AutomationFlowsSlack & Telegram › Daily Calendar Summary Notifications via Telegram From Google Calendar

Daily Calendar Summary Notifications via Telegram From Google Calendar

ByYassin Zehar @yassinzehar on n8n.io

This workflow automatically sends you a daily message on Telegram summarizing all your meetings and events for the day, straight from your Google Calendar.

Cron / scheduled trigger★★★★☆ complexity11 nodesTelegramGoogle Calendar
Slack & Telegram Trigger: Cron / scheduled Nodes: 11 Complexity: ★★★★☆ Added:

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 →

Download .json
{
  "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.

Pro

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 →

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 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

HTTP Request, Data Table, Telegram +2
Slack & Telegram

20 - Daily Backup (22:00). Uses googleDrive, googleCalendar, telegram. Scheduled trigger; 13 nodes.

Google Drive, Google Calendar, Telegram
Slack & Telegram

Automatically Send Daily Meeting List to Telegram. Uses googleCalendar, scheduleTrigger, telegram, stickyNote. Scheduled trigger; 8 nodes.

Google Calendar, Telegram
Slack & Telegram

This workflow automatically sends you a list of your daily meetings every morning via a Telegram bot.

Google Calendar, Telegram
Slack & Telegram

Solo founders and spreadsheet gremlins who track everything in Notion and want crisp Telegram pings without opening a single page.

Telegram, Notion