LinkedIn to Google Sheets, consistent ICP scoring
Your lead list looks “fine” until you actually try to qualify it. Domains with no context. LinkedIn URLs pasted inconsistently. Notes scattered across tabs. Then you waste a chunk of your week arguing about what “good fit” even means.
This is where ICP scoring automation pays off. Sales Ops feels it first, but growth marketers and agency owners doing outbound feel the drag too. You get a clean, enriched company record and a consistent ICP score that’s the same every time.
This workflow turns a company domain into a verified LinkedIn profile, pulls structured company data via Airtop, scores it, and drops the results into Google Sheets so reviews are fast and repeatable.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: LinkedIn to Google Sheets, consistent ICP scoring
flowchart LR
subgraph sg0["On form submission Flow"]
direction LR
n0["<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"]
n1@{ icon: "mdi:play-circle", form: "rounded", label: "When Executed by Another Wor..", pos: "b", h: 48 }
n2["<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/merge.svg' width='40' height='40' /></div><br/>Merge"]
n3@{ icon: "mdi:cog", form: "rounded", label: "Extract company LinkedIn url", pos: "b", h: 48 }
n4@{ icon: "mdi:cog", form: "rounded", label: "Extract Company Information", pos: "b", h: 48 }
n5@{ icon: "mdi:cog", form: "rounded", label: "Calclate ICP", pos: "b", h: 48 }
n6@{ icon: "mdi:swap-horizontal", form: "rounded", label: "LinkedIn link exists?", pos: "b", h: 48 }
n7@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Is valid LinkedIn link?", pos: "b", h: 48 }
n8@{ icon: "mdi:swap-vertical", form: "rounded", label: "Unify Params", pos: "b", h: 48 }
n5 --> n2
n8 --> n6
n0 --> n8
n6 --> n7
n6 --> n3
n7 --> n4
n7 --> n2
n7 --> n5
n4 --> n2
n3 --> n7
n1 --> n8
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 n0,n1 trigger
class n6,n7 decision
classDef customIcon fill:none,stroke:none
class n0,n2 customIcon
The Problem: Inconsistent enrichment and “vibes-based” ICP scoring
Qualifying companies sounds simple until you’re doing it at volume. Someone copies a domain into a sheet, someone else hunts for the LinkedIn page, and a third person pulls employee count, location, and “what they do” from whatever snippet they can find. Then the scoring happens in someone’s head. A week later, the same account gets re-checked and magically becomes a different score because the inputs were missing, outdated, or interpreted differently. Honestly, it’s not just slow. It’s noisy.
It adds up fast. Here’s where it breaks down in real teams:
- Finding the right LinkedIn company page is a recurring time sink, especially when names are generic or brands have multiple pages.
- Manual enrichment creates uneven data, which means filtering and segmentation in Sheets becomes unreliable.
- Scoring rubrics drift because people apply them differently, so prioritization becomes a debate instead of a decision.
- When you finally review the list, you’re re-researching basics instead of acting on clear, comparable scores.
The Solution: Domain-to-LinkedIn enrichment with consistent ICP scoring
This n8n workflow takes a simple input (a company domain) and turns it into a structured, scored company record you can trust. It starts when you submit a domain through a form trigger or send it from an upstream workflow. The automation normalizes the input, checks if you already provided a LinkedIn company URL, and validates that URL if it exists. If it’s missing, it runs sub-workflows that locate the correct LinkedIn company profile (using website scraping or search) and then uses Airtop (authenticated to LinkedIn) to extract key company details. Finally, it applies your ICP scoring rubric and merges everything into one unified JSON-style output that’s ready to save into Google Sheets or pass to the next enrichment step.
The workflow begins with clean inputs, then it branches based on LinkedIn presence. Airtop pulls consistent fields from the company profile, and the merge step combines enrichment plus scoring so every row in Google Sheets has the same shape.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you qualify 50 companies from a webinar list each week. Manually, a quick LinkedIn search plus copying basics into Google Sheets is maybe 5 minutes per company, and scoring adds another 3 minutes. That’s about 6–7 hours of repetitive work. With this workflow, submitting a domain takes under a minute, then the enrichment and scoring runs in the background (often a few minutes depending on LinkedIn retrieval). You still review the results, but you’re reviewing instead of researching.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Airtop for LinkedIn-authenticated data extraction
- Google Sheets to store enriched, scored rows
- Airtop API Key (get it from your Airtop dashboard)
Skill level: Intermediate. You’ll connect credentials, map fields, and configure the required sub-workflows.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A domain (and optional LinkedIn URL) triggers the run. You can start it from the built-in form trigger, or send the same input from an upstream workflow when a new company enters your pipeline.
Inputs get cleaned so downstream steps behave. The workflow normalizes the domain, then checks whether a LinkedIn company URL is already present. If it is, it validates the URL so you don’t enrich the wrong page by accident.
LinkedIn data is gathered through Airtop. If the LinkedIn page wasn’t provided, sub-workflows attempt to locate it (commonly via website scraping or search). Then Airtop extracts fields like company name, tagline, location, employee count, and a plain-English “about” section that’s actually usable for qualification.
Scoring and output are merged for a single record. The workflow applies your ICP rubric (AI/tech orientation, scale, agency status, geography), attaches score justifications, and combines everything into one structured output that can be written to Google Sheets.
You can easily modify the scoring rubric to match your ICP model 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 public form entry point and the upstream workflow trigger so this flow can run from a form or another workflow.
- Open Form Entry Trigger and set Form Title to
LinkedIn Company Profile Extractor. - In Form Entry Trigger, confirm the fields: Company domain (required), Airtop Profile (connected to Linkedin) (required), and Company LinkedIn.
- Set Form Description to
=<h2>Find Company LinkedIn URL</h2> <p>This automation takes a company domain and returns its LinkedIn URL.</p>. - Open Upstream Workflow Trigger and confirm workflow inputs include Company domain, Airtop Profile (connected to Linkedin), and Company LinkedIn.
Step 2: Normalize and Check Input Data
Standardize field names and validate that LinkedIn data is present before sub-workflows run.
- In Normalize Inputs, set company_domain to
={{ $json["Company domain"] }}. - In Normalize Inputs, set airtop_profile to
={{ $json["Airtop Profile (connected to Linkedin)"] }}. - In Normalize Inputs, set company_linkedin to
={{ $json["Company LinkedIn"] }}. - In Check LinkedIn Presence, keep the condition: string notEmpty with Left Value
={{ $json.company_linkedin }}. - In Validate LinkedIn URL, keep the condition: string contains with Left Value
={{ $json.company_linkedin }}and Right Valuelinkedin.com/company.
⚠️ Common Pitfall: If Company LinkedIn is empty, Check LinkedIn Presence routes to Run Sub-Workflow (Configure Required) A instead of validation. Make sure the field is optional only if you want auto-enrichment.
Step 3: Configure Sub-Workflow Execution
Each Execute Workflow node must be connected to an existing workflow and mapped to the correct input values.
- Open Run Sub-Workflow (Configure Required) A and select the target workflow in Workflow.
- In Run Sub-Workflow (Configure Required) A, set inputs: Company domain to
={{ $('Normalize Inputs').item.json.company_domain }}and Airtop Profile (connected to Linkedin) to={{ $('Normalize Inputs').item.json.airtop_profile }}. - Open Run Sub-Workflow (Configure Required) B and select the target workflow in Workflow.
- In Run Sub-Workflow (Configure Required) B, set inputs: airtop_profile to
={{ $('Normalize Inputs').item.json.airtop_profile }}and company_linkedin to={{ $json.company_linkedin }}. - Open Run Sub-Workflow (Configure Required) C and select the target workflow in Workflow.
- In Run Sub-Workflow (Configure Required) C, set inputs: airtop_profile to
={{ $('Normalize Inputs').item.json.airtop_profile }}and company_linkedin to={{ $json.company_linkedin }}.
⚠️ Common Pitfall: The workflow selectors for all three Execute Workflow nodes are empty. You must choose a workflow before this flow can run.
Step 4: Merge Results from Parallel Branches
Combine outputs from multiple parallel paths into a single result stream.
- Confirm Validate LinkedIn URL outputs to Run Sub-Workflow (Configure Required) B, Combine Results, and Run Sub-Workflow (Configure Required) C in parallel.
- Open Combine Results and set Number of Inputs to
3to match the three incoming branches.
Validate LinkedIn URL outputs to both Run Sub-Workflow (Configure Required) B and Run Sub-Workflow (Configure Required) C in parallel, while also sending data directly to Combine Results.
Step 5: Test and Activate Your Workflow
Run a full test from the form or an upstream workflow, then enable for production use.
- Click Execute Workflow and submit a sample form entry in Form Entry Trigger with a valid domain and LinkedIn URL.
- Verify that Normalize Inputs produces
company_domain,airtop_profile, andcompany_linkedinvalues. - Confirm that Check LinkedIn Presence routes correctly and that Validate LinkedIn URL only passes URLs containing
linkedin.com/company. - Check that outputs from Run Sub-Workflow (Configure Required) B and Run Sub-Workflow (Configure Required) C appear in Combine Results.
- Toggle the workflow to Active when the test run completes successfully.
Common Gotchas
- Airtop credentials can expire or need specific permissions. If things break, check your Airtop API key status and LinkedIn-authenticated Airtop Profile 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.
Frequently Asked Questions
About an hour if your Airtop profile is already connected to LinkedIn.
No. You will mostly connect accounts and map fields. The only “technical” part is configuring the required sub-workflows once.
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 usage costs based on your plan.
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.
Yes, but plan to do it thoughtfully. You can adjust the scoring inside the “Run Sub-Workflow (Configure Required)” pieces that calculate classifications and the ICP score, then keep the “Combine Results” merge output the same. Common tweaks include changing geography rules, adding an “industry fit” factor from the LinkedIn about section, and weighting employee count brackets differently. If you keep the output fields consistent, your Google Sheets columns won’t break later.
Usually it’s an expired Airtop API key or the Airtop Profile is no longer authenticated to LinkedIn. Regenerate the key in Airtop, update it in n8n, and confirm the LinkedIn session is still valid. If the LinkedIn URL validation passes but extraction fails, it can also be a permissions issue on the Airtop side or a temporary block that requires slowing down runs.
It depends on your n8n plan and how fast LinkedIn extraction runs, but most teams comfortably process a few hundred companies a day when they batch it.
For this use case, n8n is usually the better fit because you can branch, validate, and merge multi-step enrichment without paying extra for every conditional path. It also supports self-hosting, which means high-volume scoring doesn’t turn into a surprise bill. Zapier or Make can still work if you’re doing a simpler “domain in, row out” flow with minimal enrichment. The tradeoff is flexibility: the moment you add sub-workflows and validation logic, n8n feels less fragile. Talk to an automation expert if you want help choosing.
Once your enrichment and scoring are consistent, the whole lead review process gets calmer. Set it up, run it in the background, and focus on the accounts that actually deserve attention.
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.