AutomationFlowsAI & RAG › Re-engage Old Clients with Claude 3.7 Sonnet, Gmail and Google Sheets

Re-engage Old Clients with Claude 3.7 Sonnet, Gmail and Google Sheets

ByisaWOW @isawow on n8n.io

Automatically re-engage old or inactive clients by sending AI-personalized follow-up emails using Claude 3.7 Sonnet, Gmail, and Google Sheets — with smart reply detection to avoid messaging clients who are already in active conversation.

Cron / scheduled trigger★★★★★ complexityAI-powered30 nodesGoogle SheetsGmailAgentAnthropic ChatOutput Parser Structured
AI & RAG Trigger: Cron / scheduled Nodes: 30 Complexity: ★★★★★ AI nodes: yes Added:

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

This workflow follows the Agent → Gmail 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
{
  "nodes": [
    {
      "id": "89e9df44-87b0-4135-9dad-4c6b495b4327",
      "name": "\u23f0 Daily Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        144,
        688
      ],
      "parameters": {
        "rule": {
          "interval": [
            {}
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "9bdc7268-9feb-4145-93d6-ae4ddb14568e",
      "name": "\ud83d\udccb Old Client Database",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        544,
        688
      ],
      "parameters": {
        "options": {},
        "filtersUI": {
          "values": [
            {
              "lookupColumn": "Manually Stop Workflow (STOP)"
            }
          ]
        },
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID/edit#gid=0",
          "cachedResultName": "Database"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "YOUR_GOOGLE_SHEET_ID",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID/edit",
          "cachedResultName": "Old Client Outreach - AI"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "27d10a5f-0e9b-40b0-b631-0166801ac70b",
      "name": "\ud83d\udd04 Loop: Process Each Client",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        800,
        688
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "29a33a56-34fc-416b-b660-2f9c02d596fe",
      "name": "\ud83d\udce7 Fetch Client's Latest Email",
      "type": "n8n-nodes-base.gmail",
      "position": [
        1200,
        704
      ],
      "parameters": {
        "limit": 1,
        "simple": false,
        "filters": {
          "sender": "={{ $json['Email Address'] }}"
        },
        "options": {},
        "operation": "getAll"
      },
      "typeVersion": 2.1
    },
    {
      "id": "aa569f3c-6841-468f-860c-40c7d0003cbc",
      "name": "\ud83d\udcc5 Date Checker (30-Day Window)",
      "type": "n8n-nodes-base.code",
      "position": [
        1520,
        704
      ],
      "parameters": {
        "jsCode": "// Loop over input items and add date check fields\nfor (const item of $input.all()) {\n  const inputDate = new Date(item.json.date || '2024-09-24T02:52:24.000Z');\n  const currentDate = new Date();\n  const thirtyDaysAgo = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000);\n  \n  // Check if date is within last 30 days\n  const isWithinLast30Days = inputDate >= thirtyDaysAgo;\n  \n  // Calculate days difference\n  const daysDifference = Math.floor((currentDate - inputDate) / (1000 * 60 * 60 * 24));\n  \n  // Format date as 1-Jan-2025\n  const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', \n                  'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n  const formattedDate = `${inputDate.getDate()}-${months[inputDate.getMonth()]}-${inputDate.getFullYear()}`;\n  \n  item.json.isWithinLast30Days = isWithinLast30Days;\n  item.json.daysDifference = daysDifference;\n  item.json.thirtyDaysAgo = thirtyDaysAgo.toISOString();\n  item.json.formattedDate = formattedDate;\n}\n\nreturn $input.all();"
      },
      "typeVersion": 2
    },
    {
      "id": "610063e5-bae7-458b-a18f-97f47a477ce8",
      "name": "\ud83d\udd00 Route: Client Replied Recently?",
      "type": "n8n-nodes-base.switch",
      "position": [
        1808,
        704
      ],
      "parameters": {
        "rules": {
          "values": [
            {
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "8c6b4da5-b35b-40de-a12f-04320bf4dad2",
                    "operator": {
                      "type": "boolean",
                      "operation": "true",
                      "singleValue": true
                    },
                    "leftValue": "={{ $json.isWithinLast30Days }}",
                    "rightValue": ""
                  }
                ]
              }
            },
            {
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "34086b43-439f-4aa3-80fd-ef5bf712130f",
                    "operator": {
                      "type": "boolean",
                      "operation": "false",
                      "singleValue": true
                    },
                    "leftValue": "={{ $json.isWithinLast30Days }}",
                    "rightValue": ""
                  }
                ]
              }
            }
          ]
        },
        "options": {
          "allMatchingOutputs": true
        }
      },
      "typeVersion": 3.2
    },
    {
      "id": "51c154d2-5e86-4a10-9e70-2f8e24e21079",
      "name": "\ud83d\udcdd Update: Mark Reply Manually",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1696,
        0
      ],
      "parameters": {
        "columns": {
          "value": {
            "Email Address": "={{ $('\ud83d\udccb Old Client Database').item.json['Email Address'] }}",
            "Lastest Email from Client": "={{ $('\ud83d\udce7 Fetch Client\\'s Latest Email').item.json.text }}",
            "Date of Lastest Email from Client": "={{ $('\ud83d\udcc5 Date Checker (30-Day Window)').item.json.formattedDate }}",
            "Followup Workflow (Running,Reply Manually)": "Reply Manually"
          },
          "schema": [
            {
              "id": "Client Name",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Client Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Email Address",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Email Address",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Followup Workflow (Running,Reply Manually)",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Followup Workflow (Running,Reply Manually)",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Lastest Email from Client",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Lastest Email from Client",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Date of Lastest Email from Client",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Date of Lastest Email from Client",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Email Address"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID/edit#gid=0",
          "cachedResultName": "Database"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "YOUR_GOOGLE_SHEET_ID",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID/edit",
          "cachedResultName": "Old Client Outreach - AI"
        }
      },
      "typeVersion": 4.6
    },
    {
      "id": "8f58f7d8-31fc-4cf8-8a44-318dbc5cba6c",
      "name": "\u2705 Update: Mark Running Status",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        2912,
        688
      ],
      "parameters": {
        "columns": {
          "value": {
            "Email Address": "={{ $('\ud83d\udccb Old Client Database').item.json['Email Address'] }}",
            "Lastest Email from Client": "=",
            "Date of Lastest Email from Client": "=",
            "Followup Workflow (Running,Reply Manually)": "Running"
          },
          "schema": [
            {
              "id": "Client Name",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Client Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Email Address",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Email Address",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Followup Workflow (Running,Reply Manually)",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Followup Workflow (Running,Reply Manually)",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Lastest Email from Client",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Lastest Email from Client",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Date of Lastest Email from Client",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Date of Lastest Email from Client",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Email Address"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID/edit#gid=0",
          "cachedResultName": "Database"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "YOUR_GOOGLE_SHEET_ID",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID/edit",
          "cachedResultName": "Old Client Outreach - AI"
        }
      },
      "typeVersion": 4.6
    },
    {
      "id": "0a2c7486-ce86-4fc6-981c-2b56a870584d",
      "name": "\ud83d\udce9 Fetch Followup Message Template",
      "type": "n8n-nodes-base.googleSheets",
      "onError": "continueErrorOutput",
      "position": [
        2912,
        208
      ],
      "parameters": {
        "options": {},
        "filtersUI": {
          "values": [
            {
              "lookupValue": "={{ $('\ud83d\udccb Old Client Database').item.json.Scenario }}",
              "lookupColumn": "Scenario"
            },
            {
              "lookupValue": "={{ $('\ud83d\udccb Old Client Database').item.json['Number of Emails Sent'] }}",
              "lookupColumn": "Number of Emails Sent"
            }
          ]
        },
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 1592686330,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID/edit#gid=1592686330",
          "cachedResultName": "Follow-up Messages"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "YOUR_GOOGLE_SHEET_ID",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID/edit",
          "cachedResultName": "Old Client Outreach - AI"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "ca5c0663-144d-4593-9ee2-e8a11c471021",
      "name": "\ud83d\udcc2 Fetch Situation-Based Prompt",
      "type": "n8n-nodes-base.googleSheets",
      "onError": "continueErrorOutput",
      "position": [
        2912,
        432
      ],
      "parameters": {
        "options": {},
        "filtersUI": {
          "values": [
            {
              "lookupValue": "={{ $('\ud83d\udccb Old Client Database').item.json.Scenario }}",
              "lookupColumn": "Scenario"
            }
          ]
        },
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 666858875,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID/edit#gid=666858875",
          "cachedResultName": "Situation"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "YOUR_GOOGLE_SHEET_ID",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID/edit",
          "cachedResultName": "Old Client Outreach - AI"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "9e7a4705-a5fe-4234-adae-0a820c0f1bd9",
      "name": "\ud83d\udcec Fetch 10 Email Conversations",
      "type": "n8n-nodes-base.gmail",
      "position": [
        3216,
        688
      ],
      "parameters": {
        "limit": 10,
        "simple": false,
        "filters": {
          "sender": "={{ $json['Email Address'] }}"
        },
        "options": {},
        "operation": "getAll"
      },
      "typeVersion": 2.1
    },
    {
      "id": "dd5a2d99-6a69-430d-abf4-ead01e1b2895",
      "name": "\ud83d\udce6 Bundle Email Conversations",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        3504,
        688
      ],
      "parameters": {
        "options": {},
        "fieldsToAggregate": {
          "fieldToAggregate": [
            {
              "fieldToAggregate": "text"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "3c31b9f3-c5a9-4aa5-bfe4-e3c43e1ac082",
      "name": "\ud83d\udd00 Merge: Templates + Conversations",
      "type": "n8n-nodes-base.merge",
      "position": [
        3792,
        416
      ],
      "parameters": {
        "numberInputs": 3
      },
      "typeVersion": 3.1
    },
    {
      "id": "9acf05f9-3b31-4e3c-9e64-a7cba15af2ce",
      "name": "\ud83d\udce6 Prepare AI Input Bundle",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        4112,
        432
      ],
      "parameters": {
        "options": {},
        "fieldsToAggregate": {
          "fieldToAggregate": [
            {
              "fieldToAggregate": "Prompt"
            },
            {
              "fieldToAggregate": "text"
            },
            {
              "fieldToAggregate": "Followup Message Direction"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "96e3fc4f-4547-4f22-b876-3828bec4c472",
      "name": "\ud83e\udd16 Re-engagement Email Drafter",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        4640,
        688
      ],
      "parameters": {
        "text": "=Prompt {{ $json.Prompt }}\n\nDirection of Message: {{ $('\ud83d\udce9 Fetch Followup Message Template').item.json['Followup Message Direction'] }}\n\nLast email conversations: {{ $json.text }}\n\nBased upon the conversation with the email \n{{ $('\ud83d\udccb Old Client Database').item.json[\"Email Address\"] }}\n, draft next email.\n\nInitial goal which client wanted to achieve:\n{{ $('\ud83d\udccb Old Client Database').item.json['The goal which client wanted to achieve by hiring an agency'] }}\n\nReason for ending: \n{{ $('\ud83d\udccb Old Client Database').item.json['Detailed Reason Why Contract Got Ended'] }}\n\nClient's industry: {{ $('\ud83d\udccb Old Client Database').item.json['Client is from Industry of'] }}\n\nIndustry Vertical: {{ $('\ud83d\udccb Old Client Database').item.json['Client\\'s Industry Vertical'] }}\n\nServices They Used: {{ $('\ud83d\udccb Old Client Database').item.json['Specific services they used'] }}",
        "options": {
          "systemMessage": "Draft an email based on the recent conversation done with the client convincing him that, we have now improved and help him achieve his goals."
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 1.9
    },
    {
      "id": "6a754e84-34b7-4e36-9eb0-cbac2c1cffca",
      "name": "\ud83e\udd16 Claude 3.7 Sonnet LLM",
      "type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
      "position": [
        4544,
        976
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "claude-3-7-sonnet-20250219",
          "cachedResultName": "Claude 3.7 Sonnet"
        },
        "options": {}
      },
      "typeVersion": 1.3
    },
    {
      "id": "0176734f-6361-4e74-875b-b702d5f7d833",
      "name": "\ud83d\udccb Email Structure Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        4704,
        976
      ],
      "parameters": {
        "schemaType": "manual",
        "inputSchema": "{\n\t\"type\": \"object\",\n\t\"properties\": {\n\t\t\"subject\": {\n\t\t\t\"type\": \"string\",\n\t\t\t\"description\": \"The email subject line\"\n\t\t},\n\t\t\"body\": {\n\t\t\t\"type\": \"object\",\n\t\t\t\"properties\": {\n\t\t\t\t\"greeting\": {\n\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\"description\": \"Email opening/greeting\"\n\t\t\t\t},\n\t\t\t\t\"content\": {\n\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\"description\": \"Main email message content\"\n\t\t\t\t},\n\t\t\t\t\"closing\": {\n\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\"description\": \"Email closing/signature\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\"content\"]\n\t\t}\n\t},\n\t\"required\": [\"subject\", \"body\"]\n}"
      },
      "typeVersion": 1.2
    },
    {
      "id": "159a92f3-08a2-4403-9ff6-2f0d8841883e",
      "name": "\ud83d\udce4 Send Re-engagement Email",
      "type": "n8n-nodes-base.gmail",
      "position": [
        4976,
        688
      ],
      "parameters": {
        "sendTo": "user@example.com",
        "message": "={{ $json.output.body.greeting }}\n\n{{ $json.output.body.content }}",
        "options": {
          "appendAttribution": false
        },
        "subject": "={{ $json.output.subject }}",
        "emailType": "text"
      },
      "typeVersion": 2.1
    },
    {
      "id": "622c4b53-1c73-480f-b646-eb402aadd9ca",
      "name": "\ud83d\udcca Update Email Count in Sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        5568,
        1072
      ],
      "parameters": {
        "columns": {
          "value": {
            "Email Address": "={{ $('\ud83d\udccb Old Client Database').item.json['Email Address'] }}",
            "Number of Emails Sent": "={{ (parseInt($('\ud83d\udccb Old Client Database').item.json['Number of Emails Sent']) || 0) + 1 }}"
          },
          "schema": [
            {
              "id": "Client Name",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Client Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Email Address",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Email Address",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Number of Emails Sent",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Number of Emails Sent",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Email Address"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID/edit#gid=0",
          "cachedResultName": "Database"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "YOUR_GOOGLE_SHEET_ID",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID/edit",
          "cachedResultName": "Old Client Outreach - AI"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "a18e1f37-35ca-47cc-b921-cbf0fba31436",
      "name": "\u23f1\ufe0f Rate Limit Wait (1 Min)",
      "type": "n8n-nodes-base.wait",
      "position": [
        5888,
        1072
      ],
      "parameters": {
        "unit": "minutes"
      },
      "typeVersion": 1.1
    },
    {
      "id": "6dd7b1b5-f7be-4f4a-99a1-b9cdfaa07e10",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -416,
        384
      ],
      "parameters": {
        "width": 512,
        "height": 816,
        "content": "## AI-Powered Old Client Re-engagement\n\n\nThis workflow automatically re-engages old clients by sending\npersonalized AI-written follow-up emails daily \u2014 based on past\nconversations, client industry, and situation-specific templates.\nIt skips clients who have already replied, avoiding spam and\nkeeping outreach professional.\n\n\n## \u2699\ufe0f How it works\n\n1. Schedule trigger runs the workflow daily\n2. Loads all old clients from Google Sheets database\n3. Loops through each client one by one\n4. Fetches the client's latest email from Gmail\n5. Checks if client replied in the last 30 days\n6. If replied \u2192 marks \"Reply Manually\" in sheet \u2192 skips to next client\n7. If no reply \u2192 marks \"Running\" and fetches templates + past conversations\n8. Merges follow-up template, situation prompt, and email history\n9. Claude 3.7 Sonnet drafts a personalized re-engagement email\n10. Email is sent via Gmail automatically\n11. Sheet updates email count, waits 1 min, then moves to next client\n\n## \ud83d\udee0\ufe0f Setup steps\n\n\u2610 Connect Google Sheets OAuth credentials\n\u2610 Connect Gmail OAuth credentials\n\u2610 Replace YOUR_GOOGLE_SHEET_ID with your actual Sheet ID\n\u2610 Replace YOUR_EMAIL@yourdomain.com in Send Email node\n\u2610 Add Anthropic API key for Claude 3.7 Sonnet model\n\u2610 Fill client data in \"Database\" sheet\n\u2610 Add follow-up templates in \"Follow-up Messages\" sheet\n\u2610 Add situation prompts in \"Situation\" sheet\n\u2610 Activate workflow\n"
      },
      "typeVersion": 1
    },
    {
      "id": "49884918-4cbd-4281-a96c-457f3a9ab533",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        144,
        496
      ],
      "parameters": {
        "color": 7,
        "width": 496,
        "height": 240,
        "content": "## 1. Trigger & Load Clients\n\nSchedule trigger fires daily and loads all client\nrecords from the \"Database\" sheet in Google Sheets.\n\nOnly rows where \"Manually Stop Workflow (STOP)\"\nis not triggered are fetched \u2014 giving you manual\noverride control directly from the sheet."
      },
      "typeVersion": 1
    },
    {
      "id": "625f29fd-68b8-42f6-9a65-364a8248b569",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        752,
        480
      ],
      "parameters": {
        "color": 7,
        "width": 384,
        "height": 256,
        "content": "## 2. Loop: Process Each Client\n\nSplits all loaded clients into individual items\nand processes them one by one in a loop.\n\n- Loop start: picks next client from the list\n- Loop end: returns here after each client is done\n- Stops automatically when all clients are processed"
      },
      "typeVersion": 1
    },
    {
      "id": "ff354ada-4d2e-4bed-ba8e-366d4714fcf0",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1200,
        480
      ],
      "parameters": {
        "color": 7,
        "width": 416,
        "height": 272,
        "content": "## 3. Check Latest Email from Client\n\nFetches the most recent email received from\nthe client's email address via Gmail.\n\nDate Checker then calculates:\n- Was the email received in the last 30 days?\n- How many days ago was it?\n- Formats the date as: DD-Mon-YYYY"
      },
      "typeVersion": 1
    },
    {
      "id": "4afd2a35-da26-4f23-8c8f-0f16394d97ee",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1712,
        480
      ],
      "parameters": {
        "color": 7,
        "width": 336,
        "height": 272,
        "content": "## 4. Route by Reply Status\n\nChecks the result from Date Checker:\n\n\u2705 Replied within 30 days\n\u2192 Route 0: Mark as \"Reply Manually\"\n\n\ud83d\udd01 No reply in last 30 days\n\u2192 Route 1: Continue with AI follow-up sequence"
      },
      "typeVersion": 1
    },
    {
      "id": "81db3afb-63cb-4dd1-bf93-cddb0689fbff",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1600,
        -112
      ],
      "parameters": {
        "color": 7,
        "width": 304,
        "content": "## 5. Client Replied \u2014 Skip\n\nSaves latest email and date in sheet.\nMarks status as \"Reply Manually\" and skips."
      },
      "typeVersion": 1
    },
    {
      "id": "7dbd2db3-69d2-4ae6-a0e8-e08496697608",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2784,
        80
      ],
      "parameters": {
        "color": 7,
        "width": 848,
        "height": 656,
        "content": "## 6. Fetch Templates & Conversations\n\nMarks client as \"Running\" in sheet.\nFetches follow-up template, situation prompt,\nand last 10 emails for AI context."
      },
      "typeVersion": 1
    },
    {
      "id": "6b4a4b93-f446-49ff-8198-b046436a668f",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3792,
        272
      ],
      "parameters": {
        "color": 7,
        "width": 416,
        "height": 208,
        "content": "## 7. Merge & Prepare AI Input\n\nCombines template, prompt, and email history\ninto one clean input for the AI agent."
      },
      "typeVersion": 1
    },
    {
      "id": "9465878c-7ac3-42db-bc39-06abf666b4ec",
      "name": "Sticky Note8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        4640,
        528
      ],
      "parameters": {
        "color": 7,
        "width": 432,
        "height": 208,
        "content": "## 8. AI Drafts & Sends Email\n\nClaude 3.7 writes a personalized re-engagement\nemail using past conversations and client context.\nValidates structure and sends via Gmail."
      },
      "typeVersion": 1
    },
    {
      "id": "9b9fdc90-4062-4409-90f3-1c084451f45c",
      "name": "Sticky Note9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        5568,
        944
      ],
      "parameters": {
        "color": 7,
        "width": 416,
        "height": 176,
        "content": "## 9. Update Count & Loop Back\n\nIncrements email count in sheet.\nWaits 1 min then loops to next client."
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "\ud83d\udccb Old Client Database": {
      "main": [
        [
          {
            "node": "\ud83d\udd04 Loop: Process Each Client",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u23f0 Daily Schedule Trigger": {
      "main": [
        [
          {
            "node": "\ud83d\udccb Old Client Database",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83e\udd16 Claude 3.7 Sonnet LLM": {
      "ai_languageModel": [
        [
          {
            "node": "\ud83e\udd16 Re-engagement Email Drafter",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udccb Email Structure Parser": {
      "ai_outputParser": [
        [
          {
            "node": "\ud83e\udd16 Re-engagement Email Drafter",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udce6 Prepare AI Input Bundle": {
      "main": [
        [
          {
            "node": "\ud83e\udd16 Re-engagement Email Drafter",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udce4 Send Re-engagement Email": {
      "main": [
        [
          {
            "node": "\ud83d\udcca Update Email Count in Sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u23f1\ufe0f Rate Limit Wait (1 Min)": {
      "main": [
        [
          {
            "node": "\ud83d\udd04 Loop: Process Each Client",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udd04 Loop: Process Each Client": {
      "main": [
        [],
        [
          {
            "node": "\ud83d\udce7 Fetch Client's Latest Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u2705 Update: Mark Running Status": {
      "main": [
        [
          {
            "node": "\ud83d\udcec Fetch 10 Email Conversations",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udce6 Bundle Email Conversations": {
      "main": [
        [
          {
            "node": "\ud83d\udd00 Merge: Templates + Conversations",
            "type": "main",
            "index": 2
          }
        ]
      ]
    },
    "\ud83d\udcca Update Email Count in Sheet": {
      "main": [
        [
          {
            "node": "\u23f1\ufe0f Rate Limit Wait (1 Min)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udcdd Update: Mark Reply Manually": {
      "main": [
        [
          {
            "node": "\ud83d\udd04 Loop: Process Each Client",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udce7 Fetch Client's Latest Email": {
      "main": [
        [
          {
            "node": "\ud83d\udcc5 Date Checker (30-Day Window)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83e\udd16 Re-engagement Email Drafter": {
      "main": [
        [
          {
            "node": "\ud83d\udce4 Send Re-engagement Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udcc2 Fetch Situation-Based Prompt": {
      "main": [
        [
          {
            "node": "\ud83d\udd00 Merge: Templates + Conversations",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "\ud83d\udcc5 Date Checker (30-Day Window)": {
      "main": [
        [
          {
            "node": "\ud83d\udd00 Route: Client Replied Recently?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udcec Fetch 10 Email Conversations": {
      "main": [
        [
          {
            "node": "\ud83d\udce6 Bundle Email Conversations",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udce9 Fetch Followup Message Template": {
      "main": [
        [
          {
            "node": "\ud83d\udd00 Merge: Templates + Conversations",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udd00 Route: Client Replied Recently?": {
      "main": [
        [
          {
            "node": "\ud83d\udcdd Update: Mark Reply Manually",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "\ud83d\udcc2 Fetch Situation-Based Prompt",
            "type": "main",
            "index": 0
          },
          {
            "node": "\ud83d\udce9 Fetch Followup Message Template",
            "type": "main",
            "index": 0
          },
          {
            "node": "\u2705 Update: Mark Running Status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udd00 Merge: Templates + Conversations": {
      "main": [
        [
          {
            "node": "\ud83d\udce6 Prepare AI Input Bundle",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Pro

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

About this workflow

Automatically re-engage old or inactive clients by sending AI-personalized follow-up emails using Claude 3.7 Sonnet, Gmail, and Google Sheets — with smart reply detection to avoid messaging clients who are already in active conversation.

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

More AI & RAG workflows → · Browse all categories →

Related workflows

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

AI & RAG

If you teach on Udemy at any meaningful scale, you already know the problem: 80% of student messages are variations of the same handful of questions, but every one of them needs a thoughtful reply to

N8N Nodes Globals, HTTP Request, Google Sheets +8
AI & RAG

This n8n automation workflow automates the creation, scripting, production, and posting of YouTube videos. It leverages AI (OpenAI), image generation (PIAPI), video rendering (Shotstack), and platform

Agent, OpenAI Chat, Airtable Tool +7
AI & RAG

Created by: Peyton Leveillee Last updated: October 2025

OpenAI Chat, Google Sheets, HTTP Request +5
AI & RAG

The Multi-Model Agency Content Engine is a high-performance editorial system designed for agencies. It solves the "blank page" problem by alternating between real-world social proof and strategic expe

Google Sheets, Gmail, Google Drive +6
AI & RAG

SEO Blog Article Generation Workflow. Uses outputParserStructured, httpRequest, agent, lmChatOpenAi. Scheduled trigger; 56 nodes.

Output Parser Structured, HTTP Request, Agent +4