Automatic follow-up when a lead doesn't reply
If someone hasn't replied 3 days after your email, send a polite follow-up automatically.
How it works
Trigger: Schedule — weekdays at 10:00
- Read your Outreach sheet (email, name, subject, sent_at, followed_up).
- Keep people emailed more than 3 days ago who haven't had a follow-up.
- Check Gmail for a reply from them in the last 5 days.
- If there's no reply, send a short follow-up and mark the row as followed up.
Diagram
Trigger App Logic
Build it
Pick your tool — same automation, step by step.
Copy and paste straight into an n8n canvas (Ctrl+V), or download and use Import from File. Then connect your own credentials and replace every YOUR_… placeholder.
Show code (277 lines)
{
"name": "Automatic follow-up when a lead doesn't reply (Flowngn)",
"nodes": [
{
"parameters": {
"content": "## Automatic follow-up when a lead doesn't reply\nIf someone hasn't replied 3 days after your email, send a polite follow-up automatically.\n\n**Setup**\n1. Open each node and connect your own credentials.\n2. Replace every YOUR_… placeholder.\n3. Test once, then activate.\n\nFree template from Flowngn",
"height": 260,
"width": 340
},
"id": "34314253-a934-4153-ae4e-f6e12969f9cb",
"name": "Setup notes",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-420,
-60
]
},
{
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "0 10 * * 1-5"
}
]
}
},
"id": "34314253-a934-4153-ae4e-f6e12969f9cb",
"name": "Weekdays 10:00",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.2,
"position": [
0,
0
]
},
{
"parameters": {
"operation": "read",
"documentId": {
"__rl": true,
"value": "YOUR_SPREADSHEET_ID",
"mode": "id"
},
"sheetName": {
"__rl": true,
"value": "Outreach",
"mode": "name"
},
"options": {}
},
"id": "34314253-a934-4153-ae4e-f6e12969f9cb",
"name": "Read outreach list",
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.5,
"position": [
300,
0
]
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "loose"
},
"conditions": [
{
"id": "c1",
"leftValue": "={{ $json.followed_up !== 'yes' && $json.sent_at && DateTime.fromISO($json.sent_at) < $now.minus({ days: 3 }) }}",
"rightValue": "",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"id": "34314253-a934-4153-ae4e-f6e12969f9cb",
"name": "Due for follow-up?",
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
600,
0
]
},
{
"parameters": {
"operation": "getAll",
"limit": 1,
"filters": {
"q": "=from:{{ $json.email }} newer_than:5d"
}
},
"id": "34314253-a934-4153-ae4e-f6e12969f9cb",
"name": "Check for a reply",
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.1,
"position": [
900,
0
],
"alwaysOutputData": true
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "loose"
},
"conditions": [
{
"id": "c1",
"leftValue": "={{ $json.id }}",
"rightValue": "",
"operator": {
"type": "string",
"operation": "notExists",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"id": "34314253-a934-4153-ae4e-f6e12969f9cb",
"name": "No reply yet?",
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
1200,
0
]
},
{
"parameters": {
"sendTo": "={{ $('Due for follow-up?').item.json.email }}",
"subject": "=Re: {{ $('Due for follow-up?').item.json.subject }}",
"emailType": "text",
"message": "=Hi {{ $('Due for follow-up?').item.json.name }},\n\nJust floating this to the top of your inbox — happy to answer any questions, or I'll leave you be if the timing isn't right.\n\nBest,\nYOUR_NAME",
"options": {
"appendAttribution": false
}
},
"id": "34314253-a934-4153-ae4e-f6e12969f9cb",
"name": "Send follow-up",
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.1,
"position": [
1500,
0
]
},
{
"parameters": {
"operation": "update",
"documentId": {
"__rl": true,
"value": "YOUR_SPREADSHEET_ID",
"mode": "id"
},
"sheetName": {
"__rl": true,
"value": "Outreach",
"mode": "name"
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"email": "={{ $('Due for follow-up?').item.json.email }}",
"followed_up": "yes"
},
"matchingColumns": [
"email"
]
},
"options": {}
},
"id": "34314253-a934-4153-ae4e-f6e12969f9cb",
"name": "Mark followed up",
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.5,
"position": [
1800,
0
]
}
],
"connections": {
"Weekdays 10:00": {
"main": [
[
{
"node": "Read outreach list",
"type": "main",
"index": 0
}
]
]
},
"Read outreach list": {
"main": [
[
{
"node": "Due for follow-up?",
"type": "main",
"index": 0
}
]
]
},
"Due for follow-up?": {
"main": [
[
{
"node": "Check for a reply",
"type": "main",
"index": 0
}
]
]
},
"Check for a reply": {
"main": [
[
{
"node": "No reply yet?",
"type": "main",
"index": 0
}
]
]
},
"No reply yet?": {
"main": [
[
{
"node": "Send follow-up",
"type": "main",
"index": 0
}
]
]
},
"Send follow-up": {
"main": [
[
{
"node": "Mark followed up",
"type": "main",
"index": 0
}
]
]
}
},
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"meta": {
"templateCredsSetupCompleted": false
},
"tags": []
}In Make, create a new scenario and add these modules in order:
- Schedule the scenario: Weekdays 10:00
- Google Sheets › Search Rows
- Filter on the next route: “Due for follow-up?”
- If yesGmail › Watch Emails (by label)
- If yesFilter on the next route: “No reply yet?”
- If yesGmail › Send an Email
- If yesGoogle Sheets › Update a Row
- Every module run uses Make operations — the free plan includes a monthly quota.
- Module and step names can differ slightly as Make and Zapier update their apps.
In Zapier, create a new Zap and add these steps in order:
- Schedule by Zapier — Weekdays 10:00
- Google Sheets — Lookup Spreadsheet Rows (or Code by Zapier)
- Filter by Zapier: “Due for follow-up?”
- If yesGmail — New Labeled Email
- If yesFilter by Zapier: “No reply yet?”
- If yesGmail — Send Email
- If yesGoogle Sheets — Update Spreadsheet Row
- Zaps with more than two steps need a paid Zapier plan.
- Webhooks, Filters/Paths and Code by Zapier are premium features on some Zapier plans.
- Module and step names can differ slightly as Make and Zapier update their apps.
Tips
- Only one automatic follow-up — after that, a personal message works better.
Related flows
Sales & CRMMedium
AI cold email drafts from each prospect's website
Add a prospect to a sheet; AI reads their website and drafts a short, personal email in Gmail for you to check.
Google Sheets → HTTP Request → AI model → Gmail8h/mo
Sales & CRMEasy
Follow-up draft 3 days after sending a proposal
Log a sent proposal in a sheet; three days later a polite follow-up email is waiting in your Gmail drafts.
Google Sheets → Gmail3h/mo
Sales & CRMAdvanced
AI lead qualifier
AI scores each new lead and fast-tracks the hot ones to your sales team.
Webhook → AI model → Slack → Gmail8h/mo