Apollo + Google Sheets: LinkedIn outreach stays tidy
LinkedIn outreach gets messy fast. Leads live in Apollo, notes end up in DMs, and your “source of truth” is… a half-updated spreadsheet nobody trusts.
Growth marketers feel it when campaigns stall. Sales reps feel it when follow-ups slip. Agency operators trying to keep multiple clients moving feel it too. This Apollo Sheets outreach automation keeps everything in one place and makes your connection requests feel personal, not spammy.
You’ll see how this n8n workflow turns a plain-English audience description into Apollo leads, generates AI icebreakers, logs every prospect in Google Sheets (with dedupe-friendly structure), then launches PhantomBuster to send invites.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Apollo + Google Sheets: LinkedIn outreach stays tidy
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["<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/>Run Apify Actor & Get Results"]
n2@{ icon: "mdi:robot", form: "rounded", label: "Generate Search URL", pos: "b", h: 48 }
n3@{ icon: "mdi:cog", form: "rounded", label: "Limit", 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/httprequest.dark.svg' width='40' height='40' /></div><br/>Trigger PhantomBuster Agent"]
n5@{ icon: "mdi:database", form: "rounded", label: "Add to Google Sheet", pos: "b", h: 48 }
n6@{ icon: "mdi:robot", form: "rounded", label: "Personalize Outreach", pos: "b", h: 48 }
n7@{ icon: "mdi:cog", form: "rounded", label: "Aggregate", pos: "b", h: 48 }
n3 --> n6
n7 --> n4
n0 --> n2
n5 --> n7
n2 --> n1
n6 --> n5
n1 --> 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 n0 trigger
class n2,n6 ai
class n5 database
class n1,n4 api
classDef customIcon fill:none,stroke:none
class n0,n1,n4 customIcon
The Problem: LinkedIn outreach turns into spreadsheet chaos
Outreach usually breaks in the boring places. You build a lead list, export it, clean it, paste it into a sheet, then rewrite messages one-by-one because generic invites get ignored. Then you do it again next week, except now you’ve got duplicates, missing fields, and no reliable way to see who was contacted, who connected, and who needs a follow-up. The worst part is the mental load. You spend your best hours babysitting data instead of talking to the right people.
The friction compounds. Here’s where it breaks down in real life.
- Lead exports from Apollo get reworked repeatedly, which means your list quality drifts over time.
- Personalization becomes “I’ll do it later,” because writing 50 decent icebreakers is exhausting.
- Duplicates sneak in, so two teammates can message the same prospect and look careless.
- Without clean status tracking, follow-up timing turns into guesswork and missed replies.
The Solution: Apollo leads + AI icebreakers, tracked in Sheets
This workflow gives you a single, repeatable pipeline for LinkedIn prospecting. It starts with a simple form where you describe your ideal audience in plain English (industry, role, location, company size, keywords). n8n uses OpenAI to convert that description into a properly formatted Apollo search URL, then an HTTP request triggers an Apify scrape to pull lead data at scale. Next, it processes leads in controlled batches so you don’t overload downstream steps or your outreach tool. For each lead, OpenAI generates a short, specific icebreaker using profile and employment details. Finally, everything gets appended into Google Sheets with consistent columns, and PhantomBuster is triggered to send connection requests using those personalized messages.
The workflow begins with a form submission. Then it turns your targeting into an Apollo query, fetches the matching prospects via Apify, and generates one icebreaker per person. Google Sheets becomes the campaign ledger, and PhantomBuster reads from that ledger to run your LinkedIn invites without manual copying.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you want to reach 100 new prospects a week. Manually, that’s often 2 minutes to find each profile, another minute to log it, and about 2 minutes to write a non-cringey invite, which is roughly 8 hours of busywork. With this workflow, you spend about 5 minutes describing the audience in the form, then let the run collect and enrich leads in the background. You review the sheet, spot-check a few icebreakers, and launch PhantomBuster. Most teams get the week’s list ready in under an hour.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Apollo to source targeted lead lists
- Google Sheets to track leads and statuses
- OpenAI API key (get it from the OpenAI API dashboard)
- Apify API token (get it from Apify Console settings)
- PhantomBuster API key (get it from PhantomBuster account settings)
Skill level: Intermediate. You’ll connect a few accounts, map fields into a Sheet, and sanity-check API responses.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
Audience form submission. You enter a plain-English description of who you want to reach. Think “VP Marketing at B2B SaaS in the UK, 50–200 employees,” plus any keywords that matter.
Targeting becomes an Apollo search. OpenAI converts your description into a usable Apollo search URL, so you don’t have to fiddle with filters until something “looks right.”
Leads are collected and enriched in batches. n8n calls Apify via HTTP Request to fetch Apollo lead data, then limits how many items get processed at once. That keeps the workflow stable when you’re pulling hundreds of leads.
Icebreakers and tracking happen automatically. OpenAI crafts an icebreaker per lead, the workflow appends everything into Google Sheets (with consistent column headers), then PhantomBuster is triggered to send connection requests using the sheet as the source.
You can easily modify the message template to match your brand voice and offer. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Form Trigger
Set up the intake form that starts the workflow and captures the audience description.
- Add and open Form Intake Trigger.
- Set Form Title to
LinkedIn Lead Outreach Trigger. - Set Form Description to
Insert an audience for your LinkedIn Outreach Campaign here.. - In Form Fields, keep the textarea labeled
Describe your audience in plain English.. - Credential Required: Connect your
httpBasicAuthcredentials.
Step 2: Connect Apify and PhantomBuster HTTP Actions
Configure the outbound API calls that fetch leads and trigger PhantomBuster.
- Open Execute Apify Fetch and set URL to
https://api.apify.com/v2/acts/jljBwyyQakqrL1wae/run-sync-get-dataset-items. - Set Method to
POSTand Specify Body toJSON. - Set JSON Body to
={ "getPersonalEmails": true, "getWorkEmails": true, "totalRecords": 500, "url": "{{ $json.message.content.searchUrl }}" }. - In Header Parameters, set
AuthorizationtoBearer [CONFIGURE_YOUR_TOKEN]and replace with your Apify token. - Open Launch PhantomBuster Run and set URL to
https://api.phantombuster.com/api/v2/agents/launch. - Set Method to
POST, and in Header Parameters setX-Phantombuster-Keyto[CONFIGURE_YOUR_API_KEY]. - In Body Parameters, set id to
[YOUR_ID]for the PhantomBuster agent.
Step 3: Set Up the AI Processing Nodes
Use OpenAI to generate the search URL and personalized icebreaker text.
- Open Create Search Link and keep JSON Output enabled.
- Ensure the user message uses the expression
{{ $json['Describe your audience in plain English.'] }}to pass the form input. - Credential Required: Connect your
openAiApicredentials. - Open Craft Icebreaker Text and keep JSON Output enabled.
- Verify the final user message includes the expression
={"linkedInFields":"{{ $json.first_name }} {{ $json.last_name }}, {{ $json.city }}, {{ $json.title }} at {{ $json.employment_history[0].organization_name }}, previous experience: {{ $json.employment_history[1].title }} at {{ $json.employment_history[1].organization_name }}, {{ $json.employment_history[2].title }} at {{ $json.employment_history[2].organization_name }}"}. - Credential Required: Connect your
openAiApicredentials.
Step 4: Configure Output and Aggregation
Limit the batch size, write lead data to Google Sheets, and aggregate items before triggering PhantomBuster.
- Open Restrict Batch Size and set Max Items to
3. - Open Append Leads to Sheet and set Operation to
appendOrUpdate. - Set Document ID to
[YOUR_ID]and Sheet Name togid=[YOUR_ID]based on your Google Sheet. - In Columns, map fields using expressions like
={{ $('Restrict Batch Size').item.json.id }}and={{ $json.message.content.icebreaker }}. - Credential Required: Connect your
googleSheetsOAuth2Apicredentials. - Open Combine Lead Batch and set Aggregate to
aggregateAllItemData.
Step 5: Test and Activate Your Workflow
Run a manual test to validate the form intake, AI output, and downstream API calls.
- Click Execute Workflow and submit a sample form entry to Form Intake Trigger.
- Confirm Create Search Link returns a JSON object containing
searchUrl. - Verify Execute Apify Fetch returns lead items, then Restrict Batch Size limits to
3records. - Check Craft Icebreaker Text outputs
icebreakerin JSON, and Append Leads to Sheet writes new rows. - Confirm Launch PhantomBuster Run returns a success response from the API.
- Once successful, toggle the workflow to Active for production use.
Common Gotchas
- Google Sheets permissions are the quiet killer. If rows stop appending, check the connected Google account in n8n credentials and confirm the Sheet is shared correctly.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- OpenAI prompts that are too generic create bland invites. Add your positioning and a few “what we do” examples early, or you will be editing outputs forever.
Frequently Asked Questions
About 1–2 hours if your accounts and API keys are ready.
No. You’ll mainly connect credentials and map fields into your Sheet.
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 OpenAI, Apify, and PhantomBuster usage (many teams land around $50/month all-in for this stack).
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. Swap the prompt inside the “Craft Icebreaker Text” OpenAI node to match your tone, your offer, and your compliance rules. Common tweaks include adding a strict character limit, forcing a “no pitch” first message, or inserting a dynamic line based on job title (for example, different openers for Sales vs. Marketing). You can also change the sheet columns so your team can approve messages before PhantomBuster runs.
Usually it’s an expired OAuth session or the wrong Google account connected. Re-auth the Google Sheets credential in n8n, then confirm the Sheet ID in the “Append Leads to Sheet” node matches the actual file. Also check sharing permissions, especially if the sheet lives in a shared drive with stricter access rules.
Hundreds per run.
Often, yes, because this flow benefits from batching, conditional logic, and chaining multiple HTTP calls without turning into a fragile maze. n8n also gives you the self-hosting option, which is a big deal when you’re running lots of executions and don’t want per-task pricing surprises. Another advantage is transparency: you can see exactly what data went into an icebreaker and what got written to Google Sheets. Zapier or Make can still be fine for a lightweight “add row to sheet” use case, but end-to-end prospecting usually outgrows simple zaps. If you’re on the fence, Talk to an automation expert and get a straight recommendation.
Once this is running, your LinkedIn outreach stops living in five places at once. The workflow handles the repetitive parts so you can focus on conversations that turn into pipeline.
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.