This workflow corresponds to n8n.io template #7904 — we link there as the canonical source.
This workflow follows the Agent → Gmail Tool 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": "SeCqKiu6DwEynq5h",
"name": "Meeting Booking Agent",
"tags": [],
"nodes": [
{
"id": "4145c3f3-c976-4e1a-8248-086484f1304d",
"name": "Telegram Trigger",
"type": "n8n-nodes-base.telegramTrigger",
"position": [
48,
496
],
"parameters": {
"updates": [
"message"
],
"additionalFields": {}
},
"typeVersion": 1.2
},
{
"id": "db0d67ac-a2ff-4236-9c6f-007c2e3a1707",
"name": "AI Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
256,
496
],
"parameters": {
"text": "={{ $json.message.text }}",
"options": {
"systemMessage": "=You are a smart, helpful AI assistant that helps users schedule meetings, check availability, create events in Google Calendar, and send meeting details via email.\nAlways respond like a friendly, professional human assistant.\n\nCore Process:\n\nALWAYS use Date and Time tool FIRST to get current date/time\nALWAYS check Google Calendar for conflicts before booking new meetings\nOnly create meetings if no time conflicts exist\n\nCritical Rules:\n\nDate Accuracy: When user says \"tomorrow,\" \"next Monday,\" etc., use Date and Time tool to calculate exact dates.\n\nConflict Prevention: Before creating any meeting, check if user already has something booked at that time. If conflict exists, inform user and offer alternatives.\n\nNever double-book: Always resolve conflicts before creating new meetings.\n\nTool Usage:\n\nDate and Time tool: Use first to establish current date, then for any relative date calculations\n\nGoogle Calendar tool: Check for conflicts first, then create events only if no conflicts\n\nGmail tool: Use when user asks to send meeting details or email invites\n\nExample Workflows:\n\nBooking Request: \"Book meeting with Sarah tomorrow at 2 PM\"\n\nGet current date \u2192 Calculate tomorrow's exact date\nCheck calendar for that time slot\nIf no conflict: Create meeting / If conflict: \"You already have [meeting] at 2 PM on [date]. Different time?\"\n\nMeeting Inquiry: \"Do I have meetings tomorrow?\"\n\nGet current date \u2192 Calculate tomorrow's exact date\nSearch calendar for that date\nList meetings with specific date: \"Here are your meetings for [exact date]:\"\n\n\nBe proactive. Make scheduling easy and human-like. Don\u2019t ask the user to write structured inputs \u2014 understand what they mean naturally."
},
"promptType": "define"
},
"typeVersion": 2
},
{
"id": "386b3bc2-736a-429d-b98d-0620c72815a6",
"name": "Gmail",
"type": "n8n-nodes-base.gmailTool",
"position": [
736,
736
],
"parameters": {
"sendTo": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('To', ``, 'string') }}",
"message": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Message', ``, 'string') }}",
"options": {
"appendAttribution": false
},
"subject": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Subject', ``, 'string') }}",
"emailType": "text"
},
"typeVersion": 2.1
},
{
"id": "354df6b7-8db1-4f44-a602-40281542f6ad",
"name": "Telegram",
"type": "n8n-nodes-base.telegram",
"position": [
624,
496
],
"parameters": {
"text": "={{ $json.output }}",
"chatId": "={{ $('Telegram Trigger').item.json.message.chat.id }}",
"additionalFields": {
"appendAttribution": false
}
},
"typeVersion": 1.2
},
{
"id": "a154a955-05fa-40ce-a4e6-22aab05f1292",
"name": "Date & Time",
"type": "n8n-nodes-base.dateTimeTool",
"position": [
864,
736
],
"parameters": {
"options": {
"timezone": "Asia/Dhaka"
}
},
"typeVersion": 2
},
{
"id": "08d4ae43-8bc4-43b8-b40f-2e251485d406",
"name": "Get",
"type": "n8n-nodes-base.googleCalendarTool",
"position": [
384,
736
],
"parameters": {
"limit": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Limit', ``, 'number') }}",
"options": {},
"timeMax": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Before', ``, 'string') }}",
"timeMin": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('After', ``, 'string') }}",
"calendar": {
"__rl": true,
"mode": "list",
"value": "user@example.com",
"cachedResultName": "For the Agent"
},
"operation": "getAll"
},
"typeVersion": 1.3
},
{
"id": "1e51325f-74f1-472b-9f90-3e38a91e6a77",
"name": "Update",
"type": "n8n-nodes-base.googleCalendarTool",
"position": [
288,
736
],
"parameters": {
"eventId": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Event_ID', ``, 'string') }}",
"calendar": {
"__rl": true,
"mode": "list",
"value": "user@example.com",
"cachedResultName": "For the Agent"
},
"operation": "update",
"updateFields": {}
},
"typeVersion": 1.3
},
{
"id": "6216fc21-9f71-4f14-857b-6f949579c433",
"name": "Delete",
"type": "n8n-nodes-base.googleCalendarTool",
"position": [
480,
736
],
"parameters": {
"eventId": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Event_ID', ``, 'string') }}",
"options": {},
"calendar": {
"__rl": true,
"mode": "list",
"value": "user@example.com",
"cachedResultName": "For the Agent"
},
"operation": "delete"
},
"typeVersion": 1.3
},
{
"id": "20d9c182-28f6-4fb3-b28f-eeb8dd961d7e",
"name": "Create",
"type": "n8n-nodes-base.googleCalendarTool",
"position": [
576,
736
],
"parameters": {
"end": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('End', ``, 'string') }}",
"start": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Start', ``, 'string') }}",
"calendar": {
"__rl": true,
"mode": "list",
"value": "user@example.com",
"cachedResultName": "For the Agent"
},
"additionalFields": {
"summary": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Summary', ``, 'string') }}",
"attendees": [
"={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('attendees0_Attendees', ``, 'string') }}"
],
"description": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Description', ``, 'string') }}"
}
},
"typeVersion": 1.3
},
{
"id": "f87ed0e3-92bd-47e6-805e-3aadab5670ed",
"name": "OpenAI",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
-64,
736
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini"
},
"options": {}
},
"typeVersion": 1.2
},
{
"id": "705a6708-9249-4090-ab7c-3c9510f04785",
"name": "Memory",
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
"position": [
64,
736
],
"parameters": {
"sessionKey": "={{ $('Telegram Trigger').item.json.message.chat.id }}",
"sessionIdType": "customKey"
},
"typeVersion": 1.3
},
{
"id": "d88091a2-d857-4bab-ad26-2fa85aeacb31",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1136,
-128
],
"parameters": {
"color": 5,
"width": 960,
"height": 1056,
"content": "\n---\n\n# \ud83d\udee0 Setup Guide\n\nFollow these steps to get started:\n\n1. **Connect your [Telegram Bot](https://core.telegram.org/bots#creating-a-new-bot)**\n\n * In the **Telegram Trigger** and **Telegram** nodes, insert your Telegram bot token (from @BotFather).\n * This allows users to chat with the agent directly from Telegram.\n\n2. **Add your [OpenAI](https://platform.openai.com/api-keys) API key**\n\n * Used in the **OpenAI** node to power natural conversation and interpret scheduling requests.\n * Choose the right model (`gpt-4.1-mini` is already set).\n\n3. **Enable Conversation Memory**\n\n * The **Memory** node is linked to Telegram chat IDs, so the bot remembers ongoing conversations.\n * No extra setup needed, but make sure the session key remains `chat.id`.\n\n4. **Plug in your [Google Calendar](https://calendar.google.com/) account**\n\n * In the **Get**, **Update**, **Delete**, and **Create** nodes, connect your Google Calendar.\n * This lets the AI check availability, prevent double-booking, and create events.\n\n5. **Set your Timezone**\n\n * In the **Date & Time** node, confirm your correct timezone (currently `Asia/Dhaka`).\n * This ensures correct handling of \u201ctomorrow,\u201d \u201cnext Monday,\u201d etc.\n\n6. **Connect your [Gmail](https://mail.google.com/) account**\n\n * In the **Gmail** node, link your Gmail account.\n * This is used to send meeting invites and confirmations to attendees.\n\n7. **AI Agent System Message (already set)**\n\n * The **AI Agent** node has rules to:\n\n * Always calculate exact dates with Date & Time\n * Always check calendar before creating events\n * Avoid double-booking and suggest alternatives\n * Keep these rules as they make the assistant act professional and human-like.\n\nOnce all connections are set, your workflow will **chat with users on Telegram, check Google Calendar for availability, create meetings, and send invites via Gmail \u2014 all automatically** \ud83d\udcc5\ud83e\udd16\n\n---\n"
},
"typeVersion": 1
},
{
"id": "ce35084a-f8c5-4b87-9ddb-50ef4b8268ba",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-64,
-112
],
"parameters": {
"color": 5,
"width": 544,
"height": 464,
"content": "## Start here: Step-by Step Youtube Tutorial :star:\n[](https://youtu.be/IWDGfZyN5to)"
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "c97ce50f-79b7-40c5-b270-3ee564838ce4",
"connections": {
"Get": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Gmail": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Create": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Delete": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Memory": {
"ai_memory": [
[
{
"node": "AI Agent",
"type": "ai_memory",
"index": 0
}
]
]
},
"OpenAI": {
"ai_languageModel": [
[
{
"node": "AI Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Update": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"AI Agent": {
"main": [
[
{
"node": "Telegram",
"type": "main",
"index": 0
}
]
]
},
"Date & Time": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Telegram Trigger": {
"main": [
[
{
"node": "AI Agent",
"type": "main",
"index": 0
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Use cases are many: Let users book, check, reschedule, or cancel meetings directly from Telegram. Perfect for solopreneurs, agencies, or teams who want an AI-powered assistant that prevents double-bookings, manages Google Calendar, and even sends email invites automatically.
Source: https://n8n.io/workflows/7904/ — 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.
Jarvis. Uses telegramTrigger, lmChatOpenAi, openAi, telegram. Event-driven trigger; 28 nodes.
Send a text or voice message to a Telegram bot and it books, reschedules, or cancels Google Calendar events for you. It resolves attendee names to email addresses, attaches a Meet link, and drafts a G
Meet Troy, your intelligent personal assistant that seamlessly manages your Google Calendar and Tasks through Telegram. This workflow combines AI-powered natural language processing with MCP (Model Co
How it works: This project teaches you to create a personal AI assistant named Jackie that operates through Telegram. Jackie can summarize unread emails, check calendar events, manage Google Tasks, an
This workflow turns a Telegram bot into a simple Notion To-Do assistant.