🏢 AI Receptionists & Front Office

How AI Receptionists Coordinate with Calendars

A receptionist that can't see the calendar is just a voicemail with better diction. The moment an AI agent can actually read availability, book appointments, reschedule, and cancel — against a live scheduling system — it becomes genuinely useful.

Rohan Pavuluri
Rohan Pavuluri
March 8, 2026 · 7 min read
Speechify

A receptionist that can't see the calendar is just a voicemail with better diction. The moment an AI agent can actually read availability, book appointments, reschedule, and cancel — against a live scheduling system — it becomes genuinely useful. That integration is the single highest-leverage piece of work in any receptionist deployment. Done well, it feels magic. Done badly, you get double-booked patients, missed appointments, and a lot of angry calls the next morning.

This piece walks through the calendar integration patterns, the common pitfalls, and how to design the agent's scheduling logic so it stays consistent with your source of truth.

TL;DR

  • Read/write against a live scheduling API — never cached, never static lists.
  • Use optimistic locking or provider-side conflict detection to prevent double-booking.
  • Handle time zones explicitly at every step.
  • Trigger immediate SMS/email confirmation on every booking, reschedule, and cancellation.
  • Map your scheduling system's concept of "slot" into the agent's prompt vocabulary.

The four calendar operations

An AI receptionist needs to handle four basic operations cleanly:

  1. Check availability — "Do you have anything Thursday afternoon?"
  2. Book — "Let's do Thursday at 2 PM."
  3. Reschedule — "Can we move my Tuesday appointment to next week?"
  4. Cancel — "I need to cancel my Thursday appointment."

Each should be a function exposed to the LLM. The prompt routes to the right function based on caller intent.

Common calendar systems

Cloud scheduling (easy):

  • Google Calendar
  • Microsoft Outlook / Office 365
  • Calendly
  • Cal.com
  • Acuity Scheduling

These have clean REST APIs, OAuth flows, and well-documented conflict handling. Integration is typically a few hundred lines of code.

Practice management systems (medium):

  • Dentrix, Eaglesoft, Open Dental (dental)
  • Athena, Epic, eClinicalWorks (medical)
  • Clio, MyCase (legal)

