AutomationFlowsSlack & Telegram › Birthday and Ephemeris Notification (google Contact, Telegram & Home Assistant)

Birthday and Ephemeris Notification (google Contact, Telegram & Home Assistant)

ByThibaud @tderouze on n8n.io

How it works: Schedule Trigger on a daily basis (configured at 7.30 am) Connects Google Contacts to get personal information from them Field Checker on birthday date & firstnames. And see if there is any celebration for today Send a Telegram Notification and display the message…

Cron / scheduled trigger★★★★☆ complexity26 nodesGoogle ContactsHTTP RequestTelegramHome Assistant
Slack & Telegram Trigger: Cron / scheduled Nodes: 26 Complexity: ★★★★☆ Added:
Birthday and Ephemeris Notification (google Contact, Telegram & Home Assistant) — n8n workflow card showing Google Contacts, HTTP Request, Telegram integration

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

This workflow follows the HTTP Request → Telegram 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
{
  "id": "y76cTME4BEhw95mU",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Birthday and Ephemeris Notification (Google Contact, Telegram & Home Assistant)",
  "tags": [
    {
      "id": "TwicI38nhopsenFM",
      "name": "tutorial",
      "createdAt": "2025-05-01T16:25:25.881Z",
      "updatedAt": "2025-05-01T16:25:25.881Z"
    }
  ],
  "nodes": [
    {
      "id": "a2f6a1b1-07e7-4ea8-8c44-507e4a4ce8d7",
      "name": "Google Contacts",
      "type": "n8n-nodes-base.googleContacts",
      "position": [
        500,
        -420
      ],
      "parameters": {
        "fields": [
          "birthdays",
          "names"
        ],
        "options": {},
        "rawData": true,
        "operation": "getAll",
        "returnAll": true
      },
      "credentials": {
        "googleContactsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "448e68ee-81e5-4487-b023-0aeb7666009d",
      "name": "Get One first name list",
      "type": "n8n-nodes-base.set",
      "position": [
        940,
        -220
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "a14c29b7-0902-4184-987d-2c367dbcd257",
              "name": "pr\u00e9noms",
              "type": "string",
              "value": "={{ Array.from(new Set([...( $json.name || [] ), ...( $json.givenName || [] )])) }}\n"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "de0a4d55-7bd7-4d24-97a0-593442472a57",
      "name": "First names",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        720,
        -220
      ],
      "parameters": {
        "options": {},
        "fieldsToAggregate": {
          "fieldToAggregate": [
            {
              "fieldToAggregate": "names[0].givenName"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "a8ee01f9-05d6-4589-b399-a0ff141995ec",
      "name": "Nominis - Saints du jour",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        720,
        40
      ],
      "parameters": {
        "url": "={{ $json.URL }}",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "4c6c0726-187f-4697-b935-a93e68e7e9d2",
      "name": "Combine Firstname & Saints",
      "type": "n8n-nodes-base.merge",
      "position": [
        1160,
        -220
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineAll"
      },
      "typeVersion": 3
    },
    {
      "id": "61384cde-744a-4091-b639-dfbb9e801026",
      "name": "No Saint Today ?",
      "type": "n8n-nodes-base.if",
      "position": [
        1600,
        -220
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "91fd004e-ac14-4957-b3eb-aeb08ddcb90f",
              "operator": {
                "type": "boolean",
                "operation": "false",
                "singleValue": true
              },
              "leftValue": "={{ $json.hasMatch }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "36836914-c1c0-45e4-8e40-e95255af0c04",
      "name": "Compose Message",
      "type": "n8n-nodes-base.set",
      "position": [
        2620,
        -400
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "00b2965c-a9c8-45ea-8dff-b241517aa474",
              "name": "message",
              "type": "string",
              "value": "=Nous sommes le {{ $('Set Date Offset').item.json.date.toDateTime().setLocale('fr').format('dd LLL yyyy') }}:\n{{ $json.Birthday }}{{ $json.fete }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "1c3eecb1-5623-4f0d-b361-9b1f0f520c40",
      "name": "Single list Birthday",
      "type": "n8n-nodes-base.set",
      "position": [
        1160,
        -620
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "7a8cde23-384d-41b1-bda8-4fb954f1ded9",
              "name": "anniversary",
              "type": "array",
              "value": "={{ [].concat($json.displayName || [], $json.name || []) }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "8417f6b0-1174-48ae-81a0-367a95eb9f71",
      "name": "Get Nominis URL",
      "type": "n8n-nodes-base.set",
      "position": [
        500,
        40
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "d5a204e9-b6b4-46d7-8e10-43b272c3df27",
              "name": "URL",
              "type": "string",
              "value": "=https://nominis.cef.fr/json/nominis.php?jour={{ $json.date.slice(8,10) }}&mois={{ $json.date.slice(5,7) }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "ae03ca3a-b89e-461d-9fee-8fa5e0835ff6",
      "name": "Sent Telegram Message",
      "type": "n8n-nodes-base.telegram",
      "position": [
        2840,
        -300
      ],
      "parameters": {
        "text": "={{ $json.message }}",
        "chatId": "Enter ID here",
        "additionalFields": {
          "appendAttribution": false
        }
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "72561cef-18c0-42bb-aeba-5a0c9edebbb2",
      "name": "Birthday Today?",
      "type": "n8n-nodes-base.if",
      "position": [
        720,
        -520
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "91fd004e-ac14-4957-b3eb-aeb08ddcb90f",
              "operator": {
                "type": "number",
                "operation": "equals"
              },
              "leftValue": "={{ $json.birthdays[0].date.month }}",
              "rightValue": "={{ $('Set Date Offset').item.json.date.toDateTime().month }}"
            },
            {
              "id": "e22d0adc-27bc-4806-a8eb-882a324de2e3",
              "operator": {
                "type": "number",
                "operation": "equals"
              },
              "leftValue": "={{ $json.birthdays[0].date.day }}",
              "rightValue": "={{ $('Set Date Offset').item.json.date.toDateTime().day }}"
            },
            {
              "id": "de6faccb-3dc9-46a5-9b9f-2dcd67323003",
              "operator": {
                "name": "filter.operator.equals",
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "73b23829-3de7-4ce1-af1a-3c0d3d7b8d47",
      "name": "Set Date Offset",
      "type": "n8n-nodes-base.set",
      "position": [
        180,
        -200
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "c9683414-7c6c-434e-952d-fa7e6fb1d89d",
              "name": "date",
              "type": "string",
              "value": "={{ $today.plus({days:3}) }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "af033f75-db4f-4bdc-b2ea-fb5a9d226165",
      "name": "Everyday at 7am",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -40,
        -200
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "cronExpression",
              "expression": "30 7 * * *"
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "18992707-c7f8-471c-81c3-10c0c1c7562e",
      "name": "List of Saints of the day",
      "type": "n8n-nodes-base.set",
      "position": [
        940,
        40
      ],
      "parameters": {
        "options": {
          "ignoreConversionErrors": true
        },
        "assignments": {
          "assignments": [
            {
              "id": "94478a1c-c75f-4e42-911d-53873b8a157a",
              "name": "Saints",
              "type": "array",
              "value": "={{ Array.from(new Set([...Object.keys($json.response.prenoms.majeurs), ...Object.keys($json.response.prenoms.derives)])) }}\n"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "0446428f-678c-4798-84a1-17a4cfdc5615",
      "name": "Check if any firstname match a Saints of the day",
      "type": "n8n-nodes-base.code",
      "position": [
        1380,
        -220
      ],
      "parameters": {
        "jsCode": "// Helper function to remove accents and convert to lowercase\nfunction normalizeString(str) {\n  str\n    .normalize(\"NFD\")                  // Decompose accented characters\n    .replace(/[\\u0300-\\u036f]/g, \"\")   // Remove diacritics\n    .toLowerCase();                    // Convert to lowercase\n  return str.charAt(0).toUpperCase() + str.slice(1)\n}\n\nconst saints = $json[\"Saints\"]\n  .split(',')\n  .map(s => normalizeString(s.trim()))\n  .filter(s => s.length > 0);\n\nconst givenNames = $json[\"pr\u00e9noms\"]\n  .split(',')\n  .map(s => normalizeString(s.trim()))\n  .filter(s => s.length > 0);\n\nconst matches = saints.filter(name => givenNames.includes(name));\nreturn [{ json: { matches, hasMatch: matches.length > 0 } }];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "8ae56325-b16b-4222-b14b-6631da56eba5",
      "name": "Aggregate Birthdays",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        940,
        -620
      ],
      "parameters": {
        "options": {},
        "fieldsToAggregate": {
          "fieldToAggregate": [
            {
              "fieldToAggregate": "names[0].displayName"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "8ebf2870-feab-4ed9-bc18-2e1bd46cf0c6",
      "name": "Aggregate No Birthday",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        940,
        -420
      ],
      "parameters": {
        "options": {},
        "fieldsToAggregate": {
          "fieldToAggregate": [
            {
              "fieldToAggregate": "name"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "a66b44d7-6fee-4480-b2e7-dbf862c27d9b",
      "name": "\"Bonne f\u00eate\" celebration message",
      "type": "n8n-nodes-base.set",
      "position": [
        1960,
        -300
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "3b11dc8e-7905-4358-af6b-767550f79b55",
              "name": "fete",
              "type": "string",
              "value": "=\nBonne f\u00eate {{ $json.matches.join(', ') }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "40b49097-0910-44fc-9287-c976e13da70d",
      "name": "Birthday celebration message",
      "type": "n8n-nodes-base.set",
      "position": [
        1960,
        -500
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "60bb0fb7-3395-4772-baf3-32922f7da1c4",
              "name": "Birthday",
              "type": "string",
              "value": "=\nAujourd'hui, c'est l'anniversaire de {{ $json.anniversary.join(', ') }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "54d92f95-03c9-4258-9ebf-66fb9f13f195",
      "name": "Merge Birthday + F\u00eate Messages",
      "type": "n8n-nodes-base.merge",
      "position": [
        2180,
        -400
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineAll"
      },
      "typeVersion": 3
    },
    {
      "id": "2e26ec97-bff0-41be-914e-e978cba49cd5",
      "name": "Check if any celebration to make",
      "type": "n8n-nodes-base.if",
      "position": [
        2400,
        -400
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "or",
          "conditions": [
            {
              "id": "5ba01568-dfa9-496d-afeb-30b9c08f5af5",
              "operator": {
                "type": "string",
                "operation": "exists",
                "singleValue": true
              },
              "leftValue": "={{ $json.Birthday }}",
              "rightValue": ""
            },
            {
              "id": "41f70dad-ec70-49f2-bc43-09b88eb60997",
              "operator": {
                "type": "string",
                "operation": "exists",
                "singleValue": true
              },
              "leftValue": "={{ $json.fete }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "693c9749-4d63-442a-b6f8-bd2090bb1be9",
      "name": "Send to Google Home Speaker",
      "type": "n8n-nodes-base.homeAssistant",
      "position": [
        2840,
        -500
      ],
      "parameters": {
        "domain": "tts",
        "service": "speak",
        "resource": "service",
        "operation": "call",
        "serviceAttributes": {
          "attributes": [
            {
              "name": "entity_id",
              "value": "tts.google_translate_fr_fr"
            },
            {
              "name": "message",
              "value": "={{ $json.message }}"
            },
            {
              "name": "media_player_entity_id",
              "value": "media_player.google_cuisine"
            }
          ]
        }
      },
      "credentials": {
        "homeAssistantApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "e2f0d6c7-711c-49d4-82a6-5216a166c75a",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -80,
        -340
      ],
      "parameters": {
        "width": 400,
        "height": 300,
        "content": "## Scheduling & Offset\nIf you need to put some time interval between now and the time of trigger"
      },
      "typeVersion": 1
    },
    {
      "id": "4ddd362a-d254-42e8-8b81-ecb8e31951fe",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        480,
        0
      ],
      "parameters": {
        "width": 620,
        "height": 340,
        "content": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n## Call Nominis API\nAPI to get information from the Saint of the day\n[More Info](https://nominis.cef.fr/contenus/integrations.html)"
      },
      "typeVersion": 1
    },
    {
      "id": "dc4ca251-80ec-4069-94b2-205bb111d4b2",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        480,
        -720
      ],
      "parameters": {
        "width": 1260,
        "height": 680,
        "content": "## Birthday & First name Operations\nManipulation fo find first name & birthday dates and see if there are some matches"
      },
      "typeVersion": 1
    },
    {
      "id": "42577f80-1c10-4935-af8f-076f1f2838c3",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1880,
        -620
      ],
      "parameters": {
        "width": 860,
        "height": 520,
        "content": "## Celebration message composition"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "f1eb642f-f198-4d75-86ee-c4967d4f8791",
  "connections": {
    "First names": {
      "main": [
        [
          {
            "node": "Get One first name list",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Birthday Today?": {
      "main": [
        [
          {
            "node": "Aggregate Birthdays",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Aggregate No Birthday",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Compose Message": {
      "main": [
        [
          {
            "node": "Sent Telegram Message",
            "type": "main",
            "index": 0
          },
          {
            "node": "Send to Google Home Speaker",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Everyday at 7am": {
      "main": [
        [
          {
            "node": "Set Date Offset",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Nominis URL": {
      "main": [
        [
          {
            "node": "Nominis - Saints du jour",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Contacts": {
      "main": [
        [
          {
            "node": "First names",
            "type": "main",
            "index": 0
          },
          {
            "node": "Birthday Today?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Date Offset": {
      "main": [
        [
          {
            "node": "Google Contacts",
            "type": "main",
            "index": 0
          },
          {
            "node": "Get Nominis URL",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "No Saint Today ?": {
      "main": [
        [
          {
            "node": "Merge Birthday + F\u00eate Messages",
            "type": "main",
            "index": 1
          }
        ],
        [
          {
            "node": "\"Bonne f\u00eate\" celebration message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Aggregate Birthdays": {
      "main": [
        [
          {
            "node": "Single list Birthday",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Single list Birthday": {
      "main": [
        [
          {
            "node": "Birthday celebration message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Aggregate No Birthday": {
      "main": [
        [
          {
            "node": "Merge Birthday + F\u00eate Messages",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get One first name list": {
      "main": [
        [
          {
            "node": "Combine Firstname & Saints",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Nominis - Saints du jour": {
      "main": [
        [
          {
            "node": "List of Saints of the day",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "List of Saints of the day": {
      "main": [
        [
          {
            "node": "Combine Firstname & Saints",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Combine Firstname & Saints": {
      "main": [
        [
          {
            "node": "Check if any firstname match a Saints of the day",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Birthday celebration message": {
      "main": [
        [
          {
            "node": "Merge Birthday + F\u00eate Messages",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge Birthday + F\u00eate Messages": {
      "main": [
        [
          {
            "node": "Check if any celebration to make",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check if any celebration to make": {
      "main": [
        [
          {
            "node": "Compose Message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\"Bonne f\u00eate\" celebration message": {
      "main": [
        [
          {
            "node": "Merge Birthday + F\u00eate Messages",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Check if any firstname match a Saints of the day": {
      "main": [
        [
          {
            "node": "No Saint Today ?",
            "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

How it works: Schedule Trigger on a daily basis (configured at 7.30 am) Connects Google Contacts to get personal information from them Field Checker on birthday date & firstnames. And see if there is any celebration for today Send a Telegram Notification and display the message…

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

More Slack & Telegram workflows → · Browse all categories →

Related workflows

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

Slack & Telegram

This workflow is designed for individuals, families, and teams who want to automate birthday greetings for their contacts. It's particularly useful for those who maintain their contacts in Google and

Telegram, Home Assistant, Microsoft Teams +2
Slack & Telegram

V2.1 Career-Bot-Workflow. Uses telegram, httpRequest, readWriteFile, googleDrive. Scheduled trigger; 33 nodes.

Telegram, HTTP Request, Read Write File +2
Slack & Telegram

v2.2_career-bot-workflow. Uses telegram, httpRequest, googleDrive, googleSheets. Scheduled trigger; 27 nodes.

Telegram, HTTP Request, Google Drive +2
Slack & Telegram

career-bot-workflow. Uses telegram, httpRequest, googleDrive, googleSheets. Scheduled trigger; 25 nodes.

Telegram, HTTP Request, Google Drive +1
Slack & Telegram

V2.0 Career-Bot-Workflow. Uses telegram, httpRequest. Scheduled trigger; 16 nodes.

Telegram, HTTP Request