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 →
{
"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.
googleContactsOAuth2ApihomeAssistantApitelegramApi
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 →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
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
V2.1 Career-Bot-Workflow. Uses telegram, httpRequest, readWriteFile, googleDrive. Scheduled trigger; 33 nodes.
v2.2_career-bot-workflow. Uses telegram, httpRequest, googleDrive, googleSheets. Scheduled trigger; 27 nodes.
career-bot-workflow. Uses telegram, httpRequest, googleDrive, googleSheets. Scheduled trigger; 25 nodes.
V2.0 Career-Bot-Workflow. Uses telegram, httpRequest. Scheduled trigger; 16 nodes.