This workflow corresponds to n8n.io template #6952 — we link there as the canonical source.
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": "SeY9lTVPdPeVIQdg",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Bot Telegram Calendar",
"tags": [
{
"id": "5iQR5Cw05Bzz7Aqt",
"name": "Google",
"createdAt": "2025-08-02T17:36:32.751Z",
"updatedAt": "2025-08-02T17:36:32.751Z"
},
{
"id": "DW3QCDhQZ9ZpSunz",
"name": "Bot",
"createdAt": "2025-08-02T17:37:06.011Z",
"updatedAt": "2025-08-02T17:37:06.011Z"
},
{
"id": "pvFbKYpUu6xv7RQ8",
"name": "Calendar",
"createdAt": "2025-08-02T17:36:30.352Z",
"updatedAt": "2025-08-02T17:36:30.352Z"
},
{
"id": "rYuINsb3Y1XjrgNv",
"name": "Productivity",
"createdAt": "2025-08-02T17:36:49.812Z",
"updatedAt": "2025-08-02T17:36:49.812Z"
},
{
"id": "yfpCFhbNZGRtYKc0",
"name": "Telegram",
"createdAt": "2025-08-02T17:36:35.592Z",
"updatedAt": "2025-08-02T17:36:35.592Z"
}
],
"nodes": [
{
"id": "a79f7817-b3e8-417c-b176-eb507d9c7b69",
"name": "Count event",
"type": "n8n-nodes-base.code",
"position": [
416,
0
],
"parameters": {
"jsCode": "// Get all the event from the items\nconst allItems = $items(\"Check google Calendar\");\n\n// initiate event board\nlet events = [];\n\n// Check items and extract events\nallItems.forEach(item => {\n const data = item.json;\n\n if (Array.isArray(data)) {\n events.push(...data.filter(e => e && Object.keys(e).length > 0));\n } else if (data && Object.keys(data).length > 0) {\n events.push(data);\n }\n});\n\n// Calculate the number of events\nconst eventCount = events.length;\n\nreturn [\n {\n json: {\n eventCount,\n events\n }\n }\n];\n"
},
"typeVersion": 2
},
{
"id": "3daa99b4-dc92-47eb-a9a2-a749ca5fa215",
"name": "7am trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
0,
0
],
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 8
}
]
}
},
"typeVersion": 1.2
},
{
"id": "11e1cff6-439b-4cae-8d1c-a48e7a8bed90",
"name": "If condition",
"type": "n8n-nodes-base.if",
"position": [
624,
0
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "or",
"conditions": [
{
"id": "0a556b19-d5f6-42fd-aa9f-6ebfc2c5e042",
"operator": {
"type": "number",
"operation": "gt"
},
"leftValue": "={{ $json.eventCount}}",
"rightValue": 0
}
]
}
},
"executeOnce": false,
"typeVersion": 2.2,
"alwaysOutputData": false
},
{
"id": "711a4b13-a376-4f54-b458-f97a832e4fe1",
"name": "Message code",
"type": "n8n-nodes-base.code",
"position": [
832,
-96
],
"parameters": {
"jsCode": "// Get all of the events from IF true branch\nconst rawItems = $items();\nlet events = [];\n\n// Normalize data\nrawItems.forEach(item => {\n const data = item.json;\n\n if (Array.isArray(data.events)) {\n events.push(...data.events);\n } else if (data.event) {\n events.push(data.event);\n } else {\n events.push(data);\n }\n});\n\n// Message creation\nlet message = `\u2600\ufe0f Good morning! Here's your calendar for today\\n\\n\ud83d\udcc5 You have ${events.length} event${events.length > 1 ? 's' : ''} today.\\n\\n`;\n\nevents.forEach(e => {\n message += `\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\n`;\n message += `\ud83d\udccc Name: ${e.summary || \"N/A\"}\\n`;\n message += `\u23f0 Starts: ${e.start?.dateTime || e.start?.date || \"N/A\"}\\n`;\n message += `\u23f3 Ends: ${e.end?.dateTime || e.end?.date || \"N/A\"}\\n\\n`;\n\n message += `\ud83d\udc64 Creator: ${e.creator?.email || \"N/A\"}\\n`;\n message += `\ud83d\udc65 Organizer: ${e.organizer?.email || \"N/A\"}\\n\\n`;\n\n message += `\ud83d\udcc4 Type: ${e.eventType || \"N/A\"}\\n`;\n message += `\ud83d\udd17 Link: ${e.htmlLink || \"N/A\"}\\n\\n`;\n\n message += `\ud83d\udcdd Description: ${e.description || \"No description\"}\\n`;\n message += `\ud83d\udccd Location: ${e.location || \"N/A\"}\\n\\n`;\n});\n\nmessage += \"\u2728 Have a great day!\";\n\nreturn [\n {\n json: {\n text: message\n }\n }\n];\n"
},
"typeVersion": 2
},
{
"id": "b6b693b3-c599-49e2-b4cd-7781ef0c97c0",
"name": "Message no meeting today",
"type": "n8n-nodes-base.telegram",
"position": [
928,
176
],
"parameters": {
"text": "=\ud83d\udc4b Hi! Your calendar is clear for today \ud83d\uddd3\ufe0f\u2728",
"chatId": "1234",
"additionalFields": {}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "774ce326-9fd9-4136-8882-e68167c23c13",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-48,
-496
],
"parameters": {
"color": 2,
"width": 416,
"height": 848,
"content": "## 1.Workflow trigger and Google Calendar\n\nThe workflow is **triggered automatically** each morning at 7am.\n\nThen the second node will **analyse your Google Calendar** of the day looking for any event or meeting scheduled.\n\nHow to setup:\nSet up your Google Agenda **API credentials** "
},
"typeVersion": 1
},
{
"id": "d2319706-cda9-45a0-860e-d3b1f330d3f0",
"name": "Check google Calendar",
"type": "n8n-nodes-base.googleCalendar",
"position": [
208,
0
],
"parameters": {
"options": {
"orderBy": "startTime"
},
"calendar": {
"__rl": true,
"mode": "list",
"value": "fr.french#user@example.com",
"cachedResultName": "Jours f\u00e9ri\u00e9s et autres f\u00eates en France"
},
"operation": "getAll",
"returnAll": true
},
"credentials": {
"googleCalendarOAuth2Api": {
"name": "<your credential>"
}
},
"executeOnce": false,
"typeVersion": 1.3,
"alwaysOutputData": true
},
{
"id": "79952d85-8136-40b4-976a-409ecb103230",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
384,
-496
],
"parameters": {
"color": 5,
"width": 368,
"height": 848,
"content": "## 2.Count event code and Branch\n\nThe first node will **count the number of event items** scheduled and **return a number**. Even if there is no event, a number (0 in this case) would be returned.\n\nThe the second node will **analyse this number**, if the number is not 0, the True branch \u2705 will be activated. If it's O, it will be the False branch \u274c that will be activated."
},
"typeVersion": 1
},
{
"id": "bbc556dc-619a-4bc1-9fdb-6c0f3a44576e",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
768,
-496
],
"parameters": {
"color": 4,
"width": 560,
"height": 848,
"content": "## 3. Send the telegram message\n\nIn the **True branch** \u2705, the code node, will create the message and gather all the informations wanted about the events and meeting. So a full sum um will be sent in one message only.\nIn the Telegram send text node, the **message is sent**.\n\nIf it's the **False branch** \u274c, the Telegram node will send the **message about not having meeting that day**.\n\nHow to setup:\n- Set up a Telegram bot and get the key API.\n- Connect the API credentials to the node.\n- For the **True branch** \u2705, set up your message in javascript and then copy and paste the json file in the next node.\n- For the **False branch** \u274c, just set up your message."
},
"typeVersion": 1
},
{
"id": "1e479d9c-0d57-469c-8631-195a879fb351",
"name": "Send sum up message",
"type": "n8n-nodes-base.telegram",
"position": [
1040,
-96
],
"parameters": {
"text": "={{ $json.text }}",
"chatId": "1234",
"additionalFields": {}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "2d7ba810-f3d8-4e33-940f-516ea9b93a71",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-304,
-496
],
"parameters": {
"color": 3,
"content": "## Required\n\n- Telegram Bot and its API\n- Google account\n- Google Calendar API"
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "8576f66a-463e-4a95-a07a-205e8f57ff27",
"connections": {
"7am trigger": {
"main": [
[
{
"node": "Check google Calendar",
"type": "main",
"index": 0
}
]
]
},
"Count event": {
"main": [
[
{
"node": "If condition",
"type": "main",
"index": 0
}
]
]
},
"If condition": {
"main": [
[
{
"node": "Message code",
"type": "main",
"index": 0
}
],
[
{
"node": "Message no meeting today",
"type": "main",
"index": 0
}
]
]
},
"Message code": {
"main": [
[
{
"node": "Send sum up message",
"type": "main",
"index": 0
}
]
]
},
"Check google Calendar": {
"main": [
[
{
"node": "Count event",
"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.
googleCalendarOAuth2ApitelegramApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow automatically sends you a daily message on Telegram summarizing all your meetings and events for the day, straight from your Google Calendar.
Source: https://n8n.io/workflows/6952/ — 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 n8n template demonstrates how to automatically fetch upcoming movie releases from TMDB and let users add selected movies to their Google Calendar directly from Telegram. On a daily schedule, the
20 - Daily Backup (22:00). Uses googleDrive, googleCalendar, telegram. Scheduled trigger; 13 nodes.
Automatically Send Daily Meeting List to Telegram. Uses googleCalendar, scheduleTrigger, telegram, stickyNote. Scheduled trigger; 8 nodes.
This workflow automatically sends you a list of your daily meetings every morning via a Telegram bot.
Solo founders and spreadsheet gremlins who track everything in Notion and want crisp Telegram pings without opening a single page.