AutomationFlowsGeneral › Automated 4-stage Email Follow-up System with AI Personalization and…

Automated 4-stage Email Follow-up System with AI Personalization and…

Original n8n title: Automated 4-stage Email Follow-up System with AI Personalization and Database Tracking

ByBuay Biel @bielbuay on n8n.io

This n8n template demonstrates how to automate personalized cold email follow-ups using AI personalization and database tracking. Perfect for sales teams, recruiters, and agencies managing high-volume outreach.

Cron / scheduled trigger★★★★☆ complexityAI-powered24 nodesNoco DbGroq ChatEmail SendChain Llm
General Trigger: Cron / scheduled Nodes: 24 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #9108 — we link there as the canonical source.

This workflow follows the Chainllm → Emailsend recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "00a6357a-03f0-48f0-bed9-dcf7de5b5511",
      "name": "Get many rows",
      "type": "n8n-nodes-base.nocoDb",
      "position": [
        -1136,
        624
      ],
      "parameters": {
        "table": "mznkwe3wz0dofde",
        "options": {},
        "operation": "getAll",
        "projectId": "psinm4yvd05vnvy",
        "returnAll": true,
        "authentication": "nocoDbApiToken"
      },
      "credentials": {
        "nocoDbApiToken": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "d2f3be79-b5cc-4145-b9f5-75b075d7c3c9",
      "name": "Filter",
      "type": "n8n-nodes-base.filter",
      "position": [
        -912,
        624
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "loose"
          },
          "combinator": "or",
          "conditions": [
            {
              "id": "8ed5c77d-155f-4e54-9792-80e591213ea9",
              "operator": {
                "name": "filter.operator.equals",
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json['Next Follow up/Contact'] }}",
              "rightValue": "={{ $now.format('M/dd/yy') }}"
            },
            {
              "id": "2d5ae5f1-ba75-474d-b2ba-a53643e4452e",
              "operator": {
                "type": "dateTime",
                "operation": "before"
              },
              "leftValue": "={{ $json['Next Follow up/Contact'] }}",
              "rightValue": "={{ $now.format('M/dd/yy') }}"
            }
          ]
        },
        "looseTypeValidation": true
      },
      "typeVersion": 2.2
    },
    {
      "id": "92ea9d6b-fd48-441f-8083-a07cf273b744",
      "name": "Switch",
      "type": "n8n-nodes-base.switch",
      "position": [
        -272,
        592
      ],
      "parameters": {
        "rules": {
          "values": [
            {
              "outputKey": "Follow Up 1 ",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "30fceefc-9858-4b72-bea7-59c20a328a92",
                    "operator": {
                      "type": "string",
                      "operation": "empty",
                      "singleValue": true
                    },
                    "leftValue": "={{ $json['Follow Up 1 (Day 3) Y/N'] }}",
                    "rightValue": ""
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "Follow Up 2",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "37ae5967-faa4-4595-9a41-00c9f160ae38",
                    "operator": {
                      "type": "string",
                      "operation": "empty",
                      "singleValue": true
                    },
                    "leftValue": "={{ $json['Follow Up 2 (Day 7) Y/N'] }}",
                    "rightValue": ""
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "Follow Up 3",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "ae3c3461-15d1-4adf-a67a-4a9cb14a4bc2",
                    "operator": {
                      "type": "string",
                      "operation": "empty",
                      "singleValue": true
                    },
                    "leftValue": "={{ $json['Follow Up 3 (Day 12) Y/N'] }}",
                    "rightValue": ""
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "Follow Up 4",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "7488eccf-3b6a-4244-9782-0aa4ff5e3105",
                    "operator": {
                      "type": "string",
                      "operation": "empty",
                      "singleValue": true
                    },
                    "leftValue": "={{ $json['Follow Up 4 (Day 16) Y/N'] }}",
                    "rightValue": ""
                  }
                ]
              },
              "renameOutput": true
            }
          ]
        },
        "options": {}
      },
      "typeVersion": 3.2
    },
    {
      "id": "596a5b9d-51ea-4b81-9715-fcdef5d8a9f0",
      "name": "Groq Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatGroq",
      "position": [
        32,
        144
      ],
      "parameters": {
        "model": "openai/gpt-oss-120b",
        "options": {}
      },
      "credentials": {
        "groqApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "39beac49-471d-45bd-bbed-1e527d57d022",
      "name": "Groq Chat Model1",
      "type": "@n8n/n8n-nodes-langchain.lmChatGroq",
      "position": [
        32,
        544
      ],
      "parameters": {
        "model": "openai/gpt-oss-20b",
        "options": {}
      },
      "credentials": {
        "groqApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "a55a3e49-72fb-4549-b390-144948324b2b",
      "name": "Groq Chat Model2",
      "type": "@n8n/n8n-nodes-langchain.lmChatGroq",
      "position": [
        32,
        944
      ],
      "parameters": {
        "model": "openai/gpt-oss-20b",
        "options": {}
      },
      "credentials": {
        "groqApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "6121e37c-b95c-4c92-a540-aa602b8568b3",
      "name": "Groq Chat Model3",
      "type": "@n8n/n8n-nodes-langchain.lmChatGroq",
      "position": [
        32,
        1456
      ],
      "parameters": {
        "model": "openai/gpt-oss-120b",
        "options": {}
      },
      "credentials": {
        "groqApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "932677fa-c641-4cd3-b084-0dba8bca85a2",
      "name": "Send email",
      "type": "n8n-nodes-base.emailSend",
      "position": [
        320,
        -80
      ],
      "parameters": {
        "text": "={{ $json.text }}",
        "options": {
          "appendAttribution": false
        },
        "subject": "RE: Quick question about Lead Qualification",
        "toEmail": "={{ $('Get many rows').item.json.email }}",
        "emailFormat": "text"
      },
      "credentials": {
        "smtp": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "d1d382d4-9ac2-4ebe-a9d2-50a6ddf49501",
      "name": "Send email1",
      "type": "n8n-nodes-base.emailSend",
      "position": [
        336,
        320
      ],
      "parameters": {
        "text": "={{ $json.text }}",
        "options": {
          "appendAttribution": false
        },
        "subject": "RE: Quick question about lead qualification",
        "toEmail": "={{ $('Get many rows').item.json.email }}",
        "emailFormat": "text"
      },
      "credentials": {
        "smtp": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "3cd74ac1-2c6e-49ff-9bc3-42a2fc0cdaee",
      "name": "Send email2",
      "type": "n8n-nodes-base.emailSend",
      "position": [
        304,
        720
      ],
      "parameters": {
        "text": "={{ $json.text }}",
        "options": {
          "appendAttribution": false
        },
        "subject": "RE: Quick question about lead qualification",
        "toEmail": "={{ $('Get many rows').item.json.email }}",
        "emailFormat": "text"
      },
      "credentials": {
        "smtp": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "20e78be4-e656-4e21-8557-e3d8547c5a8f",
      "name": "Send email3",
      "type": "n8n-nodes-base.emailSend",
      "position": [
        304,
        1232
      ],
      "parameters": {
        "text": "={{ $json.text }}",
        "options": {
          "appendAttribution": false
        },
        "subject": "RE: Quick question about lead qualification ",
        "toEmail": "={{ $('Get many rows').item.json.email }}",
        "emailFormat": "text"
      },
      "credentials": {
        "smtp": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "04d81390-a5ab-4670-8eff-b6421c646731",
      "name": "Update a row",
      "type": "n8n-nodes-base.nocoDb",
      "position": [
        512,
        320
      ],
      "parameters": {
        "table": "mznkwe3wz0dofde",
        "fieldsUi": {
          "fieldValues": [
            {
              "fieldName": "Follow Up 2 (Day 7) Y/N",
              "fieldValue": "Y"
            },
            {
              "fieldName": "Next Follow up/Contact",
              "fieldValue": "={{ $now.plus(5, 'Days').format('M/dd/yy') }}"
            },
            {
              "fieldName": "Id",
              "fieldValue": "={{ $('Get many rows').item.json.Id }}"
            }
          ]
        },
        "operation": "update",
        "projectId": "psinm4yvd05vnvy",
        "authentication": "nocoDbApiToken"
      },
      "credentials": {
        "nocoDbApiToken": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "8fd0f965-59c1-4c93-9d5f-b49a7849ec87",
      "name": "Update a row1",
      "type": "n8n-nodes-base.nocoDb",
      "position": [
        528,
        -80
      ],
      "parameters": {
        "table": "mznkwe3wz0dofde",
        "fieldsUi": {
          "fieldValues": [
            {
              "fieldName": "Follow Up 1 (Day 3) Y/N",
              "fieldValue": "Y"
            },
            {
              "fieldName": "Next Follow up/Contact",
              "fieldValue": "={{ $now.plus(4, 'Days').format('M/dd/yy') }}"
            },
            {
              "fieldName": "Id",
              "fieldValue": "={{ $('Get many rows').item.json.Id }}"
            }
          ]
        },
        "operation": "update",
        "projectId": "psinm4yvd05vnvy",
        "authentication": "nocoDbApiToken"
      },
      "credentials": {
        "nocoDbApiToken": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "f33d7ba4-fe04-48f8-8d21-c5424a330349",
      "name": "Update a row2",
      "type": "n8n-nodes-base.nocoDb",
      "position": [
        512,
        720
      ],
      "parameters": {
        "table": "mznkwe3wz0dofde",
        "fieldsUi": {
          "fieldValues": [
            {
              "fieldName": "Follow Up 3 (Day 12) Y/N",
              "fieldValue": "Y"
            },
            {
              "fieldName": "Next Follow up/Contact",
              "fieldValue": "={{ $now.plus(4, 'days').format('M/dd/yy') }}"
            },
            {
              "fieldName": "Id",
              "fieldValue": "={{ $('Get many rows').item.json.Id }}"
            }
          ]
        },
        "operation": "update",
        "projectId": "psinm4yvd05vnvy",
        "authentication": "nocoDbApiToken"
      },
      "credentials": {
        "nocoDbApiToken": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "df8f317d-3265-4d8a-bdd0-cb2bbf27157c",
      "name": "Update a row3",
      "type": "n8n-nodes-base.nocoDb",
      "position": [
        512,
        1232
      ],
      "parameters": {
        "table": "mznkwe3wz0dofde",
        "fieldsUi": {
          "fieldValues": [
            {
              "fieldName": "Follow Up 4 (Day 16) Y/N",
              "fieldValue": "Y"
            },
            {
              "fieldName": "Id",
              "fieldValue": "={{ $('Get many rows').item.json.Id }}"
            }
          ]
        },
        "operation": "update",
        "projectId": "psinm4yvd05vnvy",
        "authentication": "nocoDbApiToken"
      },
      "credentials": {
        "nocoDbApiToken": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "30a03741-6f5e-43a7-91d2-c57e3cd70b23",
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -1328,
        624
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "triggerAtHour": 10
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "c3602cdb-4e3a-47d7-827c-be80b75cce98",
      "name": "Filter1",
      "type": "n8n-nodes-base.filter",
      "position": [
        -704,
        624
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "c188d6ef-d923-48c0-89fe-2a699ab30ecf",
              "operator": {
                "type": "string",
                "operation": "empty",
                "singleValue": true
              },
              "leftValue": "={{ $json['Not Interested'] }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "4ce96b40-c824-4cc5-9f0f-d397f7a262be",
      "name": "Follow Up Message 1",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        -48,
        -80
      ],
      "parameters": {
        "text": "=You are an email personalization assistant. Your job is to modify an email template by replacing ONLY one specific element:\n\n1. Replace the recipient's name\n\nCRITICAL INSTRUCTIONS:\n- Change ONLY the name\n- Keep ALL other content exactly the same\n- Maintain the exact formatting, spacing, and structure\n- Do not modify subject lines, signatures, or any other text\n- Do not add extra content or make style changes\n\nINPUT FORMAT:\nYou will receive:\n- Original Email: \nHey Michael, \n[[Insert Follow Up Email 1]]\n\n- New Name: {{ $json.first_name }}\n\nREPLACEMENT RULES:\n- Replace \"Michael\" with the actual name provided\n- Use the exact capitalization provided in the input\n\nOUTPUT FORMAT:\nReturn only the modified email with no additional commentary, explanations, or metadata.",
        "batching": {},
        "promptType": "define"
      },
      "typeVersion": 1.7
    },
    {
      "id": "b38f5b0f-07ad-4d7d-8a43-811770d66a08",
      "name": "Follow Up Message 2",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        -48,
        320
      ],
      "parameters": {
        "text": "=You are an email personalization assistant. Your job is to modify an email template by replacing ONLY one specific element:\n\n1. Replace the recipient's name\n\nCRITICAL INSTRUCTIONS:\n- Change ONLY the name\n- Keep ALL other content exactly the same\n- Maintain the exact formatting, spacing, and structure\n- Do not modify subject lines, signatures, or any other text\n- Do not add extra content or make style changes\n\nINPUT FORMAT:\nYou will receive:\n- Original Email: \nHey ((name)),\n[[Insert Follow Up Email 2]]\n\n\n- New Name: {{ $json.first_name }}\n\nREPLACEMENT RULES:\n- Look for placeholders like: ((name)), or obvious name placeholders\n- Use the exact capitalization provided in the input\n\nOUTPUT FORMAT:\nReturn only the modified email with no additional commentary, explanations, or metadata.",
        "batching": {},
        "promptType": "define"
      },
      "typeVersion": 1.7
    },
    {
      "id": "623869ff-9e98-4278-b8b3-c1e8e689edd4",
      "name": "Follow Up Message 3",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        -48,
        720
      ],
      "parameters": {
        "text": "=You are an email personalization assistant. Your job is to modify an email template by replacing ONLY one specific element:\n\n1. Replace the recipient's name\n\nCRITICAL INSTRUCTIONS:\n- Change ONLY the name\n- Keep ALL other content exactly the same\n- Maintain the exact formatting, spacing, and structure\n- Do not modify subject lines, signatures, or any other text\n- Do not add extra content or make style changes\n\nINPUT FORMAT:\nYou will receive:\n- Original Email: \nHey ((name)),\n\n[[Insert Follow Up Email 3]]\n\n\n- New Name: {{ $json.first_name }}\n\nREPLACEMENT RULES:\n- Look for placeholders like: ((name)), or obvious name placeholders\n- Use the exact capitalization provided in the input\n\nOUTPUT FORMAT:\nReturn only the modified email with no additional commentary, explanations, or metadata.",
        "batching": {},
        "promptType": "define"
      },
      "typeVersion": 1.7
    },
    {
      "id": "9ad58bd4-a5c2-4206-b1b1-48b83cf9c2d8",
      "name": "Follow Up Message 4",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        -48,
        1232
      ],
      "parameters": {
        "text": "=You are an email personalization assistant. Your job is to modify an email template by replacing ONLY one specific element:\n\n1. Replace the recipient's name\n\nCRITICAL INSTRUCTIONS:\n- Change ONLY the name\n- Keep ALL other content exactly the same\n- Maintain the exact formatting, spacing, and structure\n- Do not modify subject lines, signatures, or any other text\n- Do not add extra content or make style changes\n\nINPUT FORMAT:\nYou will receive:\n- Original Email: \nHi ((name))\n[[Insert Follow Up Email 4]]\n\n\n- New Name: {{ $json.first_name }}\n\nREPLACEMENT RULES:\n- Look for placeholders like: ((name)), or obvious name placeholders\n- Use the exact capitalization provided in the input\n\nOUTPUT FORMAT:\nReturn only the modified email with no additional commentary, explanations, or metadata.",
        "batching": {},
        "promptType": "define"
      },
      "typeVersion": 1.7
    },
    {
      "id": "5353f6d4-32b4-471c-b383-641b78b75c91",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2896,
        -800
      ],
      "parameters": {
        "color": 5,
        "width": 1312,
        "height": 1408,
        "content": "# Automated Email Follow-Up Workflow\n\nThis n8n template demonstrates how to automate personalized cold email follow-ups using AI personalization and database tracking. Perfect for sales teams, recruiters, and agencies managing high-volume outreach.\n\n**Use cases:** Follow up with cold leads, re-engage trial users, nurture conference contacts, recruit candidates, or follow up with proposal recipients.\n\n\n\n## How it works\n\n* NocoDB fetches all leads and filters those needing follow-up today based on the \"Next Follow up/Contact\" date\n* A switch node routes leads to the appropriate follow-up stage (1-4) based on which follow-ups have already been sent\n* AI personalizes each email template by inserting the recipient's name while keeping the rest of the content intact\n* Emails are sent via SMTP (or Gmail node), then the database updates to mark the follow-up as sent and schedule the next one\n* The workflow runs daily at 10 AM to automatically process follow-ups without manual intervention\n\n\n\n## Good to know\n\n* Each AI personalization costs ~$0.001 with Groq (free tier available). See Groq pricing for details.\n* Follow-up schedule: Day 3, 7, 12, 16 after initial contact (fully customizable)\n* Leads marked \"Not Interested\" are automatically excluded from future follow-ups\n* The workflow only processes leads with an \"Initial Contact Date\" set - this triggers the entire sequence (The initial Contact is done manually and updated manually)\n\n\n\n## How to use\n\n* The schedule trigger runs daily but can be replaced with manual trigger or webhook for immediate testing\n* Customize the 4 email templates in the AI nodes to match your brand voice and offering\n* Adjust follow-up intervals by modifying the \"Update a row\" nodes (currently +4 or +5 days between follow-ups)\n* Import your lead list to NocoDB with minimum required fields: first_name, last_name, email, Initial Contact Date\n\n\n\n## Requirements\n\n* **NocoDB account** - Free lead database (You can use any database-Google Sheets, Airtable etc. However ensure the essential details below are in the database)\n* **Groq API key** (or OpenAI/Ollama) - For AI personalization (Swap this for any LLM you like/have)\n* **SWITCH** the 'Send Email' nodes for the **Gmail** Node and set it up using OAuth\n\n## Database Structure\n\n**Critical columns** (workflow will fail without these):\n* `first_name` - Recipient's first name for personalization\n* `email` - Where to send follow-ups\n* `Initial Contact Date` - Triggers the sequence when set\n* `Next Follow up/Contact` - Determines when next follow-up sends\n* `Follow Up 1 (Day 3) Y/N` - Tracks completion (null/Y)\n* `Follow Up 2 (Day 7) Y/N` - Tracks completion (null/Y)\n* `Follow Up 3 (Day 12) Y/N` - Tracks completion (null/Y)\n* `Follow Up 4 (Day 16) Y/N` - Tracks completion (null/Y)\n* `Not Interested` - Excludes leads from sequence\n\n**Optional enrichment columns:**\norganization_name, title, industry, linkedin_url, city, organization_website_url, organization_annual_revenue_printed, organization_linkedin_url, organization_phone, organization_country\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "2be4a15e-542b-4556-95f4-75a0525e00af",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1552,
        -800
      ],
      "parameters": {
        "color": 6,
        "width": 1088,
        "height": 880,
        "content": "## Customizing this workflow\n\n**Change follow-up timing:** Edit the `$now.plus(X, 'Days')` values in the Update nodes to adjust intervals between follow-ups.\n\n**Swap AI providers:** Replace Groq nodes with OpenAI, Anthropic, or local Ollama models - all use the same LangChain interface.\n\n**Use Gmail instead of SMTP:** Replace \"Send Email\" nodes with native Gmail nodes for better deliverability and OAuth authentication.\n\n**Add more follow-ups:** Duplicate the Follow Up 4 branch, add a new condition to the Switch node, and create corresponding database column.\n\n**Different email content per industry:** Create separate branches in the Switch node based on the lead's industry field to send targeted messaging.\n\n\n\n## Setup Checklist\n\n**Database Setup (5 minutes):**\n1. Create NocoDB/datbase table with required columns: first_name, last_name, email, Initial Contact Date, Next Follow up/Contact, Follow Up 1-4 Y/N, Not Interested\n2. Import your lead list or add leads manually\n3. Set \"Initial Contact Date\" to when you first contacted them\n4. Calculate \"Next Follow up/Contact\" as Initial Contact Date + 3 days\n\n**Workflow Configuration (10 minutes):**\n1. Add NocoDB/dtabase credentials (get API token from NocoDB settings)\n2. Add Groq/LLM credentials (free at console.groq.com)\n3. Add email credentials (SMTP details or Gmail OAuth)\n4. Update email templates in the 4 AI personalization nodes\n\n**Testing (5 minutes):**\n1. Add test lead with your email and today's follow-up date\n2. Execute workflow manually\n3. Verify email received and database updated\n4. Test each follow-up stage by updating the test lead\n\n**Go Live:**\n1. Set schedule trigger to your preferred time (default: 10 AM daily)\n2. Activate workflow\n3. Monitor for first few days to ensure proper execution\n"
      },
      "typeVersion": 1
    },
    {
      "id": "9f98fd9b-9c40-4d91-bce5-f2410f80b718",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1536,
        112
      ],
      "parameters": {
        "color": 4,
        "width": 1072,
        "height": 336,
        "content": "## Troubleshooting\n\n**No emails sending:**\nCheck if \"Next Follow up/Contact\" is today or earlier, follow-up fields are null (not \"Y\"), and email credentials are valid.\n\n**AI personalization fails:**\nVerify API key is valid and has credits, model name is correct (openai/gpt-oss-120b for Groq).\n\n**Database not updating:**\nConfirm field names match exactly (case-sensitive), NocoDB credentials are current, and you're using the correct Project/Table IDs.\n\n**Wrong follow-up sent:**\nCheck Switch node conditions - they route based on which follow-up fields are empty vs \"Y\".\n"
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "Filter": {
      "main": [
        [
          {
            "node": "Filter1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Switch": {
      "main": [
        [
          {
            "node": "Follow Up Message 1",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Follow Up Message 2",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Follow Up Message 3",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Follow Up Message 4",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter1": {
      "main": [
        [
          {
            "node": "Switch",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send email": {
      "main": [
        [
          {
            "node": "Update a row1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send email1": {
      "main": [
        [
          {
            "node": "Update a row",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send email2": {
      "main": [
        [
          {
            "node": "Update a row2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send email3": {
      "main": [
        [
          {
            "node": "Update a row3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get many rows": {
      "main": [
        [
          {
            "node": "Filter",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Groq Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Follow Up Message 1",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Groq Chat Model1": {
      "ai_languageModel": [
        [
          {
            "node": "Follow Up Message 2",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Groq Chat Model2": {
      "ai_languageModel": [
        [
          {
            "node": "Follow Up Message 3",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Groq Chat Model3": {
      "ai_languageModel": [
        [
          {
            "node": "Follow Up Message 4",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Get many rows",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Follow Up Message 1": {
      "main": [
        [
          {
            "node": "Send email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Follow Up Message 2": {
      "main": [
        [
          {
            "node": "Send email1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Follow Up Message 3": {
      "main": [
        [
          {
            "node": "Send email2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Follow Up Message 4": {
      "main": [
        [
          {
            "node": "Send email3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

This n8n template demonstrates how to automate personalized cold email follow-ups using AI personalization and database tracking. Perfect for sales teams, recruiters, and agencies managing high-volume outreach.

Source: https://n8n.io/workflows/9108/ — original creator credit. Request a take-down →

More General workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

General

This n8n template demonstrates how to automate personalized cold email outreach using AI and a lead database. It’s designed to contact unengaged leads, personalize messages at scale, and schedule foll

Noco Db, Chain Llm, Groq Chat +1
General

⚠️ Important: This workflow uses the Autype community node and requires a self-hosted n8n instance.

Noco Db, N8N Nodes Autype, Email Send
General

RoboNuggets - Faceless POV AI Machine (R24). Uses scheduleTrigger, googleSheets, chainLlm, lmChatOpenAi. Scheduled trigger; 31 nodes.

Google Sheets, Chain Llm, OpenAI Chat +5
General

Video Automation (images only). Uses chainLlm, lmChatOpenAi, outputParserStructured, splitOut. Scheduled trigger; 28 nodes.

Chain Llm, OpenAI Chat, Output Parser Structured +4
General

Sia — Portal de Expansão de Terrenos (Principal). Uses chainLlm, lmChatGroq, googleSheets. Webhook trigger; 12 nodes.

Chain Llm, Groq Chat, Google Sheets