RetellAI + Google Calendar: calls book themselves
Missed calls don’t feel like “missed calls.” They show up later as empty calendar slots, confused staff, and the nagging sense that you’re leaking revenue in the background.
Front-desk teams get buried first. Then it hits clinic owners and service businesses who rely on the phone. This RetellAI booking automation answers 24/7, pulls the right info, and books directly into Google Calendar without someone playing receptionist all day.
Below you’ll see exactly what the workflow does, what results you can expect, and what you’ll need to run it reliably.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: RetellAI + Google Calendar: calls book themselves
flowchart LR
subgraph sg0["When clicking ‘Test workflow’ Flow"]
direction LR
n16@{ icon: "mdi:play-circle", form: "rounded", label: "When clicking ‘Test workflow’", pos: "b", h: 48 }
n17@{ icon: "mdi:cube-outline", form: "rounded", label: "Qdrant Vector Store", pos: "b", h: 48 }
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/httprequest.dark.svg' width='40' height='40' /></div><br/>Create collection"]
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/httprequest.dark.svg' width='40' height='40' /></div><br/>Refresh collection"]
n20@{ icon: "mdi:cog", form: "rounded", label: "Get folder", pos: "b", h: 48 }
n21@{ icon: "mdi:cog", form: "rounded", label: "Download Files", pos: "b", h: 48 }
n22@{ icon: "mdi:vector-polygon", form: "rounded", label: "Embeddings OpenAI", pos: "b", h: 48 }
n23@{ icon: "mdi:robot", form: "rounded", label: "Default Data Loader", pos: "b", h: 48 }
n24@{ icon: "mdi:robot", form: "rounded", label: "Token Splitter", pos: "b", h: 48 }
n20 --> n21
n21 --> n17
n24 -.-> n23
n22 -.-> n17
n19 --> n20
n23 -.-> n17
n16 --> n18
n16 --> n19
end
subgraph sg1["Retrive Qdrant Vecto Flow"]
direction LR
n3["<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/>n8n_rag_function"]
n4@{ icon: "mdi:cube-outline", form: "rounded", label: "Retrive Qdrant Vector Store", pos: "b", h: 48 }
n5@{ icon: "mdi:vector-polygon", form: "rounded", label: "Embeddings OpenAI2", pos: "b", h: 48 }
n6@{ icon: "mdi:wrench", form: "rounded", label: "RAG", pos: "b", h: 48 }
n7@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model2", pos: "b", h: 48 }
n8["<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"]
n9@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model1", pos: "b", h: 48 }
n28@{ icon: "mdi:robot", form: "rounded", label: "Retrive Agent", pos: "b", h: 48 }
n6 -.-> n28
n28 --> n8
n3 --> n28
n5 -.-> n4
n9 -.-> n6
n7 -.-> n28
n4 -.-> n6
end
subgraph sg2["Structured Output Pa Flow"]
direction LR
n0@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Filter", pos: "b", h: 48 }
n1@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model", pos: "b", h: 48 }
n2@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser", pos: "b", h: 48 }
n10["<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"]
n14["<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/>n8n_call"]
n25@{ icon: "mdi:swap-vertical", form: "rounded", label: "Set call fields", pos: "b", h: 48 }
n26@{ icon: "mdi:robot", form: "rounded", label: "Extract key points", pos: "b", h: 48 }
n0 --> n25
n14 --> n0
n25 --> n26
n1 -.-> n26
n26 --> n10
n2 -.-> n26
end
subgraph sg3["Structured Output Pa Flow"]
direction LR
n11@{ icon: "mdi:location-exit", form: "rounded", label: "Google Calendar", pos: "b", h: 48 }
n12@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model3", pos: "b", h: 48 }
n13@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser1", pos: "b", h: 48 }
n15["<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/>n8n_check_available"]
n27@{ icon: "mdi:robot", form: "rounded", label: "Concert start date", pos: "b", h: 48 }
n27 --> n11
n12 -.-> n27
n15 --> n27
n13 -.-> n27
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 n16 trigger
class n23,n24,n28,n2,n26,n13,n27 ai
class n7,n9,n1,n12 aiModel
class n6 ai
class n17,n4 ai
class n22,n5 ai
class n0 decision
class n18,n19,n3,n8,n14,n15 api
classDef customIcon fill:none,stroke:none
class n18,n19,n3,n8,n10,n14,n15 customIcon
The Problem: Phone Calls Create Hidden Admin Work
When bookings come in by phone, the work doesn’t stop when the call ends. Someone has to listen carefully, write down the details, confirm a time, check availability, then create the calendar event. And if the caller asks a simple question (hours, returns, services), your team repeats the same answers all week. The worst part is the mistakes: a name spelled wrong, the date misunderstood, or the wrong service length booked. One small slip, one unhappy customer. It’s exhausting.
The friction compounds. Here’s where it breaks down in real life.
- Calls arrive after hours, so potential customers hit voicemail and move on.
- Agents and staff miss details in the rush, which leads to incorrect bookings and awkward follow-ups.
- Teams answer the same FAQ questions repeatedly because the “source of truth” is scattered across folders and docs.
- Even when everything goes fine, you still spend about 10 minutes per call on admin that doesn’t grow the business.
The Solution: RetellAI Answers, Retrieves, and Books Automatically
This workflow turns your phone line into an always-on booking and support channel. RetellAI handles the conversation, then sends call events into n8n via a webhook when a call ends or is analyzed. From there, OpenAI summarizes what happened and pulls out structured details like the caller’s name, contact info, the service requested, and the intended date and time. If the caller asked a question, the workflow can answer using your own documents through a RAG setup (Retrieval-Augmented Generation), which means it retrieves relevant snippets from your knowledge base before generating a response. Finally, when the call is actually a booking request, n8n formats the date correctly and creates the event in Google Calendar. Your team gets a clean Telegram update so nothing disappears into a black hole.
The workflow starts with RetellAI webhooks for call events and support queries. It routes the request to either summarization + alerting, or knowledge retrieval + response, or calendar scheduling. The output is simple: booked appointments in Google Calendar, plus readable summaries your team can act on.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say your business gets 6 booking calls a day. Manually, you might spend about 10 minutes per call listening, typing notes, checking the calendar, and creating the event, which is roughly 1 hour daily. With this workflow, the “work” becomes a quick glance at a Telegram summary plus the calendar entry that’s already created. Even if you spend 1 minute per call reviewing, that’s about 10 minutes a day. You get most of that hour back, and you stop dropping after-hours callers.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- RetellAI to answer calls and send webhooks.
- Google Calendar to create appointments automatically.
- Google Drive for your knowledge base documents.
- OpenAI API key (get it from the OpenAI API dashboard)
Skill level: Intermediate. You’ll connect accounts, paste webhook URLs into RetellAI, and make small prompt edits for your business.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
RetellAI sends the signal. When a call ends (or RetellAI finishes analyzing it), it hits your n8n webhook with the transcript and call details.
The workflow cleans and structures the call. n8n maps the raw fields, then OpenAI summarizes the conversation and an output parser turns that summary into usable data (names, intent, requested time).
Knowledge questions get answered from your docs. For FAQ-style queries, the workflow retrieves relevant snippets from a Qdrant vector store built from documents pulled out of Google Drive, then the AI agent replies with context-aware answers.
Bookings land in Google Calendar and your team gets notified. The workflow formats dates into calendar-friendly timestamps, creates the event, and sends a Telegram update with a clear summary so your staff can follow up if needed.
You can easily modify which Google Drive folder is indexed to change what the agent “knows” based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Manual Trigger
This workflow begins with a manual trigger to initialize Qdrant collection setup and data resets.
- Add the Manual Execution Start node as the trigger.
- Confirm the execution flow: Manual Execution Start outputs to both Create Collection Request and Reset Collection Data in parallel.
Step 2: Connect Qdrant Collection Setup and Google Drive Sources
This step initializes your vector database and pulls knowledge base files from Google Drive.
- Configure Create Collection Request with URL set to
https://QDRANTURL/collections/COLLECTIONand Method set toPOST. - Set JSON Body to
{ "filter": {} }and enable Send Body and Send Headers. - Credential Required: Connect your httpHeaderAuth credentials in Create Collection Request.
- Configure Reset Collection Data with URL set to
https://[CONFIGURE_YOUR_API_KEY]/deleteand Method set toPOST. - Credential Required: Connect your httpHeaderAuth credentials in Reset Collection Data.
- In Fetch Drive Folder, set Drive to
My Driveand Folder ID to=[YOUR_ID]. - Credential Required: Connect your googleDriveOAuth2Api credentials in Fetch Drive Folder.
- In Download Drive Files, set Operation to
downloadand File ID to{{ $json.id }}. - Credential Required: Connect your googleDriveOAuth2Api credentials in Download Drive Files.
⚠️ Common Pitfall: Replace placeholder values like QDRANTURL, COLLECTION, and [YOUR_ID] before running the workflow.
Step 3: Set Up Document Chunking and Vector Storage
These nodes transform Drive files into chunks, generate embeddings, and store vectors in Qdrant.
- In Token Chunk Splitter, set Chunk Size to
300and Chunk Overlap to30. - Configure Load Default Documents with Data Type set to
binary. - Credential Required: Connect your openAiApi credentials in Generate Embeddings.
- In Store Vectors Qdrant, set Mode to
insertand ensure your Qdrant Collection is selected. - Credential Required: Connect your qdrantApi credentials in Store Vectors Qdrant.
Step 4: Configure Call Intake, Filtering, and Summarization
This path ingests call data, filters for completed events, and summarizes the transcript before notifying Telegram.
- In Call Intake Webhook, set HTTP Method to
POSTand Path tob352dd49-d3b3-4e0a-a781-17137f7199c8. - In Apply Event Filter, add two conditions: Left Value
{{ $json.body.event }}equalscall_endedandcall_analyzed. - In Map Call Fields, map fields like Transcript to
{{ $json.body.call.transcript }}and Duration (sec) to{{ $('Call Intake Webhook').item.json.body.call.call_cost.total_duration_seconds }}. - In Summarize Key Points, set Text to
To: {{ $json.To }} Complete transcript: {{ $json.Transcript }}and enable output parsing. - Credential Required: Connect your openAiApi credentials in Primary Chat Model (this is the language model for Summarize Key Points).
- Ensure Parse Summary Output is connected as the output parser for Summarize Key Points; credentials should be added to Primary Chat Model, not Parse Summary Output.
- In Send Telegram Update, set Chat ID to
[YOUR_ID]and keep the message template using{{ $json.output.* }}fields. - Credential Required: Connect your telegramApi credentials in Send Telegram Update.
Step 5: Set Up the RAG Support Agent Webhook
This branch handles inbound support queries using the vector store and returns responses via webhook.
- In RAG Webhook Entry, set HTTP Method to
POST, Path toedb1e894-1210-4902-a34f-a014bbdad8d8, and Response Mode toresponseNode. - In Retrieve Support Agent, set Text to
{{ $json.body.args.query }}and keep Agent set toconversationalAgent. - Credential Required: Connect your openAiApi credentials in Agent Chat Model (this is the language model for Retrieve Support Agent).
- Ensure RAG Knowledge Tool is connected as a tool to Retrieve Support Agent; credentials should be added to the parent language model, not the tool node.
- Credential Required: Connect your openAiApi credentials in Retriever Chat Model (this powers RAG Knowledge Tool).
- Credential Required: Connect your qdrantApi credentials in Fetch Qdrant Store and openAiApi credentials in Secondary Embeddings.
- Keep Return Webhook Response connected to Retrieve Support Agent to send the AI response back to the caller.
Step 6: Configure Availability Checking and Calendar Booking
This path formats requested dates and creates a Google Calendar event.
- In Check Availability Webhook, set HTTP Method to
POST, Path to4dcd68b1-91d3-40bc-8aa6-c681126752b2, and Response Mode tolastNode. - In Format Start Date, set Text to
Convert this date to a compatible format for Google Calendar APIs for the start date, and for the end date add 1 hour to the start date. Here is the start date: {{ $json.body.args.date }}and keep output parsing enabled. - Credential Required: Connect your openAiApi credentials in Calendar Chat Model (this is the language model for Format Start Date).
- Ensure Parse Time Output is connected as the output parser for Format Start Date; credentials should be added to Calendar Chat Model, not Parse Time Output.
- In Create Calendar Event, set Start to
{{ $json.output.start }}and End to{{ $json.output.end }}, then select your calendar[YOUR_EMAIL]. - Credential Required: Connect your googleCalendarOAuth2Api credentials in Create Calendar Event.
Step 7: Test and Activate Your Workflow
Validate each path and then enable the workflow for production.
- Click Execute Workflow to test the Manual Execution Start branch and confirm Qdrant collection setup and Drive ingestion run without errors.
- Send a POST request to the Call Intake Webhook URL and confirm a Telegram summary arrives from Send Telegram Update.
- Send a POST request to the RAG Webhook Entry URL and verify a response is returned via Return Webhook Response.
- Send a POST request to the Check Availability Webhook URL and confirm Create Calendar Event creates an event with the formatted times.
- Toggle the workflow to Active once all tests succeed.
Common Gotchas
- Google Calendar credentials can expire or need specific permissions. If things break, check the Google connection inside n8n’s Credentials panel 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
Plan on about 1–2 hours if your accounts are ready.
No. You’ll mostly connect accounts and paste webhook URLs into the right places.
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 costs (often just a few dollars a month at low volume) and any RetellAI usage.
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, and you should. You’ll typically tweak the summarization and date/time prompts (the OpenAI “summarize” and “format start date” parts) so they capture your service duration, staff member, and any intake questions. Many teams also swap the Google Drive folder that gets indexed so the RAG answers match their real policies. If you want a “human handoff” path, you can route certain intents to Telegram for manual confirmation instead of auto-booking.
Most of the time it’s the webhook URL, not RetellAI itself. Confirm the RetellAI agent is pointed at the correct n8n webhook (and the right one for call events vs. RAG queries), then re-check that the n8n workflow is active and reachable from the public internet. If you’re self-hosting, firewall or HTTPS issues can block inbound webhooks. Finally, look at the last execution in n8n to see which node first received an empty payload.
On n8n Cloud, it depends on your plan’s monthly execution limit, and each call can trigger more than one execution if you use separate webhooks for booking and RAG. If you self-host, there’s no hard execution cap, but your server resources matter. Practically, most small businesses can handle dozens of calls a day comfortably, assuming your OpenAI and vector store calls aren’t timing out. If you expect heavy volume, you’ll want to watch rate limits and add basic retry handling.
Often, yes, because the “phone agent” use case needs branching logic, structured parsing, and a knowledge retrieval layer. n8n handles that without forcing you into expensive task pricing when a single call triggers multiple steps. You also get the option to self-host, which can be a big deal if you’re running this all day. That said, Zapier or Make can be fine for simple “call summary to Slack” flows. Talk to an automation expert if you want a quick recommendation for your exact setup.
Once this is running, calls don’t pile up into admin work. They turn into booked time on your calendar and clear notes in Telegram, honestly the way it should’ve been all along.
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.