Gmail + Google Sheets: follow-ups sent and logged
Following up sounds simple until you’re staring at a messy Google Sheet, yesterday’s sent emails, and that nagging feeling you forgot someone important.
This Gmail follow-up automation hits sales reps and marketing managers hardest. But founders running their own outreach and agency teams managing multiple campaigns feel the same drag. You’ll send staged follow-ups automatically and keep your tracker updated without babysitting it.
This workflow pulls contacts from Google Sheets, sends the right email at the right stage in Gmail, then watches for replies and logs them back to the sheet. You’ll see where time disappears, what the automation changes, and what you need to run it.
How This Automation Works
See how this solves the problem:
n8n Workflow Template: Gmail + Google Sheets: follow-ups sent and logged
flowchart LR
subgraph sg0["Daily Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "Daily Trigger", pos: "b", h: 48 }
n1@{ icon: "mdi:database", form: "rounded", label: "Fetch Contact Data ", pos: "b", h: 48 }
n2@{ icon: "mdi:swap-vertical", form: "rounded", label: "Iterate Contacts", pos: "b", h: 48 }
n3@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Determine Follow-Up Stage", pos: "b", h: 48 }
n4@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Route by Follow-Up Stage", pos: "b", h: 48 }
n5@{ icon: "mdi:message-outline", form: "rounded", label: "Send Follow-Up Email 1 ", pos: "b", h: 48 }
n6@{ icon: "mdi:message-outline", form: "rounded", label: "Send Follow-Up Email 2", pos: "b", h: 48 }
n7@{ icon: "mdi:database", form: "rounded", label: "Update Sheet with Follow-Up ..", pos: "b", h: 48 }
n0 --> n1
n2 --> n3
n1 --> n2
n6 --> n7
n5 --> n7
n4 --> n5
n4 --> n6
n3 --> n4
n7 --> n2
end
subgraph sg1["Flow 2"]
direction LR
n8@{ icon: "mdi:message-outline", form: "rounded", label: "Check Email Responses", pos: "b", h: 48 }
n9@{ icon: "mdi:database", form: "rounded", label: "Update Sheet with Response ", pos: "b", h: 48 }
n8 --> n9
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 n3,n4 decision
class n1,n7,n9 database
The Challenge: Follow-ups fall through the cracks
Most outreach trackers start out “organized” and turn into a junk drawer. Someone updates the stage but forgets the last_email_date. Another person sends a follow-up from their inbox, but the sheet still says “Pending.” Then replies land in Gmail and never make it back to the tracker, so you keep nudging people who already answered (which feels… not great). The worst part is the mental overhead. You spend more energy remembering what to do than doing the work that actually moves deals.
It adds up fast. Here’s where it breaks down in day-to-day outreach.
- You waste about 10 minutes per contact just checking history, choosing the right template, and updating the sheet after sending.
- Follow-up stages drift because everyone interprets “Follow-Up 1” differently, which means inconsistent messaging and timing.
- Replies stay trapped in inbox threads, so reporting turns into guesswork and “I think they responded?” conversations.
- Manual sending makes it hard to scale past a small list without mistakes, duplicated messages, or missed days.
The Fix: A staged follow-up engine powered by Sheets
This workflow turns Google Sheets into your lightweight outreach system and Gmail into the delivery engine. Every morning (set to 9 AM by default), n8n reads your “EmailCampaign” sheet, grabs each contact, and checks their current stage and status. Based on that, it sends the right message through Gmail (initial or follow-up) and immediately updates the sheet so the tracker reflects what actually happened. Separately, it monitors your inbox for replies using IMAP, then writes the response back into the sheet and updates the status to “Replied.” No more hunting through threads. No more “did we send the second follow-up?” debates.
The workflow starts on a schedule, then loops through contacts in batches so it can handle a list without choking. After it routes each person to the correct follow-up level, Gmail sends the email and Google Sheets is updated right away. Finally, reply detection keeps the tracker honest, even when you’re busy doing other work.
What Changes: Before vs. After
| What This Eliminates | Impact You’ll See |
|---|---|
|
|
Real-World Impact
Say you have 40 contacts in your Google Sheet and you send staged outreach that includes an initial email plus one follow-up. Manually, you’ll spend maybe 10 minutes per contact to check history, send, and log status, which is about 6 hours across a week. With this workflow, you spend about 15 minutes updating the sheet and sanity-checking templates, then the scheduled run does the sending and logging automatically. Replies also get captured without extra work, so your tracker stays accurate while you move on.
Requirements
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets for your contact list and tracking.
- Gmail to send follow-ups and read replies.
- Gmail OAuth2 + Google Sheets credentials (create in Google Cloud, then connect in n8n).
Skill level: Beginner. You’ll mostly connect accounts, map a few fields, and edit message text for each follow-up stage.
Need help implementing this? Talk to an automation expert (free 15-minute consultation).
The Workflow Flow
A daily schedule kicks things off. The workflow starts at 9 AM by default using a Schedule Trigger, so outreach runs even if you forget.
Google Sheets provides the “source of truth.” n8n reads the EmailCampaign sheet (name, email, stage, last_email_date, status, response) and pulls the records into a loop.
Logic decides who gets what. An If check and a routing step (by follow-up level) pick the correct Gmail message for that contact, using the stage you set in the sheet.
Emails go out, and the sheet updates immediately. After sending, the workflow writes back the new status and last email date. In a separate path, an IMAP email trigger scans for replies and logs the response text to the same row.
You can easily modify the follow-up stages to match your campaign, or change the schedule to run hourly during a launch. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Schedule Trigger
Set the daily trigger that kicks off the outreach cycle.
- Add and open Daily Schedule Start.
- Set the schedule Rule to use
cronExpression(configure the desired daily time in the UI). - Connect Daily Schedule Start to Retrieve Contact Records to begin the workflow.
Step 2: Connect Google Sheets
Pull contacts and update follow-up status in your spreadsheet.
- Open Retrieve Contact Records and select your Document and Sheet (e.g., Sheet3 in PageRankChecker). Credential Required: Connect your googleApi credentials.
- Open Modify Sheet Follow-Up Status and confirm Operation is
updatewith Authentication set toserviceAccount. Credential Required: Connect your googleApi credentials. - Ensure the column mappings in Modify Sheet Follow-Up Status use these expressions:
={{ $('Route by Follow-Up Level').item.json.Reply }},={{ $('Route by Follow-Up Level').item.json['Follow-up'] + 1}},={{ $('Route by Follow-Up Level').item.json['User Name'] }},={{ $('Route by Follow-Up Level').item.json['Inquiry ID'] }},={{ $('Route by Follow-Up Level').item.json['User Email'] }},={{ new Date($now).toISOString().split('T')[0] }},={{ new Date(Date.now() + 3 * 24 * 60 * 60 * 1000).toISOString().split('T')[0] }}. - Connect Modify Sheet Follow-Up Status back to Cycle Through Contacts to keep processing remaining records.
Step 3: Set Up Contact Batching and Follow-Up Logic
Batch contacts and route only those who have not replied.
- Open Cycle Through Contacts to control record batching (keep defaults unless you need a specific batch size).
- Configure Evaluate Follow-Up Status with condition: Left Value
={{ $json.Reply }}equalsno. - Set Evaluate Follow-Up Status to output data even when the condition fails (already configured), then connect it to Route by Follow-Up Level.
- In Route by Follow-Up Level, verify rules for Follow-up values:
={{ $json['Follow-up'] }}equals6and equals7.
Step 4: Configure Follow-Up Email Dispatch
Send the appropriate follow-up email based on the contact’s follow-up level.
- Open Dispatch Follow-Up Email A and set Send To to
={{ $json['User Email'] }}, Subject toTesting-6, and Message toTesting-6. Credential Required: Connect your googleApi credentials. - Open Dispatch Follow-Up Email B and set Send To to
={{ $json['User Email'] }}, Subject toTesting-7, and Message toTesting-7. Credential Required: Connect your googleApi credentials. - Confirm Route by Follow-Up Level connects to both Dispatch Follow-Up Email A (Follow-up = 6) and Dispatch Follow-Up Email B (Follow-up = 7).
- Ensure both email nodes connect to Modify Sheet Follow-Up Status to record the new status.
Step 5: Process Reply Scanning and Sheet Updates
Scan for replies and update the spreadsheet to stop future follow-ups.
- Open Scan Email Replies and confirm Custom Email Config is
["UNSEEN", ["SUBJECT", "Testing"]]. Credential Required: Connect your imap credentials. - Open Update Sheet with Reply and set Operation to
updatewith Authentication set toserviceAccount. Credential Required: Connect your googleApi credentials. - Verify column mappings in Update Sheet with Reply: reply to
=yesand user email to={{ $json.from }}, matching on user email.
Step 6: Review Utility Nodes for Optional Enhancements
These helper nodes are placeholders for additional message or HRMS updates.
- Open Utility: Followup Msg 6 and Utility: Followup Msg 7 if you want to add variables or template content.
- Review Utility: HRMS Inquiry Update for future data enrichment or external updates.
Step 7: Test and Activate Your Workflow
Run a controlled test to verify emails, routing, and sheet updates before going live.
- Click Execute Workflow to run a manual test with sample data from Retrieve Contact Records.
- Confirm a contact with Reply =
noroutes through Route by Follow-Up Level, triggers the correct email node, and updates Modify Sheet Follow-Up Status. - Trigger Scan Email Replies manually and verify Update Sheet with Reply writes
=yesto the reply column for the matchinguser email. - Turn on the workflow using the Active toggle to enable daily scheduled runs.
Watch Out For
- Gmail credentials can expire or need specific permissions. If things break, check the Gmail connection inside n8n’s Credentials screen first, then confirm IMAP is enabled in your Gmail settings.
- 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
About an hour if your Google and Gmail accounts are ready.
Yes. No coding is required, but you do need to be comfortable mapping sheet columns to email fields and testing with a small list first.
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 Google usage limits (typically not an extra cost for small lists).
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.
Start by changing the stage rules in the “Evaluate Follow-Up Status” and “Route by Follow-Up Level” logic so it matches your exact sequence (for example: Initial, Follow-Up 1, Follow-Up 2, Breakup). Then edit the message text in the Set nodes (the “Followup Msg” utilities) so the copy sounds like you. Common customizations include skipping weekends, stopping follow-ups when status is “Replied,” and adding a “Do Not Contact” value in the sheet that the workflow respects.
Usually it’s expired OAuth access or IMAP being disabled in Gmail. Reconnect the Gmail credential in n8n, confirm IMAP is turned on, and double-check the Google account permissions you approved. If it fails only on larger runs, you may also be hitting rate limits, so slow the batch size and avoid blasting too many emails at once.
If you self-host n8n, there’s no execution cap from n8n itself; it mainly depends on your server and Gmail sending limits.
Often, yes, because follow-up sequencing needs branching logic, looping through rows, and updating the tracker after each send, and n8n handles that without turning into a pile of separate Zaps or scenarios. It also gives you the self-hosting option, which is useful when you run outreach daily and don’t want to think about task limits. Zapier or Make can still be fine for very small, simple flows, like “new row equals send one email.” This one is closer to a mini system, not a single trigger-action pair. Talk to an automation expert if you want a quick recommendation for your exact volume and tools.
Once this is running, your follow-ups go out on time and your sheet stays truthful. Honestly, that’s the kind of “set it and forget it” win that makes outreach sustainable.
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.