LinkedIn + Google Sheets: track invites and followers
You start with good intentions: “I’ll follow up with everyone who commented.” Then reality hits. Tabs everywhere, duplicate profiles, invites you can’t remember sending, and a spreadsheet that’s already out of date.
This LinkedIn Sheets tracking automation hits marketing managers and growth-focused founders first, but agency operators feel it too. You will turn post engagement into a clean, deduplicated list of leads, invited connections, accepted connections, and Company Page follow invites. Logged automatically.
Below, you’ll see how the workflow runs end-to-end, what you need to set it up, and what kind of time you get back once it’s running on a schedule.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: LinkedIn + Google Sheets: track invites and followers
flowchart LR
subgraph sg0["When clicking ‘Execute workflow’ Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "When clicking ‘Execute workf..", pos: "b", h: 48 }
n1@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items", pos: "b", h: 48 }
n2@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Out", pos: "b", h: 48 }
n3@{ icon: "mdi:database", form: "rounded", label: "Fetch Posts to Scrape", pos: "b", h: 48 }
n4@{ icon: "mdi:database", form: "rounded", label: "Mark Post as scraped", pos: "b", h: 48 }
n5@{ icon: "mdi:cog", form: "rounded", label: "Scrape comments from Post", pos: "b", h: 48 }
n6@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items1", pos: "b", h: 48 }
n7@{ icon: "mdi:database", form: "rounded", label: "Check if already collected", pos: "b", h: 48 }
n8@{ icon: "mdi:database", form: "rounded", label: "Collect leads in sheet", pos: "b", h: 48 }
n9@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If not in sheet", pos: "b", h: 48 }
n24@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Filter", pos: "b", h: 48 }
n24 --> n6
n2 --> n24
n9 --> n8
n9 --> n6
n1 --> n5
n6 --> n4
n6 --> n7
n4 --> n1
n3 --> n1
n8 --> n6
n5 --> n2
n7 --> n9
n0 --> n3
end
subgraph sg1["Schedule Flow"]
direction LR
n10@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger", pos: "b", h: 48 }
n11@{ icon: "mdi:database", form: "rounded", label: "Fetch Leads that have not be..", pos: "b", h: 48 }
n12@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop over leads", pos: "b", h: 48 }
n13@{ icon: "mdi:cog", form: "rounded", label: "Check if a person is a conne..", pos: "b", h: 48 }
n14@{ icon: "mdi:cog", form: "rounded", label: "Send a linked in connection ..", pos: "b", h: 48 }
n15@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If", pos: "b", h: 48 }
n16@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If1", pos: "b", h: 48 }
n17@{ icon: "mdi:database", form: "rounded", label: "Already connected", pos: "b", h: 48 }
n18@{ icon: "mdi:database", form: "rounded", label: "Pending", pos: "b", h: 48 }
n25@{ icon: "mdi:database", form: "rounded", label: "Invite Sent", pos: "b", h: 48 }
n15 --> n14
n15 --> n16
n16 --> n18
n16 --> n17
n18 --> n12
n25 --> n12
n12 --> n13
n10 --> n11
n17 --> n12
n13 --> n15
n14 --> n25
n11 --> n12
end
subgraph sg2["Schedule Flow"]
direction LR
n19@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger1", pos: "b", h: 48 }
n20@{ icon: "mdi:cog", form: "rounded", label: "List your linkedin connections", pos: "b", h: 48 }
n22@{ icon: "mdi:database", form: "rounded", label: "Update connection status", pos: "b", h: 48 }
n26@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split out over connections", pos: "b", h: 48 }
n29["<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/>Code in JavaScript"]
n19 --> n20
n29 --> n22
n26 --> n29
n20 --> n26
end
subgraph sg3["Schedule Flow"]
direction LR
n21@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger2", pos: "b", h: 48 }
n23@{ icon: "mdi:cog", form: "rounded", label: "Invite connections to follow..", pos: "b", h: 48 }
n27@{ icon: "mdi:database", form: "rounded", label: "Get connected leads", pos: "b", h: 48 }
n28@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop over leads2", pos: "b", h: 48 }
n30@{ icon: "mdi:database", form: "rounded", label: "Update invited to page", pos: "b", h: 48 }
n28 --> n23
n21 --> n27
n27 --> n28
n30 --> n28
n23 --> n30
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,n10,n19,n21 trigger
class n9,n24,n15,n16 decision
class n3,n4,n7,n8,n11,n17,n18,n25,n22,n27,n30 database
class n29 code
classDef customIcon fill:none,stroke:none
class n29 customIcon
The Problem: LinkedIn outreach falls apart after the first day
LinkedIn Company Page growth looks simple on paper. Post content, watch engagement roll in, connect with the right people, then invite new connections to follow your page. In practice, it’s death by tiny tasks. You copy profile URLs from commenters, you forget which post you already scraped, and you end up sending invites twice (or not at all). Even worse, you can’t tell what’s working because your “system” lives in browser history, notes, and half-finished spreadsheets.
It adds up fast. Here’s where it breaks down once you try to do it consistently.
- Manually collecting commenters and checking profiles burns about 1-2 hours per batch of posts, and that’s before you send a single invite.
- Without deduping, you keep revisiting the same people, which means you waste time and look sloppy with repeat outreach.
- Invite status is basically invisible unless you click through profiles one by one, so follow-up timing turns into guesswork.
- Inviting accepted connections to follow your Company Page is easy to forget, and that’s the whole point of doing this in the first place.
The Solution: Automated LinkedIn engagement → invites → followers tracking
This workflow turns LinkedIn engagement into a repeatable growth loop using n8n, Browserflow for LinkedIn actions, and a Google Sheets dashboard that stays accurate. It starts by pulling a list of LinkedIn post URLs from a Google Sheet, then scrapes the people who commented (and optionally liked) those posts. Each profile is normalized and checked against your existing sheet so you only add new leads once. From there, scheduled runs take over: the workflow checks who hasn’t been invited yet, sends connection requests, tracks which invites are pending vs. accepted, and finally invites accepted connections to follow your Company Page. Every action updates the same Google Sheet so you always know what happened and when.
The workflow begins when you manually kick off a scrape or when your schedules run. Then it moves through four stages: collect engaged profiles, send connection invites, sync acceptance status, and push Company Page follow invites. The end result is one clean list you can trust, not a pile of screenshots and “I think I already sent that.”
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you scrape engagement from 10 recent posts each week and you typically find 20 real prospects per post. Manually, you might spend about 2 minutes per profile to open, sanity-check, copy the URL, and log it, which is roughly 6-7 hours before invites and follow-ups. With this workflow, you trigger the scrape once, then scheduled runs handle the invites, acceptance sync, and Company Page follow invites automatically. Your “work” becomes reviewing the sheet for a few minutes and tweaking targeting, not doing the clicking.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets for the lead log and post queue.
- Browserflow to scrape engagement and perform LinkedIn actions.
- Browserflow API key (get it from your Browserflow dashboard settings).
Skill level: Intermediate. You’ll connect credentials, install a community node, and paste in your Company Page URL.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
Engagement scraping kicks off from your sheet. You start with a Google Sheet that contains the LinkedIn post URLs you want to mine for leads, and a manual trigger runs the first scrape. As each post is handled, the workflow flags it as processed so you don’t keep re-scraping the same thing.
Profiles get cleaned up before they hit your lead list. Commenters are expanded into individual items, company profiles are filtered out, and profile URLs are normalized so duplicates don’t sneak in under slightly different formats. Then the workflow checks Google Sheets to verify whether the lead already exists.
Connection invites run on a schedule. Every few minutes (or whatever interval you choose), n8n pulls “uninvited” leads from Google Sheets, checks each person’s connection status via Browserflow, and sends an invite only when it makes sense. Pending and connected statuses are written back with timestamps, so the sheet stays truthful.
Accepted connections turn into Company Page follow invites. Another schedule syncs your current LinkedIn connections, matches them back to the sheet, and updates acceptance status. Once someone is marked connected and not yet invited to follow your Company Page, Browserflow sends the “Invite to Follow Page” action and logs that too.
You can easily modify the schedule timing and the lead filters to match your outreach pace. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Manual Trigger
This workflow starts with a manual run and includes three scheduled checks for ongoing LinkedIn actions.
- Open Manual Start Trigger to confirm it will be used for initial testing and on-demand runs.
- Open Scheduled Lead Check and set the interval rule to
daysInterval: 2so it pulls uninvited leads every two days. - Open Scheduled Connection Sync and set the interval rule to
daysInterval: 2for connection status syncing. - Open Scheduled Page Invites and set the interval rule to
daysInterval: 2for page-follow invites.
Step 2: Connect Google Sheets
Google Sheets powers the posts list, lead records, and status updates across the workflow.
- In Retrieve Posts List, set Document to
[YOUR_ID]and Sheet toPosts. Ensure the filter includes scraped_at with=. - In Flag Post Processed, set Operation to
updateand map url to{{ $('Batch Iterate Posts').item.json.url }}and scraped_at to{{$now.toISO()}}. - In Verify Existing Lead, filter by linkedin_url with
{{ $('Batch Process Profiles').item.json.linkedin_url }}in theProfilessheet. - In Append Leads Sheet, set Operation to
appendand map name to{{ $('Batch Process Profiles').item.json.name }}and linkedin_url to{{ $('Batch Process Profiles').item.json.linkedin_url }}. - Apply the same Google Sheets document and sheet IDs to the remaining sheets nodes used for status updates and filters (profiles, accepted leads, and invite flags).
- Credential Required: Connect your googleSheetsOAuth2Api credentials to all Google Sheets nodes (11 nodes handle posts, profiles, and invite statuses).
[YOUR_ID]) or updates will land in the wrong file.Step 3: Set Up Comment Scraping and Lead Intake
This section pulls LinkedIn post commenters, filters out companies, and stores new leads.
- In Batch Iterate Posts, keep the default batch settings to iterate through the posts list.
- In Extract Commenters, set Operation to
scrapeProfilesFromPostComments, Post URL to{{ $('Retrieve Posts List').item.json.url }}, and keep commentsLimit at20. - Credential Required: Connect your browserflowApi credentials to Extract Commenters.
- In Expand Comments, set Field To Split Out to
comments. - In Filter Company Profiles, keep the condition linkedin_url notContains
companyto exclude company pages. - In Branch If New Lead, keep the condition
{{ $json.linkedin_url }}notExists to only append new leads.
Step 4: Configure the Connection Invite Loop
This scheduled loop checks uninvited leads, assesses their status, and sends connection invites as needed.
- In Retrieve Uninvited Leads, keep filters for invited_as_connection and accepted blank to find eligible leads.
- In Assess Connection Status, set linkedinUrl to
{{ $json.linkedin_url }}. - In Connection Needed?, keep the conditions where is_connection equals
falseand is_pending equalsfalseso only new invites are sent. - In Send Connection Invite, set Operation to
sendConnectionInviteand linkedinUrl to{{ $('Iterate Lead Queue').item.json.linkedin_url }}. - In Record Invite Sent and Mark Pending Invite, keep the invited_as_connection timestamp to
{{$now}}and match on linkedin_url. - Credential Required: Connect your browserflowApi credentials to Assess Connection Status and Send Connection Invite.
{{ $now }} but an extra brace may cause a validation error.Step 5: Sync Connections and Normalize URLs
This scheduled path syncs current connections and updates accepted statuses in the leads sheet.
- In List Current Connections, keep Operation as
listConnectionsand limit as20. - In Expand Connection List, set Field To Split Out to
dataso each connection is processed individually. - In Normalize Profile URLs, keep the JavaScript that appends a trailing slash to linkedin_url values.
- In Update Accepted Status, set accepted to
✅and match on linkedin_url. - Credential Required: Connect your browserflowApi credentials to List Current Connections.
Step 6: Configure Page Follow Invites
Once a lead is accepted, this flow sends an invite to follow your LinkedIn company page.
- In Retrieve Accepted Leads, keep filters for accepted equal to
✅and invited_to_page empty. - In Iterate Page Invites, keep default batch settings.
- In Send Page Follow Invite, set Operation to
inviteToFollowPage, searchTerm to{{ $('Retrieve Accepted Leads').item.json.name }}, and linkedinUrl tohttps://linkedin.com/company/[YOUR_ID]. - In Update Page Invite Flag, set invited_to_page to
✅and match on linkedin_url. - Credential Required: Connect your browserflowApi credentials to Send Page Follow Invite.
[YOUR_ID] in Send Page Follow Invite with your actual LinkedIn company ID, or invites will fail silently.Step 7: Test and Activate Your Workflow
Run a manual test to verify the full data loop before turning on the schedules.
- Click Execute Workflow on Manual Start Trigger to confirm posts are read and commenters are extracted.
- Check that Append Leads Sheet adds new profiles and Flag Post Processed updates scraped_at with
{{$now.toISO()}}. - Manually run Scheduled Lead Check to validate the invite loop and confirm updates in Record Invite Sent, Mark Pending Invite, or Mark Connected.
- Once validated, toggle the workflow to Active to enable the scheduled triggers.
Common Gotchas
- Google Sheets credentials can expire or need specific permissions. If things break, check the n8n Credentials page and confirm the connected Google account still has edit access to the sheet.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Browserflow prompts and defaults are not “your” process. Honestly, if you don’t tune what counts as a valid lead (and filter out company pages early), you will be cleaning junk rows forever.
Frequently Asked Questions
About 45 minutes if you already have the Google Sheet template and Browserflow account ready.
No. You’ll mostly connect accounts and paste in a few values like your Company Page URL.
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 Browserflow costs (it has a free trial, then paid plans).
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, but keep it intentional. You can enable the “likers” scrape in the Browserflow extraction step, then keep the same Google Sheets dedupe check so you don’t flood your lead list. Common customizations include scraping only certain posts (by tag in your sheet), tightening the “company profile” filter, and slowing the invite schedule so your account stays safe.
Usually it’s an expired API key or the credential is pointing at the wrong Browserflow workspace. Regenerate the Browserflow API key, update it in n8n credentials, and rerun a single test item. If it still fails, check that the Browserflow for LinkedIn community node is installed and that your LinkedIn session inside Browserflow is valid. Rate limits can also show up as flaky behavior when you run big batches, so reducing batch size often fixes it.
A few thousand leads in Google Sheets is fine for most teams, and the real limit is your n8n execution allowance and how aggressively you schedule invites.
For this workflow, n8n is usually the better fit because you need looping, branching, and scheduled sync logic across multiple stages (scrape, invite, accept, follow invite). Zapier and Make can handle pieces of it, but the moment you add deduping, status checks, and multi-workflow scheduling, costs and complexity creep in. n8n also gives you the option to self-host, which matters if you’re running frequent checks. If you only want a lightweight “new comment → add row” automation, Zapier or Make can be faster to set up. Talk to an automation expert if you want help choosing.
Once this is live, LinkedIn growth stops being a “when I have time” task. The workflow handles the repetitive tracking, and you get a reliable pipeline you can actually build on.
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.