These often have APIs but less developer-friendly. Middleware vendors (NexHealth for dental, Redox for medical, Clio's official API for legal) smooth this out.

Hospitality PMS (medium-hard):

  • Opera (Oracle Hospitality)
  • Mews
  • Cloudbeds

Reservation logic is more complex than simple appointment booking — rate availability, room inventory, multi-night logic. Plan for dedicated integration work.

Legacy / proprietary (hard):

  • Home-grown schedulers
  • Older on-prem systems
  • Paper or spreadsheet-based workflows

For these, either migrate to a modern scheduler or build a custom middleware layer.

For general integration patterns, see calendar integrations: Cal.com, Google, Outlook.

Availability queries — get the format right

The agent asks: "Do you have anything Thursday afternoon?"

That needs to translate into a scheduling-system query:

  • Provider or service (specific dentist? any hygienist?).
  • Date range (Thursday = 2026-04-18; afternoon = 12:00–17:00).
  • Duration (appointment type determines slot length — cleaning = 45 min, crown = 90 min).
  • Availability type (new-patient slots, established-patient slots).

The function signature:

get_availability(
  provider_id: str | None,
  date_range: tuple[date, date],
  time_range: tuple[time, time],
  duration_minutes: int,
  slot_type: str
) -> list[AvailableSlot]

The agent's prompt maps natural language to these arguments.

The "offer 2–3 slots, not 20" rule

Never dump a long list of available slots on the caller. A good pattern:

Agent: "Happy to book you for a cleaning. I have Thursday
the 12th at 10 AM, or Friday the 13th at 2 PM. Either work?"

Caller: "Thursday."

Agent: "Booked — Thursday at 10 AM."

Three slots max, with a clear ask. The caller picks or asks for something different. Dumping 15 slots triggers decision fatigue and longer calls.

Booking with concurrency safety

Two callers ask for the same 10 AM Thursday slot. The race:

Caller A (0.8s ahead): picks 10 AM Thursday.
Caller B: simultaneously picks 10 AM Thursday.

function book_appointment():
  acquire lock on slot (or rely on DB unique constraint)
  if available:
    insert booking
    return success
  else:
    return slot_unavailable

Caller B's agent gets slot_unavailable back and pivots:

"Oh — that slot just got taken. Let me offer you the next available — Thursday at 11 AM?"

This is a few-percent-of-bookings issue, but handle it cleanly. The alternative is silent double-booking.

Time zones are the #1 source of bugs

A booking agent without strict time-zone handling will produce:

"The text says my appointment is at 6 PM but we talked about 3 PM…"

Every time. Rules:

  • Capture or infer the caller's time zone. Area code is a heuristic, not definitive.
  • Always confirm the slot in the caller's local time: "Thursday at 2 PM your time."
  • Store the appointment in the scheduler's zone (usually office-local).
  • Send SMS confirmations in the caller's zone.
  • Handle DST explicitly — appointments scheduled across the DST boundary need careful handling.

Rescheduling — look up before offering

The agent should never "reschedule" a made-up appointment:

Wrong:

Caller: "I need to reschedule."
Agent: "Sure, when?"
[Agent books a new appointment without looking up the old one.]

Right:

Caller: "I need to reschedule."
Agent: "Sure — let me pull up your appointment.
I have you for Thursday at 10 AM. Is that the one?"

Caller: "Yes, can we move it to next week?"

Agent: "Let me see — I have Tuesday the 17th at 2 PM
or Wednesday the 18th at 10 AM. Which works?"

[Caller picks; agent cancels the old and books the new
atomically.]

The reschedule function should be atomic — cancel + book as one transaction, not two independent operations.

Cancellation — offer a reschedule

A cancellation is lost revenue. Before confirming, offer:

"Got it — before I cancel, want to move it instead?"

Many callers only canceled because they didn't want to call back later. One-call reschedule saves the appointment.

Confirmation and reminder loops

Every scheduling event triggers a confirmation:

  • Immediate SMS or email — within 30 seconds of the call ending.
  • 24-hour reminder — day before.
  • Same-day reminder (optional) — morning-of, 2 hours before, or per practice preference.

Each step reduces no-shows. For the integration, see sending SMS follow-ups from voice agents.

Error handling

Scheduling systems fail. Your agent needs a plan:

  • API down. Agent says "I can't reach the calendar right now — can I take your info and call you back within 15 minutes?" Ticket opens for humans.
  • Permission error. Vendor credentials expired. Alert ops. Fall back to callback booking.
  • Unexpected slot gone. Race condition. Offer alternatives.
  • Unknown provider. Typo in the prompt config. Fall back to "any available."

Every error path should degrade gracefully. The caller shouldn't know the backend had a hiccup.

Testing the integration

Integration tests should cover:

  • Basic availability query for the next 7 days.
  • Booking a slot; verifying it appears in the scheduler UI.
  • Double-booking attempt (should fail cleanly).
  • Cancellation; verifying it's freed.
  • Reschedule; verifying the old is gone and the new exists.
  • Time-zone edge cases.
  • DST-boundary bookings.

Run these tests on a non-production scheduler before every release.

FAQ

What about group appointments or multi-person bookings? Handle as a single booking spanning multiple participants. Scheduler systems usually support this; the agent's function needs to accept a list of participants.

Can the agent recommend a provider based on criteria? Yes. Give it the criteria (specialty, insurance accepted, earliest availability) and let it filter.

How do we handle recurring bookings (weekly therapy)? Most schedulers support recurring appointments. The agent books the first and creates the recurrence rule.

What about buffer time between appointments? Configured in the scheduler, not the agent. The agent queries "available 30-minute slots between 9 and 5" and the scheduler respects buffer rules.

Can the agent block time on a calendar (not a patient, just a hold)? Yes, if the function permits. Useful for reserved slots like "Dr. Lee is out Friday afternoon."

Rohan Pavuluri
Rohan Pavuluri
Building SIMBA Voice Agents

Rohan Pavuluri builds SIMBA Voice Agents at Speechify. Previously, he founded and led Upsolve, the largest nonprofit in the United States serving low-income Americans through technology. He writes about real-world voice-agent deployments — customer support, outbound sales, AI receptionists — and the practical product, design, and operational lessons that actually move the needle.

More from Rohan Pavuluri

View all →

Related reading

Voice AI, twice a month.

Get the best of the SIMBA resources hub — new articles, trend notes, and operator guides. No spam.