In this post, I’ll show you how to build an automated lead follow up system using n8n — one that responds instantly and follows up automatically so no lead slips through the cracks.
Key takeaways
- An automated lead follow-up system has four moving parts. It needs a trigger, an instant response, a branching nurture sequence, and a human handoff.
Miss any one of these and leads slip through the cracks. - Speed is the single biggest lever you have. Responding within 5 minutes makes a lead up to 100x more likely to convert than waiting 30 minutes.
- The hardest part is not sending timed emails. It is correctly detecting who has replied, so the automation does not nag a lead who already answered or go silent on one who did not.
Most guides on this topic explain the theory and stop there. This one does not.
Every detail below comes from a real system built in n8n, currently running live, including the bugs that broke it and how we fixed them.
If you want this built for you rather than by you, our n8n automation agency handles the setup end to end.

What Is an Automated Lead Follow-Up System?
An automated lead follow-up system is a workflow that responds to a new lead the moment they submit a form.
It then checks in automatically over the following days if nobody replies, sending a series of timed nudges instead of relying on a person to remember.
The best systems also detect when a lead does reply and stop immediately, handing the conversation to a human.
That is the short version. The rest of this guide breaks down exactly how it works and how to build one yourself.
Why Manual Follow-Up Fails
Nobody sets out to ignore a lead. It happens because follow-up competes with everything else on a business owner’s plate, and it usually loses.
The real cost is not the five minutes it takes to write one reply. It shows up in smaller, harder-to-see ways:
- Context switching – stopping what you are doing to remember what a lead asked three days ago
- The lead that sits too long – not forgotten forever, just forgotten long enough to lose interest
- Manual CRM cleanup – updating a spreadsheet or CRM field by hand, after the fact, if at all
- The back-and-forth just to get basic info – chasing details a form could have captured up front
Speed makes this worse.
Research from Lead Response Management found that contacting a lead within 5 minutes makes you nearly 100x more likely to make contact and qualify them, compared to waiting 30 minutes.
A separate InsideSales.com study puts the odds of qualifying a lead at 21x higher within the first 5 minutes versus 30.
The RAIN Group has found it takes an average of multiple touches, not one, to actually convert a lead. That is exactly why a single “sorry, missed your message” email is not a system. It is a gesture.
This gap is what the automation below is built to close. It does not replace judgment. It removes the admin that gets in the way of it.
How an Automated Follow-Up System Works
Strip away the tooling and every real system follows the same six-step logic.
- Trigger – something starts the sequence, such as a form submission
- Capture – the lead’s info gets pulled out and cleaned up
- Instant response – a confirmation goes out immediately, and the lead gets logged
- Qualification and detection – the system figures out what state the lead is in
- Branching nurture – a different sequence runs depending on that state
- Human handoff — the moment a real reply appears, automation steps back

Here is how that maps onto a real, live build:

The Case Detection step is the part almost nobody talks about. It is also the hardest part to get right. More on that in the Common Mistakes section below.
The Trigger
Most systems fire off one of a handful of events.
A web form submission works well, whether that is a quote request, contact form, or lead magnet. A missed call can trigger a sequence too, along with behavioral signals like revisiting a pricing page, or re-engaging a dormant lead.
The build referenced throughout this guide uses a Tally form submission as its trigger. A lead fills out a request, and the workflow takes over from that instant.
Instant Response (Speed-to-Lead)
Speed is what separates a lead who books a call from one who moves on to a competitor. The data below shows exactly how much responding fast changes your odds, and the build in this guide sends that first response the same second the form gets submitted.
| Response time | Likelihood of qualifying the lead |
| Within 5 minutes | Up to 100x more likely than 30 min |
| Within 5 minutes (alt. study) | 21x more likely than 30 min |
| After 30+ minutes | Sharp drop-off in contact and qualification rates |

