Build guide

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.

Retell AICal.com
Jan 20, 2026
Optimized for

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

Step 1: Set the global settings

Think of this as context the agent carries through the entire call. Mine tells it:

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:

  1. Schedule an appointment
  2. Reschedule an appointment
  3. Cancel an appointment
  4. Questions about pricing, hours, insurance
  5. 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:

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:

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

← Back to the library Good luck and happy building