{
  "id": "IkA19lqk3SYh3jDa",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Daily Follow-Up System with Multi-Stage Sequences",
  "tags": [],
  "nodes": [
    {
      "id": "8d075e52-b287-42cd-b875-13e9db056ffc",
      "name": "Daily at 9 AM",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -608,
        128
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "cronExpression",
              "expression": "0 9 * * *"
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "5fbc9862-fee7-4a3d-a12f-c75e200cd1e0",
      "name": "Read All Follow-Up Leads",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -320,
        128
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Follow-Up Tracker"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "YOUR_GOOGLE_SHEET_ID"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "f06c504b-931d-45a7-9e4a-f451cbfd1c74",
      "name": "Filter Today's Follow-Ups",
      "type": "n8n-nodes-base.filter",
      "position": [
        64,
        144
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "check-date-match",
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json['Next Follow-Up Date'] }}",
              "rightValue": "={{ $now.format('yyyy-MM-dd') }}"
            },
            {
              "id": "check-active-status",
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json['Status'] }}",
              "rightValue": "Active"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "f636570a-a769-4bab-a5b1-8bab12c95936",
      "name": "Process One at a Time",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        400,
        144
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "b9b6cdf6-705e-4ca6-a0f1-be0ce3f81846",
      "name": "Route by Follow-Up Stage",
      "type": "n8n-nodes-base.switch",
      "position": [
        -624,
        720
      ],
      "parameters": {
        "rules": {
          "values": [
            {
              "outputKey": "Day 1",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "5b6a152e-50c8-4580-af1a-fcfcb5d2dd21",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json['Stage'] }}",
                    "rightValue": "Day 1"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "Day 3",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "bc2bb080-5308-4dfb-89e5-c4995b8e8158",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json['Stage'] }}",
                    "rightValue": "Day 3"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "Day 7",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "e8dd580d-ba10-4c09-a075-6fda7b931cca",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json['Stage'] }}",
                    "rightValue": "Day 7"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "Day 14",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "93af264b-4acd-4951-b7cd-a3c3a0d166c5",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json['Stage'] }}",
                    "rightValue": "Day 14"
                  }
                ]
              },
              "renameOutput": true
            }
          ]
        },
        "options": {}
      },
      "typeVersion": 3.2
    },
    {
      "id": "94ea2fb4-1c48-4b53-a4e2-12a247598f94",
      "name": "Send Day 1 Follow-Up",
      "type": "n8n-nodes-base.gmail",
      "position": [
        -320,
        480
      ],
      "parameters": {
        "sendTo": "={{ $json['Email'] }}",
        "message": "=<p>Hi {{ $json['Name'].split(' ')[0] }},</p>\n\n<p>I wanted to follow up on our conversation about <strong>{{ $json['Project/Interest'] }}</strong>.</p>\n\n<p>I know things can get busy, so I'm reaching out to see if you had a chance to think about our discussion. Is this still something you'd like to move forward with?</p>\n\n<p><strong>Quick reminder of what we discussed:</strong></p>\n<ul>\n<li>Timeline: {{ $json['Timeline'] || 'Flexible' }}</li>\n<li>Next step: {{ $json['Next Step'] || 'Schedule a call' }}</li>\n</ul>\n\n<p>If you're still interested, simply reply to this email or <a href=\"YOUR_CALENDAR_LINK\">book a time on my calendar</a> that works for you.</p>\n\n<p>No pressure - if timing isn't right, just let me know!</p>\n\n<p>Best,<br>Your Name</p>",
        "options": {},
        "subject": "Quick Follow-Up - {{ $json['Name'] }}"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "2b6551c3-a614-495b-a00b-e95be20d774f",
      "name": "Send Day 3 Follow-Up",
      "type": "n8n-nodes-base.gmail",
      "position": [
        -320,
        656
      ],
      "parameters": {
        "sendTo": "={{ $json['Email'] }}",
        "message": "=<p>Hi {{ $json['Name'].split(' ')[0] }},</p>\n\n<p>I was putting together some resources and thought of you! Since we discussed <strong>{{ $json['Project/Interest'] }}</strong>, I wanted to share something that might be helpful.</p>\n\n<p>\ud83d\udcc4 <strong><a href=\"YOUR_RESOURCE_LINK\">Here's a guide/case study/resource</a></strong> that addresses exactly what we talked about.</p>\n\n<p>I've seen this approach work really well for [similar clients/projects], and thought it might give you some ideas as you're thinking through next steps.</p>\n\n<p>If you'd like to discuss how this could apply to your situation specifically, I'm happy to jump on a quick 15-minute call this week.</p>\n\n<p><a href=\"YOUR_CALENDAR_LINK\">Grab a time here \u2192</a></p>\n\n<p>Hope this helps!</p>\n\n<p>Best,<br>Your Name</p>",
        "options": {},
        "subject": "Thought You'd Find This Helpful - {{ $json['Name'] }}"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "14e055f7-79ad-469d-a7ee-34414d75406f",
      "name": "Send Day 7 Follow-Up",
      "type": "n8n-nodes-base.gmail",
      "position": [
        -320,
        848
      ],
      "parameters": {
        "sendTo": "={{ $json['Email'] }}",
        "message": "=<p>Hi {{ $json['Name'].split(' ')[0] }},</p>\n\n<p>I wanted to reach out one more time about <strong>{{ $json['Project/Interest'] }}</strong>.</p>\n\n<p>I haven't heard back from you, which is totally fine - I know priorities shift and timing isn't always perfect.</p>\n\n<p><strong>Here's my thinking:</strong></p>\n<ul>\n<li>If you're still interested, I'd love to chat and see how we can move this forward</li>\n<li>If timing isn't right, no problem at all - just let me know and I'll check back in a few months</li>\n<li>If this isn't a priority anymore, that's completely understandable</li>\n</ul>\n\n<p>Just reply with \"Still interested,\" \"Maybe later,\" or \"Not right now\" and I'll know where things stand.</p>\n\n<p>Either way, thanks for considering working together!</p>\n\n<p>Best,<br>Your Name</p>",
        "options": {},
        "subject": "Last Check-In - {{ $json['Name'] }}"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "df6840e0-319a-4a7c-81f0-cb80971d2554",
      "name": "Send Day 14 Final Follow-Up",
      "type": "n8n-nodes-base.gmail",
      "position": [
        -320,
        1040
      ],
      "parameters": {
        "sendTo": "={{ $json['Email'] }}",
        "message": "=<p>Hi {{ $json['Name'].split(' ')[0] }},</p>\n\n<p>This will be my last email about <strong>{{ $json['Project/Interest'] }}</strong> - I don't want to crowd your inbox!</p>\n\n<p>I genuinely enjoyed our initial conversation and would love to work together if the timing ever becomes right.</p>\n\n<p><strong>Here's what I'm leaving open for you:</strong></p>\n<ul>\n<li>My calendar link: <a href=\"YOUR_CALENDAR_LINK\">Book anytime</a></li>\n<li>Direct email: Just reply to this thread</li>\n<li>No questions asked - I'll pick up right where we left off</li>\n</ul>\n\n<p>If circumstances change or you have questions down the road, please don't hesitate to reach out. I'm here whenever you need.</p>\n\n<p>Wishing you all the best with {{ $json['Project/Interest'] }} and everything else!</p>\n\n<p>Best,<br>Your Name</p>\n\n<p style=\"font-size: 11px; color: #666;\"><em>P.S. I'll remove you from this follow-up sequence, but feel free to reach out anytime in the future.</em></p>",
        "options": {},
        "subject": "Final Note - Leaving This Open for You"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "68c62208-ed32-4a69-a99f-e8db094d3a4c",
      "name": "Update Last Sent Date",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        64,
        752
      ],
      "parameters": {
        "columns": {
          "value": {
            "Email": "={{ $json['Email'] }}",
            "Last Sent Date": "={{ $now.format('yyyy-MM-dd') }}"
          },
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Email"
          ]
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Follow-Up Tracker"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "YOUR_GOOGLE_SHEET_ID"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "321778a9-d503-4a77-bbac-4c7c2b9e34bd",
      "name": "Calculate Next Follow-Up",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        400,
        752
      ],
      "parameters": {
        "columns": {
          "value": {
            "Email": "={{ $json['Email'] }}",
            "Stage": "={{ $json['Stage'] === 'Day 1' ? 'Day 3' : $json['Stage'] === 'Day 3' ? 'Day 7' : $json['Stage'] === 'Day 7' ? 'Day 14' : 'Complete' }}",
            "Status": "={{ $json['Stage'] === 'Day 14' ? 'Completed' : 'Active' }}",
            "Next Follow-Up Date": "={{ $now.plus({ days: $json['Stage'] === 'Day 1' ? 2 : $json['Stage'] === 'Day 3' ? 4 : $json['Stage'] === 'Day 7' ? 7 : 0 }).format('yyyy-MM-dd') }}"
          },
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Email"
          ]
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Follow-Up Tracker"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "YOUR_GOOGLE_SHEET_ID"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "d0a52a65-4899-4943-ac7f-85ac1001581b",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1856,
        -32
      ],
      "parameters": {
        "color": 7,
        "width": 576,
        "height": 1280,
        "content": "# \ud83d\udd04 Daily Follow-Up System with Multi-Stage Sequences\n\n## What It Does\nAutomatically sends timed follow-up emails to leads based on a 4-stage sequence (Day 1, 3, 7, 14), updates tracking automatically, and calculates next follow-up dates. Set it once, add leads, and never manually track follow-ups again. Converts cold leads into warm opportunities through consistent, professional touchpoints.\n\n## How It Works\n1. **Schedule Trigger** \u2192 Runs daily at 9 AM\n2. **Read Tracker Sheet** \u2192 Gets all leads from Follow-Up Tracker\n3. **Filter Today's Follow-Ups** \u2192 Only processes leads where \"Next Follow-Up Date\" = Today\n4. **Process Individually** \u2192 Handles each lead one at a time (prevents rate limits)\n5. **Route by Stage** \u2192 Sends appropriate email based on Day 1/3/7/14 stage\n6. **Send Stage Email** \u2192 4 different templates for each follow-up milestone\n7. **Update Last Sent** \u2192 Records when email was sent\n8. **Calculate Next Date** \u2192 Automatically schedules next follow-up (or marks complete)\n\n---\n\n## \ud83d\ude80 SETUP INSTRUCTIONS\n\n### Step 1: Create Follow-Up Tracker Sheet\n- Create Google Sheet with tab \"Follow-Up Tracker\"\n- Add columns: `Name | Email | Project/Interest | Timeline | Next Step | Stage | Next Follow-Up Date | Last Sent Date | Status`\n- Populate with leads: Set Stage = \"Day 1\", Status = \"Active\", Next Follow-Up Date = desired start date\n- Update `YOUR_GOOGLE_SHEET_ID` in nodes 2, 7, and 8\n\n### Step 2: Configure Email Templates\n- Edit nodes 6-9 with your email templates\n- Replace `YOUR_CALENDAR_LINK` with your actual booking link (Calendly, etc.)\n- Replace `YOUR_RESOURCE_LINK` in Day 3 email with relevant content\n- Customize sender name/signature in all templates\n\n### Step 3: Setup Gmail Connection\n- Add Gmail OAuth2 credentials to all email nodes\n- Test workflow with one test lead first\n- Monitor Gmail sending limits (500/day for free accounts)\n\n### Step 4: Test the Sequence\n- Add one test lead with Next Follow-Up Date = today\n- Manually execute workflow to verify email sends\n- Check that Google Sheet updates correctly\n- Verify next stage is calculated properly"
      },
      "typeVersion": 1
    },
    {
      "id": "d3cf7fe8-01d9-4815-b183-674e24489234",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -672,
        -32
      ],
      "parameters": {
        "color": 4,
        "width": 608,
        "height": 368,
        "content": "## Step 1: Start Daily Follow-Up Run\nPurpose: Trigger the workflow every morning and load all leads that are part of the follow-up sequence."
      },
      "typeVersion": 1
    },
    {
      "id": "2c0fc58e-a357-4ae8-b298-0e49d8f00707",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -48,
        -32
      ],
      "parameters": {
        "color": 6,
        "width": 640,
        "height": 368,
        "content": "## Step 2: Select And Queue Today's Leads\nPurpose: Filter only active leads scheduled for follow-up today and queue them to be processed one by one.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "973d3182-409b-4383-8430-2fb2f6e164d8",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -672,
        352
      ],
      "parameters": {
        "color": 5,
        "width": 608,
        "height": 896,
        "content": "## Step 3: Send Stage-Specific Follow-Up Email\nPurpose: Route each lead to the correct follow-up stage and send the appropriate email template for that day in the sequence."
      },
      "typeVersion": 1
    },
    {
      "id": "729333d1-5e9e-4505-83ac-7ff5c6210731",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -48,
        352
      ],
      "parameters": {
        "color": 3,
        "width": 640,
        "height": 896,
        "content": "## Step 4: Update Timeline And Next Follow-Up\nPurpose: Log when the last follow-up was sent and calculate the next follow-up date and stage status in the tracker.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "051e1ca3-186f-4062-ba38-ef7af1eec8b7",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1264,
        -32
      ],
      "parameters": {
        "color": 7,
        "width": 576,
        "height": 1280,
        "content": "## \ud83d\udd27 Customization Options\n\n- **Change Timing**: Modify intervals in node 8 (currently 2, 4, 7 days between stages)\n- **Add More Stages**: Add new Switch outputs and email templates (e.g., Day 21, Day 30)\n- **Different Sequences**: Create multiple sheets for different lead types/products\n- **Business Hours Only**: Add time-based IF node before email sending\n- **Add SMS**: Insert Twilio node for high-value leads at certain stages\n\n---\n\n## \ud83d\udea8 Troubleshooting\n\n- **Emails not sending**: Verify today's date matches \"Next Follow-Up Date\" format (yyyy-MM-dd)\n- **Wrong stage email**: Check Stage column values exactly match Switch conditions (\"Day 1\" not \"day 1\")\n- **Not updating sheet**: Confirm Email column is unique identifier and exists in both read/update operations\n- **Skipping leads**: Ensure Status = \"Active\" (not \"active\" or other variations)\n- **Duplicate emails**: Workflow only processes if Next Follow-Up Date = exactly today\n\n---\n\n## \ud83d\udca1 Enhancement Ideas\n\n- Track email opens using tracking pixels or email service API\n- Add \"Responded\" status that automatically pauses sequence when lead replies\n- Create separate sequences for different products/services\n- Send Slack notification when lead reaches Day 14 (final stage)\n- Generate weekly report of follow-up completion rates\n- Add \"Snooze\" functionality to pause sequence for X days"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "aa85d07e-f8da-4d04-9c0c-d3d93c5226f7",
  "connections": {
    "Daily at 9 AM": {
      "main": [
        [
          {
            "node": "Read All Follow-Up Leads",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Day 1 Follow-Up": {
      "main": [
        [
          {
            "node": "Update Last Sent Date",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Day 3 Follow-Up": {
      "main": [
        [
          {
            "node": "Update Last Sent Date",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Day 7 Follow-Up": {
      "main": [
        [
          {
            "node": "Update Last Sent Date",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Process One at a Time": {
      "main": [
        [
          {
            "node": "Route by Follow-Up Stage",
            "type": "main",
            "index": 0
          }
        ],
        []
      ]
    },
    "Update Last Sent Date": {
      "main": [
        [
          {
            "node": "Calculate Next Follow-Up",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Read All Follow-Up Leads": {
      "main": [
        [
          {
            "node": "Filter Today's Follow-Ups",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Route by Follow-Up Stage": {
      "main": [
        [
          {
            "node": "Send Day 1 Follow-Up",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Send Day 3 Follow-Up",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Send Day 7 Follow-Up",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Send Day 14 Final Follow-Up",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter Today's Follow-Ups": {
      "main": [
        [
          {
            "node": "Process One at a Time",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Day 14 Final Follow-Up": {
      "main": [
        [
          {
            "node": "Update Last Sent Date",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}