In the live build, the confirmation email fires in the same execution as the intake.
There is no polling delay and no batch job checking every 10 minutes. The lead submits the form, and the confirmation is already on its way before they close the tab.
Lead Qualification and Scoring
A common failure point in DIY automations is qualification logic that gets bolted onto a separate tool, disconnected from the CRM, so the two fall out of sync.
The simpler and more durable approach is to keep one system of record.
In this build, Airtable is the single source of truth. Every lead has one record, and every status change, whether bounced, lead_replied, or unresponsive, gets written back to that same record instead of scattered across multiple tools.
Nurture Sequence and Branching Logic
This is the part where most guides get vague. Here is the actual branching logic from a live system.
| State | Sequence |
| Case 1 — Total silence (nobody has replied) | Wait 3h → nudge → wait 3d → final apology → marked unresponsive |
| Case 3 — You replied, lead still silent | Wait 24h → nudge → wait 3d → case study email → wait 7d → closeout → marked unresponsive |
| Case 2 — Lead replied (at any point) | Sequence stops immediately, status flips to lead_replied, a human takes over |
Every checkpoint re-checks who has replied before sending the next email. This means a lead who answers between the 3-hour and 3-day nudge never gets the 3-day nudge.
Human Handoff
The moment a lead replies, the system’s job is done.
In this build, that is Case 2. The automation goes permanently silent for that lead, and a person takes over the conversation in Gmail directly.
No AI-generated replies are sent on the business’s behalf. That is a deliberate choice, not a limitation. Automation should remove admin, not replace judgment.
Automated vs Manual Follow-Up Side by Side
The gap between manual and automated follow-up is not just speed.
It shows up in consistency, cost, and how well the system holds up once lead volume grows. The table below breaks down exactly where each approach wins and where it falls short.
| Manual | Automated | |
| Speed | Minutes to days, depending on how busy you are | Seconds, every time |
| Consistency | Breaks down the moment you’re busy | Identical every single time |
| Effort per lead | A few minutes, repeated for every lead, every touch | Built once, runs forever |
| Personalization | High, but inconsistent | Dynamic, pulled from the actual form data every time |
| Cost at scale | Grows linearly with lead volume | Flat. 10 leads or 1,000 costs the same to run |
How to Build Your Own Automated Lead Follow-Up System
You don’t need a big budget or a technical background to get this running.
The seven steps below walk through the exact process, from picking your tools to setting up the safety nets that keep leads from slipping through.
Step 1 – Choose Your Stack
The right stack depends on the size and shape of your business.
| Business type | Typical stack |
| Local service / small business | Tally or a simple form tool + n8n or Zapier/Make + Gmail + Airtable |
| B2B SaaS | HubSpot or Pipedrive as CRM, with native or connected automation |
| Enterprise / RevOps | Apollo, Conversica, or Salesforce-native automation, often layered with a dedicated SDR tool |
The build in this guide uses Tally for forms, n8n for orchestration, Gmail OAuth2 for sending, and Airtable as the CRM and database.
This stack was chosen specifically because it has no per-lead subscription fee. You own the workflow outright. There is no monthly software bill that scales with how many leads come in.
Step 2 – Map Your Triggers and Goals
Before building anything, write down what starts the sequence and what “done” looks like for a lead. In this build, the goal was simple.
Never let a lead go silent unnoticed, without needing anyone to remember to check.
Step 3 – Build Your Sequence (Messaging and Timing)
Here is a real sequence, not a hypothetical one.
- Instant acknowledgment, sent the moment the form is submitted
- Wait period of 3 hours (Case 1) or 24 hours (Case 3, since you already replied once)
- Check-in or nudge message
- Wait 3 more days
- Value or case-study message
- Wait 7 more days
- Final closeout message, then the record gets marked unresponsive
- Stop-on-reply logic at every single step
Step 4 – Add a Missed-Call Text-Back Layer (Optional)
Some businesses, especially local and home-service ones, lose leads to missed phone calls, not just unanswered forms.
This layer was not part of the build referenced in this guide, since it is a form-triggered system rather than a call-triggered one.
It is a natural phase-two addition worth flagging if missed calls are a bigger source of leads for you.
Step 5 – Personalize with AI (Beyond First Name Tags)
Static templates with a name swapped in feel like what they are. Templates.
The build referenced here pulls the lead’s name, the service they asked about, and a summary of their inquiry directly from the form submission into every email.
That way the instant response actually references what the lead asked for, not just their name.
Step 6 – Test, Launch, and Set Handoff Rules
This is where most DIY automations quietly ship with bugs nobody notices until a real lead falls through.
The live build referenced throughout this guide went through a real validation pass and caught 10 separate bugs that manual review had missed entirely. See the Common Mistakes section below for the full list.
[SCREENSHOT: n8n execution log showing a passed test run, real timestamps]
Before launch, confirm the following:
- Every wait node is set to its real production duration, not a test value
- Every “did they reply” check is scoped to the correct thread, not just the sender’s email address
- There is a wait period before every reply-check, since checking instantly will never catch a genuine human reply
- A terminal status gets written for every possible ending, not just the happy path
Step 7 – Monitor, A/B Test, and Improve
Track reply rate, time-to-first-open, meetings booked, and, most importantly, response time from trigger to first send. A system that is fast but silent on failures is just as risky as one that is slow.
[SCREENSHOT: Error Handler workflow canvas, plus one sample alert email]
The build here runs a separate, always-on error-handler workflow that emails an alert the moment anything fails anywhere in the main sequence.
It flags the workflow name, the exact node that failed, the error message, and a direct link to the execution. Nothing fails silently.
Common Mistakes That Break Automated Follow-Up Systems
These mistakes rarely show up in guides on this topic, which is strange, because they are what actually takes a system down in production.
Every item below was a real bug, caught and fixed in a live build.
- Checking for a reply by sender email alone. If a test or real email address gets reused across more than one conversation, a reply from a completely unrelated old thread gets mistaken for a reply on a brand-new lead. Fix: match on the thread ID, not just the sender.
- Checking for a reply with zero wait time. Running the check the same second an email sends will never catch a real human reply.
It only catches something that already existed at that instant. Fix: add a wait node before every reply-check. - The automation’s own confirmation email tripping its own reply check. A check for “has the business owner personally replied” can be satisfied by the system’s own auto-sent confirmation, since it is sent from the same account.
Fix: explicitly exclude the automation’s own known message IDs. - Trusting exact string matches on form data. A form field label with a trailing space silently broke a mapping.
The field just came out empty, with no error thrown.
Fix: trim anything sourced from external form input, and never assume exact equality holds. - No terminal status for leads who go completely silent. A sequence that just ends, with no final status written, means “unresponsive” as a real, queryable state never actually existed.
Fix: build an explicit status write at the end of every path, not just the ones where a reply happens. - Assuming data further back in the chain is still available. Referencing data from several nodes back without pointing at the source node explicitly can silently break the moment an intermediate node’s output shape changes.
Fix: reference the source node by name, not assumption. - A dead or mistyped email address only getting caught on the last day. Waiting until day 7 to discover a bounce wastes the entire sequence.
Fix: check for bounces early, right after the first send, not just as a backup at the end.
Real-World Examples of Sequences in Action
Rather than hypothetical scenarios, here are three sequences that have actually run and been verified against real execution data.
Case 1, total silence.
A lead submits the form, gets the instant confirmation, and never replies.
The system runs a 3-hour nudge, then a 3-day final apology, then a 7-day closeout, and the status flips to unresponsive. Verified live.
Case 2, lead replies first.
A lead replies to the confirmation email before anyone follows up manually. The automation detects this and goes permanently silent. No further emails go out, the status flips to lead_replied, and the business owner takes the conversation from there. Verified live.
Case 3, business owner replies personally, lead stays silent.
The business owner responds to the lead directly.
If the lead does not answer, the system picks up its own timed sequence from there: a 24-hour nudge, a 3-day case study, and a 7-day closeout. If the lead replies at any point mid-sequence, remaining emails cancel and the status flips to lead_replied instead.
Verified live, including the mid-sequence flip.
[SCREENSHOT: Three real, PII-redacted execution timelines from n8n — one per case]
Popular Tools for Automated Lead Follow-Up (2026)
Picking a tool comes down to how much control you want versus how fast you want to start.
The table below breaks down the main options by type, best fit, and what they actually cost to run over time.
| Tool | Type | Best for | Recurring cost |
| HubSpot | CRM-native automation | B2B SaaS, mid-market | Monthly, scales with contacts |
| Pipedrive | CRM-native automation | Small sales teams | Monthly per seat |
| GoHighLevel | All-in-one marketing/CRM | Agencies, local service businesses | Monthly, flat or tiered |
| Apollo | Sales engagement + data | B2B outbound-heavy teams | Monthly, scales with usage |
| Conversica / Verse.io | AI SDR (voice/chat-first) | Enterprise, high lead volume | Enterprise pricing |
| n8n / Zapier / Make | Workflow orchestration | Any business wanting a self-owned, custom system | Self-hosted n8n has no per-lead fee. Zapier and Make are usage-based |
The tradeoff worth naming directly: SaaS platforms are faster to start with but charge per contact or per month indefinitely.
A self-owned n8n build costs time to set up correctly, including the real bugs listed above, but then runs indefinitely without a growing subscription bill.
See our breakdown of [zapier vs make vs n8n](INTERNAL LINK: Blog #4, once published) for a fuller comparison.
How to Make Your Automation Fail-Safe
This is the part most guides skip entirely, and it is the difference between a demo and something you would actually trust with real leads.
- A dedicated error-handler workflow, separate from the main sequence, that fires an alert the instant anything fails, including which workflow, which node, what the error was, and a direct link to the execution
- Early bounce detection, right after the first send, so a dead or mistyped email address gets caught immediately instead of wasting the whole sequence
- Thread-scoped reply checks everywhere a “did they reply” decision gets made, to prevent an unrelated old conversation from being mistaken for a new one
- A hard cap on emails per lead, scoped per-lead rather than globally, so no single stuck lead can ever be emailed indefinitely
- A duplicate-lead guard, so the same email submitting twice updates the existing record instead of spawning a second, parallel automation
- A safe default, so if the “who’s replied” check ever comes back empty or errors out, the system defaults to the safest path of one extra follow-up rather than crashing
None of this is exotic. It is what separates an automation that works in a demo from one that works when a real business depends on it.
Click to view the full n8n workflow JSON
{
"name": "Instant Lead Response + 3-3-7 Follow-Up",
"nodes": [
{
"parameters": {
"httpMethod": "POST",
"path": "your-lead-form-webhook",
"options": {}
},
"id": "d5f8a3c2-4e1b-4a2c-8d9f-1e2a3b4c5d6e",
"name": "SureForms Webhook",
"typeVersion": 2,
"type": "n8n-nodes-base.webhook",
"position": [
1600,
1056
]
},
{
"parameters": {
"assignments": {
"assignments": [
{
"type": "string",
"name": "email",
"id": "1",
"value": "={{$json.body.data.fields.find(f => f.label === \"Your Email\")?.value || ''}}"
},
{
"type": "string",
"name": "name",
"id": "2",
"value": "={{$json.body.data.fields.find(f => f.label === \"Your Name\")?.value || ''}}"
},
{
"type": "string",
"name": "inquiry_summary",
"id": "3",
"value": "={{$json.body.data.fields.find(f => f.label === \"What is the business process you would like to automate\")?.value || ''}}"
},
{
"type": "string",
"name": "response_id",
"id": "4",
"value": "={{$json.body.data.responseId || ''}}"
},
{
"type": "string",
"name": "submitted_at",
"id": "5",
"value": "={{$json.body.data.createdAt || $json.body.createdAt || ''}}"
},
{
"id": "d284890f-b714-4dee-823f-ca0d4b458aa0",
"name": "phone",
"value": "={{$json.body.data.fields.find(f => f.label === \"Phone Number\")?.value || ''}}",
"type": "string"
},
{
"id": "ba98382b-34b7-474f-bb7a-12042a0b24c5",
"name": "location",
"value": "={{$json.body.data.fields.find(f => f.label === \"Location\")?.value || ''}}",
"type": "string"
},
{
"id": "ebed4ede-6a28-48da-8048-da9a1fe2cc3b",
"name": "service_needed",
"value": "={{$json.body.data.fields.find(f => f.label.trim() === \"What service do you need\")?.value || ''}}",
"type": "string"
}
]
},
"options": {}
},
"id": "c8d9e0f1-a2b3-4c5d-6e7f-8a9b0c1d2e3f",
"name": "Transform Lead - VERIFY FIELD NAMES",
"typeVersion": 3.4,
"type": "n8n-nodes-base.set",
"position": [
1824,
1056
]
},
{
"parameters": {
"sendTo": "={{ $('Transform Lead - VERIFY FIELD NAMES').item.json.email }}",
"subject": "Thanks for reaching out to Headway Automation",
"message": "=Hi {{ $('Transform Lead - VERIFY FIELD NAMES').item.json.name }},\n\nThanks for reaching out, got your message and wanted to confirm it landed safely.\n\nI personally read and respond to every inquiry, usually within 4 hours (often much sooner).\n\nIn the meantime, feel free to just hit reply if anything urgent comes up.\n\nTalk soon,\nAsim\nHeadway Automation",
"options": {}
},
"id": "d9e0f1a2-b3c4-5d6e-7f8a-9b0c1d2e3f4a",
"name": "Send Instant Response",
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.2,
"position": [
2496,
1072
]
},
{
"parameters": {
"operation": "create",
"base": {
"__rl": true,
"value": "YOUR_AIRTABLE_BASE_ID",
"mode": "list",
"cachedResultName": "Your Airtable Base",
"cachedResultUrl": ""
},
"table": {
"__rl": true,
"value": "YOUR_AIRTABLE_TABLE_ID",
"mode": "list",
"cachedResultName": "Your Table",
"cachedResultUrl": ""
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"Name": "={{$('Transform Lead - VERIFY FIELD NAMES').item.json.name}}",
"Email": "={{ $('Transform Lead - VERIFY FIELD NAMES').item.json.email }}",
"Phone": "={{ $('Transform Lead - VERIFY FIELD NAMES').item.json.phone }}",
"Location": "={{ $('Transform Lead - VERIFY FIELD NAMES').item.json.location }}",
"What service do you need": "={{ $('Transform Lead - VERIFY FIELD NAMES').item.json.service_needed }}"
},
"matchingColumns": [],
"schema": [
{
"id": "Name",
"displayName": "Name",
"required": false,
"defaultMatch": false,
"canBeUsedToMatch": true,
"display": true,
"type": "string",
"readOnly": false,
"removed": false
},
{
"id": "Email",
"displayName": "Email",
"required": false,
"defaultMatch": false,
"canBeUsedToMatch": true,
"display": true,
"type": "string",
"readOnly": false,
"removed": false
},
{
"id": "Phone",
"displayName": "Phone",
"required": false,
"defaultMatch": false,
"canBeUsedToMatch": true,
"display": true,
"type": "string",
"readOnly": false,
"removed": false
},
{
"id": "Location",
"displayName": "Location",
"required": false,
"defaultMatch": false,
"canBeUsedToMatch": true,
"display": true,
"type": "string",
"readOnly": false,
"removed": false
},
{
"id": "What service do you need",
"displayName": "What service do you need",
"required": false,
"defaultMatch": false,
"canBeUsedToMatch": true,
"display": true,
"type": "string",
"readOnly": false,
"removed": false
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {}
},
"id": "e0f1a2b3-c4d5-6e7f-8a9b-0c1d2e3f4a5b",
"name": "Log to Airtable - SET BASE/TABLE",
"typeVersion": 2.2,
"type": "n8n-nodes-base.airtable",
"position": [
2720,
1056
]
},
{
"parameters": {
"operation": "search",
"base": {
"__rl": true,
"value": "YOUR_AIRTABLE_BASE_ID",
"mode": "list",
"cachedResultName": "Your Airtable Base",
"cachedResultUrl": ""
},
"table": {
"__rl": true,
"value": "YOUR_AIRTABLE_TABLE_ID",
"mode": "list",
"cachedResultName": "Your Table",
"cachedResultUrl": ""
},
"filterByFormula": "={Email} = \"{{ $('Transform Lead - VERIFY FIELD NAMES').item.json.email }}\"\n",
"options": {}
},
"id": "f830320d-c9d2-4ead-b340-dd1f9fef56a3",
"name": "Duplicate Lead Lookup",
"typeVersion": 2.2,
"type": "n8n-nodes-base.airtable",
"position": [
2048,
1056
],
"alwaysOutputData": true
},
{
"parameters": {
"operation": "getAll",
"limit": 1,
"filters": {
"q": "=from:asim.headwaywriting@gmail.com"
}
},
"id": "34e73fe7-c111-48da-9a95-64c984843da2",
"name": "Get Latest From Asim",
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.2,
"position": [
480,
160
],
"alwaysOutputData": true
},
{
"parameters": {
"conditions": {
"conditions": [
{
"id": "1",
"operator": {
"operation": "exists",
"singleValue": true,
"type": "string"
},
"rightValue": "",
"leftValue": "={{$json.id}}"
},
{
"id": "2",
"operator": {
"type": "string",
"operation": "notEquals"
},
"rightValue": "={{ $('Send Instant Response').item.json.id }}",
"leftValue": "={{$json.id}}"
},
{
"id": "3",
"operator": {
"type": "string",
"operation": "equals"
},
"rightValue": "={{ $('Send Instant Response').item.json.threadId }}",
"leftValue": "={{$json.threadId}}"
}
],
"combinator": "and",
"options": {
"typeValidation": "strict",
"version": 2,
"caseSensitive": true
}
},
"options": {}
},
"id": "2cea6486-76d0-43a1-bc49-58e4c0faa6b4",
"name": "Asim Replied?",
"typeVersion": 2,
"type": "n8n-nodes-base.if",
"position": [
704,
160
]
},
{
"parameters": {
"operation": "update",
"base": {
"__rl": true,
"value": "YOUR_AIRTABLE_BASE_ID",
"mode": "list",
"cachedResultName": "Your Airtable Base",
"cachedResultUrl": ""
},
"table": {
"__rl": true,
"value": "YOUR_AIRTABLE_TABLE_ID",
"mode": "list",
"cachedResultName": "Your Table",
"cachedResultUrl": ""
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"id": "={{ $('Log to Airtable - SET BASE/TABLE').item.json.id }}",
"Status": "lead_replied"
},
"matchingColumns": [
"id"
],
"schema": [
{
"id": "id",
"displayName": "id",
"required": false,
"defaultMatch": true,
"display": true,
"type": "string",
"readOnly": true,
"removed": false
},
{
"id": "Status",
"displayName": "Status",
"required": false,
"defaultMatch": false,
"canBeUsedToMatch": true,
"display": true,
"type": "string",
"readOnly": false,
"removed": false
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {}
},
"id": "f1aa3fc3-09df-4935-94fb-fd14cf25706d",
"name": "Case 2 - Update Airtable",
"typeVersion": 2.2,
"type": "n8n-nodes-base.airtable",
"position": [
3392,
256
]
},
{
"parameters": {
"amount": 60
},
"id": "f1a2b3c4-d5e6-7f8a-9b0c-1d2e3f4a5b6c",
"name": "Wait 3h",
"typeVersion": 1.1,
"type": "n8n-nodes-base.wait",
"position": [
928,
112
]
},
{
"parameters": {
"operation": "getAll",
"limit": 1,
"filters": {
"q": "=from:{{ $('Transform Lead - VERIFY FIELD NAMES').item.json.email }}"
}
},
"id": "a2b3c4d5-e6f7-8a9b-0c1d-2e3f4a5b6c7d",
"name": "Check Reply 3h",
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.2,
"position": [
1152,
112
],
"alwaysOutputData": true
},
{
"parameters": {
"conditions": {
"conditions": [
{
"id": "1",
"operator": {
"operation": "exists",
"singleValue": true,
"type": "string"
},
"rightValue": "",
"leftValue": "={{$json.id}}"
},
{
"id": "2",
"operator": {
"type": "string",
"operation": "equals"
},
"rightValue": "={{ $('Send Instant Response').item.json.threadId }}",
"leftValue": "={{$json.threadId}}"
}
],
"combinator": "and",
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
}
},
"options": {}
},
"id": "b3c4d5e6-f7a8-9b0c-1d2e-3f4a5b6c7d8e",
"name": "Reply Found 3h?",
"typeVersion": 2.3,
"type": "n8n-nodes-base.if",
"position": [
1376,
112
]
},
{
"parameters": {
"operation": "reply",
"messageId": "={{ $('Send Instant Response').item.json.id }}",
"message": "=Hi {{$json.name}},\n\nJust wanted to make sure my last email actually reached you, sometimes these things get buried.\n\nNo rush at all, just let me know if anything comes up on your end.\n\nBest,\nAsim\nHeadway Automation",
"options": {}
},
"id": "c4d5e6f7-a8b9-0c1d-2e3f-4a5b6c7d8e9f",
"name": "Send 3h Nudge",
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.2,
"position": [
1600,
256
]
},
{
"parameters": {
"amount": 30
},
"id": "d5e6f7a8-b9c0-1d2e-3f4a-5b6c7d8e9f0a",
"name": "Wait 3d",
"typeVersion": 1.1,
"type": "n8n-nodes-base.wait",
"position": [
1824,
256
]
},
{
"parameters": {
"operation": "getAll",
"limit": 1,
"filters": {
"q": "=from:{{ $('Transform Lead - VERIFY FIELD NAMES').item.json.email }}"
}
},
"id": "e6f7a8b9-c0d1-2e3f-4a5b-6c7d8e9f0a1b",
"name": "Check Reply 3d",
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.2,
"position": [
2048,
256
],
"alwaysOutputData": true
},
{
"parameters": {
"conditions": {
"conditions": [
{
"id": "1",
"operator": {
"operation": "exists",
"singleValue": true,
"type": "string"
},
"rightValue": "",
"leftValue": "={{$json.id}}"
},
{
"id": "2",
"operator": {
"type": "string",
"operation": "equals"
},
"rightValue": "={{ $('Send Instant Response').item.json.threadId }}",
"leftValue": "={{$json.threadId}}"
}
],
"combinator": "and",
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
}
},
"options": {}
},
"id": "f7a8b9c0-d1e2-3f4a-5b6c-7d8e9f0a1b2c",
"name": "Reply Found 3d?",
"typeVersion": 2.3,
"type": "n8n-nodes-base.if",
"position": [
2272,
256
]
},
{
"parameters": {
"operation": "reply",
"messageId": "={{ $('Send Instant Response').item.json.id }}",
"message": "=Hi {{$json.name}},\n\nThought I'd share something that might be relevant. We recently helped a SaaS company cut 18 hours a week of manual lead follow-up using n8n automation.\n\nIf that sounds like something worth exploring for your business, I'd be happy to walk you through it.\n\nBest,\nAsim\nHeadway Automation",
"options": {}
},
"id": "a8b9c0d1-e2f3-4a5b-6c7d-8e9f0a1b2c3d",
"name": "Send 3d Email",
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.2,
"position": [
2496,
400
]
},
{
"parameters": {
"amount": 90
},
"id": "b9c0d1e2-f3a4-5b6c-7d8e-9f0a1b2c3d4e",
"name": "Wait 7d",
"typeVersion": 1.1,
"type": "n8n-nodes-base.wait",
"position": [
2720,
400
]
},
{
"parameters": {
"operation": "getAll",
"limit": 1,
"filters": {
"q": "=from:{{ $('Transform Lead - VERIFY FIELD NAMES').item.json.email }}"
}
},
"id": "c0d1e2f3-a4b5-6c7d-8e9f-0a1b2c3d4e5f",
"name": "Check Reply 7d",
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.2,
"position": [
2944,
400
],
"alwaysOutputData": true
},
{
"parameters": {
"conditions": {
"conditions": [
{
"id": "1",
"operator": {
"operation": "exists",
"singleValue": true,
"type": "string"
},
"rightValue": "",
"leftValue": "={{$json.id}}"
},
{
"id": "2",
"operator": {
"type": "string",
"operation": "equals"
},
"rightValue": "={{ $('Send Instant Response').item.json.threadId }}",
"leftValue": "={{$json.threadId}}"
}
],
"combinator": "and",
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
}
},
"options": {}
},
"id": "d1e2f3a4-b5c6-7d8e-9f0a-1b2c3d4e5f6a",
"name": "Reply Found 7d?",
"typeVersion": 2.3,
"type": "n8n-nodes-base.if",
"position": [
3168,
400
]
},
{
"parameters": {
"operation": "reply",
"messageId": "={{ $('Send Instant Response').item.json.id }}",
"message": "=Hi {{$json.name}},\n\nI know things get busy, so this will be my last note for now.\n\nIf automating your lead follow-up is still something you're interested in, I'd genuinely love to help. If the timing's just not right, no worries at all.\n\nEither way, just let me know.\n\nBest,\nAsim\nHeadway Automation",
"options": {}
},
"id": "e2f3a4b5-c6d7-8e9f-0a1b-2c3d4e5f6a7b",
"name": "Send 7d Email",
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.2,
"position": [
3392,
496
]
},
{
"parameters": {
"amount": 61
},
"id": "52d9e477-9765-4115-b3d2-f3a4bc82f24d",
"name": "Wait C3 24h",
"typeVersion": 1.1,
"type": "n8n-nodes-base.wait",
"position": [
928,
592
]
},
{
"parameters": {
"operation": "getAll",
"limit": 1,
"filters": {
"q": "=from:{{ $('Transform Lead - VERIFY FIELD NAMES').item.json.email }}"
}
},
"id": "5b6e40e1-b335-47da-8558-3a179bde7dde",
"name": "Check Reply C3 24h",
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.2,
"position": [
1152,
592
],
"alwaysOutputData": true
},
{
"parameters": {
"conditions": {
"conditions": [
{
"id": "1",
"operator": {
"operation": "exists",
"singleValue": true,
"type": "string"
},
"rightValue": "",
"leftValue": "={{$json.id}}"
},
{
"id": "2",
"operator": {
"type": "string",
"operation": "equals"
},
"rightValue": "={{ $('Send Instant Response').item.json.threadId }}",
"leftValue": "={{$json.threadId}}"
}
],
"combinator": "and",
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
}
},
"options": {}
},
"id": "418e8612-7a62-49ba-aa8a-2c1fde3b0c43",
"name": "Reply Found C3 24h?",
"typeVersion": 2.3,
"type": "n8n-nodes-base.if",
"position": [
1376,
592
]
},
{
"parameters": {
"operation": "reply",
"messageId": "={{ $('Send Instant Response').item.json.id }}",
"message": "=Hi {{$json.name}},\n\nJust confirming my last reply made it through okay.\n\nHappy to answer anything on your mind, just hit reply.\n\nBest,\nAsim\nHeadway Automation",
"options": {}
},
"id": "f01630da-e47b-4a99-af1a-f6f2b9b5f41e",
"name": "Send C3 24h Nudge",
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.2,
"position": [
1600,
752
]
},
{
"parameters": {
"amount": 30
},
"id": "351b59c4-422a-4d9c-8d22-6127938ab268",
"name": "Wait C3 3d",
"typeVersion": 1.1,
"type": "n8n-nodes-base.wait",
"position": [
1824,
736
]
},
{
"parameters": {
"operation": "getAll",
"limit": 1,
"filters": {
"q": "=from:{{ $('Transform Lead - VERIFY FIELD NAMES').item.json.email }}"
}
},
"id": "fd41199f-3f2f-4e71-b5fb-09bbbcd595df",
"name": "Check Reply C3 3d",
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.2,
"position": [
2048,
736
],
"alwaysOutputData": true
},
{
"parameters": {
"conditions": {
"conditions": [
{
"id": "1",
"operator": {
"operation": "exists",
"singleValue": true,
"type": "string"
},
"rightValue": "",
"leftValue": "={{$json.id}}"
},
{
"id": "2",
"operator": {
"type": "string",
"operation": "equals"
},
"rightValue": "={{ $('Send Instant Response').item.json.threadId }}",
"leftValue": "={{$json.threadId}}"
}
],
"combinator": "and",
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
}
},
"options": {}
},
"id": "3e7f214d-fc78-4b0a-a96d-bd74adc6ab78",
"name": "Reply Found C3 3d?",
"typeVersion": 2.3,
"type": "n8n-nodes-base.if",
"position": [
2272,
736
]
},
{
"parameters": {
"operation": "reply",
"messageId": "={{ $('Send Instant Response').item.json.id }}",
"message": "=Hi {{$json.name}},\n\nWanted to pass along a quick example of the kind of work we do, thought it might be useful while you're weighing things.\n\n[Case study link here]\n\nHappy to answer any questions.\n\nBest,\nAsim\nHeadway Automation",
"options": {}
},
"id": "a0ed26e3-4dd9-43da-ad4d-1b24ab78be07",
"name": "Send C3 3d Case Study",
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.2,
"position": [
2496,
864
]
},
{
"parameters": {
"amount": 30
},
"id": "908061af-00e8-46b8-b4f8-f832978ddbd4",
"name": "Wait C3 7d",
"typeVersion": 1.1,
"type": "n8n-nodes-base.wait",
"position": [
2720,
864
]
},
{
"parameters": {
"operation": "getAll",
"limit": 1,
"filters": {
"q": "=from:{{ $('Transform Lead - VERIFY FIELD NAMES').item.json.email }}"
}
},
"id": "943f9d6a-3805-430e-a06a-541976ca86c9",
"name": "Check Reply C3 7d",
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.2,
"position": [
2944,
864
],
"alwaysOutputData": true
},
{
"parameters": {
"conditions": {
"conditions": [
{
"id": "1",
"operator": {
"operation": "exists",
"singleValue": true,
"type": "string"
},
"rightValue": "",
"leftValue": "={{$json.id}}"
},
{
"id": "2",
"operator": {
"type": "string",
"operation": "equals"
},
"rightValue": "={{ $('Send Instant Response').item.json.threadId }}",
"leftValue": "={{$json.threadId}}"
}
],
"combinator": "and",
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
}
},
"options": {}
},
"id": "3c481851-ad43-43a8-a8c3-e422f5aa5db3",
"name": "Reply Found C3 7d?",
"typeVersion": 2.3,
"type": "n8n-nodes-base.if",
"position": [
3168,
864
]
},
{
"parameters": {
"operation": "reply",
"messageId": "={{ $('Send Instant Response').item.json.id }}",
"message": "=Hi {{$json.name}},\n\nI'll leave things here for now. If you'd like to pick the conversation back up down the road, just reply anytime and I'll be glad to help.\n\nWishing you the best either way.\n\nAsim\nHeadway Automation",
"options": {}
},
"id": "8d676a75-6b6a-4fe1-afc0-b29764cfb72f",
"name": "Send C3 7d Closeout",
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.2,
"position": [
3392,
912
]
},
{
"parameters": {
"operation": "getAll",
"limit": 1,
"filters": {
"q": "=from:mailer-daemon {{ $('Transform Lead - VERIFY FIELD NAMES').item.json.email }}"
}
},
"id": "01da363b-ef01-4d8f-8710-136a3ce6ea7c",
"name": "Check For Bounce",
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.2,
"position": [
3616,
736
],
"alwaysOutputData": true
},
{
"parameters": {
"conditions": {
"conditions": [
{
"id": "1",
"leftValue": "={{$json.id}}",
"rightValue": "",
"operator": {
"type": "string",
"operation": "exists",
"singleValue": true
}
}
],
"combinator": "and",
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
}
},
"options": {}
},
"id": "4db704fb-86a2-4a99-8ee0-7947a09f1c09",
"name": "Bounce Found?",
"type": "n8n-nodes-base.if",
"typeVersion": 2.3,
"position": [
3840,
736
]
},
{
"parameters": {
"operation": "update",
"base": {
"__rl": true,
"value": "YOUR_AIRTABLE_BASE_ID",
"mode": "list",
"cachedResultName": "Your Airtable Base",
"cachedResultUrl": ""
},
"table": {
"__rl": true,
"value": "YOUR_AIRTABLE_TABLE_ID",
"mode": "list",
"cachedResultName": "Your Table",
"cachedResultUrl": ""
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"id": "={{ $('Log to Airtable - SET BASE/TABLE').item.json.id }}",
"Status": "bounced"
},
"matchingColumns": [
"id"
],
"schema": [
{
"id": "id",
"displayName": "id",
"required": false,
"defaultMatch": true,
"display": true,
"type": "string",
"readOnly": true,
"removed": false
},
{
"id": "Status",
"displayName": "Status",
"required": false,
"defaultMatch": false,
"canBeUsedToMatch": true,
"display": true,
"type": "string",
"readOnly": false,
"removed": false
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {}
},
"id": "64e04052-52d1-4a44-b3c4-f39b07a74782",
"name": "Mark Bounced - Update Airtable",
"type": "n8n-nodes-base.airtable",
"typeVersion": 2.2,
"position": [
4064,
720
]
},
{
"parameters": {
"operation": "update",
"base": {
"__rl": true,
"value": "YOUR_AIRTABLE_BASE_ID",
"mode": "list",
"cachedResultName": "Your Airtable Base",
"cachedResultUrl": ""
},
"table": {
"__rl": true,
"value": "YOUR_AIRTABLE_TABLE_ID",
"mode": "list",
"cachedResultName": "Your Table",
"cachedResultUrl": ""
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"id": "={{ $('Log to Airtable - SET BASE/TABLE').item.json.id }}",
"Status": "unresponsive"
},
"matchingColumns": [
"id"
],
"schema": [
{
"id": "id",
"displayName": "id",
"required": false,
"defaultMatch": true,
"display": true,
"type": "string",
"readOnly": true,
"removed": false
},
{
"id": "Status",
"displayName": "Status",
"required": false,
"defaultMatch": false,
"canBeUsedToMatch": true,
"display": true,
"type": "string",
"readOnly": false,
"removed": false
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {}
},
"id": "7ae15932-d6e7-41c5-9dfe-4a8bcdd93f1b",
"name": "Mark Unresponsive - Update Airtable",
"type": "n8n-nodes-base.airtable",
"typeVersion": 2.2,
"position": [
4064,
1056
]
},
{
"parameters": {
"operation": "getAll",
"limit": 1,
"filters": {
"q": "=from:mailer-daemon {{ $('Transform Lead - VERIFY FIELD NAMES').item.json.email }}"
}
},
"id": "b2c699da-2995-4f11-9ee9-ae74518eed3f",
"name": "Check For Bounce - Early",
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.2,
"position": [
2944,
1056
],
"alwaysOutputData": true
},
{
"parameters": {
"conditions": {
"conditions": [
{
"id": "1",
"leftValue": "={{$json.id}}",
"rightValue": "",
"operator": {
"type": "string",
"operation": "exists",
"singleValue": true
}
}
],
"combinator": "and",
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
}
},
"options": {}
},
"id": "84b746a3-701a-4b59-9dd5-23c3357abba6",
"name": "Bounce Found - Early?",
"type": "n8n-nodes-base.if",
"typeVersion": 2.3,
"position": [
3168,
1056
]
},
{
"parameters": {
"amount": 60
},
"id": "eb523c55-ea04-4865-a071-27b4f3f39852",
"name": "Wait Before Asim Reply Check (4h)",
"type": "n8n-nodes-base.wait",
"typeVersion": 1.1,
"position": [
256,
160
]
},
{
"parameters": {
"content": "**Lead Capture + Auto Followup**\n\nInstantly responds to new leads, logs to Airtable, detects bounces, then runs timed follow-up sequence (3-3-7) until lead replies or email bounces.",
"height": 140,
"width": 600
},
"id": "sticky-overview",
"name": "Overview: Lead Capture + Auto Followup",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
208,
-64
]
},
{
"parameters": {
"content": "**INTAKE**\n\nForm submission → Extract lead data → Validate email address",
"height": 130,
"width": 752,
"color": 2
},
"id": "sticky-zone1-intake",
"name": "Zone 1: Intake",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
1568,
976
]
},
{
"parameters": {
"content": "**INSTANT RESPONSE**\n\nSend welcome email → Log to Airtable → Check for immediate bounce",
"height": 130,
"width": 528,
"color": 3
},
"id": "sticky-zone2-instant",
"name": "Zone 2: Instant Response",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
2480,
1264
]
},
{
"parameters": {
"content": "**EARLY BOUNCE CHECK**\n\nCatch hard bounces immediately after intake. If bounced, mark and stop.",
"height": 130,
"width": 200,
"color": 4
},
"id": "sticky-zone3-bounce-early",
"name": "Zone 3: Early Bounce Check",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
3120,
1216
]
},
{
"parameters": {
"content": "**CASE DETECTION**\n\nWait 4h → Check if Asim replied → Route to Case 1/2/3",
"height": 120,
"width": 528,
"color": 5
},
"id": "sticky-zone4-detection",
"name": "Zone 4: Case Detection",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
224,
112
]
},
{
"parameters": {
"content": "**CASE 1: TOTAL SILENCE**\n\nNobody replied. Send 3h, 3d, 7d nudges. Check after each for reply.",
"height": 486,
"width": 2544,
"color": 6
},
"id": "sticky-zone5-case1",
"name": "Zone 5: Case 1 Total Silence",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
912,
-16
]
},
{
"parameters": {
"content": "**CASE 2: LEAD REPLIED**\n\nLead responded. Automation stops, Asim takes over.",
"height": 112,
"width": 120,
"color": 7
},
"id": "sticky-zone6-case2",
"name": "Zone 6: Case 2 Lead Replied",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
3456,
160
]
},
{
"parameters": {
"content": "**CASE 3: ASIM REPLIED, LEAD SILENT**\n\nAsim replied but lead silent. Send 24h, 3d, 7d sequence with escalation.",
"height": 422,
"width": 2544
},
"id": "sticky-zone7-case3",
"name": "Zone 7: Case 3 Asim Replied",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
896,
544
]
},
{
"parameters": {
"content": "**TERMINAL STATUS**\n\nFinal bounce check + Airtable status update at end of Case 1 or 3.",
"height": 446,
"width": 528,
"color": 2
},
"id": "sticky-zone8-terminal",
"name": "Zone 8: Terminal Status",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
3584,
672
]
},
{
"parameters": {
"conditions": {
"conditions": [
{
"operator": {
"operation": "exists",
"singleValue": true,
"type": "string"
},
"rightValue": "",
"leftValue": "={{$json.id}}",
"id": "1"
}
],
"options": {
"typeValidation": "strict",
"version": 2,
"caseSensitive": true
},
"combinator": "and"
},
"options": {}
},
"id": "79bd513e-c7b1-4a60-a0d3-a051c35192f3",
"name": "Existing Lead?",
"typeVersion": 2,
"type": "n8n-nodes-base.if",
"position": [
2272,
1056
]
},
{
"parameters": {
"operation": "update",
"base": {
"__rl": true,
"value": "YOUR_AIRTABLE_BASE_ID",
"mode": "list",
"cachedResultName": "Your Airtable Base",
"cachedResultUrl": ""
},
"table": {
"__rl": true,
"value": "YOUR_AIRTABLE_TABLE_ID",
"mode": "list",
"cachedResultName": "Your Table",
"cachedResultUrl": ""
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"id": "={{ $json.id }}",
"Name": "={{ $('Transform Lead - VERIFY FIELD NAMES').item.json.name }}",
"Phone": "={{ $('Transform Lead - VERIFY FIELD NAMES').item.json.phone }}",
"Location": "={{ $('Transform Lead - VERIFY FIELD NAMES').item.json.location }}",
"What service do you need": "={{ $('Transform Lead - VERIFY FIELD NAMES').item.json.service_needed }}"
},
"matchingColumns": [
"id"
],
"schema": [
{
"id": "id",
"displayName": "id",
"required": false,
"defaultMatch": true,
"display": true,
"type": "string",
"readOnly": true,
"removed": false
},
{
"id": "Name",
"displayName": "Name",
"required": false,
"defaultMatch": false,
"canBeUsedToMatch": true,
"display": true,
"type": "string",
"readOnly": false,
"removed": false
},
{
"id": "Phone",
"displayName": "Phone",
"required": false,
"defaultMatch": false,
"canBeUsedToMatch": true,
"display": true,
"type": "string",
"readOnly": false,
"removed": false
},
{
"id": "Location",
"displayName": "Location",
"required": false,
"defaultMatch": false,
"canBeUsedToMatch": true,
"display": true,
"type": "string",
"readOnly": false,
"removed": false
},
{
"id": "What service do you need",
"displayName": "What service do you need",
"required": false,
"defaultMatch": false,
"canBeUsedToMatch": true,
"display": true,
"type": "string",
"readOnly": false,
"removed": false
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {}
},
"id": "a1b2c3d4-e5f6-4789-9abc-def012345678",
"name": "Update Existing Lead - Airtable",
"typeVersion": 2.2,
"type": "n8n-nodes-base.airtable",
"position": [
2500,
900
]
}
],
"connections": {
"Reply Found 3h?": {
"main": [
[
{
"node": "Case 2 - Update Airtable",
"type": "main",
"index": 0
}
],
[
{
"node": "Send 3h Nudge",
"type": "main",
"index": 0
}
]
]
},
"Duplicate Lead Lookup": {
"main": [
[
{
"node": "Existing Lead?",
"type": "main",
"index": 0
}
]
]
},
"Send Instant Response": {
"main": [
[
{
"node": "Log to Airtable - SET BASE/TABLE",
"type": "main",
"index": 0
}
]
]
},
"Reply Found 3d?": {
"main": [
[
{
"node": "Case 2 - Update Airtable",
"type": "main",
"index": 0
}
],
[
{
"node": "Send 3d Email",
"type": "main",
"index": 0
}
]
]
},
"Check Reply 3d": {
"main": [
[
{
"node": "Reply Found 3d?",
"type": "main",
"index": 0
}
]
]
},
"Asim Replied?": {
"main": [
[
{
"node": "Wait C3 24h",
"type": "main",
"index": 0
}
],
[
{
"node": "Wait 3h",
"type": "main",
"index": 0
}
]
]
},
"Case 2 - Update Airtable": {
"main": []
},
"Wait 3h": {
"main": [
[
{
"node": "Check Reply 3h",
"type": "main",
"index": 0
}
]
]
},
"Transform Lead - VERIFY FIELD NAMES": {
"main": [
[
{
"node": "Duplicate Lead Lookup",
"type": "main",
"index": 0
}
]
]
},
"Get Latest From Asim": {
"main": [
[
{
"node": "Asim Replied?",
"type": "main",
"index": 0
}
]
]
},
"Send 3d Email": {
"main": [
[
{
"node": "Wait 7d",
"type": "main",
"index": 0
}
]
]
},
"SureForms Webhook": {
"main": [
[
{
"node": "Transform Lead - VERIFY FIELD NAMES",
"type": "main",
"index": 0
}
]
]
},
"Reply Found 7d?": {
"main": [
[
{
"node": "Case 2 - Update Airtable",
"type": "main",
"index": 0
}
],
[
{
"node": "Send 7d Email",
"type": "main",
"index": 0
}
]
]
},
"Send 3h Nudge": {
"main": [
[
{
"node": "Wait 3d",
"type": "main",
"index": 0
}
]
]
},
"Wait 3d": {
"main": [
[
{
"node": "Check Reply 3d",
"type": "main",
"index": 0
}
]
]
},
"Check Reply 7d": {
"main": [
[
{
"node": "Reply Found 7d?",
"type": "main",
"index": 0
}
]
]
},
"Wait 7d": {
"main": [
[
{
"node": "Check Reply 7d",
"type": "main",
"index": 0
}
]
]
},
"Check Reply 3h": {
"main": [
[
{
"node": "Reply Found 3h?",
"type": "main",
"index": 0
}
]
]
},
"Wait C3 24h": {
"main": [
[
{
"node": "Check Reply C3 24h",
"type": "main",
"index": 0
}
]
]
},
"Check Reply C3 24h": {
"main": [
[
{
"node": "Reply Found C3 24h?",
"type": "main",
"index": 0
}
]
]
},
"Reply Found C3 24h?": {
"main": [
[
{
"node": "Case 2 - Update Airtable",
"type": "main",
"index": 0
}
],
[
{
"node": "Send C3 24h Nudge",
"type": "main",
"index": 0
}
]
]
},
"Send C3 24h Nudge": {
"main": [
[
{
"node": "Wait C3 3d",
"type": "main",
"index": 0
}
]
]
},
"Wait C3 3d": {
"main": [
[
{
"node": "Check Reply C3 3d",
"type": "main",
"index": 0
}
]
]
},
"Check Reply C3 3d": {
"main": [
[
{
"node": "Reply Found C3 3d?",
"type": "main",
"index": 0
}
]
]
},
"Reply Found C3 3d?": {
"main": [
[
{
"node": "Case 2 - Update Airtable",
"type": "main",
"index": 0
}
],
[
{
"node": "Send C3 3d Case Study",
"type": "main",
"index": 0
}
]
]
},
"Send C3 3d Case Study": {
"main": [
[
{
"node": "Wait C3 7d",
"type": "main",
"index": 0
}
]
]
},
"Wait C3 7d": {
"main": [
[
{
"node": "Check Reply C3 7d",
"type": "main",
"index": 0
}
]
]
},
"Check Reply C3 7d": {
"main": [
[
{
"node": "Reply Found C3 7d?",
"type": "main",
"index": 0
}
]
]
},
"Reply Found C3 7d?": {
"main": [
[
{
"node": "Case 2 - Update Airtable",
"type": "main",
"index": 0
}
],
[
{
"node": "Send C3 7d Closeout",
"type": "main",
"index": 0
}
]
]
},
"Send 7d Email": {
"main": [
[
{
"node": "Check For Bounce",
"type": "main",
"index": 0
}
]
]
},
"Send C3 7d Closeout": {
"main": [
[
{
"node": "Check For Bounce",
"type": "main",
"index": 0
}
]
]
},
"Check For Bounce": {
"main": [
[
{
"node": "Bounce Found?",
"type": "main",
"index": 0
}
]
]
},
"Bounce Found?": {
"main": [
[
{
"node": "Mark Bounced - Update Airtable",
"type": "main",
"index": 0
}
],
[
{
"node": "Mark Unresponsive - Update Airtable",
"type": "main",
"index": 0
}
]
]
},
"Log to Airtable - SET BASE/TABLE": {
"main": [
[
{
"node": "Check For Bounce - Early",
"type": "main",
"index": 0
}
]
]
},
"Check For Bounce - Early": {
"main": [
[
{
"node": "Bounce Found - Early?",
"type": "main",
"index": 0
}
]
]
},
"Bounce Found - Early?": {
"main": [
[
{
"node": "Mark Bounced - Update Airtable",
"type": "main",
"index": 0
}
],
[
{
"node": "Wait Before Asim Reply Check (4h)",
"type": "main",
"index": 0
}
]
]
},
"Wait Before Asim Reply Check (4h)": {
"main": [
[
{
"node": "Get Latest From Asim",
"type": "main",
"index": 0
}
]
]
},
"Existing Lead?": {
"main": [
[
{
"node": "Update Existing Lead - Airtable",
"type": "main",
"index": 0
}
],
[
{
"node": "Send Instant Response",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1"
}
}
FAQs
How fast should you follow up with a new lead?
Within 5 minutes if possible. Response time is one of the single biggest predictors of whether a lead converts at all.
What’s the difference between automated and manual follow-up?
Manual follow-up depends on a person remembering to act, every time, for every lead. Automated follow-up runs the same sequence identically regardless of how busy anyone is, and hands off to a human the instant a real reply comes in.
Do I need a CRM to automate lead follow-up?
You need somewhere that holds a single, current status per lead. That can be a full CRM or something as simple as an Airtable base, as long as every part of the system reads and writes to the same place.
Can automation replace my sales team?
No, and it should not try to. Automation should remove the admin, like sending the first response, tracking who has replied, and nudging on a schedule, not replace the judgment a real conversation needs.
How much does an automated follow-up system cost?
It depends on the stack. SaaS platforms typically charge a recurring fee that scales with contacts or usage.
A self-owned build on a tool like n8n has an upfront time cost to build and test correctly, but no ongoing per-lead fee after that.
Is automated quote follow-up different from lead follow-up?
Not structurally. A quote request is just a specific type of lead. The same trigger, instant response, branching nurture, and handoff logic applies.
Only the message content changes.
Asim Arman is a CXL-certified conversion optimizer and n8n automation builder at Headway Automation. He writes SEO content professionally at VISER X and builds every system he writes about. More about Asim · LinkedIn

