Google Sheets to Gmail, follow ups that pause on reply
Your outreach looks “organized” right up until follow-ups start. One lead replies, another gets missed, and suddenly you’re scanning Gmail threads while your Google Sheet turns into a graveyard of half-updated statuses.
This Sheets Gmail followups automation hits sales reps hardest, but agency owners and consultants feel it too. You get a consistent 3-email sequence that pauses the second a prospect replies, so you stop annoying warm leads and you stop losing track of who needs what.
Below you’ll see how the workflow runs, what results you can expect, and what you need to turn a simple spreadsheet into a reliable follow-up machine.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Google Sheets to Gmail, follow ups that pause on reply
flowchart LR
subgraph sg0["Google Sheets Flow"]
direction LR
n0@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model", pos: "b", h: 48 }
n1@{ icon: "mdi:message-outline", form: "rounded", label: "Gmail Tool - Send Email 1", pos: "b", h: 48 }
n2@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model 2", pos: "b", h: 48 }
n3@{ icon: "mdi:message-outline", form: "rounded", label: "Gmail Tool - Send Email 2", pos: "b", h: 48 }
n4@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model 3", pos: "b", h: 48 }
n5@{ icon: "mdi:message-outline", form: "rounded", label: "Gmail Tool - Send Email 3", pos: "b", h: 48 }
n6@{ icon: "mdi:database", form: "rounded", label: "Final Update to Sheet", pos: "b", h: 48 }
n9@{ icon: "mdi:database", form: "rounded", label: "Check Status Before Email 2", pos: "b", h: 48 }
n10@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check if Hot After Email 2", pos: "b", h: 48 }
n11@{ icon: "mdi:database", form: "rounded", label: "Check Status Before Email 3", pos: "b", h: 48 }
n12@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check if Hot After Email ", pos: "b", h: 48 }
n14@{ icon: "mdi:robot", form: "rounded", label: "Agent : Email 1", pos: "b", h: 48 }
n15@{ icon: "mdi:play-circle", form: "rounded", label: "Google Sheets Trigger", 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/merge.svg' width='40' height='40' /></div><br/>Merge"]
n17@{ icon: "mdi:database", form: "rounded", label: "Update Statut Email 2", pos: "b", h: 48 }
n18@{ icon: "mdi:swap-vertical", form: "rounded", label: "Entreprise Description", pos: "b", h: 48 }
n19["<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/>Merge1"]
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/merge.svg' width='40' height='40' /></div><br/>Merge2"]
n23@{ icon: "mdi:database", form: "rounded", label: "Update Email 1 Send", pos: "b", h: 48 }
n24@{ icon: "mdi:cog", form: "rounded", label: "Wait Until Time planning Ema..", pos: "b", h: 48 }
n25@{ icon: "mdi:cog", form: "rounded", label: "Wait Until Time planning Ema..", pos: "b", h: 48 }
n26@{ icon: "mdi:cog", form: "rounded", label: "Wait Until Time planning Ema..", pos: "b", h: 48 }
n27["<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/>Mapping Output"]
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/code.svg' width='40' height='40' /></div><br/>Mapping Output1"]
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/>Mapping Output2"]
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/code.svg' width='40' height='40' /></div><br/>Smart Time Planning"]
n31@{ icon: "mdi:robot", form: "rounded", label: "Agent IA : final follow-up", pos: "b", h: 48 }
n32@{ icon: "mdi:robot", form: "rounded", label: "Agent IA : Follow", pos: "b", h: 48 }
n33@{ icon: "mdi:database", form: "rounded", label: "Update row in sheet", pos: "b", h: 48 }
n16 --> n14
n19 --> n32
n20 --> n31
n27 --> n6
n14 --> n29
n28 --> n17
n29 --> n23
n32 --> n28
n0 -.-> n14
n2 -.-> n32
n4 -.-> n31
n30 --> n33
n23 --> n24
n33 --> n25
n15 --> n30
n15 --> n18
n17 --> n26
n18 --> n16
n18 --> n19
n18 --> n20
n12 --> n20
n1 -.-> n14
n3 -.-> n32
n5 -.-> n31
n31 --> n27
n10 --> n19
n9 --> n10
n11 --> n12
n25 --> n16
n24 --> n9
n26 --> n11
end
subgraph sg1["Gmail Reply Flow"]
direction LR
n7@{ icon: "mdi:play-circle", form: "rounded", label: "Gmail Reply Trigger", pos: "b", h: 48 }
n8@{ icon: "mdi:database", form: "rounded", label: "Mark Prospect as Hot", pos: "b", h: 48 }
n13["<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/>Send a message"]
n7 --> n8
n8 --> n13
end
subgraph sg2["Error Flow"]
direction LR
n21@{ icon: "mdi:play-circle", form: "rounded", label: "Error Trigger", 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/>Send a message1"]
n21 --> n22
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 n15,n7,n21 trigger
class n14,n31,n32 ai
class n0,n2,n4 aiModel
class n10,n12 decision
class n6,n9,n11,n17,n23,n33,n8 database
class n27,n28,n29,n30 code
classDef customIcon fill:none,stroke:none
class n16,n19,n20,n27,n28,n29,n30,n13,n22 customIcon
The Problem: Follow-Ups Break the Moment You Get Busy
Most cold outreach doesn’t fail because your first email is terrible. It fails because follow-ups are inconsistent. You send Email 1, then the day gets away from you. Or you do follow up, but you accidentally follow up to someone who already replied because the “status” in your sheet is two days behind your inbox. Even worse, you change the wording every time, so you can’t tell what’s actually working. It’s messy, and frankly it drains focus fast.
It adds up fast. Here’s where it breaks down in real life.
- Manually sending three emails to 30 prospects can eat up about 2 hours, and that’s before you even log notes.
- Your Google Sheet stops being trustworthy because “sent” and “replied” updates happen when you remember, not when they happen.
- Replying prospects still get scheduled follow-ups, which is awkward at best and reputation-damaging at worst.
- Even good templates underperform when timing is random and you send on bad days (hello, Monday inbox pileups).
The Solution: A Google Sheets → Gmail Sequence That Stops on Reply
This workflow turns one Google Sheet row into a complete, scheduled, personalized outreach sequence. When you add a new prospect (name, email, company, role, sector), n8n calculates send times that avoid the “bad days” and aim for mornings on Tuesday, Wednesday, or Thursday. Then AI drafts Email 1 based on the prospect profile, you send through Gmail, and the Sheet is updated immediately so your tracking stays real. After that, the system waits the right number of days and sends Email 2 and Email 3 only if the lead hasn’t replied. If a reply shows up in Gmail, the workflow flags that prospect as hot, alerts you in Slack, and pauses the rest automatically.
The workflow starts with a new row in Google Sheets. AI generates message copy (French or English depending on the prospect), Gmail sends on a schedule, and Google Sheets stays updated with every send and every “stop” event. Replies change the whole path, which is the point.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you add 30 new prospects each week to your sheet. Manually, a 3-email sequence is about 90 sends, and even at “only” 2 minutes per send (open, paste, tweak, double-check, log) that’s roughly 3 hours. With this workflow, adding the rows might take 20 minutes total, then emails send automatically over the week at the planned times. Replies pause the sequence, and your sheet updates without you babysitting it.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets for lead list and status tracking
- Gmail to send emails and detect replies
- OpenAI API key (get it from your OpenAI dashboard)
Skill level: Intermediate. You’ll connect accounts, map sheet columns, and verify your sending rules.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A new prospect is added to Google Sheets. The workflow triggers on the new row, then pulls the fields you care about (name, role, company, industry, language signals).
Send times are planned around deliverability. A scheduler calculates the next Tue/Wed/Thu morning window and adds small randomization so your Gmail activity doesn’t look robotic.
AI writes each email, then Gmail sends it. Email 1 goes out at day 0, then n8n waits 3 days for Email 2, waits 4 more days for Email 3, and updates your Sheet after each send so you always know what happened.
Replies stop everything and alert you. A Gmail reply watcher flags the prospect as hot in Google Sheets and pings Slack, which means the follow-up path gets cut off automatically.
You can easily modify the send days and wait times to match your market based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Trigger Type
This workflow starts from a new row in Google Sheets and also watches Gmail replies for hot prospects.
- Open Sheet Row Added Trigger and set Event to
rowAdded. - Choose the correct Document and Sheet where new prospect rows will appear.
- Credential Required: Connect your googleSheetsTriggerOAuth2Api credentials.
- Open Gmail Reply Watcher and confirm Filters → labelIds includes
INBOXand Poll Times is set toeveryMinute. - Credential Required: Connect your gmailOAuth2 credentials.
Step 2: Connect Google Sheets
Multiple Google Sheets nodes update scheduling, status, and hot-prospect flags. Configure the document and sheet IDs consistently.
- In Update Schedule Row, map Email to
{{ $json.Email }}and scheduling columns to{{ $json.email1_at }},{{ $json.email2_at }}, and{{ $json.email3_at }}. - In Update Email 1 Status and Update Email 2 Status, verify Operation is
updateand mappings include{{ $json.to }}with timestamps like{{ $now.toISO() }}. - In Finalize Sheet Update, ensure Operation is
appendOrUpdateand Email maps to{{ $json.to }}with=Sent at {{ $now.toISO() }}for email3_Statut. - In Flag Prospect Hot, set Email to
{{ $json.From }}and Statut Prospect tohot. - Credential Required: Connect your googleSheetsOAuth2Api credentials to all Google Sheets update nodes (7 total, including Retrieve Status Pre Email 2 and Retrieve Status Pre Email 3).
Step 3: Set Up the Scheduling and Company Profile Processing
New rows are split into parallel branches for scheduling and company profile enrichment.
- Confirm Sheet Row Added Trigger outputs to both Smart Send Scheduler and Company Profile Setup in parallel.
- In Smart Send Scheduler, keep the JavaScript code intact to calculate
email1_at,email2_at, andemail3_atscheduling fields. - In Company Profile Setup, set companyName to
YOUR COMPANY NAME, senderName toYOUR NAME – YOUR TITLE, and Description of the companies or product to your value proposition. - Ensure Company Profile Setup outputs to Combine Streams A, Combine Streams B, and Combine Streams C in parallel.
Step 4: Configure the Wait Timers and Status Checks
Each email is delayed until its scheduled time, and the workflow checks for “hot” prospects before sending follow-ups.
- In Delay Until Email 1 Time, set Resume to
specificTimeand Date Time to{{ $('Smart Send Scheduler').item.json.email1_at }}. - In Delay Until Email 2 Time, set Date Time to
{{ $('Smart Send Scheduler').item.json.email2_at }}, then connect to Retrieve Status Pre Email 2 and Hot Check After Email 2. - In Delay Until Email 3 Time, set Date Time to
{{ $('Smart Send Scheduler').item.json.email3_at }}, then connect to Retrieve Status Pre Email 3 and Hot Check After Email 3. - In Hot Check After Email 2 and Hot Check After Email 3, confirm the condition checks
{{ $json['Statut Prospect'] }}equalshot.
Step 5: Set Up AI and Gmail Sending
Three AI agents write and send Email 1, 2, and 3. Each agent uses a dedicated OpenAI chat engine and Gmail tool.
- In AI Agent Email Intro, review the Text prompt and ensure prospect fields are mapped as shown (e.g.,
{{ $json["First Name"] }}and{{ $json.Email }}). - In AI Agent Followup and AI Agent Final Followup, verify the timing fields are present such as
{{ $json.email2_at }}and{{ $json.email3_at }}. - AI Chat Engine A is connected as the language model for AI Agent Email Intro — Credential Required: Connect your openAiApi credentials.
- AI Chat Engine B is connected as the language model for AI Agent Followup — Credential Required: Connect your openAiApi credentials.
- AI Chat Engine C is connected as the language model for AI Agent Final Followup — Credential Required: Connect your openAiApi credentials.
- In Gmail Dispatch Email A, Gmail Dispatch Email B, and Gmail Dispatch Email C, confirm sendTo, subject, and message are set to
{{ $fromAI('to') }},{{ $fromAI('subject') }}, and{{ $fromAI('message_html') }}. - Credential Required: Connect your gmailOAuth2 credentials to the Gmail tool nodes. These are AI tool sub-nodes—credentials are managed on the tool nodes, not inside the AI agents.
Step 6: Parse Agent Output and Update Email Status
Each AI agent returns JSON that must be parsed before writing status updates back to the sheet.
- In Parse Agent Output A, Parse Agent Output B, and Parse Agent Output C, keep the JavaScript parser that converts the AI response to JSON.
- Ensure Parse Agent Output A connects to Update Email 1 Status and Parse Agent Output B connects to Update Email 2 Status.
- Confirm Parse Agent Output C connects to Finalize Sheet Update to mark Email 3 as sent.
Step 7: Configure Slack Alerts and Reply Handling
Replies are flagged and posted to Slack for quick follow-up.
- Verify Gmail Reply Watcher connects to Flag Prospect Hot, which updates Statut Prospect to
hot. - Connect Flag Prospect Hot to Slack Prospect Reply Alert to notify your team.
- In Slack Prospect Reply Alert, set Channel to your desired Slack channel and keep Text to your message or customize it.
- Credential Required: Connect your slackOAuth2Api credentials for Slack Prospect Reply Alert.
Step 8: Add Error Handling
The workflow uses a dedicated error trigger to alert Slack when any node fails.
- Open Failure Event Trigger and ensure it is connected to Slack Error Notification.
- In Slack Error Notification, keep the Text field with error details such as
{{ $json.execution.error.message }}and{{ $json.execution.lastNodeExecuted }}. - Credential Required: Connect your slackOAuth2Api credentials.
Step 9: Test and Activate Your Workflow
Run a controlled test to confirm the scheduling, AI content, Gmail send, and sheet updates work end-to-end.
- Click Execute Workflow and add a test row to the sheet monitored by Sheet Row Added Trigger.
- Verify that Smart Send Scheduler produces
email1_at,email2_at, andemail3_atand that Update Schedule Row writes them back. - Confirm that after the scheduled wait, AI Agent Email Intro sends via Gmail Dispatch Email A, and Update Email 1 Status updates the sheet.
- Send a reply to the test email and confirm Gmail Reply Watcher triggers Flag Prospect Hot and Slack Prospect Reply Alert.
- Once successful, switch the workflow to Active for production use.
Common Gotchas
- Google Sheets permissions can be sneaky. If rows aren’t updating, check the n8n credential and the specific spreadsheet sharing settings first.
- If you’re using Wait nodes or external scheduling logic, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- OpenAI prompts that are too generic create bland emails. Add your value prop, positioning, and a couple “do not say” rules early, or you will be editing outputs forever.
Frequently Asked Questions
About 45 minutes if your Sheet columns are already clean.
No. You will mostly connect accounts and map fields from your sheet into the email 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 costs (about $0.50 per 100 emails in this setup).
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 plan to duplicate the “generate email → parse output → send → update sheet → wait” pattern for each extra message. In practice, you’d add another AI Agent node for Email 4, another Gmail send node, and another status update in Google Sheets. You’ll also want to extend the scheduler logic so send days still land on Tue/Wed/Thu. Most people also add a “stop after X days” rule so long sequences don’t drag on forever.
Usually it’s a permissions issue on the spreadsheet or an expired credential inside n8n. Reconnect Google Sheets in n8n, then confirm the exact file and worksheet still exist and haven’t been renamed. If updates fail only sometimes, check whether someone added required columns or changed headers, because field mapping can break quietly.
A few hundred prospects per week is normal if your Gmail sending limits allow it.
For this kind of sequence, n8n tends to be easier to keep “stateful” because you can branch on lead status, merge streams, and run multiple wait periods without duct-taping extra zaps together. Reply detection is also more natural since the workflow can react to Gmail triggers and update your Google Sheet immediately. Zapier or Make can work, but multi-step follow-up logic often gets expensive and fiddly. If you’re only sending one email and logging it, they’re fine. If you want the pause-on-reply behavior plus scheduling rules, n8n is usually the cleaner fit. Talk to an automation expert if you want help choosing.
Set this up once and your follow-ups keep running, even when your calendar gets ugly. The workflow handles the repetitive parts, so you can spend your time on replies that actually matter.
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.