Your daily agenda on Telegram
Every morning, today's calendar events arrive as one neat Telegram message.
How it works
- Get today's events from Google Calendar.
- Format them as a list: time, title, location or meeting link.
- Send the message through your Telegram bot.
Diagram
Code
JavaScript used in the Code step — already included in the template below.
// Turns today's calendar events into one Telegram message.
const events = $input.all().map((item) => item.json).filter((e) => e.id);
if (!events.length) {
return [{ json: { text: "☀️ No meetings today — enjoy the focus time!" } }];
}
const time = (e) =>
e.start.dateTime
? new Date(e.start.dateTime).toLocaleTimeString("en-GB", { hour: "2-digit", minute: "2-digit" })
: "All day";
const lines = events.map((e) => {
const link = e.hangoutLink ? `\n ${e.hangoutLink}` : "";
return `• ${time(e)} — ${e.summary}${link}`;
});
return [{ json: { text: `☀️ Today's agenda (${events.length}):\n${lines.join("\n")}` } }];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.
Show code (136 lines)
{
"name": "Your daily agenda on Telegram (Flowngn)",
"nodes": [
{
"parameters": {
"content": "## Your daily agenda on Telegram\nEvery morning, today's calendar events arrive as one neat Telegram message.\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": "2473c6c3-ba78-4235-a758-cbdeb43be1cf",
"name": "Setup notes",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-420,
-60
]
},
{
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 7
}
]
}
},
"id": "2473c6c3-ba78-4235-a758-cbdeb43be1cf",
"name": "Every day 7:00",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.2,
"position": [
0,
0
]
},
{
"parameters": {
"operation": "getAll",
"calendar": {
"__rl": true,
"value": "primary",
"mode": "id"
},
"returnAll": true,
"timeMin": "={{ $today.toISO() }}",
"timeMax": "={{ $today.plus({ days: 1 }).toISO() }}",
"options": {
"singleEvents": true,
"orderBy": "startTime"
}
},
"id": "2473c6c3-ba78-4235-a758-cbdeb43be1cf",
"name": "Get today's events",
"type": "n8n-nodes-base.googleCalendar",
"typeVersion": 1.3,
"position": [
300,
0
],
"alwaysOutputData": true
},
{
"parameters": {
"jsCode": "// Turns today's calendar events into one Telegram message.\nconst events = $input.all().map((item) => item.json).filter((e) => e.id);\n\nif (!events.length) {\n return [{ json: { text: \"☀️ No meetings today — enjoy the focus time!\" } }];\n}\n\nconst time = (e) =>\n e.start.dateTime\n ? new Date(e.start.dateTime).toLocaleTimeString(\"en-GB\", { hour: \"2-digit\", minute: \"2-digit\" })\n : \"All day\";\n\nconst lines = events.map((e) => {\n const link = e.hangoutLink ? `\\n ${e.hangoutLink}` : \"\";\n return `• ${time(e)} — ${e.summary}${link}`;\n});\n\nreturn [{ json: { text: `☀️ Today's agenda (${events.length}):\\n${lines.join(\"\\n\")}` } }];"
},
"id": "2473c6c3-ba78-4235-a758-cbdeb43be1cf",
"name": "Format agenda",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
600,
0
]
},
{
"parameters": {
"chatId": "YOUR_CHAT_ID",
"text": "={{ $json.text }}",
"additionalFields": {}
},
"id": "2473c6c3-ba78-4235-a758-cbdeb43be1cf",
"name": "Send to Telegram",
"type": "n8n-nodes-base.telegram",
"typeVersion": 1.2,
"position": [
900,
0
]
}
],
"connections": {
"Every day 7:00": {
"main": [
[
{
"node": "Get today's events",
"type": "main",
"index": 0
}
]
]
},
"Get today's events": {
"main": [
[
{
"node": "Format agenda",
"type": "main",
"index": 0
}
]
]
},
"Format agenda": {
"main": [
[
{
"node": "Send to Telegram",
"type": "main",
"index": 0
}
]
]
}
},
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"meta": {
"templateCredsSetupCompleted": false
},
"tags": []
}In Make, create a new scenario and add these modules in order:
- Schedule the scenario: Every day 7:00
- Google Calendar › Search Events
- Tools › Set variable / Iterator + Array aggregator (same logic as the Code step)
- Telegram Bot › Send a Text Message or a Reply
- Every module run uses Make operations — the free plan includes a monthly quota.
- Make's built-in functions (map, sum, formatDate…) can replace most Code steps; for complex logic use a code module.
- Module and step names can differ slightly as Make and Zapier update their apps.
In Zapier, create a new Zap and add these steps in order:
- Schedule by Zapier — Every day 7:00
- Google Calendar — Find Events
- Code by Zapier — Run JavaScript (paste the code from the Code section)
- Telegram — Send Message
- Zaps with more than two steps need a paid Zapier plan.
- Webhooks, Filters/Paths and Code by Zapier are premium features on some Zapier plans.
- Code by Zapier runs JavaScript: reuse the code shown above, reading inputs from inputData instead of $json.
- Module and step names can differ slightly as Make and Zapier update their apps.
Tips
- Create your bot for free with @BotFather in Telegram.
Related flows
Leave requests approved on Telegram
Employees fill in a leave form; the manager approves or rejects it with one tap on Telegram, and the employee gets an email.
Your week ahead in one email
Every Sunday morning, get one email with the whole week's meetings, grouped by day.
Evening digest of unread emails on Telegram
Every evening, get a list of today's unread emails (sender and subject) on Telegram, so nothing important is missed.