Gmail + Google Sheets: follow ups sent, tracked
You send a solid intro email, then… silence. A few days pass, the lead goes cold, and you realize you never followed up because the reply status lived in your inbox while your pipeline lived somewhere else. That disconnect is exactly why Gmail follow up automation matters.
This hits marketing managers hardest when campaigns create a flood of inbound interest, but sales time stays fixed. Agency owners feel it when client follow-ups turn into “did we ever reply?” Slack threads. And solo founders? You are doing all of it, which means follow-ups are the first thing to slip.
This workflow checks who replied, drafts a friendly reminder with Gemini, sends it in the original Gmail thread, and keeps Google Sheets accurate. You’ll see where leads stand without babysitting your inbox.
How This Automation Works
See how this solves the problem:
n8n Workflow Template: Gmail + Google Sheets: follow ups sent, tracked
flowchart LR
subgraph sg0["When clicking ‘Execute workflow’ Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "When clicking ‘Execute workf..", pos: "b", h: 48 }
n1@{ icon: "mdi:message-outline", form: "rounded", label: "Get many messages", pos: "b", h: 48 }
n2@{ icon: "mdi:database", form: "rounded", label: "Update row in sheet", pos: "b", h: 48 }
n3@{ icon: "mdi:database", form: "rounded", label: "Get row(s) in sheet", pos: "b", h: 48 }
n4@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If", pos: "b", h: 48 }
n5@{ icon: "mdi:robot", form: "rounded", label: "AI Agent", pos: "b", h: 48 }
n6@{ icon: "mdi:brain", form: "rounded", label: "Google Gemini Chat Model", pos: "b", h: 48 }
n7@{ icon: "mdi:web", form: "rounded", label: "HTTP Request", pos: "b", h: 48 }
n8@{ icon: "mdi:message-outline", form: "rounded", label: "Get many messages1", pos: "b", h: 48 }
n9@{ icon: "mdi:message-outline", form: "rounded", label: "Reply to a message", pos: "b", h: 48 }
n10@{ icon: "mdi:database", form: "rounded", label: "Update row in sheet1", pos: "b", h: 48 }
n11@{ icon: "mdi:cog", form: "rounded", label: "Wait", pos: "b", h: 48 }
n12@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser", pos: "b", h: 48 }
n13@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields", pos: "b", h: 48 }
n4 --> n5
n11 --> n3
n5 --> n13
n13 --> n8
n7 -.-> n5
n1 --> n2
n8 --> n9
n9 --> n10
n3 --> n4
n2 --> n3
n6 -.-> n5
n12 -.-> n5
n0 --> n1
n0 --> n3
n0 --> 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 n0 trigger
class n5,n12 ai
class n6 aiModel
class n4 decision
class n2,n3,n10 database
class n7 api
The Challenge: Follow-Ups Fall Through the Cracks
Most B2B teams don’t lose leads because the offer is bad. They lose them because the follow-up system is basically “remember to check Gmail.” Replies arrive in threads, someone skims a few, and the tracker gets updated later (or not at all). Then you’re staring at a Google Sheet wondering why “Reminder needed?” still says Yes for someone who replied three days ago. It’s frustrating, and honestly a little embarrassing when you send a reminder to a person who already responded.
It adds up fast. Here’s where it breaks down in day-to-day work.
- You waste about 10 minutes per lead searching threads, checking dates, and updating Sheets manually.
- Reply tracking becomes inconsistent, so you follow up too early, too late, or not at all.
- When your sheet is wrong, the rest of your pipeline reporting is wrong too, which means bad decisions in weekly reviews.
- Writing “friendly nudges” drains attention because you keep rephrasing the same email while trying to sound human.
The Fix: Reply-Aware Follow-Ups That Update Your Sheet
This n8n workflow turns your follow-up process into something you can trust. It starts by checking Gmail for replies to your intro email (based on a subject template you already use), then it marks those leads as “no reminder needed” in Google Sheets. Next, it pulls the remaining leads from your tracker and filters to the ones whose intro email date is older than about 5 days. For each eligible lead, Gemini drafts a short, casual reminder using fields you already track (first name, company name, and the original message/pain point). Finally, the workflow finds your original sent message, replies in the same Gmail thread (so context stays intact), and logs the reminder date back into the spreadsheet.
The workflow starts with Gmail and your lead tracker in Google Sheets. Gemini handles the writing, then Gmail sends the reply on the original thread. Google Sheets gets updated immediately so your “what’s next?” view stays clean.
What Changes: Before vs. After
| What This Eliminates | Impact You’ll See |
|---|---|
|
|
Real-World Impact
Say you have 40 leads in your sheet this week and 15 are sitting past the 5-day mark. Manually, you’ll spend maybe 10 minutes per lead checking the thread, confirming dates, writing a reminder, then updating Sheets, so roughly 2.5 hours. With this workflow, you launch it (or schedule it), and the only “work” is reviewing a few sent reminders afterward, maybe 10 minutes total. That’s a couple hours back, and the tracker stays accurate the whole time.
Requirements
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Gmail to search replies and send thread replies
- Google Sheets for your lead tracker and status fields
- Google Gemini (PaLM) API Key (get it from Google AI Studio / Gemini API in Google Cloud)
Skill level: Intermediate. You’ll connect accounts, map sheet columns, and adjust a Gmail search query.
Need help implementing this? Talk to an automation expert (free 15-minute consultation).
The Workflow Flow
A manual launch (or schedule) kicks things off. The template uses a manual trigger today, but you can run it daily or a few times a week once it’s dialed in.
Gmail gets scanned for replies to your intro email. It searches your inbox for messages that match your introductory subject template, then it uses that to determine which leads have replied.
Google Sheets is updated and filtered. For leads who replied, the workflow marks “Reminder 1 needed?” as No. Then it pulls the remaining rows and checks whether the Intro email Date is older than about five days.
Gemini drafts the reminder, Gmail sends it, and Sheets logs it. The AI writes a short first reminder using the lead’s first name, company, and original message, then the workflow finds the original sent thread and replies inside it. Finally, it updates Status, flips the reminder flag, and writes the reminder send date back to your tracker.
You can easily modify the “5 days” rule to 3 days or 7 days based on your sales cycle. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Manual Trigger
This workflow starts manually and immediately fans out into three parallel branches for email retrieval, sheet processing, and delay handling.
- Add and open Manual Launch Trigger.
- Keep default settings (no parameters required).
- Confirm the parallel flow: Manual Launch Trigger outputs to both Retrieve Email Threads, Fetch Sheet Records, and Delay Window in parallel.
Tip: Parallel execution means Gmail thread retrieval, Google Sheets reads, and the wait timer all begin at the same time after manual запуск.
Step 2: Connect Google Sheets
These nodes read and update your lead tracking sheet and will power the reminder logic.
- Open Modify Sheet Row and set Document to
[YOUR_ID]and Sheet toForm Filled. - In Modify Sheet Row map Email ID to
{{ $json.headers.from.match(/<([^>]+)>/) ? $json.headers.from.match(/<([^>]+)>/)[1] : '' }}and set Reminder 1 needed? toNo. - Credential Required: Connect your
googleSheetsOAuth2Apicredentials to Modify Sheet Row. - Open Fetch Sheet Records and set Document to
[YOUR_ID], Sheet toForm Filled, and add a filter lookup on Reminder 1 needed?. - Credential Required: Connect your
googleSheetsOAuth2Apicredentials to Fetch Sheet Records. - Open Log Reminder Update and confirm column mappings: Status =
Reminder 1 Drafted, Email ID ={{ $('Retrieve Sent Threads').item.json.To }}, Reminder 1 needed? =Yes, Reminder 1 Email Date ={{ $now.format('dd-MMM-yyyy') }}. - Credential Required: Connect your
googleSheetsOAuth2Apicredentials to Log Reminder Update.
⚠️ Common Pitfall: Ensure your Google Sheet column names match exactly (for example, Reminder 1 needed? and Intro email Date) or updates will fail.
Step 3: Connect Gmail and Email Filters
These nodes find original threads and send replies in the correct Gmail thread.
- Open Retrieve Email Threads and set Operation to
getAll, Limit to10, and the filter query tosubject: <template of your introductory email>with Label set toCATEGORY_PERSONAL. - Credential Required: Connect your
gmailOAuth2credentials to Retrieve Email Threads. - Open Retrieve Sent Threads and set the query to
=to: {{ $json.ClientEmail }} subject: Following up your interestwith Label set toSENT. - Credential Required: Connect your
gmailOAuth2credentials to Retrieve Sent Threads. - Open Send Thread Reply and set Resource to
thread, Operation toreply, Message to{{ $('Map Output Fields').item.json.ClientEmailBody }}, Thread ID to{{ $json.threadId }}, and Message ID to{{ $json.id }}. - Optional: set Sender Name to
< your sales team name>in Send Thread Reply. - Credential Required: Connect your
gmailOAuth2credentials to Send Thread Reply.
Tip: The subject filter in Retrieve Email Threads should match your exact introductory email template to avoid pulling unrelated threads.
Step 4: Set Up AI Drafting and Parsing
The AI agent generates the reminder email body and outputs structured fields used by downstream Gmail actions.
- Open Reminder Draft Agent and keep the prompt as provided; it uses expressions like
{{ $json['Email ID'] }},{{ $json.Message }}, and{{ $json['Intro email Date'] }}. - Confirm Reminder Draft Agent has output parsing enabled (hasOutputParser is true).
- Open Gemini Chat Engine and connect it as the language model to Reminder Draft Agent.
- Credential Required: Connect your
googlePalmApicredentials to Gemini Chat Engine. - Open Structured Output Decode and verify the JSON schema example is set to
{ "ClientEmail": "email id", "ClientEmailBody": "Content of email id" }. - Open External API Call and ensure URL is set to
{{ /*n8n-auto-generated-fromAI-override*/ $fromAI('URL', ``, 'string') }}if you plan to call an external tool.
Tip: Structured Output Decode and External API Call are AI sub-tools linked to Reminder Draft Agent; add any required credentials on the parent agent configuration, not the sub-node.
Step 5: Configure Logic, Mapping, and Timing
This step controls when a reminder is needed and maps AI output for Gmail replies.
- Open Conditional Branch and keep the rule: left value
{{ DateTime.fromFormat($json["Intro email Date"], "dd/MM/yyyy").toMillis() }}is less than right value{{ DateTime.now().minus({ days: 5 }).toMillis() }}. - Open Map Output Fields and assign ClientEmail to
{{ $json.output.ClientEmail }}and ClientEmailBody to{{ $json.output.ClientEmailBody }}. - Open Delay Window if you want to adjust the waiting behavior before Fetch Sheet Records runs.
⚠️ Common Pitfall: If Intro email Date is not in dd/MM/yyyy format, the date comparison in Conditional Branch will fail.
Step 6: Test and Activate Your Workflow
Run a manual test to verify threading, AI output, and sheet updates before turning it on for production.
- Click Execute Workflow on Manual Launch Trigger to run all three parallel branches.
- Check that Retrieve Email Threads pulls the correct Gmail threads and Modify Sheet Row updates Reminder 1 needed? to
No. - Verify Reminder Draft Agent produces structured output and Map Output Fields passes ClientEmailBody into Send Thread Reply.
- Confirm Gmail replies are sent in the correct thread and Log Reminder Update writes the reminder status and date to Google Sheets.
- When everything works, toggle the workflow to Active for production use.
Watch Out For
- Gmail credentials can expire or need specific permissions. If things break, check the n8n Credentials page and confirm the Gmail scope still allows reading and sending.
- 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 sheet columns are already set up.
Yes. There’s no coding, but you will need to map Google Sheets columns and paste in your Gmail subject template.
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 Gemini API usage costs, which depend on how many reminders you generate.
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 change the “older than 5 days” condition in the If node to match your cycle, then tweak the Gemini prompt in the AI Agent node to match your tone. Many teams also adjust the Gmail search query in the “Retrieve Email Threads” step to target a specific label or campaign subject. If you want a second reminder, duplicate the reminder branch and write back to new columns like “Reminder 2 needed?” and “Reminder 2 Email Date.”
Usually it’s expired OAuth access or missing Gmail permissions in your n8n credential. Reconnect Gmail in n8n, then re-run a test search to confirm the inbox query returns results. Also check that your workflow is searching the right place (inbox vs. sent) and that your subject template matches what was actually sent.
If you self-host, capacity mostly depends on your server and Gmail API limits.
Often, yes, because this flow benefits from branching logic, parsing structured AI output, and doing multiple Gmail lookups in one run. n8n also gives you the option to self-host, which matters when reminders scale and execution counts climb. Zapier or Make can still work if you want a very simple “delay then email” setup, but they get awkward when you need to search threads, avoid duplicates, and keep a sheet perfectly in sync. The real difference is control: you can fine-tune the Gmail query, the date logic, and the AI prompt in one place. If you’re torn, Talk to an automation expert and we’ll sanity-check your setup.
Once this is running, follow-ups stop being a mental load. The workflow handles the repetitive nudges and logging, so you can focus on the conversations that actually move revenue.
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.