Google Sheets to Slack, hiring leads you can act on
You spot a target account hiring, you think “this is the moment,” and then… nothing happens. The job post is buried in a tab, nobody gets notified, and by the time outreach goes out, you’re late and competing with everyone else.
This is where Sheets Slack alerts start paying for themselves. Sales leaders feel it when pipeline is thin. Recruiters chasing warm companies feel it too. So do consultants who live and die by timing.
This workflow watches hiring signals, turns them into usable lead notes (with AI), and pushes the right message into Slack so you can act the same day. You’ll see what it automates, what you need to run it, and how the flow fits into a real weekly rhythm.
How This Automation Works
See how this solves the problem:
n8n Workflow Template: Google Sheets to Slack, hiring leads you can act on
flowchart LR
subgraph sg0["Schedule Trigger - Daily 9AM Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger - Daily 9AM", pos: "b", h: 48 }
n1@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Apify - Scrape Google Jobs", pos: "b", h: 48 }
n2@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Apify - Scrape LinkedIn Jobs", pos: "b", h: 48 }
n3@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Apify - Scrape Indeed Jobs", 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/code.svg' width='40' height='40' /></div><br/>Code - Normalize Google Jobs"]
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/code.svg' width='40' height='40' /></div><br/>Code - Normalize LinkedIn Jobs"]
n6["<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 - Normalize Indeed Jobs"]
n7["<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 - Combine All Sources"]
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/code.svg' width='40' height='40' /></div><br/>Code - Deduplicate and Filte.."]
n9@{ icon: "mdi:database", form: "rounded", label: "Google Sheets - Save Raw Jobs", pos: "b", h: 48 }
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/code.svg' width='40' height='40' /></div><br/>Code - Filter by Target Keyw.."]
n11@{ icon: "mdi:swap-horizontal", form: "rounded", label: "IF - Check Matches Found", pos: "b", h: 48 }
n12@{ icon: "mdi:database", form: "rounded", label: "Google Sheets - Save Qualifi..", pos: "b", h: 48 }
n25@{ icon: "mdi:swap-vertical", form: "rounded", label: "Set Configuration", pos: "b", h: 48 }
n26@{ icon: "mdi:database", form: "rounded", label: "Google Sheets - Get Target C..", pos: "b", h: 48 }
n27@{ icon: "mdi:robot", form: "rounded", label: "AI Agent - Analyze and Gener..", pos: "b", h: 48 }
n28@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model (Daily)", pos: "b", h: 48 }
n29@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser (Da..", pos: "b", h: 48 }
n30["<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/>Slack - Send Lead Alert"]
n25 --> n26
n11 --> n27
n28 -.-> n27
n1 --> n4
n3 --> n6
n7 --> n8
n2 --> n5
n4 --> n7
n6 --> n7
n0 --> n25
n9 --> n10
n5 --> n7
n10 --> n11
n29 -.-> n27
n26 --> n1
n26 --> n2
n26 --> n3
n12 --> n30
n27 --> n12
n8 --> n9
end
subgraph sg1["Schedule Trigger - Weekly Monday 8AM Flow"]
direction LR
n13@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger - Weekly Mo..", pos: "b", h: 48 }
n14@{ icon: "mdi:swap-vertical", form: "rounded", label: "Set - Weekly Report Config", pos: "b", h: 48 }
n15@{ icon: "mdi:database", form: "rounded", label: "Google Sheets - Get Raw Jobs..", pos: "b", h: 48 }
n16@{ icon: "mdi:database", form: "rounded", label: "Google Sheets - Get Qualifie..", pos: "b", h: 48 }
n17["<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 - Weekly Data"]
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/code.svg' width='40' height='40' /></div><br/>Code - Aggregate Weekly Stat.."]
n19@{ icon: "mdi:robot", form: "rounded", label: "AI Agent - Weekly Trend Anal..", pos: "b", h: 48 }
n20@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model (Weekly)", pos: "b", h: 48 }
n21@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser (We..", pos: "b", h: 48 }
n22@{ icon: "mdi:database", form: "rounded", label: "Google Sheets - Save Weekly ..", pos: "b", h: 48 }
n23["<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/>Slack - Send Weekly Report"]
n24@{ icon: "mdi:message-outline", form: "rounded", label: "Gmail - Send Weekly Report", pos: "b", h: 48 }
n17 --> n18
n20 -.-> n19
n14 --> n15
n14 --> n16
n19 --> n22
n21 -.-> n19
n18 --> n19
n22 --> n23
n22 --> n24
n13 --> n14
n15 --> n17
n16 --> n17
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,n13 trigger
class n27,n29,n19,n21 ai
class n28,n20 aiModel
class n1,n2,n3,n11 decision
class n9,n12,n26,n15,n16,n22 database
class n4,n5,n6,n8,n10,n18 code
classDef customIcon fill:none,stroke:none
class n4,n5,n6,n7,n8,n10,n30,n17,n18,n23 customIcon
The Challenge: Turning job posts into revenue timing
Hiring is one of the clearest “something changed” signals a company can broadcast, and it’s public. But turning that signal into outreach is weirdly manual. You check Google Jobs, LinkedIn, and Indeed. You skim titles. You copy links. You try to remember which roles actually matter for your offer. Then you dump a few into a sheet, tell yourself you’ll follow up later, and later never comes. Meanwhile, the account is actively spending time and budget solving the problem you sell into.
It adds up fast. Here’s where it breaks down in day-to-day operations.
- Job posts are scattered across multiple sources, so you end up doing the same search three times.
- Without normalization and de-duplication, the same role shows up repeatedly and quietly wastes attention.
- Keyword filtering lives in someone’s head, which means lead quality depends on who checked that morning.
- Even when a posting is a perfect fit, it still needs context, urgency, and a draft message before anyone will act on it.
The Fix: Daily hiring-signal monitoring with Slack-ready AI notes
This workflow runs on a schedule and does the “watching” for you. It loads your target account list from Google Sheets, checks multiple job sources using Apify scrapers (Google Jobs, LinkedIn Jobs, and Indeed), and then cleans everything into one consistent format. From there, it de-duplicates recent listings and logs the raw feed to a “Raw Jobs” sheet so you have an audit trail. Next comes the part that usually slows teams down: it filters jobs by the target keywords you define per company, then uses GPT-4o to analyze each qualified posting and produce usable context. Finally, it writes the best leads into a “Qualified Leads” sheet and posts a Slack alert that includes AI notes and a ready-to-send cold email draft.
The daily loop is about speed and consistency. The weekly loop (every Monday) looks at what happened across the whole week, summarizes trends with AI, saves a report back into Google Sheets, then posts that summary to Slack and can email it via Gmail.
What Changes: Before vs. After
| What This Eliminates | Impact You’ll See |
|---|---|
|
|
Real-World Impact
Say you track 30 target companies and you check 3 sources (Google Jobs, LinkedIn, Indeed) twice a week. If it takes maybe 3 minutes per company per source to search, skim, and copy a link, that’s about 9 minutes per company. Across 30 companies, you’re around 4.5 hours just to collect “maybes,” and that’s before writing any outreach. With this workflow, the daily run is mostly hands-off: you spend about 10 minutes refining keywords when needed, then you act on Slack alerts as they come in. The time goes into talking to the right accounts, not hunting for them.
Requirements
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets to store targets, raw jobs, and leads
- Slack to receive lead alerts and weekly reports
- Apify account for job scraping actors and credits
- OpenAI API key (get it from the OpenAI API dashboard)
- Gmail account to email weekly reports (optional)
Skill level: Intermediate. You’ll be comfortable connecting accounts, editing a few IDs, and adjusting keywords and prompts in plain text.
Need help implementing this? Talk to an automation expert (free 15-minute consultation).
The Workflow Flow
A daily schedule kicks things off. n8n runs once per day, loads your “Target Companies” sheet, and reads the keywords and positioning notes you’ve defined per account.
Job data gets pulled from multiple sources. Apify scrapers fetch roles from Google Jobs, LinkedIn Jobs, and Indeed for each target company, then the workflow normalizes fields so every listing looks the same inside your system.
Filtering and AI analysis happen only on matches. After de-duplication and raw logging, jobs are checked against your target terms. When a posting qualifies, the AI Agent (GPT-4o via the OpenAI Chat Model node) generates inferred pain points, urgency scoring, angles for outreach, and a draft email you can send with light edits.
Outputs land where your team will actually use them. Qualified leads are stored in Google Sheets for tracking, and Slack gets the alert so someone can claim it and move. On Mondays, a separate scheduled run summarizes weekly trends, saves a report, posts it to Slack, and can email it via Gmail.
You can easily modify the target keywords and the AI prompts to match your market and voice based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Schedule Triggers
Set up the daily and weekly schedules that start the workflow.
- Open Daily Schedule Starter and set the schedule rule to run daily at 9 (field triggerAtHour =
9). - Open Weekly Schedule Starter and set the weekly schedule to run at 8 on day 1 (field triggerAtDay =
1, triggerAtHour =8). - Confirm the flow starts from Daily Schedule Starter → Configure Daily Settings and Weekly Schedule Starter → Configure Weekly Window.
Step 2: Connect Google Sheets
Configure the Google Sheets nodes that store and load company and job data.
- Open Load Target Companies and set sheetName to
Target Companiesand documentId to{{$vars.GOOGLE_SHEETS_ID}}. - Open Store Raw Jobs Sheet and set sheetName to
Raw Jobsand documentId to{{$vars.GOOGLE_SHEETS_ID}}. - Open Store Qualified Leads and set sheetName to
Qualified Leadsand documentId to{{$vars.GOOGLE_SHEETS_ID}}. - Open Load Raw Jobs Weekly, Load Qualified Leads Weekly, and Save Weekly Report Sheet and set their sheetName values to
Raw Jobs,Qualified Leads, andWeekly Reportsrespectively, with documentId set to{{$vars.GOOGLE_SHEETS_ID}}. - Credential Required: Connect your Google Sheets credentials to all Google Sheets nodes.
Step 3: Set Up Daily Fetching and Apify Sources
Define daily parameters and run Apify actors for job sourcing in parallel.
- Open Configure Daily Settings and set daysToCheck to
7, maxJobsPerSource to50, targetIndustry toTechnology, and runDate to{{$now.format('yyyy-MM-dd')}}. - In Load Target Companies, ensure your sheet includes columns for Company Name, Target Keywords, and My Solution to feed the Apify queries and AI prompts.
- Load Target Companies outputs to both Apify Fetch Google Roles, Apify Pull LinkedIn Roles, and Apify Retrieve Indeed Roles in parallel.
- Open each Apify node and confirm the customBody matches the provided expressions, such as
{{ JSON.stringify({ query: $json['Company Name'] + ' jobs', maxItems: $('Configure Daily Settings').first().json.maxJobsPerSource, countryCode: 'us' }) }}for Apify Fetch Google Roles. - Credential Required: Connect your Apify credentials to Apify Fetch Google Roles, Apify Pull LinkedIn Roles, and Apify Retrieve Indeed Roles.
Step 4: Normalize, Merge, and Filter Daily Jobs
Normalize the job feeds, merge them, and filter for target keywords before qualification.
- Keep the three normalization nodes (Normalize Google Listings, Normalize LinkedIn Listings, Normalize Indeed Listings) as-is so each adds source, scrapedDate, and a unique jobId.
- Normalize Google Listings, Normalize LinkedIn Listings, and Normalize Indeed Listings output to Combine Job Streams in parallel.
- Set Combine Job Streams to mode
combineand combineBycombineAll. - Verify Deduplicate Recent Jobs references Configure Daily Settings for
daysToCheckto filter only recent roles. - Confirm Store Raw Jobs Sheet saves the deduplicated feed and passes it into Filter by Target Terms.
- In Match Presence Check, ensure the condition checks
{{$json.noMatches}}and only true matches go to AI Lead Email Composer.
Step 5: Set Up Daily AI Lead Qualification
Configure the AI agent and output parser for daily lead qualification and email drafting.
- Open AI Lead Email Composer and keep the prompt values that reference job fields like
{{ $json.company }},{{ $json.title }}, and{{ $json.matchedKeyword }}. - Ensure OpenAI Chat Daily Model is connected as the language model for AI Lead Email Composer.
- Ensure Daily Output Parser is connected as the output parser for AI Lead Email Composer; do not add credentials on the parser itself.
- Credential Required: Connect your OpenAI credentials to OpenAI Chat Daily Model (the parent node for AI Lead Email Composer).
- Confirm the output goes to Store Qualified Leads and then to Post Lead Slack Alert.
Step 6: Build Weekly Analytics and AI Reporting
Aggregate weekly data, generate an AI report, and save it for distribution.
- Open Configure Weekly Window and confirm reportWeekStart is
{{$now.minus({days: 7}).format('yyyy-MM-dd')}}and reportWeekEnd is{{$now.format('yyyy-MM-dd')}}. - Configure Weekly Window outputs to both Load Raw Jobs Weekly and Load Qualified Leads Weekly in parallel.
- Verify Combine Weekly Data uses mode
combineand combineBycombineAllbefore Aggregate Weekly Metrics. - Open AI Weekly Trend Review and confirm the prompt references
{{ $json.weekStart }},{{ $json.weekEnd }}, and summary statistics. - Ensure OpenAI Chat Weekly Model is connected as the language model for AI Weekly Trend Review, and Weekly Output Parser is connected as the output parser.
- Credential Required: Connect your OpenAI credentials to OpenAI Chat Weekly Model (the parent node for AI Weekly Trend Review).
Step 7: Configure Output and Notifications
Send qualified alerts and weekly reports to Slack and email.
- Open Post Lead Slack Alert and confirm authentication is
oAuth2, and channelId is{{$vars.SLACK_CHANNEL}}. - Open Post Weekly Slack Report and verify the blocks reference weekly stats like
{{ $('Aggregate Weekly Metrics').first().json.stats.totalJobs }}. - Open Email Weekly Report and set sendTo to
{{$vars.NOTIFICATION_EMAIL}}, message to{{$json.output.report_html}}, and subject to📊 Weekly Hiring Signal Report ({{ $('Aggregate Weekly Metrics').first().json.weekStart }} - {{ $('Aggregate Weekly Metrics').first().json.weekEnd }}). - Save Weekly Report Sheet outputs to both Post Weekly Slack Report and Email Weekly Report in parallel.
- Credential Required: Connect your Slack credentials to Post Lead Slack Alert and Post Weekly Slack Report.
- Credential Required: Connect your Gmail credentials to Email Weekly Report.
Step 8: Test and Activate Your Workflow
Run a full test to validate the daily and weekly paths, then enable production schedules.
- Click Execute Workflow and confirm Daily Schedule Starter triggers Configure Daily Settings and loads companies.
- Check that Store Raw Jobs Sheet and Store Qualified Leads receive rows after Deduplicate Recent Jobs and AI Lead Email Composer.
- Trigger Weekly Schedule Starter manually and verify Aggregate Weekly Metrics produces stats and AI Weekly Trend Review generates the structured output.
- Confirm successful execution by seeing messages in Slack from Post Lead Slack Alert and Post Weekly Slack Report, and an email from Email Weekly Report.
- Turn on the workflow using the Active toggle to enable the daily and weekly schedules in production.
Watch Out For
- Apify actors and tokens can expire or get rate-limited. If scraping suddenly returns empty results, check your Apify run logs and credit usage first.
- 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
Usually in about an hour once your accounts are ready.
Yes, but you’ll want someone comfortable with connecting credentials and pasting in a few IDs. No coding is required for basic setup.
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 and Apify usage costs, which depend on how many companies and jobs you process.
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 tailor it in three places without changing the overall structure. Update the “Target Companies” sheet to control which accounts and keywords matter, then tweak the daily settings in the configuration node (things like how many days back to check). Finally, adjust the AI Agent prompts used for lead analysis and email drafting so the output matches your offer and your tone. Many teams also change the Slack message template to include an owner field or a “next step” line.
Most of the time it’s an expired Google credential or the spreadsheet permissions changed. Reconnect Google Sheets in n8n, then confirm the workflow is pointing at the right spreadsheet ID and sheet names (“Target Companies,” “Raw Jobs,” and “Qualified Leads”). If only the weekly report fails, check that the “Weekly Reports” sheet exists and matches the name used in the workflow.
On self-hosted n8n, capacity is mostly limited by your server and by Apify/OpenAI throughput. In practice, most small teams comfortably monitor a few dozen target companies daily, then scale up once the keyword filtering is tight. If you’re on n8n Cloud, your execution limits depend on your plan, and this workflow will use multiple executions per run because it loops through companies and sources.
Often, yes. This workflow needs looping, deduping, multi-source scraping, and two different schedules (daily lead capture plus Monday reporting), and n8n handles that kind of branching and batching cleanly. You also get more control over how data is normalized before it hits Google Sheets, which matters when Google Jobs and LinkedIn format fields differently. Zapier or Make can work, but costs can climb once you add AI steps and multiple searches per company. If you’re unsure, Talk to an automation expert and we’ll map it to your volume and tools.
Hiring signals are already out there. This workflow turns them into Slack alerts you can act on, with context your team can actually use.
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.