HubSpot + LinkedIn, cleaner company data and ICP scores
Your HubSpot company records are probably “fine” until you need them. Then you find missing LinkedIn URLs, fuzzy employee counts, and five versions of the same company because someone typed the domain differently.
HubSpot admins feel it when routing rules misfire. Marketing ops feels it when segmentation gets messy. And a founder running sales will notice it when reps waste calls on the wrong accounts. This HubSpot LinkedIn enrichment automation fills in the gaps and adds an ICP score so your team knows who to prioritize.
Below, you’ll see how the workflow validates domains, pulls company details from LinkedIn, calculates a consistent ICP score, and then updates (or creates) the HubSpot company record.
How This Automation Works
See how this solves the problem:
n8n Workflow Template: HubSpot + LinkedIn, cleaner company data and ICP scores
flowchart LR
subgraph sg0["On form submission Flow"]
direction LR
n0@{ icon: "mdi:cog", form: "rounded", label: "Aggregate", pos: "b", h: 48 }
n1@{ icon: "mdi:cog", form: "rounded", label: "Company info", pos: "b", h: 48 }
n2@{ icon: "mdi:cog", form: "rounded", label: "Save company Hubspot", pos: "b", h: 48 }
n3["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/form.svg' width='40' height='40' /></div><br/>On form submission"]
n4@{ icon: "mdi:play-circle", form: "rounded", label: "When Executed by Another Wor..", pos: "b", h: 48 }
n5@{ icon: "mdi:swap-vertical", form: "rounded", label: "Unify Params", pos: "b", h: 48 }
n6@{ icon: "mdi:swap-vertical", form: "rounded", label: "Map information", pos: "b", h: 48 }
n7@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Is corporate email?", pos: "b", h: 48 }
n0 --> n6
n1 --> n0
n5 --> n7
n6 --> n2
n3 --> n5
n7 --> n1
n4 --> n5
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n3,n4 trigger
class n7 decision
classDef customIcon fill:none,stroke:none
class n3 customIcon
The Challenge: HubSpot company records drift (fast)
Company data doesn’t stay clean on its own. A form submission comes in with a Gmail address, so no domain. Another lead submits a personal domain, so it gets treated as a “company.” Someone pastes a LinkedIn URL with tracking parameters, and your dedupe logic misses it. Then you try to run targeting, routing, or enrichment later and realize the CRM has become a patchwork of half-truths. The annoying part is that none of this is hard; it’s just constant.
The friction compounds. Here’s where it breaks down in day-to-day ops.
- Reps end up googling “company + LinkedIn” and guessing which profile is correct.
- Non-corporate emails (gmail, yahoo, .edu) slip into workflows and create junk company records.
- Your ICP scoring is inconsistent because it lives in people’s heads or in a spreadsheet no one trusts.
- Duplicates creep in when domains, websites, and LinkedIn URLs aren’t normalized the same way every time.
The Fix: LinkedIn enrichment + ICP scoring, synced to HubSpot
This workflow takes a contact email and/or company domain, validates it, enriches the company profile using LinkedIn data, and then updates your HubSpot company object with structured fields you can actually use. It starts by normalizing whatever the form (or internal user) sends: email, domain, and an optional LinkedIn URL. Next, it filters out non-corporate domains so you don’t pollute HubSpot with companies that aren’t really companies. Then it invokes an Airtop-connected LinkedIn enrichment step to retrieve core company attributes like name, tagline, HQ location, website, and employee count. Finally, an AI step calculates an ICP score using those attributes, and the workflow upserts the HubSpot company record so the CRM stays current without manual cleanup.
The workflow begins at a form submission or an internal trigger. From there, it validates the domain, pulls a complete company profile from LinkedIn, and merges everything into one clean set of fields. HubSpot gets updated last, so your team sees the finished record instead of a half-filled draft.
What Changes: Before vs. After
| What This Eliminates | Impact You’ll See |
|---|---|
|
|
Real-World Impact
Say your team qualifies 20 inbound leads a week. Manually, a decent company check is usually 10 minutes: find LinkedIn, confirm website, estimate size, and jot down notes. That’s about 3 hours a week of “research” before anyone even sends a first email. With this workflow, the trigger takes under a minute (it’s just the form submit), then the enrichment and scoring runs in the background, and HubSpot updates automatically. You still review the account, but now you start from a completed record.
Requirements
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- HubSpot for company upserts and CRM fields
- Airtop to extract LinkedIn company details
- OpenAI to calculate the ICP score from attributes
- Airtop API Key (get it from your Airtop dashboard)
Skill level: Intermediate. You’ll connect accounts, map a few HubSpot properties, and test with real domains.
Need help implementing this? Talk to an automation expert (free 15-minute consultation).
The Workflow Flow
Form submission or internal invocation triggers the run. A new lead can kick this off from an n8n Form trigger, or you can call it from another workflow when you want to enrich accounts in bulk.
Inputs get normalized before anything else happens. The workflow standardizes the email, derives the company domain, and keeps an optional LinkedIn URL if it was provided. Small detail, big payoff later, because your matching logic stops being “close enough.”
Corporate domain validation blocks junk early. If the email domain is gmail, yahoo, or an .edu address, the workflow filters it out so you don’t enrich noise and create bad HubSpot companies.
LinkedIn enrichment and ICP scoring run as a packaged sub-workflow. Airtop retrieves the company profile details from LinkedIn, then the OpenAI chat model (via an AI Agent step) turns those attributes into a single ICP score you can use for routing and prioritization.
HubSpot gets updated with mapped fields. A merge/aggregate step combines the enrichment output into structured company attributes (overview, HQ location, website, domain, LinkedIn URL, employee count, ICP score), then the workflow upserts the HubSpot company record.
You can easily modify the ICP criteria to match your market, or map additional fields into HubSpot based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Form Trigger
Set up the form-based entry point and the internal workflow trigger so data can enter the workflow through a form submission or from another workflow.
- Open Form Submission Trigger and set Form Title to
New contact signup. - Set Form Description to
This automation searches for the contact's company and enriches the data accordingly. - In Form Fields, add fields for
Airtop Profile (connected to Linkedin)(required),Company domain(required), andCompany LinkedIn. - Open Workflow Invocation Trigger and confirm the input fields include
Airtop Profile (connected to Linkedin),Company domain, andCompany LinkedIn. - Connect both triggers to Normalize Input Fields (the workflow already routes Form Submission Trigger → Normalize Input Fields and Workflow Invocation Trigger → Normalize Input Fields).
Step 2: Normalize Incoming Data
Ensure the incoming fields are standardized before validation and enrichment.
- Open Normalize Input Fields and add assignments for Airtop Profile (connected to Linkedin), Company domain, and Company LinkedIn.
- Set the values to expressions:
={{ $json["Airtop Profile (connected to Linkedin)"] }},={{ $json["Company domain"] }}, and={{ $json["Company LinkedIn"] }}. - Confirm the connection from Normalize Input Fields to Validate Corporate Domain is active.
Step 3: Validate and Enrich the Company Data
Filter out non-corporate domains and call the company enrichment workflow using validated inputs.
- Open Validate Corporate Domain and ensure the first condition uses notRegex with Left Value set to
={{ $json["Company domain"] }}and Right Value set to=\b(gmail|hotmail|yahoo|outlook|icloud|aol|protonmail|live|msn|ya)\b. - Add the second condition with notEndsWith, Left Value set to
={{ $json["Company domain"] }}, and Right Value set to.edu. - Open Retrieve Company Profile and select the target workflow in Workflow (this node calls another workflow).
- Set Workflow Inputs to expressions:
={{ $json["Company domain"] }},={{ $json["Company LinkedIn"] }}, and={{ $json["Airtop Profile (connected to Linkedin)"] }}. - Ensure the flow is Validate Corporate Domain → Retrieve Company Profile → Combine Records.
Step 4: Combine, Map, and Update the Company Record
Aggregate the enrichment outputs, map the fields into a clean payload, then pass the final data to the HubSpot update workflow.
- In Combine Records, confirm Aggregate is set to
aggregateAllItemData. - Open Map Company Attributes and add assignments such as company_profile set to
={{ $json[""][0].company_profile.overview }}and company_domain set to={{ $('Validate Corporate Domain').item.json["Company domain"] }}. - Map the remaining fields with their expressions:
city,name,country,tagline,employee_count,icp_score,linkedin,state, andwebsiteas shown in the node. - Open Update HubSpot Company and select the target workflow in Workflow.
- Ensure Workflow Inputs include expressions like
={{ $json.city }},={{ $json.name }}, and={{ $json.company_domain }}to pass the mapped fields into the update workflow.
Step 5: Test and Activate Your Workflow
Validate the end-to-end flow and enable the automation for production.
- Click Execute Workflow and submit the Form Submission Trigger with a corporate domain to test the full path.
- Verify that Validate Corporate Domain passes the input, Retrieve Company Profile returns data, and Combine Records aggregates results.
- Confirm Map Company Attributes outputs values like
company_profile,icp_score, andemployee_count, then ensure Update HubSpot Company receives them. - Once successful, toggle the workflow to Active so new submissions and internal calls run automatically.
Watch Out For
- HubSpot credentials can expire or need specific permissions. If things break, check the connected app settings and property access in HubSpot first.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
Common Questions
Usually about an hour if your HubSpot and Airtop accounts are ready.
Yes. You’ll mostly be connecting accounts and choosing which HubSpot properties to map. If you can build a HubSpot form, you can handle this.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in Airtop and OpenAI usage costs.
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
You can. Most teams start by adjusting the ICP logic in the AI Agent/OpenAI scoring step so it reflects their real buying signals (industry, location, employee count bands, tech profile). You can also change what gets written into HubSpot by editing the “Map Company Attributes” field mapping, which is where overview, HQ location, LinkedIn URL, and employee count are standardized. If you already have LinkedIn URLs, keep the optional LinkedIn input and treat it as the “source of truth” so the enrichment step doesn’t guess.
Usually it’s expired credentials or missing permission to edit company properties. Reconnect the HubSpot account in n8n and confirm the integration has access to the Company object and the specific fields you’re updating. Also check if a property name changed in HubSpot, because a renamed field can look like an auth problem when it’s really a mapping issue.
On n8n Cloud Starter, you can run a healthy volume for small teams, and higher tiers handle more. If you self-host, there’s no execution cap, it mainly depends on your server and how quickly Airtop/LinkedIn enrichment returns results. In practice, many teams run this for every inbound lead and a weekly batch cleanup without issues.
Often, yes, because this kind of flow needs filtering, merging, and reusable sub-workflows, and n8n handles that without turning your bill into a surprise. Zapier or Make can still work if you only need a light enrichment step and a simple “update record” action. The moment you want domain validation, structured mapping, and a repeatable scoring model, n8n is usually the calmer option. If you’re on the fence, Talk to an automation expert and we’ll map the cheapest path that still works.
Clean company data is a compounding advantage, honestly. Set this up once and your HubSpot records stop decaying every time a new lead comes in.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.