Telegram to Google Calendar, bookings handled for you
Booking requests come in at the worst times. You answer one “Can I move my appointment?” message, then another, then you’re suddenly juggling your calendar, email, and a messy notes app.
Telegram Calendar booking automation hits hardest when you’re the person who actually has to keep the schedule clean. A clinic manager feels it daily, a solo service business owner feels it after hours, and a VA feels it when three clients ask for changes at once. This workflow turns those chats into booked, rescheduled, or canceled slots without the constant back-and-forth.
You’ll see exactly how the automation routes intent, checks availability, updates Google Calendar and Google Sheets, then confirms everything by email and Telegram so nothing slips.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Telegram to Google Calendar, bookings handled for you
flowchart LR
subgraph sg0["Telegram Flow"]
direction LR
n0@{ icon: "mdi:memory", form: "rounded", label: "Simple Memory", pos: "b", h: 48 }
n1@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser", pos: "b", h: 48 }
n2@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields", pos: "b", h: 48 }
n3@{ icon: "mdi:wrench", form: "rounded", label: "Booking Tool", pos: "b", h: 48 }
n4@{ icon: "mdi:memory", form: "rounded", label: "Simple Memory1", pos: "b", h: 48 }
n5@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser1", pos: "b", h: 48 }
n6@{ icon: "mdi:brain", form: "rounded", label: "Google Gemini Chat Model2", pos: "b", h: 48 }
n7@{ icon: "mdi:brain", form: "rounded", label: "Google Gemini Chat Model3", pos: "b", h: 48 }
n8@{ icon: "mdi:robot", form: "rounded", label: "Planning Agent", pos: "b", h: 48 }
n9@{ icon: "mdi:robot", form: "rounded", label: "Booking Agent", pos: "b", h: 48 }
n10@{ icon: "mdi:robot", form: "rounded", label: "Mail and Sheet Entry", pos: "b", h: 48 }
n11@{ icon: "mdi:message-outline", form: "rounded", label: "Send a message in Gmail", pos: "b", h: 48 }
n12@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields1", pos: "b", h: 48 }
n13@{ icon: "mdi:database", form: "rounded", label: "Append or update row in shee..", pos: "b", h: 48 }
n14@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model", pos: "b", h: 48 }
n15@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model1", pos: "b", h: 48 }
n16@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model2", pos: "b", h: 48 }
n17["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>Webhook"]
n18["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>Respond to Webhook"]
n19["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>Respond to Webhook1"]
n20["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/telegram.svg' width='40' height='40' /></div><br/>Telegram Trigger"]
n21["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/telegram.svg' width='40' height='40' /></div><br/>Send a text message"]
n22["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/telegram.svg' width='40' height='40' /></div><br/>Send a text message1"]
n23@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Switch App", pos: "b", h: 48 }
n43@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Feedback or Next", pos: "b", h: 48 }
n44@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Webhook/Telegram", pos: "b", h: 48 }
n45@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Success/Fail Booking", pos: "b", h: 48 }
n46@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Switch", pos: "b", h: 48 }
n47["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>Respond to Webhook2"]
n48["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/telegram.svg' width='40' height='40' /></div><br/>Send a text message2"]
n46 --> n47
n46 --> n48
n17 --> n8
n23 --> n19
n23 --> n22
n2 --> n9
n3 -.-> n9
n12 --> n10
n9 --> n45
n9 --> n46
n0 -.-> n8
n8 --> n43
n4 -.-> n9
n43 --> n44
n43 --> n2
n20 --> n8
n44 --> n18
n44 --> n21
n14 -.-> n8
n15 -.-> n9
n16 -.-> n10
n10 --> n23
n45 --> n12
n45 --> n46
n11 -.-> n10
n1 -.-> n8
n6 -.-> n1
n7 -.-> n5
n5 -.-> n9
n13 -.-> n10
end
subgraph sg1["When Executed by Another Workflow Flow"]
direction LR
n25@{ icon: "mdi:play-circle", form: "rounded", label: "When Executed by Another Wor..", pos: "b", h: 48 }
n26@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Operation", pos: "b", h: 48 }
n31@{ icon: "mdi:location-exit", form: "rounded", label: "validate_availability_event", pos: "b", h: 48 }
n32@{ icon: "mdi:location-exit", form: "rounded", label: "check_availability_to_create", pos: "b", h: 48 }
n33@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If", pos: "b", h: 48 }
n34@{ icon: "mdi:location-exit", form: "rounded", label: "Stop and Error", pos: "b", h: 48 }
n35@{ icon: "mdi:location-exit", form: "rounded", label: "create_event", pos: "b", h: 48 }
n36@{ icon: "mdi:location-exit", form: "rounded", label: "delete_event1", pos: "b", h: 48 }
n37@{ icon: "mdi:location-exit", form: "rounded", label: "get_event_in_time_gap", pos: "b", h: 48 }
n38@{ icon: "mdi:location-exit", form: "rounded", label: "update_calendar", pos: "b", h: 48 }
n40@{ icon: "mdi:swap-vertical", form: "rounded", label: "map_data", pos: "b", h: 48 }
n41@{ icon: "mdi:swap-vertical", form: "rounded", label: "response_data_get_data", pos: "b", h: 48 }
n42@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields2", pos: "b", h: 48 }
n33 --> n35
n33 --> n34
n40 --> n26
n26 --> n31
n26 --> n36
n26 --> n32
n26 --> n38
n26 --> n37
n37 --> n41
n31 --> n42
n32 --> n33
n25 --> n40
end
subgraph sg2["MCP Server Flow"]
direction LR
n24@{ icon: "mdi:play-circle", form: "rounded", label: "MCP Server Trigger", pos: "b", h: 48 }
n27@{ icon: "mdi:wrench", form: "rounded", label: "validate_busy_time", pos: "b", h: 48 }
n28@{ icon: "mdi:wrench", form: "rounded", label: "create_new_event", pos: "b", h: 48 }
n29@{ icon: "mdi:wrench", form: "rounded", label: "delete_event", pos: "b", h: 48 }
n30@{ icon: "mdi:wrench", form: "rounded", label: "update_event", pos: "b", h: 48 }
n39@{ icon: "mdi:wrench", form: "rounded", label: "get_events_in_gap_time", pos: "b", h: 48 }
n29 -.-> n24
n30 -.-> n24
n28 -.-> n24
n27 -.-> n24
n39 -.-> n24
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n20,n25,n24 trigger
class n1,n5,n8,n9,n10 ai
class n6,n7,n14,n15,n16 aiModel
class n3,n27,n28,n29,n30,n39 ai
class n0,n4 ai
class n23,n43,n44,n45,n46,n26,n33 decision
class n13 database
class n17,n18,n19,n47 api
classDef customIcon fill:none,stroke:none
class n17,n18,n19,n20,n21,n22,n47,n48 customIcon
The Problem: Booking Requests Turn Into Calendar Chaos
Most booking “systems” aren’t systems. They’re you, switching tabs. A customer pings on Telegram asking for “next Tuesday morning,” then follows up with “actually Thursday,” and you have to check Google Calendar, remember their details, update the event, and send a confirmation that sounds professional. It’s not hard work, but it’s constant work. The real cost is the mental load: you’re always one missed message away from a double-booking, an awkward apology, or a no-show that could have been avoided with a clear confirmation.
It adds up fast. Here’s where it breaks down when bookings are handled manually.
- You end up re-checking availability multiple times because people change details mid-conversation.
- Reschedules and cancellations get “handled,” but the calendar event isn’t updated, so the schedule lies.
- Details like service type, email, and notes live in chat threads, which means you can’t report on anything later.
- Confirmations go out inconsistently, and that usually shows up as no-shows or last-minute confusion.
The Solution: Telegram Conversations That Update Your Calendar for You
This workflow turns Telegram (or a webhook) into a real scheduling front door. A user sends a message like “Book cleaning on Friday at 2” or “Cancel my appointment,” and an AI planning agent figures out what they’re trying to do. Then it collects the missing pieces in plain language: date, time, type of service, name, email, and anything you want to capture. Once it has enough information, a booking agent takes over and talks to Google Calendar to create an event, update an existing one, or delete it for cancellations. After the calendar action succeeds, a final agent logs the details to Google Sheets and sends a confirmation email plus a final Telegram message so the customer knows it’s done.
The workflow starts with a Telegram trigger (or an inbound webhook) and routes the request through intent detection. Next, it checks availability and validates overlaps before touching your calendar. Finally, it writes a clean record to Google Sheets and sends confirmations through Gmail and Telegram, which keeps every change organized.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you handle 15 appointment requests a week via Telegram: 10 new bookings, 3 reschedules, 2 cancellations. Manually, you’re usually spending about 10 minutes per request across calendar checks, event edits, and sending confirmations, so that’s roughly 2 to 3 hours weekly. With this workflow, the “work” is replying when needed and letting it process: maybe 1 minute to review a tricky request, then the automation updates Google Calendar, logs Google Sheets, and sends Gmail + Telegram confirmations. You get most of that time back, and frankly, you also stop worrying about the one you forgot to update.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Telegram to receive and send booking messages
- Google Calendar to create, update, and delete events
- Google Sheets to store booking records and status
- Gmail or SMTP to email confirmations automatically
- OpenAI (or OpenRouter) API key (get it from your provider’s API dashboard)
- Telegram Bot Token (get it from BotFather in Telegram)
Skill level: Intermediate. You’ll connect accounts, paste API keys, and test a few real booking scenarios.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A message comes in. The workflow starts when someone messages your Telegram bot, or when a booking request hits your webhook endpoint from another system.
The assistant clarifies intent and details. An AI planning agent figures out if this is a new booking, a reschedule, or a cancellation, then asks follow-up questions to collect what’s missing (date, time, service type, name, email).
Your calendar gets updated only after validation. For bookings and reschedules, it checks Google Calendar availability and avoids overlaps. If there’s no suitable slot, it can respond back instead of silently creating a mess.
Everything gets logged and confirmed. Once the action is successful, the workflow updates a Google Sheets row (status plus details) and sends the user a confirmation via Gmail and Telegram.
You can easily modify the questions it asks and the fields it stores in Sheets based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Webhook Trigger
This workflow starts from incoming webhook and messaging triggers and routes into the AI planning layer.
- Add or open Inbound Webhook Trigger and copy its production URL for your booking app to call.
- Open Telegram Incoming Trigger to accept Telegram-based booking requests and confirm the webhook URL is registered in your Telegram bot.
- Keep MCP Service Trigger available for tool-based scheduling calls from external systems.
- Ensure Triggered by Subworkflow is ready if this workflow will be invoked by another workflow.
- Confirm the core execution flow: Inbound Webhook Trigger → Planning Coordinator and Telegram Incoming Trigger → Planning Coordinator.
Credential Required: Connect your Telegram credentials for Telegram Incoming Trigger.
Step 2: Connect Google Calendar
Calendar availability and event changes are handled by multiple Google Calendar nodes in the routing layer.
- Connect Google Calendar credentials to all calendar nodes: Check Event Availability, Check Availability to Create, Create Calendar Event, Delete Calendar Event, Update Calendar Entry, and Retrieve Events In Gap.
- Verify the routing chain: Operation Router → Check Event Availability → Refine Data Fields and Operation Router → Check Availability to Create → Conditional Branch → Create Calendar Event.
- Confirm the gap retrieval path: Retrieve Events In Gap → Prepare Response Data.
Credential Required: Connect your Google Calendar credentials.
Step 3: Set Up AI Planning, Memory, and Scheduling Tools
The workflow uses AI agents for planning, booking decisions, and communications, supported by memory and structured parsers.
- Open Planning Coordinator, Reservation Agent, and Email & Sheet Processor to ensure they are enabled and connected to language models.
- Ensure OpenAI Chat Model Core is connected to Planning Coordinator, OpenAI Chat Model Aux to Reservation Agent, and OpenAI Chat Model Mail to Email & Sheet Processor.
- Attach Buffer Memory Store to Planning Coordinator and Buffer Memory Cache to Reservation Agent for conversation context.
- Attach Structured Result Parser to Planning Coordinator and Structured Result Parser 2 to Reservation Agent.
- Confirm tool availability: Scheduling Tool is connected to Reservation Agent, and tool workflows Validate Busy Slot, Generate New Event, Remove Event Tool, Revise Event Tool, and Fetch Events Gap Tool are connected to MCP Service Trigger.
Credential Required: Connect your OpenAI credentials for OpenAI Chat Model Core, OpenAI Chat Model Aux, and OpenAI Chat Model Mail.
Credential Required: Connect your Google Gemini credentials for Gemini Chat Model Alpha and Gemini Chat Model Beta.
⚠️ Common Pitfall: Structured Result Parser, Structured Result Parser 2, and memory nodes are AI sub-nodes—add model credentials to their parent agents, not to the sub-nodes.
Step 4: Configure Routing and Data Mapping
Routing nodes and data mapping shape the booking logic and responses.
- Confirm input normalization using Map Payload Data before Operation Router.
- Review decision routing with Feedback or Continue → Webhook vs Telegram and Reservation Agent → Booking Outcome Router → Modify Data Fields.
- Verify the booking reply logic: Reservation Agent → Route Booking Reply → Return Webhook Reply 3 or Send Telegram Notice 3.
- Finalize response data using the set nodes Adjust Data Fields, Modify Data Fields, Refine Data Fields, and Prepare Response Data.
Step 5: Configure Output and Notifications
Notifications and external updates are routed based on the booking outcome and channel.
- Set response nodes for webhooks: Return Webhook Reply, Return Webhook Reply 2, and Return Webhook Reply 3.
- Enable Telegram notifications with Send Telegram Notice, Send Telegram Notice 2, and Send Telegram Notice 3.
- Ensure Email & Sheet Processor can access Dispatch Gmail Message and Update Sheets Row as tools for outbound email and logging.
Credential Required: Connect your Telegram credentials.
Credential Required: Connect your Gmail credentials.
Credential Required: Connect your Google Sheets credentials.
⚠️ Common Pitfall: Dispatch Gmail Message and Update Sheets Row are AI tool sub-nodes—add credentials on the parent Email & Sheet Processor configuration, not on the tool nodes.
Step 6: Add Error Handling
Error handling stops processing when conflicts are detected.
- Confirm Conditional Branch routes to Halt With Error when availability checks fail.
- Ensure any failure from Check Availability to Create is handled before attempting Create Calendar Event.
Step 7: Test and Activate Your Workflow
Validate end-to-end execution before turning on production.
- Use the Inbound Webhook Trigger test URL to submit a sample booking payload and confirm it reaches Planning Coordinator.
- Verify a successful booking creates or updates a calendar event and returns a response through Return Webhook Reply or Send Telegram Notice.
- Confirm that Email & Sheet Processor sends an email via Dispatch Gmail Message and logs a row via Update Sheets Row.
- Toggle the workflow to Active once all test paths complete without errors.
Common Gotchas
- Google Calendar credentials can expire or need specific permissions. If things break, check your n8n credential connection status and the Google account’s calendar access first.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
Frequently Asked Questions
About 45 minutes if your Google and Telegram accounts are ready.
No. You’ll mostly connect accounts and paste API keys into n8n. The trickiest part is testing a few “messy” user messages so the prompts and routing behave the way you want.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in OpenAI API usage (usually a few cents per conversation, depending on message length).
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, but you’ll want to adjust the availability logic. Most teams map “staff member” to a specific Google Calendar, then route the request before the availability check and event creation nodes run. Common customizations include different service durations, buffers between appointments, and “office hours” rules so the assistant stops offering impossible times.
Usually it’s the bot token. Regenerate or re-copy the token from BotFather and update it in your n8n Telegram credentials, then send a new test message to your bot. If it still fails, confirm the bot is actually started (many people forget to hit “Start” in chat) and check if your n8n instance can reach Telegram from your network.
A lot. On n8n Cloud Starter, you can run thousands of executions per month depending on your plan limits, and self-hosting removes execution caps (your server becomes the bottleneck). In practice, the pace is usually limited by how quickly Google APIs respond and how long the AI conversation takes, not by n8n itself.
If you need real conversation logic, yes. This workflow uses AI agents, memory, branching, and validation steps that get expensive or awkward in Zapier-style “two-step” automations. n8n also gives you a self-host option, which is a big deal once you’re running bookings daily. Zapier or Make can still be fine for basic “new form submission → create calendar event” scenarios. If you’re unsure, Talk to an automation expert and explain your booking volume and channels.
Once this is running, booking changes stop feeling fragile. The workflow handles the repetitive parts, and you keep control of the schedule without living in your inbox.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.