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.
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.
Chat with your AI agent in Telegram. It remembers important facts about you in Airtable, can transcribe your voice messages, search the web, read and manage Google Calendar, fetch Gmail, and query Not
Productivity Automation AI Agents Scheduling Personal Operations