Automatic birthday emails

Customers or team members get a warm birthday email on their day.

Easy Saves ~2 hours/month MarketingBy Flowngn team

Works with n8n · Make · Zapier

How it works

Trigger: Schedule — every day at 9:00
  1. Read your contacts sheet (name, email, birthday).
  2. Keep the people whose birthday is today.
  3. Send each one a personal birthday email.

Diagram

Every day 9:00Schedule TriggerGRead contactsGoogle Sheets{ }Birthdays todayCodeGSend birthday emailGmail
Trigger App Code

Code

JavaScript used in the Code step — already included in the template below.

Birthdays today · Code node
// Contacts sheet columns: name | email | birthday (YYYY-MM-DD)
// Keeps people whose birthday (day + month) is today.
const today = new Date();
const mmdd = `${String(today.getMonth() + 1).padStart(2, "0")}-${String(today.getDate()).padStart(2, "0")}`;

return $input.all()
  .map((item) => item.json)
  .filter((p) => p.email && String(p.birthday).slice(5, 10) === mmdd)
  .map((p) => ({ json: { name: String(p.name).split(" ")[0], email: p.email } }));

Build it

Pick your tool — same automation, step by step.

Copy and paste straight into an n8n canvas (Ctrl+V), or download and use Import from File. Then connect your own credentials and replace every YOUR_… placeholder.

Workflow JSON
Show code (138 lines)
{
  "name": "Automatic birthday emails (Flowngn)",
  "nodes": [
    {
      "parameters": {
        "content": "## Automatic birthday emails\nCustomers or team members get a warm birthday email on their day.\n\n**Setup**\n1. Open each node and connect your own credentials.\n2. Replace every YOUR_… placeholder.\n3. Test once, then activate.\n\nFree template from Flowngn",
        "height": 260,
        "width": 340
      },
      "id": "2c527cac-899b-4e84-aed5-20e53f8aab89",
      "name": "Setup notes",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -420,
        -60
      ]
    },
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "triggerAtHour": 9
            }
          ]
        }
      },
      "id": "2c527cac-899b-4e84-aed5-20e53f8aab89",
      "name": "Every day 9:00",
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.2,
      "position": [
        0,
        0
      ]
    },
    {
      "parameters": {
        "operation": "read",
        "documentId": {
          "__rl": true,
          "value": "YOUR_SPREADSHEET_ID",
          "mode": "id"
        },
        "sheetName": {
          "__rl": true,
          "value": "Contacts",
          "mode": "name"
        },
        "options": {}
      },
      "id": "2c527cac-899b-4e84-aed5-20e53f8aab89",
      "name": "Read contacts",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.5,
      "position": [
        300,
        0
      ]
    },
    {
      "parameters": {
        "jsCode": "// Contacts sheet columns: name | email | birthday (YYYY-MM-DD)\n// Keeps people whose birthday (day + month) is today.\nconst today = new Date();\nconst mmdd = `${String(today.getMonth() + 1).padStart(2, \"0\")}-${String(today.getDate()).padStart(2, \"0\")}`;\n\nreturn $input.all()\n  .map((item) => item.json)\n  .filter((p) => p.email && String(p.birthday).slice(5, 10) === mmdd)\n  .map((p) => ({ json: { name: String(p.name).split(\" \")[0], email: p.email } }));"
      },
      "id": "2c527cac-899b-4e84-aed5-20e53f8aab89",
      "name": "Birthdays today",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        600,
        0
      ]
    },
    {
      "parameters": {
        "sendTo": "={{ $json.email }}",
        "subject": "=Happy birthday, {{ $json.name }}! 🎂",
        "emailType": "text",
        "message": "=Hi {{ $json.name }},\n\nEveryone at YOUR_BUSINESS wishes you a wonderful birthday! 🎉\n\nYOUR_NAME",
        "options": {
          "appendAttribution": false
        }
      },
      "id": "2c527cac-899b-4e84-aed5-20e53f8aab89",
      "name": "Send birthday email",
      "type": "n8n-nodes-base.gmail",
      "typeVersion": 2.1,
      "position": [
        900,
        0
      ]
    }
  ],
  "connections": {
    "Every day 9:00": {
      "main": [
        [
          {
            "node": "Read contacts",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Read contacts": {
      "main": [
        [
          {
            "node": "Birthdays today",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Birthdays today": {
      "main": [
        [
          {
            "node": "Send birthday email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "meta": {
    "templateCredsSetupCompleted": false
  },
  "tags": []
}

Open in the playground to edit →

Tips

  • Add a discount code to the email for customers — it drives repeat visits.

Related flows