AutomationFlowsEmail & Gmail › Recurring Special Day Email Sender

Recurring Special Day Email Sender

recurring-special-day-email-sender. Uses googleSheets, gmail. Scheduled trigger; 19 nodes.

Cron / scheduled trigger★★★★☆ complexity19 nodesGoogle SheetsGmail
Email & Gmail Trigger: Cron / scheduled Nodes: 19 Complexity: ★★★★☆ Added:

This workflow follows the Gmail → Google Sheets 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
{
  "active": true,
  "connections": {
    "Loop Over Items": {
      "main": [
        [],
        [
          {
            "node": "Today's Date",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If": {
      "main": [
        [
          {
            "node": "Get Emails",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Today's Date": {
      "main": [
        [
          {
            "node": "Matched Special Day",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Matched Special Day": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          },
          {
            "node": "If",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Special Day": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Emails": {
      "main": [
        [
          {
            "node": "Filter",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter": {
      "main": [
        [
          {
            "node": "Loop Over Items1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Items1": {
      "main": [
        [],
        [
          {
            "node": "Replace Variables and Generate Signatured Body",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Replace Variables and Generate Signatured Body": {
      "main": [
        [
          {
            "node": "Include CC and BCC Emails",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Include CC and BCC Emails": {
      "main": [
        [
          {
            "node": "Send a message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send a message": {
      "main": [
        [
          {
            "node": "New Sent CampaignID",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update row in sheet": {
      "main": [
        [
          {
            "node": "Wait",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait": {
      "main": [
        [
          {
            "node": "CampaignID",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Get Special Day",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code in JavaScript1": {
      "main": [
        [
          {
            "node": "Append or update row in sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get row(s) in sheet2": {
      "main": [
        [
          {
            "node": "Code in JavaScript1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Append or update row in sheet": {
      "main": [
        [
          {
            "node": "Loop Over Items1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "New Sent CampaignID": {
      "main": [
        [
          {
            "node": "Update row in sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "CampaignID": {
      "main": [
        [
          {
            "node": "Get row(s) in sheet2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "createdAt": "2025-11-09T20:41:37.026Z",
  "id": "yrJyAqBn3dOnStcZ",
  "isArchived": false,
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "recurring-special-day-email-sender",
  "nodes": [
    {
      "parameters": {
        "options": {}
      },
      "type": "n8n-nodes-base.splitInBatches",
      "typeVersion": 3,
      "position": [
        -1072,
        -320
      ],
      "id": "8eee4aad-70b0-478c-bb61-e7646d272b96",
      "name": "Loop Over Items"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "deb65b10-9246-47b2-a59f-16b5a94afd4f",
              "leftValue": "={{ $json.isMatchedDay }}",
              "rightValue": "",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            },
            {
              "id": "94c7e0c5-3056-473f-b624-a76d727f12ba",
              "leftValue": "={{ $json.special_day_id }}",
              "rightValue": "",
              "operator": {
                "type": "number",
                "operation": "exists",
                "singleValue": true
              }
            },
            {
              "id": "4631c8f4-aa70-49c8-8e13-8c30b67bdefd",
              "leftValue": "={{ $json.is_recurring }}",
              "rightValue": "=true",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        -400,
        -320
      ],
      "id": "5bed383f-0d88-445a-9760-095dedec66b8",
      "name": "If",
      "retryOnFail": false,
      "alwaysOutputData": false,
      "onError": "continueRegularOutput"
    },
    {
      "parameters": {
        "jsCode": "// Function node\nconst now = new Date();\n\nconst formatter = new Intl.DateTimeFormat('tr-TR', {\n  timeZone: 'Europe/Istanbul',\n  day: '2-digit',\n  month: '2-digit',\n  year: 'numeric',\n});\n\nconst formatted = formatter.format(now);\n\nreturn [\n  {\n    json: {\n      date: formatted, // 16.11.2025\n    },\n  },\n];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -848,
        -384
      ],
      "id": "186cd8a3-1a00-407d-930f-b81f68e464c8",
      "name": "Today's Date"
    },
    {
      "parameters": {
        "jsCode": "// Function node\nconst currentDate = $input.first().json.date;\nconst itemDate = $('Loop Over Items').first().json.recurring_dates;\nconst itemIsActive = $('Loop Over Items').first().json.is_active;\n\nif (itemDate.trim().toString().includes(currentDate.toString().trim()) && itemIsActive) {\n  return [\n    {\n      json: {\n        isMatchedDay: true,\n        special_day_id: $('Loop Over Items').first().json.special_day_id,\n        email_title: $('Loop Over Items').first().json.email_title,\n        email_body: $('Loop Over Items').first().json.email_body,\n        email_signature: $('Loop Over Items').first().json.email_signature,\n        CC: $('Loop Over Items').first().json.CC,\n        BCC: $('Loop Over Items').first().json.BCC,\n        is_active: $('Loop Over Items').first().json.is_active,\n        is_recurring: $('Loop Over Items').first().json.is_recurring,\n        recurring_dates: $('Loop Over Items').first().json.recurring_dates,\n        recurring_type: $('Loop Over Items').first().json.recurring_type,\n        today: $input.first().json.date\n      },\n    },\n  ];\n}\n\nreturn [\n  {\n    json: {\n      isMatchedDay: false,\n      itemDate: itemDate,\n      currentDate: currentDate,\n    },\n  },\n];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -624,
        -320
      ],
      "id": "8a0223dc-cfd9-4c9c-ad10-bd88093e97ed",
      "name": "Matched Special Day"
    },
    {
      "parameters": {
        "documentId": {
          "__rl": true,
          "value": "1Ec_vpDTgdcZqVfqp6fBseSXPEv83VZu5x6gcaudEDaI",
          "mode": "list",
          "cachedResultName": "customer-base-special-day",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Ec_vpDTgdcZqVfqp6fBseSXPEv83VZu5x6gcaudEDaI/edit?usp=drivesdk"
        },
        "sheetName": {
          "__rl": true,
          "value": 580760091,
          "mode": "list",
          "cachedResultName": "special-days",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Ec_vpDTgdcZqVfqp6fBseSXPEv83VZu5x6gcaudEDaI/edit#gid=580760091"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.7,
      "position": [
        -1296,
        -320
      ],
      "id": "41a1ef57-9cd3-4c6a-bc4d-9c0ae6a79372",
      "name": "Get Special Day",
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "documentId": {
          "__rl": true,
          "value": "1Ec_vpDTgdcZqVfqp6fBseSXPEv83VZu5x6gcaudEDaI",
          "mode": "list",
          "cachedResultName": "customer-base-special-day",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Ec_vpDTgdcZqVfqp6fBseSXPEv83VZu5x6gcaudEDaI/edit?usp=drivesdk"
        },
        "sheetName": {
          "__rl": true,
          "value": "gid=0",
          "mode": "list",
          "cachedResultName": "main",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Ec_vpDTgdcZqVfqp6fBseSXPEv83VZu5x6gcaudEDaI/edit#gid=0"
        },
        "filtersUI": {
          "values": [
            {
              "lookupColumn": "Field1",
              "lookupValue": "={{ $('Get Special Day').item.json.Field1 }}"
            },
            {
              "lookupColumn": "Field2",
              "lookupValue": "={{ $('Get Special Day').item.json.Field2 }}"
            },
            {
              "lookupColumn": "Field3",
              "lookupValue": "={{ $('Get Special Day').item.json.Field3 }}"
            },
            {
              "lookupColumn": "Field4",
              "lookupValue": "={{ $('Get Special Day').item.json.Field4 }}"
            },
            {
              "lookupColumn": "Field5",
              "lookupValue": "={{ $('Get Special Day').item.json.Field5 }}"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.7,
      "position": [
        -160,
        -416
      ],
      "id": "b7a4012b-c55b-4295-8904-ed022c056388",
      "name": "Get Emails",
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "loose",
            "version": 2
          },
          "conditions": [
            {
              "id": "8ef4b581-b8a6-433e-85c8-488dc0d993f5",
              "leftValue": "={{ $json['Sent Recurring Campaign IDs'] }}",
              "rightValue": "={{ $('If').item.json.special_day_id + \"-\" +$('If').item.json.today  }}",
              "operator": {
                "type": "string",
                "operation": "notContains"
              }
            }
          ],
          "combinator": "and"
        },
        "looseTypeValidation": true,
        "options": {}
      },
      "type": "n8n-nodes-base.filter",
      "typeVersion": 2.2,
      "position": [
        48,
        -320
      ],
      "id": "db29eaa1-c65b-4c78-8d55-91183148c87b",
      "name": "Filter"
    },
    {
      "parameters": {
        "options": {}
      },
      "type": "n8n-nodes-base.splitInBatches",
      "typeVersion": 3,
      "position": [
        272,
        -320
      ],
      "id": "3802c86e-d650-488a-b990-7cb056a0c161",
      "name": "Loop Over Items1"
    },
    {
      "parameters": {
        "jsCode": "// De\u011ferleri bir \u00f6nceki node'dan al (\u00f6rnek node ad\u0131: \"Get Data\")\nconst name = $input.first().json.Name || \"\";\n\n// Mail g\u00f6vdesi (\u00f6rnek)\nlet mailBody = $('If').first().json.email_body;\n\n// \u0130mza (\u00f6rnek)\nlet signature = $('If').first().json.email_signature;\n\n// De\u011fi\u015fkenleri mailBody'de de\u011fi\u015ftir\nmailBody = mailBody\n  .replace(/{{name}}/g, name);\n\n// G\u00f6vde ve imzay\u0131 alt alta birle\u015ftir\nconst fullBody = `${mailBody}\\n\\n${signature}`;\n\nreturn [\n  {\n    json: {\n      name,\n      fullBody\n    }\n  }\n];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        528,
        -384
      ],
      "id": "5dfdf92d-3c06-419d-9576-c0147b12273b",
      "name": "Replace Variables and Generate Signatured Body"
    },
    {
      "parameters": {
        "jsCode": "// \"Get Settings\" node'undan al\nconst CC_raw  = $('If').first().json.CC\nconst BCC_raw = $('If').first().json.BCC;\n\nfunction toCommaString(input) {\n  let arr = [];\n\n  // 1) Dizi ise direkt kullan\n  if (Array.isArray(input)) {\n    arr = input;\n  } else if (typeof input === 'string') {\n    const s = input.trim();\n\n    // 2) Stringle\u015ftirilmi\u015f JSON dizi mi? => parse et\n    if ((s.startsWith('[') && s.endsWith(']')) || (s.startsWith('[\"') && s.endsWith('\"]'))) {\n      try {\n        const parsed = JSON.parse(s);\n        if (Array.isArray(parsed)) arr = parsed;\n        else arr = [s];\n      } catch {\n        // JSON parse ba\u015far\u0131s\u0131zsa CSV gibi b\u00f6l\n        arr = s.split(/[,\\s;]+/);\n      }\n    } else {\n      // 3) Normal CSV / bo\u015fluk / ; ile b\u00f6l\n      arr = s.split(/[,\\s;]+/);\n    }\n  } else if (input == null) {\n    arr = [];\n  } else {\n    arr = [String(input)];\n  }\n\n  // 4) Her bir girdiden email'i \u00e7\u0131kar (Name <mail@host> format\u0131n\u0131 da destekler)\n  const emails = arr\n    .map(v => String(v).trim())\n    .map(v => {\n      // <mail@host> varsa i\u00e7ini al\n      const mAngle = v.match(/<([^>]+)>/);\n      if (mAngle) return mAngle[1].trim();\n      return v.replace(/^\"+|\"+$/g, ''); // \u00e7evredeki \u00e7ift t\u0131rnaklar\u0131 temizle\n    })\n    // basit e-posta regex do\u011frulamas\u0131\n    .map(v => {\n      const m = v.match(/([A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,})/i);\n      return m ? m[1] : '';\n    })\n    .filter(Boolean);\n\n  // 5) Tekrars\u0131zla\u015ft\u0131r + virg\u00fcl ile ve BO\u015eLUKSUZ birle\u015ftir\n  const unique = Array.from(new Set(emails));\n  return unique.join(',');\n}\n\nconst CC  = toCommaString(CC_raw);\nconst BCC = toCommaString(BCC_raw);\n\nreturn [{ json: { CC, BCC } }];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        720,
        -384
      ],
      "id": "58384ed9-6edf-4e89-8041-371a5d1fdea5",
      "name": "Include CC and BCC Emails",
      "onError": "continueRegularOutput"
    },
    {
      "parameters": {
        "sendTo": "={{ $('Loop Over Items1').item.json['Email Address '] }}",
        "subject": "={{ $('If').item.json.email_title }}",
        "message": "={{ $('Replace Variables and Generate Signatured Body').item.json.fullBody }}",
        "options": {}
      },
      "type": "n8n-nodes-base.gmail",
      "typeVersion": 2.1,
      "position": [
        944,
        -384
      ],
      "id": "db985e94-5116-4b0b-b9c1-5133b0d05a4e",
      "name": "Send a message",
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "operation": "update",
        "documentId": {
          "__rl": true,
          "value": "1Ec_vpDTgdcZqVfqp6fBseSXPEv83VZu5x6gcaudEDaI",
          "mode": "list",
          "cachedResultName": "customer-base-special-day",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Ec_vpDTgdcZqVfqp6fBseSXPEv83VZu5x6gcaudEDaI/edit?usp=drivesdk"
        },
        "sheetName": {
          "__rl": true,
          "value": "gid=0",
          "mode": "list",
          "cachedResultName": "main",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Ec_vpDTgdcZqVfqp6fBseSXPEv83VZu5x6gcaudEDaI/edit#gid=0"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "Email Address ": "={{ $('Loop Over Items1').item.json['Email Address '] }}",
            "Sent Recurring Campaign IDs": "={{ $json['New Sent Campaign IDs'] }}"
          },
          "matchingColumns": [
            "Email Address "
          ],
          "schema": [
            {
              "id": "Name",
              "displayName": "Name",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Email Address ",
              "displayName": "Email Address ",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "Sender Email",
              "displayName": "Sender Email",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Interaction Count",
              "displayName": "Interaction Count",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Sent Campaign IDs",
              "displayName": "Sent Campaign IDs",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Sent Recurring Campaign IDs",
              "displayName": "Sent Recurring Campaign IDs",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "row_number",
              "displayName": "row_number",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "number",
              "canBeUsedToMatch": true,
              "readOnly": true,
              "removed": true
            }
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {}
      },
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.7,
      "position": [
        1392,
        -384
      ],
      "id": "6de8d76b-aa14-4942-be1e-e9b6766f45e2",
      "name": "Update row in sheet",
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {},
      "type": "n8n-nodes-base.wait",
      "typeVersion": 1.1,
      "position": [
        1632,
        -304
      ],
      "id": "6f719eb2-ca6a-42e9-b21a-be6ed3739048",
      "name": "Wait"
    },
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "hours"
            }
          ]
        }
      },
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.2,
      "position": [
        -1520,
        -320
      ],
      "id": "23dcdfb3-e622-4912-915b-d1c001145798",
      "name": "Schedule Trigger"
    },
    {
      "parameters": {
        "jsCode": "// Function\nconst n =  $input.first().json.sent_count || 0; // \u00f6rn: 5\nconst inc = Number(n) + 1;\n\nreturn [\n  {\n    json: {\n      number: inc,\n    },\n  },\n];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1232,
        -64
      ],
      "id": "490c27ae-678c-4bf3-bbcc-be12cd67990c",
      "name": "Code in JavaScript1"
    },
    {
      "parameters": {
        "documentId": {
          "__rl": true,
          "value": "1Ec_vpDTgdcZqVfqp6fBseSXPEv83VZu5x6gcaudEDaI",
          "mode": "list",
          "cachedResultName": "customer-base-special-day",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Ec_vpDTgdcZqVfqp6fBseSXPEv83VZu5x6gcaudEDaI/edit?usp=drivesdk"
        },
        "sheetName": {
          "__rl": true,
          "value": 8709831,
          "mode": "list",
          "cachedResultName": "sent-campaigns",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Ec_vpDTgdcZqVfqp6fBseSXPEv83VZu5x6gcaudEDaI/edit#gid=8709831"
        },
        "filtersUI": {
          "values": [
            {
              "lookupColumn": "special_day_id",
              "lookupValue": "={{ $json.CampaignIDtoLOG }}"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.7,
      "position": [
        992,
        -64
      ],
      "id": "394bc0be-64ac-40a8-94a3-5ae8cb67ccd4",
      "name": "Get row(s) in sheet2",
      "alwaysOutputData": true,
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "operation": "appendOrUpdate",
        "documentId": {
          "__rl": true,
          "value": "1Ec_vpDTgdcZqVfqp6fBseSXPEv83VZu5x6gcaudEDaI",
          "mode": "list",
          "cachedResultName": "customer-base-special-day",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Ec_vpDTgdcZqVfqp6fBseSXPEv83VZu5x6gcaudEDaI/edit?usp=drivesdk"
        },
        "sheetName": {
          "__rl": true,
          "value": 8709831,
          "mode": "list",
          "cachedResultName": "sent-campaigns",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Ec_vpDTgdcZqVfqp6fBseSXPEv83VZu5x6gcaudEDaI/edit#gid=8709831"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "special_day_id": "={{ $('CampaignID').item.json.CampaignIDtoLOG }}",
            "sent_count": "={{ $json.number }}",
            "sent_date": "={{ $('Today\\'s Date').item.json.date }}",
            "Field5": "={{ $('Get Special Day').item.json.Field5 }}",
            "Field4": "={{ $('Get Special Day').item.json.Field4 }}",
            "Field3": "={{ $('Get Special Day').item.json.Field3 }}",
            "Field2": "={{ $('Get Special Day').item.json.Field2 }}",
            "Field1": "={{ $('Get Special Day').item.json.Field1 }}",
            "email_body": "={{ $('Replace Variables and Generate Signatured Body').item.json.fullBody }}",
            "email_title": "={{ $('Get Special Day').item.json.email_title }}",
            "recurring_type": "={{ $('Get Special Day').item.json.recurring_type }}",
            "icon": "={{ $('Get Special Day').item.json.icon }}",
            "description": "={{ $('Get Special Day').item.json.description }}",
            "title": "={{ $('Get Special Day').item.json.title }}",
            "BCC": "={{ $('Get Special Day').item.json.BCC }}",
            "CC": "={{ $('Get Special Day').item.json.CC }}",
            "email_signature": "={{ $('Get Special Day').item.json.email_signature }}"
          },
          "matchingColumns": [
            "special_day_id"
          ],
          "schema": [
            {
              "id": "special_day_id",
              "displayName": "special_day_id",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "sent_count",
              "displayName": "sent_count",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "sent_date",
              "displayName": "sent_date",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "title",
              "displayName": "title",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "icon",
              "displayName": "icon",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "description",
              "displayName": "description",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "recurring_type",
              "displayName": "recurring_type",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "is_active",
              "displayName": "is_active",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "email_title",
              "displayName": "email_title",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "email_body",
              "displayName": "email_body",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "email_signature",
              "displayName": "email_signature",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "CC",
              "displayName": "CC",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "BCC",
              "displayName": "BCC",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Field1",
              "displayName": "Field1",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Field2",
              "displayName": "Field2",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Field3",
              "displayName": "Field3",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Field4",
              "displayName": "Field4",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Field5",
              "displayName": "Field5",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "row_number",
              "displayName": "row_number",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "number",
              "canBeUsedToMatch": true,
              "readOnly": true,
              "removed": true
            }
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {}
      },
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.7,
      "position": [
        1472,
        -64
      ],
      "id": "6c70fc76-6a7a-4b9d-9166-bf47f2bfe6ee",
      "name": "Append or update row in sheet",
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "// Function node\n\n// Buray\u0131 sen doldur: ba\u015fka bir nodelen geliyorsa expression yapabilirsin\nlet newCampaignId = $('If').first().json.special_day_id || '12345';\nnewCampaignId = newCampaignId + \"-\" + $('If').first().json.today\n\nconst current = $('Loop Over Items1').first().json['Sent Recurring Campaign IDs'];\n\nlet updated;\n\nupdated = current + '#' + newCampaignId;\n\n// Bu node'dan d\u00f6nen veri\nreturn [\n  {\n    json: {\n      'New Sent Campaign IDs': updated,\n    },\n  },\n];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1168,
        -384
      ],
      "id": "6c3867b8-1457-48bc-8372-d2a2c4dca7ac",
      "name": "New Sent CampaignID"
    },
    {
      "parameters": {
        "jsCode": "\nconst today = $('Today\\'s Date').first().json.date;\nconst special_day_id = $('If').first().json.special_day_id;\nlet updated;\n\n\nupdated = special_day_id + '-' + today;\n\n// Bu node'dan d\u00f6nen veri\nreturn [\n  {\n    json: {\n      'CampaignIDtoLOG': updated,\n    },\n  },\n];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1840,
        -304
      ],
      "id": "04294079-fa95-4db9-9080-b74ceefceb94",
      "name": "CampaignID"
    }
  ],
  "origin": "n8n",
  "repo": {
    "owner": "octaworksofficial",
    "name": "n8n"
  },
  "settings": {
    "executionOrder": "v1"
  },
  "shared": [
    {
      "createdAt": "2025-11-09T20:41:37.034Z",
      "updatedAt": "2025-11-09T20:41:37.034Z",
      "role": "workflow:owner",
      "workflowId": "yrJyAqBn3dOnStcZ",
      "projectId": "1jTilK588wM2KuJy"
    }
  ],
  "staticData": {
    "node:Schedule Trigger": {
      "recurrenceRules": []
    }
  },
  "tags": [],
  "triggerCount": 1,
  "updatedAt": "2025-11-10T12:03:06.000Z",
  "versionId": "f87873d9-5397-450f-a123-fd7bd5a0742b"
}

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

recurring-special-day-email-sender. Uses googleSheets, gmail. Scheduled trigger; 19 nodes.

Source: https://github.com/octaworksofficial/n8n/blob/20a248338297da94c67a12b0db3035f88d91a82f/yrJyAqBn3dOnStcZ.json — original creator credit. Request a take-down →

More Email & Gmail workflows → · Browse all categories →

Related workflows

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

Email & Gmail

YOUR_ID 4. Uses gmail, googleDrive, googleSheets, httpRequest. Scheduled trigger; 53 nodes.

Gmail, Google Drive, Google Sheets +1
Email & Gmail

Looking for a way to track GitHub bounty issues automatically and get notified in real time? This GitHub Bounty Tracker workflow monitors repositories for issues labeled 💎 Bounty, logs them in Google

Google Sheets, HTTP Request, WhatsApp +1
Email & Gmail

This workflow automatically sends a beautifully designed HTML newsletter every Sunday at 8 AM, featuring products currently on sale from your Algolia-powered e-commerce store.

Google Sheets, HTTP Request, Gmail
Email & Gmail

This n8n template demonstrates how to build a Auto Lead Gen & Outreach System for Local Businesses specifically designed to help businesses that don’t have a website yet.

Google Sheets, HTTP Request, Google Drive +1
Email & Gmail

The workflow is triggered automatically every day at 12:00 PM using a Cron node.

RSS Feed Read, Google Sheets, Gmail +1