LinkedIn + Google Sheets: outreach leads, ready to send
LinkedIn is full of buying signals, but turning “they’re hiring” into “we should email this person” is a grind. You jump between tabs, copy company details, hunt for emails, then still stare at a blank page trying to write something that doesn’t sound templated.
SDRs feel it in their activity targets. Recruiters deal with it when they’re trying to break into new accounts fast. And founders running sales themselves hit the wall even harder. This LinkedIn lead automation takes job posts and turns them into a Google Sheets list with verified contacts and outreach drafts you can actually send.
Below, you’ll see what the workflow does, what changes after you implement it, and the few setup details that matter so you don’t spend your afternoon debugging.
How This Automation Works
See how this solves the problem:
n8n Workflow Template: LinkedIn + Google Sheets: outreach leads, ready to send
flowchart LR
subgraph sg0["When clicking ‘Execute workflow’ Flow"]
direction LR
n0@{ icon: "mdi:database", form: "rounded", label: "Update Sheet with Email", pos: "b", h: 48 }
n1@{ icon: "mdi:brain", form: "rounded", label: "Google Gemini Chat Model", pos: "b", h: 48 }
n2@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser", pos: "b", h: 48 }
n3@{ icon: "mdi:play-circle", form: "rounded", label: "When clicking ‘Execute workf..", pos: "b", h: 48 }
n4@{ icon: "mdi:cog", form: "rounded", label: "Remove Duplicates", pos: "b", h: 48 }
n5@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Run the LinkedIn Job Scraper", pos: "b", h: 48 }
n6@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Get dataset Items", pos: "b", h: 48 }
n7@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Checks Company Size 250", pos: "b", h: 48 }
n8@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Removes HR Related Industry", pos: "b", h: 48 }
n9["<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/>Prepare Final Company Details"]
n10@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Checks Domain Existence", pos: "b", h: 48 }
n11["<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/>Apollo Get Targeted Personnel"]
n12["<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/>Apollo Email Finder"]
n13["<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/>Sanitising Email Details"]
n14["<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/>Structuring Complete Details.."]
n15@{ icon: "mdi:database", form: "rounded", label: "Adding Leads to Sheets", pos: "b", h: 48 }
n16@{ icon: "mdi:database", form: "rounded", label: "Fetching Leads Data", pos: "b", h: 48 }
n17@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Validates Email Id and Email..", pos: "b", h: 48 }
n18@{ icon: "mdi:robot", form: "rounded", label: "Lead Email Generator", pos: "b", h: 48 }
n19@{ icon: "mdi:cog", form: "rounded", label: "Limit Companies Search", pos: "b", h: 48 }
n20["<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/>Sanitising Person Details"]
n21["<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 Data"]
n22@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Filter for Batching", pos: "b", h: 48 }
n21 --> n14
n6 --> n7
n4 --> n8
n12 --> n13
n16 --> n17
n22 --> n18
n18 --> n0
n15 --> n16
n19 --> n21
n19 --> n11
n10 --> n19
n1 -.-> n18
n13 --> n21
n2 -.-> n18
n7 --> n4
n20 --> n12
n20 --> n21
n8 --> n9
n5 --> n6
n11 --> n20
n9 --> n10
n17 --> n22
n3 --> n5
n14 --> n15
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 trigger
class n2,n18 ai
class n1 aiModel
class n5,n6,n7,n8,n10,n17,n22 decision
class n0,n15,n16 database
class n11,n12 api
class n9,n13,n14,n20 code
classDef customIcon fill:none,stroke:none
class n9,n11,n12,n13,n14,n20,n21 customIcon
The Challenge: Turning Hiring Signals Into Outreach Leads
Job postings are one of the cleanest “intent” signals you can get on LinkedIn. The problem is everything that comes after. You find a promising role, then you still need the company details, a domain you can trust, the right decision-maker (not the intern managing the page), and an email address that won’t bounce. Then comes the writing. If you’re doing this manually, it’s easy to end up with a messy sheet, duplicate companies, and emails that sound generic because you’re rushing.
It adds up fast. Here’s where it usually breaks down.
- You waste about 10 minutes per company just collecting basics that should be automatic.
- Duplicate accounts slip in, so you end up emailing the same company twice and looking careless.
- Contact data is inconsistent, which means more bounces and more time spent “fixing the list.”
- Personalization gets skipped because you’re trying to hit volume, so replies don’t match the effort.
The Fix: Job Posts In, Qualified Leads Out (With Draft Emails)
This workflow runs on demand in n8n and turns LinkedIn job search results into a ready-to-send outreach sheet. It begins by scraping LinkedIn job postings (via Apify) for the roles you care about, then filters companies based on your rules like company size and industry. From there, it enriches each qualified company by finding the right people through Apollo and pulling verified email addresses. Once the lead profile is assembled, the workflow writes everything into Google Sheets, then uses an AI email composer (Gemini chat model in the template) to draft a subject line and email body that references the hiring signal you discovered. Finally, it saves those drafts back to the same sheet, so your list and your messaging stay connected.
The workflow starts when you run it in n8n. Apify collects the job-post data, Apollo fills in decision-maker contacts and emails, and Gemini generates outreach drafts based on the enriched lead context. Google Sheets becomes the single place you review, approve, and send.
What Changes: Before vs. After
| What This Eliminates | Impact You’ll See |
|---|---|
|
|
Real-World Impact
Say you target 30 companies a week hiring for a specific role. Manually, you might spend about 10 minutes per company to capture the job info and company basics, plus another 10 minutes finding a decision-maker and an email, which is roughly 10 hours weekly. With this workflow, you kick off one run, let it scrape and enrich in the background, then spend about 30 minutes reviewing the sheet and tweaking the best drafts. That’s most of a day back, every week.
Requirements
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Apify to scrape LinkedIn job posting results.
- Apollo.io to find people and verify emails.
- Google Gemini API key (get it from Google AI Studio / Gemini API in your Google Cloud console).
Skill level: Intermediate. You’ll connect accounts, paste a LinkedIn Jobs search URL into the scraper, and map a few Google Sheets fields.
Need help implementing this? Talk to an automation expert (free 15-minute consultation).
The Workflow Flow
You trigger a run when you’re ready. The workflow is built around a manual start, so you can run it daily, weekly, or whenever your pipeline needs fresh accounts.
LinkedIn job data gets collected and cleaned. Apify pulls job-post records from your LinkedIn Jobs search query, then n8n filters by company size, removes duplicates, and excludes industries you don’t want (like HR-heavy segments if that’s not your ICP).
Contacts are enriched and validated. Using HTTP requests to Apollo, the workflow searches for targeted personnel, looks up verified emails, and merges the person + company data into a single lead profile that’s consistent enough to use at scale.
Google Sheets becomes your output hub. Leads are appended to a sheet, then the workflow reads them back, checks that required fields exist, and only then asks Gemini to write a personalized subject line and email body. Those drafts are written back into the same row so review is simple.
You can easily modify the filtering rules (company size, industries, titles) to match your ICP 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 on demand so you can control when the LinkedIn scraping and outreach sequence begins.
- Add and open Manual Start Trigger.
- Leave default settings as-is to run the workflow manually.
Step 2: Connect Apify and Configure Scraping Inputs
These nodes launch the LinkedIn job scraper and read the dataset results for processing.
- Open Launch LinkedIn Scraper and set customBody to the JSON input provided, including the LinkedIn Jobs URL and
"count": 100. - In Retrieve Dataset Records, set resource to
Datasets, limit to110, and datasetId to={{ $json.defaultDatasetId }}. - Credential Required: Connect your Apify credentials in Launch LinkedIn Scraper and Retrieve Dataset Records.
Step 3: Filter and Normalize Company Records
This section filters to small companies, removes duplicates, excludes HR-related industries, and cleans company domains.
- In Check Company Size, confirm the condition uses
={{ $json.companyEmployeesCount }}with operationltand rightValue250. - In Deduplicate Companies, set compare to
selectedFieldsand fieldsToCompare tocompanyName. - In Exclude HR Industries, confirm the two notContains checks for
Human ResourcesandStaffing and Recruitinguse={{ $json.industries }}. - Keep Finalize Company Info code as provided to extract the
domainand wrap data undercompany. - In Verify Domain Presence, verify the exists check uses
={{ $json.company.domain }}. - Set Limit Company Batch to maxItems
5to control the number of companies processed per run.
Limit Company Batch outputs to both Combine Data Streams and Apollo People Search in parallel.
Step 4: Fetch People and Email Data from Apollo
These nodes pull decision-makers and email addresses from Apollo, then prepare the data for merging.
- In Apollo People Search, set url to
https://api.apollo.io/api/v1/people/searchand keep the jsonBody with{{ $json.company.domain }}insideq_organization_domains_list. - Credential Required: Connect your httpHeaderAuth credentials in Apollo People Search.
- Keep the provided JavaScript in Clean Person Records to flatten and dedupe people while wrapping data under
person. - In Apollo Email Lookup, set url to
https://api.apollo.io/v1/people/matchand jsonBody to={"id":"{{ $json.person.personId }}"}. - Credential Required: Connect your httpHeaderAuth credentials in Apollo Email Lookup.
- Keep the JavaScript in Clean Email Payload to wrap results under
email.
Clean Person Records outputs to both Apollo Email Lookup and Combine Data Streams in parallel.
Step 5: Merge Company, Person, and Email Data
This stage merges three streams into a single lead profile for sheet insertion.
- In Combine Data Streams, set numberInputs to
3to merge company, person, and email data. - Keep the JavaScript in Assemble Lead Profile to map
person.personIdtoemail.idand append company fields.
Step 6: Connect Google Sheets and Append Leads
Lead profiles are added to your Google Sheet and then reloaded for email generation.
- In Append Leads to Sheet, set operation to
append, documentId to your sheet ID, and sheetName togid=0. - Verify the column mappings use expressions like
={{ $json.email }},={{ $json.companyName }}, and={{ $json.personLinkedInUrl }}. - Credential Required: Connect your Google Sheets credentials in Append Leads to Sheet.
- In Retrieve Leads Sheet, select the same documentId and sheetName to read back the latest rows.
- Credential Required: Connect your Google Sheets credentials in Retrieve Leads Sheet.
Append Leads to Sheet outputs to Retrieve Leads Sheet to begin the email enrichment flow.
Step 7: Validate Rows and Prepare Batches for AI
These checks ensure only valid leads without existing emails get processed and limit batch size.
- In Validate Email & Content, confirm the conditions:
={{ $json.Subject }}is empty,={{ $json["Email Body"] }}is empty, and={{ $json.Email }}contains@. - In Batching Filter, keep the condition
={{ $json.row_number }}gt83to control processing batches.
⚠️ Common Pitfall: If your sheet does not include the Subject and Email Body columns, Validate Email & Content will block all rows from reaching the AI step.
Step 8: Configure AI Email Generation
The AI chain creates the subject and body using Gemini and enforces a structured response.
- In AI Email Composer, keep the prompt text and variables such as
{{ $json.Company }},{{ $json['Job Title'] }}, and{{ $json.Occupation }}. - Open Gemini Chat Engine and connect it to AI Email Composer as the language model.
- Open Structured Output Extractor and keep the jsonSchemaExample defining
subjectandemail_body. - Credential Required: Connect your Google Gemini credentials in Gemini Chat Engine.
Structured Output Extractor is connected as the output parser for AI Email Composer—ensure credentials are added to Gemini Chat Engine, not the parser.
Step 9: Write Generated Emails Back to Google Sheets
The generated subject and email body are written back to the sheet using Email as the matching key.
- In Write Email Back to Sheet, set operation to
updateand use matchingColumnsEmail. - Map columns using expressions:
={{ $('Batching Filter').item.json.Email }},={{ $json.output.subject }}, and={{ $json.output.email_body }}. - Credential Required: Connect your Google Sheets credentials in Write Email Back to Sheet.
Step 10: Test and Activate Your Workflow
Run a full test to confirm scraping, enrichment, AI generation, and sheet updates work end-to-end.
- Click Execute Workflow on Manual Start Trigger to run a live test.
- Verify that Append Leads to Sheet adds new rows and Write Email Back to Sheet updates
SubjectandEmail Body. - Check that Limit Company Batch processes only
5companies and that parallel branches populate both Combine Data Streams and Apollo People Search. - When results look correct, toggle the workflow to Active for production use.
Watch Out For
- Apollo.io credentials can expire or need specific permissions. If things break, check your Apollo API key and plan limits first, then update the header auth in the HTTP Request nodes.
- 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 you already have the accounts and API keys.
Yes, but you’ll want someone comfortable with connecting APIs and testing a few runs. No traditional coding, just configuration and careful field mapping.
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 Apify, Apollo, and Gemini API 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.
Start by changing the LinkedIn Jobs search URL you paste into the Apify scraper node so the workflow targets your niche roles. Then adjust the company filters (the “Check Company Size” and “Exclude HR Industries” logic) to match your ICP. If you prefer another enrichment provider, you can replace the Apollo HTTP Request nodes with Clay or Hunter calls and keep the same “Assemble Lead Profile” step so the sheet columns don’t change. Finally, edit the AI Email Composer prompt to reflect your offer, your tone, and any compliance rules you follow.
Most of the time it’s a mismatched Document ID or Sheet Name, not the workflow itself. Confirm the spreadsheet exists, the tab name matches exactly, and the connected Google account has edit access. If it worked once and then stopped, re-authenticate Google Sheets in n8n because tokens can expire.
On a typical n8n Cloud plan you can run thousands of executions a month, and self-hosting removes the execution cap. In practice, capacity is usually limited by Apify scraping volume and Apollo API limits, so most teams batch a few hundred leads per run to keep it stable.
Often, yes. This workflow mixes scraping, branching filters, enrichment, deduplication, and AI generation, and that kind of multi-stage logic gets clunky (and expensive) in simpler automation tools. n8n also gives you a self-hosting path, which is useful when you want higher volume without paying per tiny step. Zapier or Make can still be fine if you only need “job post → add row to sheet” and nothing else. Talk to an automation expert if you want a quick recommendation based on your volumes and tech stack.
Once this is running, your sheet stops being a graveyard of half-finished research and turns into a repeatable outreach engine. Set it up, run it when you need pipeline, and spend your time on conversations instead of copy-paste.
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.