{
  "name": "Lead Follow-up Machine — by Nex Studio",
  "nodes": [
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "new-lead",
        "options": {}
      },
      "id": "a1b2c3d4-0001-4000-8000-000000000001",
      "name": "New Lead (Webhook)",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [0, 0],
      "webhookId": "new-lead",
      "notes": "Receives leads from any source: website form, Facebook Lead Ads (via their webhook), Typeform, landing page. Expects JSON: { name, email, phone, source, message }"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            { "id": "f1", "name": "name", "value": "={{ $json.body.name || $json.body.full_name || 'there' }}", "type": "string" },
            { "id": "f2", "name": "email", "value": "={{ $json.body.email }}", "type": "string" },
            { "id": "f3", "name": "phone", "value": "={{ $json.body.phone || '' }}", "type": "string" },
            { "id": "f4", "name": "source", "value": "={{ $json.body.source || 'website' }}", "type": "string" },
            { "id": "f5", "name": "message", "value": "={{ $json.body.message || '' }}", "type": "string" },
            { "id": "f6", "name": "received_at", "value": "={{ $now.toISO() }}", "type": "string" },
            { "id": "f7", "name": "status", "value": "new", "type": "string" }
          ]
        },
        "options": {}
      },
      "id": "a1b2c3d4-0002-4000-8000-000000000002",
      "name": "Normalize Lead",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [220, 0],
      "notes": "Cleans and standardizes the lead no matter which source it came from."
    },
    {
      "parameters": {
        "operation": "append",
        "documentId": { "__rl": true, "mode": "list", "value": "REPLACE_WITH_YOUR_SHEET_ID" },
        "sheetName": { "__rl": true, "mode": "list", "value": "Leads" },
        "columns": {
          "mappingMode": "autoMapInputData",
          "value": {}
        },
        "options": {}
      },
      "id": "a1b2c3d4-0003-4000-8000-000000000003",
      "name": "Log to CRM (Google Sheets)",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.5,
      "position": [440, -120],
      "notes": "Every lead is logged the second it arrives. Swap for Airtable, HubSpot or any CRM node — the flow doesn't change."
    },
    {
      "parameters": {
        "fromEmail": "you@yourbusiness.com",
        "toEmail": "={{ $json.email }}",
        "subject": "Got your message — here's what happens next",
        "emailFormat": "text",
        "text": "=Hi {{ $json.name.split(' ')[0] }},\n\nThanks for reaching out! I just got your message and I'm on it.\n\nYou'll hear from me personally within the next couple of hours. If it's urgent, just reply to this email and it goes straight to my phone.\n\nTalk soon,\n{{ 'YOUR NAME' }}\nYOUR BUSINESS",
        "options": {}
      },
      "id": "a1b2c3d4-0004-4000-8000-000000000004",
      "name": "Instant Reply (Email)",
      "type": "n8n-nodes-base.emailSend",
      "typeVersion": 2.1,
      "position": [440, 0],
      "notes": "The lead gets a human-sounding reply in under 30 seconds, 24/7. This alone wins deals: most competitors take hours."
    },
    {
      "parameters": {
        "chatId": "REPLACE_WITH_YOUR_CHAT_ID",
        "text": "=🔥 New lead!\n\n👤 {{ $json.name }}\n📧 {{ $json.email }}\n📞 {{ $json.phone }}\n📍 Source: {{ $json.source }}\n💬 \"{{ $json.message }}\"\n\nAlready logged to the CRM and auto-replied.",
        "additionalFields": {}
      },
      "id": "a1b2c3d4-0005-4000-8000-000000000005",
      "name": "Notify Owner (Telegram)",
      "type": "n8n-nodes-base.telegram",
      "typeVersion": 1.2,
      "position": [440, 120],
      "notes": "The owner knows about every lead in real time. Swap for Slack, WhatsApp or SMS."
    },
    {
      "parameters": {
        "amount": 1,
        "unit": "days"
      },
      "id": "a1b2c3d4-0006-4000-8000-000000000006",
      "name": "Wait 1 Day",
      "type": "n8n-nodes-base.wait",
      "typeVersion": 1.1,
      "position": [660, 0],
      "webhookId": "wait-1-day",
      "notes": "n8n pauses this lead's journey here. Each lead moves through the sequence on its own clock."
    },
    {
      "parameters": {
        "operation": "lookup",
        "documentId": { "__rl": true, "mode": "list", "value": "REPLACE_WITH_YOUR_SHEET_ID" },
        "sheetName": { "__rl": true, "mode": "list", "value": "Leads" },
        "lookupColumn": "email",
        "lookupValue": "={{ $json.email }}",
        "options": {}
      },
      "id": "a1b2c3d4-0007-4000-8000-000000000007",
      "name": "Check Lead Status",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.5,
      "position": [880, 0],
      "notes": "Did the lead reply or book already? The team marks status in the sheet (or it's set automatically by the booking system)."
    },
    {
      "parameters": {
        "conditions": {
          "options": { "caseSensitive": false, "typeValidation": "loose", "version": 2 },
          "conditions": [
            {
              "id": "c1",
              "leftValue": "={{ $json.status }}",
              "rightValue": "new",
              "operator": { "type": "string", "operation": "equals" }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "id": "a1b2c3d4-0008-4000-8000-000000000008",
      "name": "Still No Reply?",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [1100, 0],
      "notes": "Only follow up with leads that haven't answered. Nobody gets spammed."
    },
    {
      "parameters": {
        "fromEmail": "you@yourbusiness.com",
        "toEmail": "={{ $json.email }}",
        "subject": "=Quick question, {{ $json.name.split(' ')[0] }}",
        "emailFormat": "text",
        "text": "=Hi {{ $json.name.split(' ')[0] }},\n\nJust checking in — did you get a chance to see my last message?\n\nIf you're still interested, I have a couple of slots open this week. Want me to hold one for you?\n\nEither way, just hit reply and let me know.\n\n{{ 'YOUR NAME' }}",
        "options": {}
      },
      "id": "a1b2c3d4-0009-4000-8000-000000000009",
      "name": "Follow-up #1 (Day 1)",
      "type": "n8n-nodes-base.emailSend",
      "typeVersion": 2.1,
      "position": [1320, -60],
      "notes": "80% of sales need 5+ follow-ups. Most businesses stop at one. This one never forgets."
    },
    {
      "parameters": {
        "amount": 2,
        "unit": "days"
      },
      "id": "a1b2c3d4-0010-4000-8000-000000000010",
      "name": "Wait 2 More Days",
      "type": "n8n-nodes-base.wait",
      "typeVersion": 1.1,
      "position": [1540, -60],
      "webhookId": "wait-2-days",
      "notes": ""
    },
    {
      "parameters": {
        "fromEmail": "you@yourbusiness.com",
        "toEmail": "={{ $json.email }}",
        "subject": "Should I close your file?",
        "emailFormat": "text",
        "text": "=Hi {{ $json.name.split(' ')[0] }},\n\nI don't want to keep bugging you, so this is my last note.\n\nIf now's not the right time, no problem at all — just reply \"later\" and I'll check back in a few months.\n\nIf you're ready, reply \"yes\" and I'll take care of everything from here.\n\n{{ 'YOUR NAME' }}",
        "options": {}
      },
      "id": "a1b2c3d4-0011-4000-8000-000000000011",
      "name": "Follow-up #2 (Day 3)",
      "type": "n8n-nodes-base.emailSend",
      "typeVersion": 2.1,
      "position": [1760, -60],
      "notes": "The 'breakup email' — consistently the highest-reply message in the sequence."
    }
  ],
  "connections": {
    "New Lead (Webhook)": { "main": [[{ "node": "Normalize Lead", "type": "main", "index": 0 }]] },
    "Normalize Lead": {
      "main": [[
        { "node": "Log to CRM (Google Sheets)", "type": "main", "index": 0 },
        { "node": "Instant Reply (Email)", "type": "main", "index": 0 },
        { "node": "Notify Owner (Telegram)", "type": "main", "index": 0 }
      ]]
    },
    "Instant Reply (Email)": { "main": [[{ "node": "Wait 1 Day", "type": "main", "index": 0 }]] },
    "Wait 1 Day": { "main": [[{ "node": "Check Lead Status", "type": "main", "index": 0 }]] },
    "Check Lead Status": { "main": [[{ "node": "Still No Reply?", "type": "main", "index": 0 }]] },
    "Still No Reply?": { "main": [[{ "node": "Follow-up #1 (Day 1)", "type": "main", "index": 0 }], []] },
    "Follow-up #1 (Day 1)": { "main": [[{ "node": "Wait 2 More Days", "type": "main", "index": 0 }]] },
    "Wait 2 More Days": { "main": [[{ "node": "Follow-up #2 (Day 3)", "type": "main", "index": 0 }]] }
  },
  "settings": { "executionOrder": "v1" },
  "pinData": {},
  "meta": { "instanceId": "portfolio-demo" }
}
