Gmail + Slack follow ups that keep leads warm
You send the first email, feel good about it, then the week gets busy. By the time you remember to check replies, the lead has gone cold or someone else already grabbed their attention. That’s how deals quietly die.
This Gmail Slack followups setup hits sales reps first, honestly, but agency owners and marketing managers feel it too. You’ll keep outreach consistent, automatically send the next message when needed, and get Slack alerts the moment someone replies.
Below you’ll see exactly what the workflow does, what you’ll need to run it, and what kind of time you get back when follow-up stops living in your head.
The Problem: Follow-ups fall through the cracks
Lead follow-up sounds simple until you’re juggling a CRM, an inbox, a calendar, and the rest of your job. You send an initial outreach email, then you have to remember to check whether they replied, decide when to follow up, and repeat. If you forget for a few days, the thread is buried. If you follow up too fast, you look pushy. Too slow, and you lose momentum. And when multiple people touch the same pipeline, it’s even worse because nobody’s sure who’s “on” the lead today.
It adds up fast. Here’s where it typically breaks down in real teams.
- You end up scanning your inbox at the end of the day, hoping you didn’t miss a reply from a high-intent lead.
- Follow-up timing becomes inconsistent, so warm leads cool off while you’re doing other work.
- Manual checking creates avoidable errors like replying late, double-following up, or forgetting to follow up at all.
- There’s no clean “system,” which makes it hard to scale outreach beyond a handful of leads.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Gmail + Slack follow ups that keep leads warm
flowchart LR
subgraph sg0["Cron: weekday 17:00 Flow"]
direction LR
n0@{ icon: "mdi:message-outline", form: "rounded", label: "Send a message", pos: "b", h: 48 }
n1@{ icon: "mdi:play-circle", form: "rounded", label: "Cron: weekday 17:00", pos: "b", h: 48 }
n2@{ icon: "mdi:cog", form: "rounded", label: "Remove Duplicates", pos: "b", h: 48 }
n3@{ icon: "mdi:cog", form: "rounded", label: "Remove Duplicates1", 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/httprequest.dark.svg' width='40' height='40' /></div><br/>get CRM updates"]
n5@{ icon: "mdi:swap-horizontal", form: "rounded", label: "test for tag", pos: "b", h: 48 }
n6@{ icon: "mdi:swap-horizontal", form: "rounded", label: "answered?", pos: "b", h: 48 }
n7@{ icon: "mdi:message-outline", form: "rounded", label: "get last 7 days", 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/slack.svg' width='40' height='40' /></div><br/>alert user"]
n9@{ icon: "mdi:message-outline", form: "rounded", label: "send another message", pos: "b", h: 48 }
n10@{ icon: "mdi:message-outline", form: "rounded", label: "get last 7 days again", pos: "b", h: 48 }
n11@{ icon: "mdi:swap-horizontal", form: "rounded", label: "replied now?", pos: "b", h: 48 }
n12["<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/>alert user1"]
n13@{ icon: "mdi:cog", form: "rounded", label: "wait 7 days", pos: "b", h: 48 }
n6 --> n2
n6 --> n9
n13 --> n7
n11 --> n3
n5 --> n0
n0 --> n13
n4 --> n5
n7 --> n6
n2 --> n8
n3 --> n12
n1 --> n4
n9 --> n10
n10 --> n11
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 n1 trigger
class n5,n6,n11 decision
class n4 api
classDef customIcon fill:none,stroke:none
class n4,n8,n12 customIcon
The Solution: Scheduled follow-ups with Slack reply alerts
This workflow runs automatically every weekday at 5pm. It checks your CentralStationCRM for people who were updated today, then filters those records down to the ones tagged for “Outreach.” For each of those, it sends an initial email through Gmail using a message template you define once. Then it waits about a week and checks Gmail for replies. If a reply is found, you get a Slack notification so you can respond while the lead is still warm. If there’s no reply, the workflow sends a second follow-up email and checks again, alerting you in Slack if they respond after the follow-up.
The workflow starts on a schedule, pulls only the contacts that match your outreach criteria, and pushes emails out from your Gmail account. After the built-in waiting period, it switches into “monitoring” mode, checks for responses, and routes the right outcome to Slack so nothing gets missed.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you update 15 outreach leads a day in CentralStationCRM. Manually, you might spend about 5 minutes per lead to check the last email, search for a reply, and decide on the next follow-up, which is roughly 75 minutes a day. With this workflow, the daily work becomes close to zero: the schedule runs automatically at 5pm, emails go out, and you only jump in when Slack tells you someone replied. Most teams get about an hour back per day on busy outreach weeks.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- CentralStationCRM for daily lead updates and tags.
- Gmail to send the outreach and follow-up emails.
- Slack to receive reply alerts in a channel or DM.
Skill level: Beginner. You’ll connect accounts, paste your email copy into the Gmail nodes, and do a quick test run (ideally without the wait node at first).
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
Weekday schedule trigger. Every weekday at 5pm, the workflow wakes up and starts the day’s outreach run. No one needs to remember to press a button.
CRM pull and filtering. n8n calls CentralStationCRM to fetch people updates from “today,” then checks each record for the “Outreach” tag. That tag becomes your control lever: add it to enroll someone, remove it to stop messaging.
Gmail outreach and follow-up logic. If the contact qualifies, Gmail sends your predefined initial message. After waiting about 7 days, the workflow checks Gmail for responses and decides what to do next: notify you in Slack if there’s a reply, or send the second follow-up if there isn’t.
Slack alerts (deduplicated). When a reply comes in, the workflow filters out duplicates and posts a clean notification to Slack. You see the lead is active, then you respond like a human, not a bot.
You can easily modify the wait period to match your sales cycle, or adjust the tag logic to run different sequences for different lead types. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Schedule Trigger
Set the workflow to run on weekdays at a specific time to pull CRM changes.
- Add and open Weekday Schedule Trigger.
- Set the cron expression to
0 17 * * 1-5to run at 17:00 Monday through Friday. - Connect Weekday Schedule Trigger to Fetch CRM Changes.
⚠️ Common Pitfall: If your instance timezone differs from your business hours, adjust the cron expression to match your local time.
Step 2: Connect CentralStationCRM
Pull updated people records from CentralStationCRM using an authenticated HTTP request.
- Open Fetch CRM Changes.
- Set URL to
https://api.centralstationcrm.net/api/people. - Set JSON Query to
={"filter" : {"updated_at": {"larger_than": "{{ new Date().beginningOf('day') }}"}}, "includes" : "tags addrs companies emails"}. - Enable Send Query and Send Headers.
- Set Authentication to
genericCredentialTypeand Generic Auth Type tohttpHeaderAuth. - Add the header accept with value
application/json. - Credential Required: Connect your
httpHeaderAuthcredentials.
Step 3: Set Up Outreach Tag Filtering and Initial Email
Check for the Outreach tag and send the first email message.
- Open Check Outreach Tag and confirm the condition checks
={{ $json.person.tags }}contains"Outreach". - Connect Fetch CRM Changes → Check Outreach Tag → Dispatch Initial Email.
- In Dispatch Initial Email, set Send To to
={{ $json.person.emails[0].name }}. - Set Subject to
=Unser Gesprächand Email Type totext. - Set Message to
=Hi {{ $json.person.salutation }} {{ $json.person.name }}, #INSERT YOUR TEXT# Best regards #SIGNATURE#(keep your line breaks). - Credential Required: Connect your Gmail credentials in Dispatch Initial Email.
⚠️ Common Pitfall: If the CRM records lack emails[0].name, the email step will fail. Ensure email addresses are present in CentralStationCRM.
Step 4: Configure Wait and First Reply Check
Wait one week after the initial email, then check for replies and deduplicate them.
- Open Delay One Week and set Unit to
daysand Amount to7. - Connect Dispatch Initial Email → Delay One Week → Retrieve Recent Replies.
- In Retrieve Recent Replies, set Operation to
getAll, Limit to10, and Simple tofalse. - Set Filters → q to
=from: {{ $('Check Outreach Tag').item.json.person.emails[0].name }}. - Set Filters → receivedAfter to
={{ new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString() }}. - In Has Responded?, verify the condition checks
={{ $json.id }}exists. - In Filter Unique Replies, set Compare to
selectedFieldsand Fields To Compare tofrom.value[0].address. - Credential Required: Connect your Gmail credentials in Retrieve Recent Replies.
Step 5: Configure Follow-up and Second Reply Check
Send a follow-up email if no reply is detected, then check again and deduplicate responses.
- Connect the false path of Has Responded? to Send Follow-up Email.
- In Send Follow-up Email, set Send To to
={{ $('Fetch CRM Changes').item.json.person.emails[0].name }}. - Set Message to
=Hi {{ $('Fetch CRM Changes').item.json.person.salutation }} {{ $json.person.name }}, ##CONTENT OF YOUR SECOND MESSAGE## Best regards ##SIGNATURE## SIGNATUR. - Set Subject to
=Unser Gesprächand Email Type totext. - Connect Send Follow-up Email → Retrieve Replies Again → Responded After Follow-up? → Filter Unique Replies 2.
- In Retrieve Replies Again, set Filters → q to
=from: {{ $('Check Outreach Tag').item.json.person.emails[0].name }}and Filters → receivedAfter to={{ new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString() }}. - In Filter Unique Replies 2, set Fields To Compare to
from.value[0].address. - Credential Required: Connect your Gmail credentials in Send Follow-up Email and Retrieve Replies Again.
⚠️ Common Pitfall: The filters query depends on the email address from Check Outreach Tag. Make sure the same address is used across all CRM contacts.
Step 6: Configure Slack Notifications
Alert a Slack user when a reply is detected after the initial or follow-up email.
- Connect Filter Unique Replies → Notify Slack User.
- Set Text in Notify Slack User to
=Hi #YOURNAME#, your contact {{ $('Check Outreach Tag').item.json.person.salutation }} {{ $('Check Outreach Tag').item.json.person.name }} has responded. Look it up: https://mail.google.com/mail/u/0/#all/{{ $json.threadId }}. - Select User and set the user ID to your Slack account in Notify Slack User.
- Connect Filter Unique Replies 2 → Notify Slack User 2 and repeat the same Text and User settings.
- Credential Required: Connect your Slack OAuth2 credentials in Notify Slack User and Notify Slack User 2.
Test and Activate Your Workflow
Validate each part of the flow and then enable it for daily operation.
- Click Execute Workflow to run the workflow manually and verify that Fetch CRM Changes returns updated people.
- Check that Dispatch Initial Email sends an email and that Delay One Week queues the workflow.
- Manually trigger Retrieve Recent Replies and Retrieve Replies Again to verify the Gmail filters return recent messages.
- Confirm Slack alerts arrive from Notify Slack User and Notify Slack User 2 with correct thread links.
- Turn on the workflow using the Active toggle to run it automatically on weekdays.
Common Gotchas
- Gmail credentials can expire or require the right Google permissions. If emails stop sending, check the Gmail node’s credential status in n8n 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.
- Slack notifications can get noisy if your channel setup is messy. Make sure the Slack node targets the right channel or user, and keep duplicate filtering enabled so you don’t see the same reply twice.
Frequently Asked Questions
About 30 minutes if your accounts are ready.
No. You’ll connect CentralStationCRM, Gmail, and Slack, then paste in your email templates.
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 any CentralStationCRM plan limits and standard Gmail sending limits for your account.
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 it’s one of the easiest tweaks. Change the “Delay One Week” wait node to 2 days, 10 days, or whatever matches your sales cycle, then adjust the follow-up Gmail message to match that cadence. You can also change the “Check Outreach Tag” condition to look for a different tag (like “Trial” or “Inbound”) so different lead types get different sequences. If you want to get fancy, add a Switch node to route different templates based on lead source or deal size.
Usually it’s expired Google authorization or the wrong Gmail account connected in n8n. Reconnect the Gmail credential, then re-open the Gmail nodes and confirm they’re pointing at the right mailbox. If it works in tests but fails in production, check Google’s sending limits and make sure you’re not blasting too many messages in one run. Also confirm the workflow is searching for replies in the same thread or mailbox you’re actually sending from.
On n8n Cloud Starter, you can run thousands of executions per month, which is enough for most small teams doing daily outreach. If you self-host, there’s no execution limit; capacity mostly depends on your server and how many leads your CRM returns each day. Practically, this workflow can handle dozens to a few hundred leads per day as long as your Gmail account is within its normal sending limits.
Often, yes, because this sequence has timing, branching, and deduping that can get expensive or awkward elsewhere. n8n handles multi-step logic cleanly, and self-hosting gives you room to scale without worrying about task pricing every time a lead is processed. Zapier or Make can still be fine if you only need a simple “send email then notify” flow without waits and checks. If you’re unsure, Talk to an automation expert and you’ll get a straight recommendation based on your volume and tools.
Once this is running, follow-up stops being a daily mental tab you keep open. You’ll see replies in Slack, send the right next email automatically, and keep leads warm without living in your inbox.
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.