How to Build a Retell AI Voice Agent with Calendar Integration
The acupuncture receptionist rebuilt on Retell: intent routing, real availability checks, and calendar bookings.
What you'll build
The same acupuncture receptionist I built on Vapi in previous videos - rebuilt on Retell AI, the second most prominent voice agent builder out there. It answers as "Sarah," routes the caller by intent, checks real availability, books the appointment on Cal.com, and the event flows through to Google Calendar on both the clinic side and the customer side.
Why switch? After a decent amount of time on Vapi, I realized it's not the most reliable for my use cases - scheduling, rescheduling, receptionist work. It struggles with calling the calendar tool, giving the correct date, giving the correct open time slots. Vapi is a single system prompt, so you're relying on the LLM to perform correctly 10 out of 10 times - and it performs well maybe 8 or 9 out of 10. That 1 in 10 can cause real problems for a client. Retell is built as a rigid, deterministic node flow: each step is its own node, so when something goes wrong you can see exactly which node broke - instead of just stuffing more into one giant prompt, which increases latency and cost.
(Vapi has something similar called Workflows, but it's still in beta. Once that releases I could see myself giving it another shot.)
This build covers the scheduling flow only. Rescheduling, cancellations, and FAQs aren't integrated yet - Retell has nothing native to cancel or reschedule a Cal.com/Google Calendar event, so that needs a Make.com or n8n webhook flow. That's the next video.
What you'll need
- A Retell AI account
- A Cal.com account connected to the Google Calendar you want bookings on
- Optional: a second Retell agent with a Spanish ElevenLabs voice for call transfers
Step 1: Set the global settings
Think of this as context the agent carries through the entire call. Mine tells it:
- It's a receptionist
- Do NOT guess dates, times, or pricing
- DO go to the knowledge base to answer FAQs
- Inbound caller number - both Vapi and Retell store the number a call comes in from. A small rule here means the agent never has to ask "can you repeat your phone number?" - it already has it, and it lands on the calendar event.
- Visit type - once the agent knows it's a first appointment vs. a follow-up, it can skip that question entirely later in the flow. Little things like this cut call time and stop the caller having to repeat confirmations left and right.
Step 2: Build the welcome node + Spanish transfer
First node:
Thank you for calling Best Acupuncture. This is Sarah. How can I help you today?
If the caller wants a Spanish-speaking agent, add a call transfer to a second Retell agent built with a Spanish-speaking ElevenLabs voice. I deliberately did NOT toggle multilingual on the main agent - it increases latency and cost, and 80% of the calls come in English. Not worth it.
Step 3: Route the caller by intent
Next node figures out why they're calling. Five branches:
- Schedule an appointment
- Reschedule an appointment
- Cancel an appointment
- Questions about pricing, hours, insurance
- Otherwise - the fail-safe. If the agent doesn't understand, it asks: "Just to confirm, are you calling to schedule an appointment, ask a question, or something else?"
Step 4: Classify new patient vs. follow-up - and use global nodes
Down the scheduling branch, the agent asks whether it's a first visit or a follow-up.
The setting that makes this feel human: on a conversation node, enable global node. If the caller is ahead of the game and already answered a question you were about to ask ("Hi, this is my first visit, can I book?"), the agent skips straight to the relevant section - in the demo it jumped right to collecting full name and confirming the number. There's also a fine-tuning examples field on nodes; I haven't used it much yet, but it's where edge-case scenarios go.
Step 5: Build the Check Calendar Availability function
Retell has check calendar availability and book on calendar functions already built in (I wish cancel/reschedule were too). Click Function, add the check-availability one:
- Name/description:
When users ask for availability, check the calendar and provide available slots. - API key: from Cal.com → Settings → API keys → Add new key. Name it (e.g. "Retell API key") and store it somewhere immediately - it won't let you see it again. And never show anyone this.
- Event type ID: in Cal.com, open the event type (mine is "New patient consultation") and pull the number out of the booking URL - e.g.
4391662. - Timezone: the default will probably be Chicago. Change it to yours (New York for me) - and change it on the Cal.com side too, under Edit availability.
While the function runs, give the node a human filler line, just like a receptionist: "All right, let me check the earliest available appointments for you."
Step 6: Connect Google Calendar on the Cal.com side
In Cal.com: Apps → App Store → Google Calendar → Install, go through the steps. Then open your event type → Edit → Advanced → attach the specific Google Calendar the events should flow to (mine is the acupuncture calendar). That's all it is.
Step 7: Offer two options, then confirm
The next node offers exactly two slots: the earliest available appointment, plus a later-in-the-day option (2 p.m., 3 p.m., etc.). Then a confirmation node repeats the day and time back. If the caller says no, it loops back to the check-availability tool to find a better fit.
Step 8: Collect the email - thoroughly
Be strict here. If the confirmation email goes to the wrong address, they forget the appointment and it creates headaches down the road. My node:
- Asks the caller to spell everything before the @
- Assumes gmail.com unless they specify a different domain (most of what we deal with is Gmail)
- Repeats the full address back for confirmation
Step 9: Book the appointment
Add the book on calendar function - same setup as Step 5, just with the event type ID for booking pulled from the URL the same way.
Step 10: Confirmation, instructions, end call
Final nodes: confirm the booking one last time, add the little extras a real receptionist would ("there's a parking lot behind the building - try parking there first, and if it's full, street parking is available"), then flow to End call.
That covers it - check availability, book an appointment, connect Google Calendar, skip between nodes, and transfer to a Spanish-speaking agent. Rescheduling and cancellations via Make.com/n8n webhooks are coming in the next video, along with connecting the knowledge base.
Resources
- Retell AI - https://www.retellai.com
- Cal.com - https://cal.com
- ElevenLabs - https://elevenlabs.io (Spanish voice for the transfer agent)