🎣 Enrich and deduplicate Slack-uploaded companies in HubSpot with Coresignal

⚑ 11 views · 🎣 Lead Generation & Enrichment

πŸ’‘ Pro Tip β€” For lead enrichment, ScraperNode can pull LinkedIn profiles, company data, and job listings directly into your pipeline β€” useful for building prospect lists without manual research.

View All Scrapers

Description

This workflow automates the full company enrichment pipeline: Simply import CSV company lists to Slack and save time on enrichment and CRM maintenance. It processes uploaded files, extracts company domains, checks for existing records in HubSpot, and uses conditional logic with user approval to decide which companies to enrich. The result is a clean, enriched CRM dataset without duplicates and context rich company profiles. Ideal for B2B sales, marketing, and RevOps teams.

How It Works

  1. A file is uploaded to a Slack channel. The workflow downloads and extracts company data from the file.
  2. Company domains are inserted into a temporary data table.
  3. HubSpot is queried to identify existing companies (duplicates).
  4. If duplicates are found, the user is asked via Slack whether to enrich them.
  5. Approved companies are enriched using Coresignal multi-source data.
  6. Existing companies are updated, and new companies are created in HubSpot.
  7. A summary of results (created, updated, skipped) is posted to Slack.

Tools used

Tool / NodeWhat it does in the workflowFree / credentials needed?
Slack TriggerWaits for a file to be uploaded in a Slack channel and sends file metadataSlack app configuration required
Slack Get FileFetches the file download URLSlack app configuration required
Slack MessageNotifies user that workflow has startedSlack app configuration required
HTTP RequestDownloads the file from SlackSlack credentials required
Extract from FileParses CSV/Excel dataNo credentials required
Data Table (insert)Stores company domainsNo credentials required
HubSpot Search CompanyChecks for duplicates in HubSpotHubSpot credentials required
IF NodeDetermines if company existsNo credentials required
Slack Send & WaitAsks user whether to enrich duplicatesSlack app configuration required
Merge NodeCombines approval resultsNo credentials required
Data Table (delete/get)Manages temporary datasetNo credentials required
Coresignal Enrich CompanyFetches company enrichment dataCoresignal API key required
Code NodeMaps domains to HubSpot company IDsNo credentials required
HubSpot Update CompanyUpdates existing companiesHubSpot credentials required
HubSpot Create CompanyCreates new companiesHubSpot credentials required
Summarize NodeCounts number of companies (created, updated, skipped) throughout the workflowNo credentials required
Merge Node (final)Combines all summary results into one outputNo credentials required
Slack Message (final)Sends summary of results to Slack channelSlack app configuration required

How to Set Up

1. Slack Trigger - listen for the file_share event on your chosen channel. Select the channel by ID, connect your Slack API credential, and ensure your Slack app has permissions to read files and post messages. 2. Notify Slack on file download - send an informational message to the channel confirming processing has started. Use ephemeral mode if the message should only be visible to the triggering user. 3. Download & setch file contents - use a Slack node (resource: file, operation: get) to download the file using the trigger’s file_id. Follow this with an HTTP Request node using your Slack credentials to fetch the private download URL - set responseFormat to file to retrieve a binary buffer. 4. Extract & stage data - parse the file with an Extract from File node (supports CSV, Excel, and other tabular formats). Before inserting, use a Data Table node (deleteRows) to clear any existing rows matching the current domain, then insert the fresh data with insertRows. Use the same Data Table ID for both operations. 5. Search HubSpot by domain - use a HubSpot node (searchByDomain) with the expression ={{ $json.Website }} and returnAll enabled to check whether the company already exists. Connect via OAuth2. 6. Branch: existing vs. new company - use an IF node to check whether a HubSpot company ID was returned. The true branch handles updates and duplicates; the false branch handles creation. 7. Slack approval for duplicates - for duplicate companies, use a sendAndWait Slack node with approvalType: double to ask the user whether to proceed with enrichment. Follow with an IF node - if declined, delete or skip the rows. 8. Enrich via Coresignal - use the Coresignal node (resource: company, operation: enrich) with the company website expression. Configure your Coresignal API key in credentials. 9. Map fields with a code node - run custom JavaScript to transform the Coresignal response into HubSpot-ready fields - calculate annual revenue, extract headquarters location, and build a description string. 10. Create or update in HubSpot -

11. Summarize & report - use Summarize nodes to count created, updated, and duplicate records. Merge the totals and post a summary message to the Slack channel. 12. Error handling - on HTTP Request and HubSpot nodes, configure retries and backoff under the Options tab. Enable continueOnFail where appropriate to prevent one failed record from stopping the workflow. Use Slack nodes to alert on critical failures.

Customization Options

Why Use This Workflow?

Limitations

Need help or want to customize this?

Reach out directly: artur@coresignal.com Follow for more on linkedin: https://www.linkedin.com/in/artur-mulagalijev/

πŸ”— Nodes Used

HTTP Request, Slack, HubSpot, Extract from File, Summarize, Slack Trigger

πŸ“₯ Import

Download workflow.json and import into n8n: Workflow menu β†’ Import from File

πŸ“– Importing guide Β· πŸ”‘ Credential setup