Google Sheets + LinkedIn, smarter prospect lists
Your “prospect list” shouldn’t be a messy spreadsheet full of half-researched companies, missing emails, and notes you don’t trust. But that’s what happens when LinkedIn research, enrichment, scoring, and outreach drafting live in a dozen browser tabs.
This LinkedIn Sheets automation hits growth marketers and sales ops hardest. Agency owners doing outbound for clients feel it too. The goal is simple: build cleaner prospect lists automatically, so your follow-ups happen faster and your CRM stays usable.
This workflow pulls target companies from LinkedIn, scores fit with AI, enriches decision-makers, then drafts a personalized 3-email sequence and stores everything in Google Sheets. You’ll see what it does, why it works, and what you need to run it daily.
How This Automation Works
See how this solves the problem:
n8n Workflow Template: Google Sheets + LinkedIn, smarter prospect lists
flowchart LR
subgraph sg0["Scheduled Automation Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "Scheduled Automation Trigger", pos: "b", h: 48 }
n1@{ icon: "mdi:cog", form: "rounded", label: "Combine Settings Data", pos: "b", h: 48 }
n2@{ icon: "mdi:database", form: "rounded", label: "Restore Company List", pos: "b", h: 48 }
n3@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Filter Score & Status", pos: "b", h: 48 }
n4@{ icon: "mdi:swap-vertical", form: "rounded", label: "Iterate Company Records", pos: "b", h: 48 }
n5["<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/>Retrieve Decision Makers"]
n6@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Validate Profiles Found", pos: "b", h: 48 }
n7@{ icon: "mdi:swap-vertical", form: "rounded", label: "Expand Profiles List", pos: "b", h: 48 }
n8["<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/>Fetch Contact Email"]
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/httprequest.dark.svg' width='40' height='40' /></div><br/>Fetch Profile Details"]
n10@{ icon: "mdi:robot", form: "rounded", label: "Build Personalization Brief", pos: "b", h: 48 }
n11@{ icon: "mdi:robot", form: "rounded", label: "Draft Email Sequence", pos: "b", h: 48 }
n12@{ icon: "mdi:robot", form: "rounded", label: "Create Email Subjects", pos: "b", h: 48 }
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/>Extract Key Profile Data"]
n14@{ icon: "mdi:database", form: "rounded", label: "Append Leads to Sheet", pos: "b", h: 48 }
n15@{ icon: "mdi:database", form: "rounded", label: "Mark Leads Enriched", pos: "b", h: 48 }
n16@{ icon: "mdi:cog", form: "rounded", label: "Cap Daily Companies", pos: "b", h: 48 }
n30@{ icon: "mdi:database", form: "rounded", label: "Load Settings Sheet B", pos: "b", h: 48 }
n32@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Validate Settings B", pos: "b", h: 48 }
n33@{ icon: "mdi:location-exit", form: "rounded", label: "Stop: Missing API Settings B", pos: "b", h: 48 }
n35@{ icon: "mdi:database", form: "rounded", label: "Update No Decision Maker", pos: "b", h: 48 }
n32 --> n2
n32 --> n33
n16 --> n4
n1 --> n32
n8 --> n13
n14 --> n15
n30 --> n1
n15 --> n4
n5 --> n6
n7 --> n9
n4 --> n5
n0 --> n30
n2 --> n3
n9 --> n8
n6 --> n7
n6 --> n35
n10 --> n11
n3 --> n16
n35 --> n4
n11 --> n12
n12 --> n14
n13 --> n10
end
subgraph sg1["Manual Execution Start Flow"]
direction LR
n17@{ icon: "mdi:swap-vertical", form: "rounded", label: "Process Company Batch", pos: "b", h: 48 }
n18["<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/>Fetch Company Details"]
n19@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Validate Company Criteria", pos: "b", h: 48 }
n20@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check New Company", pos: "b", h: 48 }
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/httprequest.dark.svg' width='40' height='40' /></div><br/>Search Target Companies"]
n22@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Company Results", pos: "b", h: 48 }
n23@{ icon: "mdi:database", form: "rounded", label: "Lookup Company Existence", pos: "b", h: 48 }
n24@{ icon: "mdi:robot", form: "rounded", label: "AI Company Rating", pos: "b", h: 48 }
n25@{ icon: "mdi:database", form: "rounded", label: "Record Company to CRM", pos: "b", h: 48 }
n26@{ icon: "mdi:cog", form: "rounded", label: "Combine Settings Data A", pos: "b", h: 48 }
n27@{ icon: "mdi:play-circle", form: "rounded", label: "Manual Execution Start", pos: "b", h: 48 }
n28@{ icon: "mdi:robot", form: "rounded", label: "Generate Search Keywords", pos: "b", h: 48 }
n29@{ icon: "mdi:database", form: "rounded", label: "Load Settings Sheet", pos: "b", h: 48 }
n31@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Validate Settings A", pos: "b", h: 48 }
n34@{ icon: "mdi:location-exit", form: "rounded", label: "Stop: Missing API Settings", pos: "b", h: 48 }
n31 --> n28
n31 --> n34
n27 --> n29
n26 --> n31
n29 --> n26
n20 --> n24
n20 --> n17
n18 --> n19
n21 --> n22
n24 --> n25
n25 --> n17
n22 --> n17
n17 --> n18
n19 --> n23
n19 --> n17
n23 --> n20
n28 --> n21
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,n27 trigger
class n10,n11,n12,n24,n28 ai
class n3,n6,n32,n19,n20,n31 decision
class n2,n14,n15,n30,n35,n23,n25,n29 database
class n5,n8,n9,n18,n21 api
class n13 code
classDef customIcon fill:none,stroke:none
class n5,n8,n9,n13,n18,n21 customIcon
The Challenge: Prospecting that never stays “done”
Manual prospecting isn’t just slow. It’s fragile. You start with a LinkedIn search, copy a company name into a sheet, open another tab for the website, then try to guess if they’re a fit. Next comes the harder part: finding the right decision-maker, pulling enough context to personalize, and then hunting for an email address that might bounce anyway. By the time you’re ready to send outreach, the list is already stale, and you’ve lost the thread on why you picked those accounts in the first place.
The friction compounds. Here’s where it breaks down in real life:
- You end up spending about 5–10 minutes per company just to collect basics (site, size, summary), and that’s before you even qualify them.
- Fit scoring becomes a gut call, which means you chase accounts that were never going to convert.
- Decision-maker research is inconsistent because you’re relying on memory and manual notes across LinkedIn profiles.
- Outreach drafts get written late (or not at all), so leads sit in Sheets with no next step.
The Fix: A daily LinkedIn-to-Sheets prospecting engine
This n8n workflow turns prospecting into a repeatable system that runs on a schedule. It starts by loading your targeting settings from Google Sheets (things like location, company size, and the filters you care about), then uses the Ghost Genius API to search LinkedIn for matching companies. For each company, it enriches the record with details like the website, description, and follower count, then asks OpenAI to score the fit from 0 to 10 based on your offer. Only companies that pass the threshold (score 7 or higher) get saved into your Google Sheets CRM. After that, it finds decision-makers through LinkedIn Sales Navigator, enriches their profile context, retrieves a verified email using a “waterfall” approach, and generates a personalized 3-email cold sequence with subjects included. Finally, it updates the lead status in the sheet so you can see exactly what was processed today.
The workflow begins on a daily schedule (or manual run if you prefer). It then moves through three phases: company discovery and scoring, decision-maker enrichment, and outreach drafting plus CRM updates. You end the day with a list that’s ready to contact, not a list that still needs research.
What Changes: Before vs. After
| What This Eliminates | Impact You’ll See |
|---|---|
|
|
Real-World Impact
Say you want to add 20 new companies to your outbound list each day. Manually, you might spend about 10 minutes per company to capture details and decide if it’s a fit, plus another 10 minutes finding a decision-maker and drafting a first-pass message. That’s roughly 6–7 hours for 20 accounts. With this workflow, you spend maybe 15 minutes updating targeting settings in Google Sheets, then let it run on schedule; by the time you’re back, qualified companies, contacts, and a 3-email sequence are already in your CRM sheet.
Requirements
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets for CRM storage and targeting settings.
- Ghost Genius API to search LinkedIn (cookieless).
- OpenAI API key (get it from the OpenAI API dashboard).
Skill level: Intermediate. You’ll connect accounts, add API keys, and map a few fields in Sheets.
Need help implementing this? Talk to an automation expert (free 15-minute consultation).
The Workflow Flow
Schedule-based run with guardrails. The workflow kicks off on a daily schedule (or via manual start for testing). It immediately loads your settings from Google Sheets and stops with a clear error if required API settings are missing.
Company discovery, then AI scoring. Using your settings, it generates search keywords and pulls matching companies from LinkedIn via HTTP requests. Each company is enriched with key details, scored by OpenAI from 0 to 10, then filtered so only strong fits (7+) move forward.
CRM write + “no duplicates” handling. Before saving a company, it checks if it already exists in your Google Sheets CRM. New companies get recorded, and the workflow processes them in batches to cap daily volume and keep runs stable.
Decision-makers, emails, and outreach drafts. For qualified companies, it retrieves decision-makers (Sales Navigator), expands profiles, fetches details, then attempts email discovery through a waterfall enrichment step. OpenAI uses the profile context to build a personalization brief, write a 3-email sequence, and generate subject lines, then everything is appended to your sheet and marked as enriched.
You can easily modify the scoring threshold (like 7/10) to fit your pipeline, or swap out which job titles count as “decision-maker” based on your ICP. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Schedule Trigger
This workflow can run on a schedule or be started manually for testing. Configure both triggers so you can test and then automate on a schedule.
- Open Scheduled Automation Trigger and set the schedule rule you want for automation (the workflow currently has a blank interval object to be filled).
- Keep Manual Execution Start enabled for on-demand runs and testing.
- Confirm the flow: Manual Execution Start → Load Settings Sheet and Scheduled Automation Trigger → Load Settings Sheet B.
Step 2: Connect Google Sheets
Multiple nodes read and write to Google Sheets for settings, company CRM, and lead output.
- In Load Settings Sheet and Load Settings Sheet B, select the Settings sheet from the document
1tRjZTbM10koP6kpXzfIf9LzuuvnDcPAtv7fTTC36SnE. - Credential Required: Connect your googleSheetsOAuth2Api credentials in Load Settings Sheet and Load Settings Sheet B.
- Connect the same credentials in all Google Sheets nodes used for CRM and lead updates: Restore Company List, Lookup Company Existence, Record Company to CRM, Append Leads to Sheet, Mark Leads Enriched, and Update No Decision Maker.
- Verify that Append Leads to Sheet writes to the
Leadssheet and Mark Leads Enriched updates theCompaniessheet using LinkedIn as the matching column.
Step 3: Set Up Settings Aggregation and Validation
Settings are loaded, aggregated, and validated before API calls are made. The workflow stops early if required values are missing.
- In Combine Settings Data A and Combine Settings Data, keep Aggregate set to
aggregateAllItemDataand Destination Field Name set tosettings. - In Validate Settings A and Validate Settings B, confirm the required fields are checked with expressions like
{{ $json.settings[6]['Value (edit with your use case)'] }}and{{ $json.settings[2]['Value (edit with your use case)'] }}. - Verify the error routes are connected: Validate Settings A → Stop: Missing API Settings and Validate Settings B → Stop: Missing API Settings B.
Step 4: Set Up AI Keyword Generation and Company Discovery
This path generates search keywords, retrieves companies, validates them, and writes qualified companies to the CRM sheet.
- In Generate Search Keywords, keep JSON Output enabled and confirm the prompt uses
{{ $json.settings[1]['Value (edit with your use case)'] }}. - Credential Required: Connect your openAiApi credentials in Generate Search Keywords.
- In Search Target Companies, verify pagination and query parameters, including keywords set to
{{ $json.message.content.keywords }}and headers withAuthorization: Bearer {{ $('Combine Settings Data A').item.json.settings[6]['Value (edit with your use case)'] }}. - Confirm the flow: Search Target Companies → Split Company Results → Process Company Batch → Fetch Company Details → Validate Company Criteria → Lookup Company Existence → Check New Company → AI Company Rating → Record Company to CRM.
- In Validate Company Criteria, keep checks for
{{ $json.website }}and{{ $json.followers_count }}(must be > 200). - Credential Required: Connect your openAiApi credentials in AI Company Rating, and googleSheetsOAuth2Api in Record Company to CRM.
Step 5: Restore and Filter Existing Companies for Enrichment
The scheduled path restores the CRM company list, filters qualified entries, caps daily processing, and iterates for enrichment.
- In Restore Company List, confirm the document is
1tRjZTbM10koP6kpXzfIf9LzuuvnDcPAtv7fTTC36SnEand sheetCompanies. - Credential Required: Connect your googleSheetsOAuth2Api credentials in Restore Company List.
- In Filter Score & Status, keep conditions: Score
{{ $json.Score }}≥7and State{{ $json.State }}equalsQualified. - In Cap Daily Companies, set Max Items to
100to throttle daily processing. - Confirm the flow: Restore Company List → Filter Score & Status → Cap Daily Companies → Iterate Company Records.
Step 6: Configure Decision-Maker Enrichment and Personalization
This section retrieves decision makers, enriches profile details, and generates personalization content and email sequences.
- In Retrieve Decision Makers, keep the URL
https://api.ghostgenius.fr/v2/private/sales-navigatorand set query values with expressions like{{ $('Iterate Company Records').item.json.ID }}and{{ $('Combine Settings Data').item.json.settings[2]['Value (edit with your use case)'] }}. - In Validate Profiles Found, ensure the condition checks
{{ $json.total }}is ≥1and routes to Expand Profiles List or Update No Decision Maker. - Keep the flow: Expand Profiles List → Fetch Profile Details → Fetch Contact Email → Extract Key Profile Data.
- In Extract Key Profile Data, retain the JavaScript that reads
experiences[0]fields and outputs a simplified object. - Credential Required: Connect your openAiApi credentials in Build Personalization Brief, Draft Email Sequence, and Create Email Subjects.
experiences[0] exists. If the API returns empty experiences, consider adding null checks or a fallback in the Code node.Step 7: Configure Output to Leads and Company Status Updates
After emails and subjects are generated, the workflow writes leads to the Leads sheet and updates company status in the Companies sheet.
- In Create Email Subjects, keep the sequence input expressions like
{{ $json.message.content.initial_email }}and output JSON fieldssubject_1,subject_2,subject_3. - In Append Leads to Sheet, confirm Operation is
appendand map columns using expressions such as{{ $('Fetch Contact Email').item.json.email }}and{{ $('Draft Email Sequence').item.json.message.content.initial_email }}. - In Mark Leads Enriched, keep Operation set to
appendOrUpdatewith State set toEnrichedand LinkedIn set to{{ $('Iterate Company Records').item.json.LinkedIn }}. - In Update No Decision Maker, confirm it updates State to
No decision maker foundfor the same LinkedIn key.
Step 8: Add Error Handling
This workflow uses stop-and-error nodes and continue-on-error settings to prevent bad data from flowing downstream.
- Keep Stop: Missing API Settings and Stop: Missing API Settings B connected from Validate Settings A and Validate Settings B to block runs without required API values.
- Note that Process Company Batch and Fetch Company Details have On Error set to
continueRegularOutputto avoid failing the entire workflow.
Step 9: Test and Activate Your Workflow
Run a manual test to verify settings, API calls, AI outputs, and sheet updates before scheduling automation.
- Click Execute Workflow from Manual Execution Start to test the end-to-end flow.
- Successful execution should append a new company row in Record Company to CRM, create new lead rows in Append Leads to Sheet, and update the company status in Mark Leads Enriched or Update No Decision Maker.
- Once verified, activate the workflow and confirm Scheduled Automation Trigger is set to your desired interval.
Watch Out For
- Ghost Genius API credentials can expire or require specific plan access. If the LinkedIn search suddenly returns nothing, check your Ghost Genius dashboard and the n8n credential used 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
About 45 minutes if your APIs and Sheets are ready.
Yes. You won’t write code, but you will need to connect accounts and map a few Google Sheets columns carefully.
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 API costs (usually a few cents per company, depending on prompt size) and any Ghost Genius API usage.
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.
You can change the targeting without touching the workflow by editing the Google Sheets “settings” rows it loads at the start. If you want stricter qualification, raise the score threshold in the filtering step that keeps scores at 7 or higher. For different outreach, update the prompts in the “Build Personalization Brief,” “Draft Email Sequence,” and “Create Email Subjects” OpenAI nodes. You can also swap the decision-maker criteria by adjusting what the “Retrieve Decision Makers” request pulls from Sales Navigator.
Most of the time it’s expired Google authorization or the sheet was moved to a different Drive location. Reconnect Google Sheets in n8n, then confirm the workflow is pointing at the right spreadsheet ID and tab names. Also check sharing permissions if the sheet belongs to a shared workspace account.
It depends on your cap settings and API limits, but processing 20–50 companies per day is a common starting point.
Often, yes, because this kind of workflow needs batching, branching, and multiple enrichment calls per lead, which can get expensive and awkward in Zapier. n8n is also easier to control when you want “stop if settings are missing” behavior and a daily cap on companies. Another practical point: keeping all the logic in one place makes troubleshooting less maddening. That said, if you only want a simple “new row in Sheets → send email” automation, Zapier or Make can be quicker. Talk to an automation expert if you want a recommendation based on your volume and stack.
Prospecting doesn’t have to be a daily grind of tabs, copying, and guesswork. Set this up once, let it run each morning, and use the time you get back to actually book meetings.
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.