Google Search to Airtable, clean LinkedIn leads
You find a great LinkedIn profile in Google, copy the URL, paste it somewhere, then lose it in a tab pile. Do that 40 times and you’ve basically spent your afternoon doing admin work.
This Google Airtable leads automation hits sales and recruiting teams first, but a marketing lead-gen sprint feels the same pain. You’ll end up with a clean Airtable table of prospects (with snippets and search terms) that’s ready for outreach.
Below is how the workflow works, what you get out of it, and what to watch for so it runs reliably.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Google Search to Airtable, clean LinkedIn leads
flowchart LR
subgraph sg0["When clicking 'Test workflow' Flow"]
direction LR
n0@{ icon: "mdi:swap-vertical", form: "rounded", label: "Prepare Search Parameters", pos: "b", h: 48 }
n1["<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/httprequest.dark.svg' width='40' height='40' /></div><br/>Google Custom Search API"]
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/code.svg' width='40' height='40' /></div><br/>Parse LinkedIn Profiles"]
n3@{ icon: "mdi:swap-vertical", form: "rounded", label: "Clean Search Results", pos: "b", h: 48 }
n4["<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/airtable.svg' width='40' height='40' /></div><br/>Save to Airtable"]
n5@{ icon: "mdi:play-circle", form: "rounded", label: "When clicking 'Test workflow'", pos: "b", h: 48 }
n6@{ icon: "mdi:swap-vertical", form: "rounded", label: "Configure Search Settings", pos: "b", h: 48 }
n7@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check Pagination", pos: "b", h: 48 }
n8@{ icon: "mdi:cog", form: "rounded", label: "Rate Limit Delay", pos: "b", h: 48 }
n9@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items", pos: "b", h: 48 }
n10@{ icon: "mdi:swap-vertical", form: "rounded", label: "⚙️ CUSTOMIZE YOUR SEARCH KEY..", pos: "b", h: 48 }
n9 --> n6
n7 --> n8
n7 --> n9
n8 --> n1
n4 --> n7
n3 --> n4
n2 --> n3
n1 --> n2
n6 --> n0
n0 --> n1
n5 --> n10
n10 --> n9
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 n5 trigger
class n7 decision
class n4 database
class n1 api
class n2 code
classDef customIcon fill:none,stroke:none
class n1,n2,n4 customIcon
The Problem: LinkedIn prospecting turns into copy-paste chaos
Manual LinkedIn prospecting breaks down the moment you need volume. Native LinkedIn search is limited, results shift, and you end up running the same searches over and over. Then comes the worst part: copying names, headlines, and URLs into a spreadsheet (or worse, into notes) and hoping you can find them again later. A single missed character in a URL, or one duplicate you don’t notice, and your outreach gets messy fast. The real cost is the mental load: you spend more time organizing leads than actually talking to them.
None of these alone is the problem. Together, they are.
- You end up re-finding the same prospects because there’s no consistent place to store them.
- Duplicates sneak in when multiple teammates run similar searches on different days.
- Copy-paste errors happen constantly, especially when you’re moving fast.
- There’s no simple way to track which search terms produced the best prospects.
The Solution: Automatically turn Google results into a deduped Airtable prospect list
This workflow uses Google’s search power to find LinkedIn profiles, then writes them into Airtable in a structured, repeatable way. You start by setting your keyword phrase (job title, industry, location, or any combo that matches your ICP). n8n sends the query to the Google Custom Search API, receives the results, and extracts the useful parts like the profile title, description, LinkedIn URL, and the search snippet. From there, it normalizes the fields so they map cleanly into your Airtable base. Finally, it upserts each profile into Airtable, which means it updates existing records instead of creating duplicates. It keeps paging through results and throttles requests so you don’t trip API limits.
The workflow starts with a manual run (so you control when it pulls data). It loops through search pages in batches, cleans up each result, and saves it to your “LinkedIn Prospects” table in Airtable. When it’s done, you have a tidy list you can filter, assign, and contact.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you’re building a list of “VP Marketing London” prospects and you want the first 50 results. Manually, even if you spend only 2 minutes per profile to open, verify, copy the URL, and paste details, that’s about 100 minutes plus cleanup. With this workflow, you set the keyword phrase once (about 5 minutes), let n8n process pages with throttling (often 10–20 minutes of waiting), and your Airtable table fills in automatically. You still review the list, but you’re reviewing, not assembling.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Airtable for storing and deduping prospects
- Google Custom Search API to pull Google results programmatically
- Google API key + Search Engine ID (get them from Google Cloud Console and Google CSE)
Skill level: Intermediate. You’ll paste API credentials, create a simple Airtable table, and tweak keyword phrases safely.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
You trigger a run with your target keyword phrase. In the “Set Keyword Phrase” step, you define what you’re hunting for (role, industry, location), then start the workflow manually so you stay in control.
The workflow prepares search options and loops in batches. n8n sets parameters like how many results to fetch, then uses a batch loop to handle pagination without overwhelming the API.
Google is queried, then results are cleaned and structured. An HTTP request calls the Google Custom Search API, a code step extracts profile entries, and a normalization step maps everything into consistent Airtable fields (title, URL, description, snippet, and the original search term).
Airtable gets an upsert, not a messy import. Prospects are created or updated in your base, then the workflow checks if there’s another page to fetch and waits briefly to respect rate limits.
You can easily modify the keyword phrases to target new roles or locations based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Manual Trigger
This workflow starts with a manual run so you can test searches interactively before automating.
- Add the Manual Execution Start node as your trigger.
- Keep the trigger settings at default since no parameters are required.
- Optionally keep Flowpast Branding for documentation and workflow context.
Step 2: Connect Google Custom Search
The workflow queries Google Custom Search to find LinkedIn profile results.
- Add the Google Search Request node and set URL to
https://www.googleapis.com/customsearch/v1. - Enable Send Query and set Authentication to
genericCredentialTypewith Generic Auth Type set tohttpQueryAuth. - Set query parameter q to
{{ $node['Initialize Search Inputs'].json.Position }} {{ $node['Initialize Search Inputs'].json.Industry }} site:linkedin.com/in. - Set query parameter start to
{{ $runIndex == 0 ? $('Initialize Search Inputs').item.json.start_index : $('Normalize Search Output').item.json.nextPageStartIndex}}. - Set query parameter cx to your Custom Search Engine ID (replace
[YOUR_ID]). - Credential Required: Connect your httpQueryAuth credentials in Google Search Request.
[YOUR_ID], Google will return an error. Replace it with your Custom Search Engine ID.Step 3: Set Up Search Inputs and Pagination Controls
These nodes build the search parameters and control how many pages are fetched.
- In ⚙️ Set Keyword Phrase, set keywords_string to
Store Manager Retail London(or your own phrase). - In Define Search Options, set Position to
{{ $json.keywords_string }}and Maxresults to30. - In Initialize Search Inputs, set start_index to
1and map fields like Position to{{ $json.Position }}and Region to{{ $json.Location }}. - Connect ⚙️ Set Keyword Phrase → Iterate Records → Define Search Options → Initialize Search Inputs to match the execution flow.
Step 4: Extract and Normalize Search Results
This section parses the Google response and standardizes fields before storing them.
- In Extract Profile Entries, keep the JavaScript code as provided to loop through response items and output fields like
title,link, andnextPageStartIndex. - In Normalize Search Output, map Title to
{{ $json.title }}, URL to{{ $json.link }}, and nextPageStartIndex to{{ $json.nextPageStartIndex }}. - Ensure the flow continues Google Search Request → Extract Profile Entries → Normalize Search Output.
Step 5: Configure Airtable Upsert and Pagination Loop
Results are stored in Airtable and the workflow loops until the max result count is reached.
- In Upsert into Airtable, set Operation to
upsert. - Select your Airtable Base and Table (replace
[YOUR_ID]values). - Map fields: Title →
{{ $json.Title }}, Search →{{ $json.Search }}, Snippet →{{ $json.Snippet }}, Description →{{ $json.Description }}, linkedin_url →{{ $json.URL }}. - Credential Required: Connect your airtableTokenApi credentials in Upsert into Airtable.
- Configure Pagination Decision with the rule
{{ parseInt($('Normalize Search Output').item.json.nextPageStartIndex) }}lt{{ $node['Define Search Options'].json.Maxresults}}to continue searching. - Connect Normalize Search Output → Upsert into Airtable → Pagination Decision → Throttle Delay → Google Search Request for the loop.
- In Throttle Delay, set Amount to
2to reduce API rate limits.
Step 6: Test and Activate Your Workflow
Run a manual test to verify results are retrieved and upserted, then activate for ongoing use.
- Click Execute Workflow on Manual Execution Start to run a test search.
- Confirm Google Search Request returns results and Extract Profile Entries outputs multiple items.
- Verify new or updated records appear in Airtable from Upsert into Airtable.
- Activate the workflow using the Active toggle once tests are successful.
Common Gotchas
- Google Custom Search credentials can expire or be restricted to the wrong project. If things break, check your API key in Google Cloud Console and confirm the Custom Search API is enabled.
- 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 30 minutes if your Google CSE and Airtable base are ready.
No. You’ll paste credentials, edit a keyword phrase, and match a few Airtable fields.
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 Google Custom Search API usage, which can add a small cost depending on how many searches you run.
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, and it’s the main way you’ll use it. Update the “Set Keyword Phrase” node to swap in new titles (“Account Executive”, “Head of People”) and add locations (“Berlin”, “Toronto”). You can also adjust volume in the “Define Search Options” node by changing the max results for testing versus larger pulls. If you want stricter filtering, add an If condition after extraction to keep only results that contain specific words in the title or snippet.
Usually it’s an expired Airtable personal access token or the token doesn’t have access to the right base. Double-check the token permissions in Airtable, then confirm the base ID and table name match what your Airtable node is pointing to. Also make sure the table fields exist (like linkedin_url) because Airtable will reject writes to unknown fields.
If you self-host n8n, there’s no hard execution limit (it mostly depends on your server and API quotas), and this workflow can comfortably process dozens of results per run.
Often, yes, because this workflow needs pagination, looping, and deduped upserts, which get clunky (and pricey) in simpler tools. n8n also makes it straightforward to add conditions and batch processing without turning the automation into a fragile chain of micro-steps. Self-hosting is the wildcard: once it’s running, you can scale executions without paying per task. Zapier or Make can still be fine if you only want a tiny “search once, save ten rows” helper and you never plan to expand it. If you’re unsure, Talk to an automation expert and we’ll point you to the simplest option.
Once this is running, prospecting stops feeling like clerical work. You get a clean, deduped list in Airtable, and you can spend your time on outreach that actually moves deals forward.
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.