Slack alerts from Google Sheets for LinkedIn changes
You open LinkedIn to “quickly check” a few profiles… and 45 minutes disappears. Worse, you still miss the one job change that mattered because it happened on a day you didn’t look.
Recruiters feel it when candidates move fast. A sales pipeline feels it when a champion changes roles. And relationship managers end up living in tabs. This LinkedIn change alerts automation moves the monitoring to the background and pushes the important updates straight into Slack.
You’ll learn what the workflow does, what you need to run it, and how the pieces fit together so you can track profile changes without babysitting a spreadsheet.
How This Automation Works
Here’s the complete workflow you’ll be setting up:
n8n Workflow Template: Slack alerts from Google Sheets for LinkedIn changes
flowchart LR
subgraph sg0["Scheduled Daily Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "Scheduled Daily Trigger", pos: "b", h: 48 }
n1@{ icon: "mdi:database", form: "rounded", label: "Fetch Profile Sheet", pos: "b", h: 48 }
n2@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Filter Fresh Records", pos: "b", h: 48 }
n3["<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 New Posts"]
n4@{ icon: "mdi:cog", form: "rounded", label: "Delay Step", 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 New Profiles"]
n6@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check New Profile Error", pos: "b", h: 48 }
n7@{ icon: "mdi:database", form: "rounded", label: "Append New Profiles", pos: "b", h: 48 }
n8@{ icon: "mdi:database", form: "rounded", label: "Load Existing Records", pos: "b", h: 48 }
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 Current Posts"]
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/>Fetch Current Profile"]
n11@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Change Detection Switch", pos: "b", h: 48 }
n12@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Validate Url Presence", pos: "b", h: 48 }
n13@{ icon: "mdi:cog", form: "rounded", label: "No Change Path", 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/slack.svg' width='40' height='40' /></div><br/>Notify First Name"]
n15@{ icon: "mdi:database", form: "rounded", label: "Update Firstname Field", pos: "b", h: 48 }
n16["<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/slack.svg' width='40' height='40' /></div><br/>Notify Last Name"]
n17@{ icon: "mdi:database", form: "rounded", label: "Update Lastname Field", 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/slack.svg' width='40' height='40' /></div><br/>Notify Tagline"]
n19@{ icon: "mdi:database", form: "rounded", label: "Update Tagline Field", pos: "b", h: 48 }
n20["<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/slack.svg' width='40' height='40' /></div><br/>Notify Summary"]
n21@{ icon: "mdi:database", form: "rounded", label: "Update Summary Field", pos: "b", h: 48 }
n22["<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/slack.svg' width='40' height='40' /></div><br/>Notify Experience"]
n23@{ icon: "mdi:database", form: "rounded", label: "Update Experience Field", pos: "b", h: 48 }
n24["<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/slack.svg' width='40' height='40' /></div><br/>Notify Open Status"]
n25@{ icon: "mdi:database", form: "rounded", label: "Update Open Status", pos: "b", h: 48 }
n26["<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/slack.svg' width='40' height='40' /></div><br/>Notify Hiring Status"]
n27@{ icon: "mdi:database", form: "rounded", label: "Update Hiring Status Field", pos: "b", h: 48 }
n28["<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/slack.svg' width='40' height='40' /></div><br/>Notify New Post"]
n29@{ icon: "mdi:database", form: "rounded", label: "Update Latest Post", pos: "b", h: 48 }
n12 --> n13
n12 --> n14
n4 --> n5
n28 --> n29
n20 --> n21
n18 --> n19
n0 --> n1
n11 --> n12
n11 --> n16
n11 --> n18
n11 --> n20
n11 --> n22
n11 --> n24
n11 --> n26
n11 --> n28
n16 --> n17
n22 --> n23
n14 --> n15
n6 --> n8
n6 --> n7
n24 --> n25
n8 --> n9
n1 --> n2
n26 --> n27
n2 --> n3
n10 --> n11
n5 --> n6
n7 --> n8
n9 --> n10
n3 --> n4
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,n11,n12 decision
class n1,n7,n8,n15,n17,n19,n21,n23,n25,n27,n29 database
class n3,n5,n9,n10 api
classDef customIcon fill:none,stroke:none
class n3,n5,n9,n10,n14,n16,n18,n20,n22,n24,n26,n28 customIcon
Why This Matters: LinkedIn changes are easy to miss
Tracking LinkedIn changes sounds simple until you try to do it consistently. You start with good intentions: a Google Sheet of prospects, candidates, partners, or influencers. Then the real world happens. People change titles, “Open to work” flips on, new posts go live, and your list gets stale without you noticing. The cost isn’t just time. It’s missed timing. You reach out too late (or with the wrong context), and the moment is gone. Honestly, manual checking is one of those tasks that feels “small” but drains your week in tiny chunks.
It adds up fast. Here’s where it usually breaks down.
- Someone gets a new role and you find out weeks later, after you’ve sent the old-company pitch.
- Your team updates the Sheet “when they remember,” which means your database becomes a mix of fresh and outdated records.
- Important signals (hiring, open-to-work, new posts) don’t show up in your day unless you’re actively hunting for them.
- Manual copy-paste creates quiet errors: wrong headlines, missing summaries, mismatched profile URLs.
What You’ll Build: A scheduled LinkedIn profile tracker with Slack alerts
This workflow turns a simple Google Sheets list into an always-on LinkedIn watchlist. On a schedule (daily by default), n8n pulls the rows from your “profile sheet,” checks each LinkedIn URL, and fetches fresh profile and post data through an HTTP request (via the Ghost Genius scraping API). It then compares what it just retrieved against what’s already stored in your sheet. If something changed, the workflow sends a Slack message showing the update and then writes the new value back to Google Sheets so your sheet stays current. If nothing changed, it takes the no-op path and moves on quietly. The end result is a clean, living database plus timely Slack pings when a job move or profile edit is worth acting on.
The workflow starts with a scheduled trigger and your Google Sheet as the “source of truth.” From there, it loops through profiles, pulls current profile data and recent posts, and runs change detection. Finally, Slack notifications go out for the specific field that changed, and Google Sheets is updated so future comparisons stay accurate.
What You’re Building
| What Gets Automated | What You’ll Achieve |
|---|---|
|
|
Expected Results
Say you track 50 LinkedIn profiles in a Sheet and you “check them quickly” once a week. If it takes about 2 minutes per profile to load, scan, and update the Sheet, that’s roughly 100 minutes, plus context switching and mistakes (call it about 2 hours). With this workflow, the daily trigger runs automatically and Slack only pings you when something changes. Your “time spent” becomes a few minutes reviewing alerts, while Google Sheets stays updated in the background.
Before You Start
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets for your tracking database and fields.
- Slack to receive change alerts in a channel.
- Ghost Genius API key (get it from your Ghost Genius dashboard) for LinkedIn profile scraping.
Skill level: Intermediate. You’ll be connecting accounts, adding credentials, and mapping a few fields in Google Sheets and Slack.
Want someone to build this for you? Talk to an automation expert (free 15-minute consultation).
Step by Step
A schedule triggers the run. The workflow uses a scheduled trigger (daily in this template) so your tracking happens even when you’re busy or out of office.
Google Sheets provides the list. n8n loads your profile sheet, filters for the rows that should be checked, then prepares those items for processing in batches so you don’t hammer APIs all at once.
LinkedIn data is fetched and compared. HTTP requests pull current profile details and recent posts using your Ghost Genius API key. A change detection step (switch/if logic) decides which field changed, if any, and routes the item down the right path.
Slack is notified and the Sheet is updated. If the first name, headline, summary, experience, hiring/open status, or latest post changes, the workflow sends a Slack message and then writes the new value back to Google Sheets so the next run compares against the latest record.
You can easily modify the schedule and which fields trigger alerts based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Scheduled Daily Trigger
This workflow runs every morning and starts by loading your profile tracker sheet.
- Add the Scheduled Daily Trigger node and open its settings.
- Set the schedule rule to trigger daily at Trigger At Hour
8. - Connect Scheduled Daily Trigger to Fetch Profile Sheet.
Step 2: Connect Google Sheets
These nodes read and update your profile tracker sheet with new profile data and change detection results.
- Open Fetch Profile Sheet and set Document to
Copy of Profiles Trackerand Sheet toProfiles. - Open Append New Profiles and confirm Operation is
updatewith Matching Columns set toLinkedIn. - Open Load Existing Records and set Document to
Copy of Profiles Trackerand Sheet toProfiles. - For all Google Sheets update nodes (11 total), ensure the same spreadsheet and sheet
Feuille 1are selected and Operation isupdate. - Credential Required: Connect your
googleSheetsOAuth2Apicredentials in Fetch Profile Sheet, Append New Profiles, Load Existing Records, and all update nodes (Update Firstname Field, Update Lastname Field, Update Tagline Field, Update Summary Field, Update Experience Field, Update Open Status, Update Hiring Status Field, Update Latest Post).
Step 3: Set Up Profile Retrieval and Filtering
This section pulls fresh profiles from the API, throttles requests, and appends new entries to the sheet.
- In Filter Fresh Records, keep the condition where Left Value is
={{ $json.ID }}and the operator is empty. - In Fetch New Posts, set URL to
https://api.ghostgenius.fr/v2/profile/postsand add query parameters: url={{ $json.LinkedIn }}and page1. - In Delay Step, set Amount to
2to throttle API calls. - In Retrieve New Profiles, set URL to
https://api.ghostgenius.fr/v2/profileand set query parameter url to={{ $('Filter Fresh Records').item.json.LinkedIn }}. - In Check New Profile Error, keep the condition that checks for
={{ $json.error }}to route errors vs successful results. - Credential Required: Connect your
httpHeaderAuthcredentials in Fetch New Posts and Retrieve New Profiles.
httpHeaderAuth credential includes them, otherwise the Check New Profile Error branch will fire and no new profiles will be added.Step 4: Configure Change Detection Logic
After loading existing records, the workflow compares current profile data and routes changes to the correct notification path.
- In Fetch Current Posts, set URL to
https://api.ghostgenius.fr/v2/profile/postsand query parameters url={{ $json.LinkedIn }}and page1. - In Fetch Current Profile, set URL to
https://api.ghostgenius.fr/v2/profilewith query parameter url={{ $('Load Existing Records').item.json.LinkedIn }}. - In Change Detection Switch, keep All Matching Outputs enabled and verify each rule compares current fields (e.g.,
={{ $json.first_name }}) against sheet fields (e.g.,={{ $('Load Existing Records').item.json.Firstname }}). - In Validate Url Presence, keep the rule that checks
={{ $json.url }}with operator notExists to send unchanged items to No Change Path. - Credential Required: Connect your
httpHeaderAuthcredentials in Fetch Current Posts and Fetch Current Profile.
Step 5: Configure Slack Alerts and Sheet Updates
Each detected change sends a Slack alert and then updates the corresponding field in Google Sheets.
- Configure Slack messaging nodes with the provided text templates such as Notify First Name using
=🚨 First name change detected…and map the expressions exactly as shown. - Repeat for all Slack notification nodes: Notify Last Name, Notify Tagline, Notify Summary, Notify Experience, Notify Open Status, Notify Hiring Status, and Notify New Post.
- Ensure each Slack node outputs directly to its matching update node: for example, Notify First Name → Update Firstname Field and Notify New Post → Update Latest Post.
- Credential Required: Connect your
slackOAuth2Apicredentials in all Slack nodes (8 total).
[YOUR_ID] in each Slack node’s Channel selector, or messages will not be delivered.Step 6: Test and Activate Your Workflow
Run a manual test to confirm the API calls, change detection, and Slack alerts work end-to-end.
- Click Execute Workflow and watch the path from Scheduled Daily Trigger to Fetch Profile Sheet and through the change detection sequence.
- Verify that Append New Profiles updates the sheet and that Slack alerts fire for any detected changes.
- Confirm that update nodes (e.g., Update Summary Field) write back the latest values to Google Sheets.
- Once validated, toggle the workflow to Active so the Scheduled Daily Trigger runs at 8 AM daily.
Troubleshooting Tips
- Google Sheets credentials can expire or need specific permissions. If things break, check the n8n Credentials screen and confirm the connected Google account still has 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.
- Slack webhooks can fail if the channel was renamed or the webhook was regenerated. Re-check the incoming webhook URL in Slack, then update the Slack node in n8n.
Quick Answers
About 30 minutes if your Sheet and Slack are ready.
No. You’ll connect accounts, paste an API key, and map a few columns in Google Sheets.
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 Ghost Genius API costs based on how many profiles you check.
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. You can change the scheduled trigger to weekly (or multiple times per day), then narrow alerts by adjusting the Change Detection Switch paths so only “Latest experience” triggers Slack. Common tweaks include alerting only on job changes, adding an extra Slack mention for VIP profiles, and storing a timestamp column in Google Sheets for each detected update.
Usually it’s an expired Google OAuth connection inside n8n, or the connected account lost access to the Sheet. Re-authenticate the Google Sheets credential and confirm the file is shared with the same Google user. Also check that your sheet columns match what the workflow expects (Firstname, Lastname, LinkedIn URL, ID, and the tracking fields). A renamed tab is another classic “nothing works” cause.
Most small teams comfortably run a few hundred profiles per day as long as you batch requests and respect the scraping API limits.
It depends on how picky you are about change detection. Zapier and Make are fine for simple “new row triggers X,” but this use case needs looping, comparisons, and multiple conditional paths (first name vs. summary vs. job change), and that’s where n8n is simply easier to keep clean. n8n also gives you a self-host option, which matters when the workflow runs daily and you don’t want every check counted as a premium task. If you want Slack messages that include before/after context and a Sheet that stays updated automatically, n8n fits naturally. Talk to an automation expert if you want help choosing.
Once this is running, LinkedIn monitoring becomes a quiet system instead of a recurring chore. The workflow handles the repetitive checks, and you only jump in when there’s something worth acting 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.