LinkedIn + Google Sheets: leads scored and messaged
LinkedIn lead gen usually falls apart in the boring parts. Copying profiles into a sheet, skimming company sites, guessing who’s “worth” messaging, then rewriting the same outreach for the tenth time.
Marketing ops teams feel this when the pipeline looks busy but conversions don’t move. A solo founder feels it when “quick prospecting” turns into a two-hour rabbit hole. And agencies running outbound for clients? Same mess, bigger volume. This LinkedIn lead scoring automation pulls prospects into Google Sheets, enriches them with OpenAI, then drafts messages you can approve.
Below, you’ll see exactly what the workflow does, what you get out of it, and where teams usually trip up when they try to automate LinkedIn outreach.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: LinkedIn + Google Sheets: leads scored and messaged
flowchart LR
subgraph sg0["Schedule Flow"]
direction LR
n0@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model", pos: "b", h: 48 }
n1@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser", pos: "b", h: 48 }
n2@{ icon: "mdi:database", form: "rounded", label: "Google Sheets2", pos: "b", h: 48 }
n3@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items", pos: "b", h: 48 }
n4@{ icon: "mdi:cog", form: "rounded", label: "HDW LinkedIn SN", pos: "b", h: 48 }
n5@{ icon: "mdi:cog", form: "rounded", label: "HDW Get Company Website", pos: "b", h: 48 }
n6@{ icon: "mdi:database", form: "rounded", label: "Google Sheets3", pos: "b", h: 48 }
n7@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items1", pos: "b", h: 48 }
n8@{ icon: "mdi:database", form: "rounded", label: "Google Sheets4", pos: "b", h: 48 }
n9@{ icon: "mdi:cog", form: "rounded", label: "HDW Get User Posts", pos: "b", h: 48 }
n10@{ icon: "mdi:cog", form: "rounded", label: "Aggregate", pos: "b", h: 48 }
n11@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items2", pos: "b", h: 48 }
n12@{ icon: "mdi:database", form: "rounded", label: "Google Sheets5", pos: "b", h: 48 }
n13@{ icon: "mdi:database", form: "rounded", label: "Google Sheets6", pos: "b", h: 48 }
n14@{ icon: "mdi:cog", form: "rounded", label: "Aggregate1", pos: "b", h: 48 }
n15@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items3", pos: "b", h: 48 }
n16@{ icon: "mdi:database", form: "rounded", label: "Google Sheets7", pos: "b", h: 48 }
n17@{ icon: "mdi:database", form: "rounded", label: "Google Sheets8", pos: "b", h: 48 }
n18@{ icon: "mdi:cog", form: "rounded", label: "Aggregate2", pos: "b", h: 48 }
n19@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items4", pos: "b", h: 48 }
n20@{ icon: "mdi:database", form: "rounded", label: "Google Sheets9", pos: "b", h: 48 }
n21@{ icon: "mdi:cog", form: "rounded", label: "HDW Get Company News", pos: "b", h: 48 }
n22@{ icon: "mdi:cog", form: "rounded", label: "HDW Get Company Posts", pos: "b", h: 48 }
n23@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Out", pos: "b", h: 48 }
n24@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model1", pos: "b", h: 48 }
n25@{ icon: "mdi:database", form: "rounded", label: "Google Sheets10", pos: "b", h: 48 }
n26@{ icon: "mdi:cog", form: "rounded", label: "HDW Site-map", pos: "b", h: 48 }
n27@{ icon: "mdi:cog", form: "rounded", label: "HDW Parser", pos: "b", h: 48 }
n28@{ icon: "mdi:robot", form: "rounded", label: "Summarise user posts", pos: "b", h: 48 }
n29@{ icon: "mdi:robot", form: "rounded", label: "Summarise company news", pos: "b", h: 48 }
n30@{ icon: "mdi:robot", form: "rounded", label: "Summarise company posts", pos: "b", h: 48 }
n31@{ icon: "mdi:robot", form: "rounded", label: "Summarise company website", pos: "b", h: 48 }
n32@{ icon: "mdi:database", form: "rounded", label: "Google Sheets11", pos: "b", h: 48 }
n33@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items6", pos: "b", h: 48 }
n34@{ icon: "mdi:database", form: "rounded", label: "Google Sheets12", pos: "b", h: 48 }
n35@{ icon: "mdi:database", form: "rounded", label: "Google Sheets13", pos: "b", h: 48 }
n36@{ icon: "mdi:cog", form: "rounded", label: "Sort", pos: "b", h: 48 }
n37@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If2", pos: "b", h: 48 }
n38@{ icon: "mdi:cog", form: "rounded", label: "Limit", pos: "b", h: 48 }
n39@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items7", pos: "b", h: 48 }
n40@{ icon: "mdi:database", form: "rounded", label: "Google Sheets14", pos: "b", h: 48 }
n45@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger", pos: "b", h: 48 }
n48@{ icon: "mdi:cog", form: "rounded", label: "HDW Send LinkedIn Connection", pos: "b", h: 48 }
n49@{ icon: "mdi:robot", form: "rounded", label: "AI Agent: ICP - LinkedIn sea..", pos: "b", h: 48 }
n50@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Company name is not empty", pos: "b", h: 48 }
n51@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Website is not empty", pos: "b", h: 48 }
n52@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Post summary is empty", pos: "b", h: 48 }
n53@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Company news is empty", pos: "b", h: 48 }
n54@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Company post is empty", pos: "b", h: 48 }
n55@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Lead Score is empty", pos: "b", h: 48 }
n56@{ icon: "mdi:robot", form: "rounded", label: "Company Score Analysis", pos: "b", h: 48 }
n58@{ icon: "mdi:memory", form: "rounded", label: "Simple Memory", pos: "b", h: 48 }
n59@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If", pos: "b", h: 48 }
n60@{ icon: "mdi:robot", form: "rounded", label: "Basic LLM Chain", pos: "b", h: 48 }
n61@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model2", pos: "b", h: 48 }
n65@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If4", pos: "b", h: 48 }
n66@{ icon: "mdi:database", form: "rounded", label: "Read companies", pos: "b", h: 48 }
n67@{ icon: "mdi:database", form: "rounded", label: "Save new companies", pos: "b", h: 48 }
n68@{ icon: "mdi:play-circle", form: "rounded", label: "Discourse your ICP with Agent", pos: "b", h: 48 }
n69@{ icon: "mdi:robot", form: "rounded", label: "ICP Agent", pos: "b", h: 48 }
n70["<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"]
n59 --> n49
n59 --> n60
n37 --> n38
n65 --> n5
n65 --> n3
n36 --> n37
n38 --> n39
n70 --> n32
n10 --> n28
n69 --> n59
n23 --> n4
n14 --> n29
n18 --> n30
n27 -.-> n31
n26 -.-> n31
n58 -.-> n69
n2 --> n3
n6 --> n51
n8 --> n52
n12 --> n11
n13 --> n53
n16 --> n15
n17 --> n54
n20 --> n19
n66 --> n50
n25 --> n7
n32 --> n55
n34 --> n33
n35 --> n36
n40 --> n39
n4 --> n67
n3 --> n6
n3 --> n8
n3 --> n13
n3 --> n17
n3 --> n65
n7 --> n70
n7 --> n31
n11 --> n70
n11 --> n9
n15 --> n70
n15 --> n21
n19 --> n70
n19 --> n22
n33 --> n35
n33 --> n56
n39 --> n48
n45 --> n35
n0 -.-> n49
n9 --> n10
n24 -.-> n31
n61 -.-> n69
n61 -.-> n60
n67 --> n66
n55 --> n33
n21 --> n14
n28 --> n12
n51 --> n7
n53 --> n15
n54 --> n19
n22 --> n18
n52 --> n11
n56 --> n34
n29 --> n16
n5 --> n2
n30 --> n20
n1 -.-> n49
n50 --> n3
n31 --> n25
n48 --> n40
n68 --> n69
n49 --> n23
end
subgraph sg1["Schedule Flow"]
direction LR
n42@{ icon: "mdi:database", form: "rounded", label: "Google Sheets17", pos: "b", h: 48 }
n43@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items8", pos: "b", h: 48 }
n44@{ icon: "mdi:cog", form: "rounded", label: "HDW LinkedIn Send Message", pos: "b", h: 48 }
n57@{ icon: "mdi:cog", form: "rounded", label: "5s", pos: "b", h: 48 }
n62@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger3", pos: "b", h: 48 }
n63@{ icon: "mdi:database", form: "rounded", label: "Google Sheets21", pos: "b", h: 48 }
n64@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If3", pos: "b", h: 48 }
n57 --> n44
n64 --> n43
n42 --> n43
n63 --> n64
n43 --> n57
n62 --> n63
n44 --> n42
end
subgraph sg2["Schedule Flow"]
direction LR
n41@{ icon: "mdi:database", form: "rounded", label: "Google Sheets15", pos: "b", h: 48 }
n46@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger1", pos: "b", h: 48 }
n47@{ icon: "mdi:cog", form: "rounded", label: "HDW Get LinkedIn Profile Con..", pos: "b", h: 48 }
n46 --> n47
n47 --> n41
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 n45,n68,n62,n46 trigger
class n1,n28,n29,n30,n31,n49,n56,n60,n69 ai
class n0,n24,n61 aiModel
class n58 ai
class n37,n50,n51,n52,n53,n54,n55,n59,n65,n64 decision
class n2,n6,n8,n12,n13,n16,n17,n20,n25,n32,n34,n35,n40,n66,n67,n42,n63,n41 database
classDef customIcon fill:none,stroke:none
class n70 customIcon
The Problem: LinkedIn Prospecting Becomes Busywork
Finding good prospects on LinkedIn is not the hard part. The hard part is everything you do after you find them. You open ten tabs, scan a site for clues, read a few posts, try to guess intent, then paste scraps into a spreadsheet that no one trusts. Next day, you can’t remember why Lead #14 looked promising, so you re-research them. It’s exhausting, and it quietly kills consistency, which is what outbound needs to work at all.
It adds up fast. And the friction compounds once you try to scale beyond a handful of leads.
- Prospect data ends up scattered across LinkedIn tabs, notes, and half-filled rows in Google Sheets.
- Lead quality is decided by gut feel, so two people will score the same profile very differently.
- Personalized messaging turns into a template factory, which means replies drop and you end up blaming the offer.
- Manual follow-ups break the moment your week gets busy, and the “pipeline” goes stale overnight.
The Solution: Turn an ICP Into Scored Leads and Drafted Outreach
This workflow takes you from “Here’s who we want to target” to “Here are the best leads, ranked, with outreach drafted” without living inside LinkedIn all day. You start by giving the AI Agent your Ideal Customer Profile in plain English (for example, “marketing directors at SaaS companies with 50–200 employees”). The workflow converts that ICP into LinkedIn search parameters, finds matching prospects, and saves the structured lead data into Google Sheets. Then it enriches each lead by pulling context from sources like the company website, relevant posts, and recent mentions, and asks OpenAI to evaluate intent signals. Finally, it scores each lead on a 1–10 scale and prepares connection requests and follow-up messages, so you can move quickly while keeping control.
The workflow starts with an ICP prompt (often sent via Telegram or a webhook, depending on how you prefer to kick it off). It gathers prospects, merges and cleans fields, and loops through leads in batches to stay stable. Then OpenAI generates both a lead score and an outreach draft, and the workflow can send messages to the top-scoring leads once your connection is accepted.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you want to message 40 new LinkedIn prospects a week. Manually, if you spend about 8 minutes collecting basics and another 7 minutes skimming for context and writing a first message, that’s roughly 10 hours. With this workflow, you spend maybe 15 minutes writing or tweaking your ICP prompt, then let it run in batches while it fills Google Sheets, scores leads, and drafts outreach. You still review before sending, but the heavy lifting is done, so your “prospecting day” becomes a short review session instead of a half-day project.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets to store and review leads.
- OpenAI to enrich context, score, and draft messages.
- AnySite API key (get it from your AnySite.io dashboard)
Skill level: Intermediate. You’ll connect credentials, create a sheet with the right columns, and adjust a couple of prompts to match your offer.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A message, webhook, or scheduled run kicks things off. You provide an ICP description, and the workflow uses it as the single source of truth for targeting. Keep it simple at first. You can tighten it later.
Lead discovery and capture happens next. The LinkedIn search runs, results are cleaned up with basic logic (like “If” rules and field mapping), and leads are written into Google Sheets so you have a visible, auditable list.
Enrichment and scoring happen in a loop. For each lead, the workflow fetches additional context via HTTP requests, merges it into a single view, then asks OpenAI to score the lead (1–10) based on your criteria and the intent signals it finds. Frankly, this is where most teams see the biggest upgrade, because it removes the “who do we do first?” debate.
Outreach is drafted and optionally sent. The workflow prepares connection requests and follow-up messages for high-scoring leads, and it can send messages when a connection is accepted (so you don’t have to babysit timing). You review the drafts in your sheet or notifications, then approve what goes out.
You can easily modify the scoring criteria to match your offer and market based on your needs. See the full implementation guide below for customization options.
Common Gotchas
- Google Sheets credentials can expire or need specific permissions. If things break, check the Google connection inside n8n credentials first and confirm the sheet is still shared with the same account.
- If you’re using Wait nodes or external enrichment via HTTP Request, 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
Plan on about 60–90 minutes if your accounts and sheet are ready.
No. You’ll mostly connect accounts, paste API keys, and edit a couple of prompts.
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 usage (often a few dollars a month at low volume).
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 ICP prompt inside the AI Agent node, then adjust the scoring prompt in the “Company Score Analysis” step so it reflects what a good-fit lead looks like for you. Most teams also tweak the message template used by the AnySite LinkedIn Send Message action to match brand tone, and they add simple filters (like location or industry) before a lead is allowed to be messaged.
Usually it’s one of three things: the AnySite API key is missing/expired, the AnySite LinkedIn community node isn’t installed correctly, or your LinkedIn account is hitting rate limits. Double-check the AnySite credentials in n8n first, then confirm you’re running on a self-hosted instance (n8n Cloud will not support that community node). If it still fails, slow the workflow down with batching and spacing so requests look more human and you stop getting blocked.
On a typical self-hosted setup, hundreds of leads per week is realistic as long as you respect LinkedIn limits (roughly 100–200 connection requests weekly). The workflow itself can process more, but LinkedIn is the bottleneck, so batching and scheduling matter more than raw compute.
Often, yes, because this kind of workflow needs branching logic, looping in batches, and more control over how data is merged and evaluated. n8n also gives you the option to self-host, which is a big deal when you’re running frequent lead enrichment and don’t want every run metered. The catch is important though: this workflow relies on a community LinkedIn node that won’t run on n8n Cloud, and Zapier/Make may be simpler if you only want to move leads between apps. If you’re unsure, Talk to an automation expert and describe your volume and risk tolerance.
Once this is in place, your Google Sheet becomes the control center: who to contact, why they’re a fit, and what to say next. You keep the judgment. The workflow handles the grind.
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.