LinkedIn + Gmail: outreach drafts ready to review
You find a great LinkedIn job post, copy the details somewhere “for later,” then lose it. Or you remember it, but now you’re rewriting the same outreach message again, trying to sound personal without spending your whole afternoon on it.
This is what recruiters and agency owners complain about most. A lot of founders do too. This LinkedIn outreach automation pulls job posts into a sheet and creates Gmail drafts you can review in one place.
You’ll see exactly what the workflow automates, what you need to connect, and how to customize it so your outreach stays consistent without sounding robotic.
How This Automation Works
Here’s the complete workflow you’ll be setting up:
n8n Workflow Template: LinkedIn + Gmail: outreach drafts ready to review
flowchart LR
subgraph sg0["Schedule Flow"]
direction LR
n0@{ icon: "mdi:database", form: "rounded", label: "Google Sheets", pos: "b", h: 48 }
n1@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Filter", pos: "b", h: 48 }
n2@{ icon: "mdi:database", form: "rounded", label: "Google Sheets1", pos: "b", h: 48 }
n3@{ icon: "mdi:robot", form: "rounded", label: "Basic LLM Chain", pos: "b", h: 48 }
n4@{ icon: "mdi:brain", form: "rounded", label: "Google Gemini Chat Model", pos: "b", h: 48 }
n5@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser", pos: "b", h: 48 }
n6["<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"]
n7@{ icon: "mdi:database", form: "rounded", label: "Google Sheets2", pos: "b", h: 48 }
n8@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger1", pos: "b", h: 48 }
n9@{ icon: "mdi:message-outline", form: "rounded", label: "Gmail", pos: "b", h: 48 }
n10["<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/>Pull Jobs "]
n11@{ icon: "mdi:swap-vertical", form: "rounded", label: "Extract Info", pos: "b", h: 48 }
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/>Pull Decision Makers"]
n13@{ icon: "mdi:swap-vertical", form: "rounded", label: "Extract Info1", pos: "b", h: 48 }
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/httprequest.dark.svg' width='40' height='40' /></div><br/>Get Email IDs"]
n6 --> n7
n1 --> n2
n10 --> n11
n11 --> n0
n13 --> n1
n14 --> n9
n0 --> n12
n2 --> n3
n2 --> n6
n7 --> n14
n3 --> n6
n8 --> n10
n12 --> n13
n4 -.-> n3
n5 -.-> n3
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 n8 trigger
class n3,n5 ai
class n4 aiModel
class n1 decision
class n0,n2,n7 database
class n10,n12,n14 api
classDef customIcon fill:none,stroke:none
class n6,n10,n12,n14 customIcon
Why This Matters: Outreach Falls Apart in the “In-Between”
Job sourcing and outreach usually die in the handoff between “I found something” and “I actually contacted someone.” LinkedIn job posts disappear down a rabbit hole of tabs. Decision-maker names get copied into notes with zero structure. Then you try to write a message, realize you’re missing the company detail you saw earlier, and go back to search again. It’s not hard work, just draining work. And when it’s draining, consistency slips. You send fewer messages, follow up late, or worse, you send a generic template because you’re out of time.
It adds up fast. Here’s where the friction usually shows up.
- Saving job posts “somewhere” turns into scattered notes that you can’t sort or filter when you want to act.
- Finding the right person at the company is repetitive research, and you end up doing it from scratch every time.
- Personalized outreach takes long enough that you batch it, which means you reach out later than you should.
- Manual drafting leads to inconsistent tone and missed details, so replies drop and confidence drops with it.
What You’ll Build: LinkedIn Jobs to Sheets, Then Gmail Drafts
This workflow runs on a schedule and quietly does the collecting for you. First, it pulls fresh LinkedIn job listings through Apify, splits the response into clean fields, and logs each role into Google Sheets (title, company, location, and poster details). Next, it looks up decision-maker profiles for those companies, filters them using criteria you control (city, company name, role keywords), and appends the best matches into a second sheet. Once you have structured job + contact data, an AI step generates a short referral-style message that fits a strict format (under 100 words, personalized, not overhyped). Finally, it looks up the email address via an email-finder API and creates a Gmail draft with a subject and body, ready for you to review and send.
The flow starts with daily job sourcing and ends with drafted emails sitting in Gmail. In the middle, Sheets becomes your control panel: it stores the inputs, stores the AI output, and keeps everything searchable so you can scale without losing track.
What You’re Building
| What Gets Automated | What You’ll Achieve |
|---|---|
|
|
Expected Results
Say you target 10 new roles a day. Manually, you might spend about 10 minutes capturing the job details, another 10 minutes finding a decision-maker, and 10 minutes writing a decent first message, which is roughly 5 hours a day when you’re doing it properly. With this workflow, the daily run collects and organizes the data automatically, then creates drafts for you to skim and send. If you spend about 30 minutes reviewing drafts and making quick edits, you’re getting back around 4 hours on a busy day.
Before You Start
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets for storing jobs, contacts, and drafts.
- Gmail to create drafts in your inbox.
- Apify account to pull LinkedIn jobs and profiles.
- Gemini API key (get it from Google AI Studio).
- Anymailfinder API key (get it from your Anymailfinder dashboard).
Skill level: Intermediate. You’ll connect a few APIs, confirm sheet columns, and enable Gmail API access in Google Cloud.
Want someone to build this for you? Talk to an automation expert (free 15-minute consultation).
Step by Step
A daily schedule kicks things off. n8n runs this automation automatically, so your pipeline fills up while you’re doing other work.
Job listings are collected and normalized. An HTTP request pulls LinkedIn job data through an Apify actor, then the workflow splits out key fields and writes clean rows to your Jobs Google Sheet.
Decision-makers are discovered and filtered. A second pull gets profile data for relevant people at those companies. The workflow applies your criteria (like city or specific company matches) and appends the best contacts into a Contacts sheet so you’re not mixing “maybe” leads with real targets.
AI generates outreach, then Gmail drafts are created. The LLM chain produces a structured headline and message body, merges that with contact data, looks up an email address via Anymailfinder, and finally drafts the email in Gmail with subject and copy already filled in.
You can easily modify the filtering rules to target different locations or industries based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Scheduled Trigger
This workflow starts on a recurring schedule and then fetches job listings.
- Add and open Scheduled Automation Trigger.
- Set your desired schedule interval in the trigger’s Rule settings (e.g., daily or hourly cadence).
- Confirm Scheduled Automation Trigger is connected to Fetch Job Listings.
Step 2: Connect Google Sheets
Three Google Sheets nodes store jobs, contacts, and draft messages.
- Open Update Jobs Sheet and select the spreadsheet Document
LinkedIn Jobs Dataand SheetSheet1. - Confirm Operation is set to
appendOrUpdateand the Columns map fields like={{ $json.id }},={{ $json.title }}, and={{ $json.description }}. - Credential Required: Connect your
googleSheetsOAuth2Apicredentials in Update Jobs Sheet. - Open Update Contacts Sheet, verify Operation is
appendOrUpdate, and map fields like={{ $json.name }}and={{ $json.link }}. - Credential Required: Connect your
googleSheetsOAuth2Apicredentials in Update Contacts Sheet. - Open Store Draft Messages, verify fields map to
={{ $json.output.Body }},={{ $json.output.Headline }}, and={{ $json['Profile Link'] }}. - Credential Required: Connect your
googleSheetsOAuth2Apicredentials in Store Draft Messages.
Step 3: Set Up Job and Profile Data Collection
This stage pulls job listings and decision profiles, then filters contacts by criteria.
- In Fetch Job Listings, set URL to
https://api.apify.com/v2/datasets/EfaMgoTc0ibyoM2Qc/items?clean=true&format=json&limit=1000. - In Split Job Fields, set Field to Split Out to
=applyUrl,companyId, companyName, companyUrl, contractType,description,descriptionHtml, jobUrl, location, postedTime, salary, sector, title, workType, posterFullName, posterProfileUrl, applicationsCount, contractType, id. - In Fetch Decision Profiles, set URL to
https://api.apify.com/v2/datasets/9u0RiQrljJXL5KBCk/items?clean=true&format=json. - In Split Profile Fields, set Field to Split Out to
link, name, company, designation, education, location, verified, thumbnail. - In Apply Criteria Filter, configure conditions for
={{ $json.location }}equalsBengaluruOR={{ $json.company }}equalsSnapmint. - Confirm the flow: Split Profile Fields → Apply Criteria Filter → Update Contacts Sheet.
Step 4: Set Up AI Message Generation and Merging
This stage generates personalized referral messages and merges them with contact data.
- Open Generate Referral Message and set Text to
={{ $('Update Jobs Sheet').item.json.title }},{{ $('Update Jobs Sheet').item.json.descriptionText }},{{ $('Update Jobs Sheet').item.json.link }},{{ $json.Designation }},{{ $json.Name }},. - Ensure the prompt in Generate Referral Message matches your outreach style and stays under 100 words.
- Open Gemini Chat Engine and set Model to
models/learnlm-2.0-flash-experimental. - Credential Required: Connect your
googlePalmApicredentials in Gemini Chat Engine. - Verify Structured Result Parser has the schema with required fields
HeadlineandBody. This parser is connected to Generate Referral Message as an AI output parser. - Confirm parallel execution: Update Contacts Sheet outputs to both Generate Referral Message and Combine Data Streams in parallel.
- In Combine Data Streams, confirm Mode is
combineand Combine By iscombineByPosition.
Credential Reminder: Structured Result Parser does not take credentials directly. Add AI credentials to the parent node Gemini Chat Engine, which powers Generate Referral Message.
Step 5: Configure Output Actions
Draft messages are stored, enriched with emails, and sent to Gmail drafts.
- Confirm Combine Data Streams → Store Draft Messages with the mapped fields
={{ $json.output.Body }}and={{ $json.output.Headline }}. - In Lookup Email Addresses, set URL to
https://api.anymailfinder.com/v5.0/search/linkedin-url.json, Method toPOST, and send body parameterprofile linkwith={{ $json['Profile Link'] }}. - In Lookup Email Addresses, set the authorization header to
Bearer [CONFIGURE_YOUR_TOKEN]. - Open Draft Gmail Notification, set Resource to
draft, Subject to={{ $json.output.Headline }}, and Message to={{ $json.output.Body }}. - Credential Required: Connect your
gmailOAuth2credentials in Draft Gmail Notification.
[CONFIGURE_YOUR_TOKEN] before testing.Step 6: Test and Activate Your Workflow
Run a manual test to confirm data flow from job listings to Gmail drafts.
- Click Execute Workflow to run Scheduled Automation Trigger manually.
- Verify new rows appear in the Jobs and Contacts sheets from Update Jobs Sheet and Update Contacts Sheet.
- Confirm Store Draft Messages writes a
HeadlineandBodyfor each filtered profile. - Check Draft Gmail Notification for a new draft with the generated message.
- Once satisfied, toggle the workflow to Active to enable scheduled runs.
Troubleshooting Tips
- Google Sheets and Gmail credentials can expire or need specific permissions. If things break, check your connected accounts in n8n Credentials and confirm the Gmail API is enabled in your Google Cloud project first.
- If you’re pulling a lot of jobs or profiles, Apify runs and HTTP requests can take longer than expected. When downstream steps fail, it’s often because the workflow continued before the dataset was ready, so add a longer wait or re-check the actor run status before splitting fields.
- Default AI prompts are generic. Add your voice rules (tone, length, “do/don’t” phrases, and a couple real examples) early, or you’ll spend your saved time editing every draft anyway.
Quick Answers
About 45 minutes if your APIs are already enabled.
No. You’ll connect accounts, paste a few API keys, and map some Google Sheets columns.
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 usage, your Gemini API usage, and your email-finder API 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.
Yes, and you should. Most people start by adjusting the “Apply Criteria Filter” logic to focus on certain cities, titles, or target company lists. You can also swap the “Lookup Email Addresses” HTTP request to use Hunter.io (or another provider) without changing the rest of the workflow. If you prefer OpenAI, replace the Gemini chat model in the message generation section and keep the structured output parser so the headline/body stays clean.
Usually it’s Gmail API access not being enabled in the correct Google Cloud project, or the OAuth consent screen/scopes weren’t set up to allow draft creation. Reconnect the Gmail credential in n8n after enabling the API, then rerun a single test execution. If it works once and then fails later, check for expired OAuth permissions.
If you self-host, volume is mostly limited by your server and your API rate limits, not n8n itself.
Often, yes. This workflow mixes multi-step data shaping (splitting fields, merging streams, filtering) with AI output that needs to be structured, and n8n is simply more comfortable doing that without turning into a fragile chain of mini-zaps. It’s also easier to self-host, which matters if you’re running daily sourcing at higher volume. Zapier or Make can still work if you simplify the flow and don’t need the decision-maker pull or structured parsing. If you’re unsure, Talk to an automation expert and get a straight recommendation.
Once this is running, outreach stops being a “big task” you dread. You just open Gmail, review the drafts, and hit send when they look right.
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.