Calendar Integrations: Cal.com, Google, Outlook
Voice agents that book, reschedule, or cancel appointments live or die on their calendar integration. A voice agent that guesses at availability or writes to the wrong calendar breaks the workflow it was built for.
Voice agents that book, reschedule, or cancel appointments live or die on their calendar integration. A voice agent that guesses at availability or writes to the wrong calendar breaks the workflow it was built for. The good news: calendar APIs are mature in 2026, and the major platforms (Cal.com, Calendly, Google Calendar, Microsoft Outlook) all have clean APIs that voice agents can integrate with reasonably. The tricky parts are time zones, OAuth, concurrency, and handling the specific quirks of each platform.
This piece walks through integrating voice agents with the major calendar systems, the patterns that work, and what to watch out for.
TL;DR
- Cal.com and Calendly are designed for scheduling; integration is clean.
- Google Calendar and Outlook are general-purpose; integration requires more glue.
- OAuth 2.0 for user-scoped calendars; service accounts for admin-scoped.
- Time zones, recurrences, and availability windows are the main complexity.
- Test with real user calendars before production; sandbox behavior differs.
The four platforms
Cal.com. Open-source-core scheduling platform. Clean REST API. Booking-focused. Good for voice AI that books into specific event types.
Calendly. Closed-source scheduling platform. Good API. Booking-focused. Similar integration pattern to Cal.com.
Google Calendar. General-purpose calendar. Very mature API. Lots of edge cases. Most widely used.
Microsoft Outlook / Office 365. General-purpose calendar. Microsoft Graph API. Enterprise-heavy.
Each has its own auth model, data model, and quirks.
Cal.com integration
API base: https://api.cal.com/v2/
Auth: API key (personal or team).
Key endpoints:
GET /slots/availableโ query availability.POST /bookingsโ create a booking.PATCH /bookings/{id}โ update.DELETE /bookings/{id}โ cancel.
Simple, REST-native, event-type-centric. Cal.com models "event types" (e.g., "30-minute Discovery Call") and availability flows from the event type's rules.
Voice agent flow:
- User requests booking.
- Agent queries available slots for the specific event type.
- Agent offers 2โ3 slots.
- Agent creates booking.
- Cal.com sends confirmation to user.
Calendly integration
API base: https://api.calendly.com/
Auth: OAuth 2.0 or personal access token.
Key endpoints:
GET /event_type_available_timesโ availability.POST /scheduled_events(indirect via invitee flow) โ book.GET /users/meโ current user context.
Calendly's booking flow is typically a two-step โ generate a booking URL, send to user. For voice AI, this is awkward. Some integrations work around it with server-side booking APIs.
Google Calendar integration
API base: https://www.googleapis.com/calendar/v3/
Auth: OAuth 2.0 (user-scoped) or service account with domain-wide delegation (admin-scoped).
Key endpoints:
GET /calendars/{calendarId}/eventsโ list events.POST /calendars/{calendarId}/eventsโ create event.GET /freeBusyโ availability query across calendars.PATCH /calendars/{calendarId}/events/{eventId}โ update.DELETE /calendars/{calendarId}/events/{eventId}โ cancel.
Availability querying is via freeBusy API:
POST /freeBusy
{
"timeMin": "2026-04-16T09:00:00Z",
"timeMax": "2026-04-17T17:00:00Z",
"items": [{"id": "[email protected]"}]
}
Returns busy periods; available slots are the complement.
Outlook (Microsoft Graph) integration
API base: https://graph.microsoft.com/v1.0/
Auth: OAuth 2.0 (user-scoped) or application permissions (admin-scoped).
Key endpoints:
GET /me/calendar/eventsโ list events.POST /me/calendar/eventsโ create event.POST /me/calendar/getScheduleโ availability query.PATCH /me/calendar/events/{id}โ update.DELETE /me/calendar/events/{id}โ cancel.
Similar capability to Google Calendar but Microsoft-Graph-flavored. Availability via getSchedule.
OAuth flow
For user-scoped calendars:
- Voice agent redirects user (one-time) to OAuth consent screen.
- User approves.
- Code returned; voice agent exchanges for access + refresh tokens.
- Tokens stored encrypted.
- Access tokens expire (usually 1 hour); refresh token used to get new ones.
Handle refresh-token rotation, expiration, revocation.
Service accounts / admin-scoped
For office deployments where all staff calendars are accessed centrally:
- Google: service account with domain-wide delegation.
- Microsoft: application permissions granted by admin consent.
Simpler runtime (no user OAuth per call) but requires admin setup.
Time zones โ the #1 bug
Every calendar API has time zone rules. Missteps cause user-visible bugs:
- Caller in Pacific time asks for "Thursday at 10 AM."
- Agent books in Eastern time by default.
- Caller shows up at 7 AM their time, confused.
Rules:
- Capture caller's time zone explicitly, or infer from area code + confirm.
- Pass the time zone explicitly in every API call.
- Confirm back to the caller in their time zone.
- Store the appointment in the calendar owner's time zone.
- Send notifications in the caller's time zone.
Availability-query strategy
To offer relevant slots:
- Determine what event types / meeting types apply.
- Determine participant calendars (solo, group, round-robin).
- Query each calendar's free/busy.
- Compute intersection.
- Apply business rules (work hours, buffer, max bookings per day).
- Return 2โ3 slots to the caller.
This is more complex than a single API call โ often requires multiple queries + logic.
Concurrency and locking
Two callers ask for the same slot. Without locking:
Caller A: requests 10 AM slot โ succeeds.
Caller B: requests same 10 AM slot โ also succeeds.
Double-booked.
Google Calendar and Outlook don't have native slot-locking โ the window between read (availability) and write (book) is where races happen.
Mitigations:
- Optimistic: book, detect conflict, offer alternative.
- Pessimistic: application-level lock on slot during booking flow.
- Event idempotency keys (where supported).
Event metadata
When creating events, populate:
- Title โ descriptive ("Cleaning appointment โ Jamie Patel").
- Attendees โ caller and provider.
- Location โ physical or video link.
- Description โ agent-generated summary.
- Reminders โ configurable.
- Conferencing โ Google Meet, Microsoft Teams, Zoom link auto-generation.
Recurring events
For recurring bookings (weekly therapy, monthly grooming):
- Use the platform's RRULE syntax.
- Handle series vs single-instance modifications.
- Consider holiday and exception dates.
Calendar-level recurrence is cleaner than creating N events.
Webhooks (Push notifications)
Google and Outlook support push notifications on calendar changes:
- Event created / updated / canceled.
- Useful for voice AI to stay in sync if humans make changes directly.
Setup involves subscription management; renewal every few days.
Booking confirmation flow
After booking:
- Calendar system sends email invite (if configured).
- Voice AI can also send SMS confirmation with details.
- Voice AI logs booking in CRM / ticketing.
Triple-confirmation (voice + email + SMS) reduces no-shows.
See sending SMS follow-ups from voice agents.
Cancellation handling
When user cancels:
- Free up the slot.
- Notify attendees.
- Log cancellation in CRM.
- Offer to reschedule during the call.
Make cancellation easy โ friction here costs retention.
Common pitfalls
Time zone assumptions. Caller in Pacific time, system defaulting to UTC or Eastern. Bugs at scale.
Stale availability. Caching availability for minutes โ offering slots that got taken.
Overlapping event types. Cal.com / Calendly allow multiple event types per host. Avoid overlapping by explicit querying per event type.
Permission issues. OAuth scope insufficient, or service account not delegated to target user.
Notification chaos. Multiple systems sending confirmations โ user gets 4 emails and an SMS. Pick one, consolidate.
Integration architecture
Pattern:
- Voice agent โ middleware โ calendar API.
- Middleware handles:
- OAuth token storage and refresh.
- Time zone normalization.
- Multi-calendar availability queries.
- Caching (with short TTL).
- Locking during booking.
Testing
- Sandbox / test calendars โ Google and Microsoft provide developer accounts.
- Realistic data โ multiple time zones, recurring events, conflicting calendars.
- Edge cases โ DST transitions, all-day events, multi-day events.
- Error paths โ auth expired, API rate limited, slot taken mid-flow.
Related reading
- Twilio + Voice Agents: A Complete Guide
- How to Integrate Voice Agents with a Custom REST API
- Sending Voice Agent Transcripts to Slack
- Connecting Voice Agents to Snowflake or BigQuery
- How to Port a Phone Number to Your Voice Agent
FAQ
Which calendar system is easiest to integrate with? Cal.com. Clean API, booking-focused, open source.
What about Zoom / Microsoft Teams meetings? Auto-create meeting links during event creation โ both Google and Microsoft support this natively.
Can we handle no-show cancellations? Not directly via calendar API. Use attendance signals (Zoom join data, e.g.) to mark no-shows in CRM.
What about appointment buffers? Configured in the calendar or scheduling tool โ Cal.com event types support buffers natively. For Google/Outlook, implement in availability logic.
How do we handle out-of-office / vacation blocks? They show as busy time in free/busy queries. Voice agent sees them as unavailable.

Tyler Weitzman is co-founder and Head of AI at Speechify. He has spent the past decade building the speech-synthesis stack that powers millions of users. Tyler writes about the engineering of real-time conversational systems โ text-to-speech, speech recognition, latency budgets, model serving, and the architectural choices that separate prototypes from production-grade voice agents.
More from Tyler Weitzman
View all โOpen-Source vs Proprietary Voice Agent Stacks
The open-source voice AI stack in 2026 is genuinely good. Whisper and its derivatives handle STT. Open-weight LLMs like Llama 3/4, Qwen, Mistral handle the reasoning. Open-source TTS (XTTS, StyleTTS, Orpheus-class) handles output.
Build vs Buy: When to Build Your Own Voice Agent
Build-vs-buy for voice agents in 2026 is a different conversation than it was two years ago. Then, the open-source stack was rough and most serious deployments ended up building.
Voice Agents for Developer Support
Developer support is a strange category. Developers don't generally want to call anyone. They want Stack Overflow, they want clear docs, they want an LLM that can read their code.
Related reading
How to Integrate Voice Agents with a Custom REST API
Most voice agent integrations are with off-the-shelf systems โ Salesforce, HubSpot, Zendesk, Stripe. But eventually every production deployment needs to integrate with a custom internal API โ the billing system, the proprietary order management, the ops dashboard that only yourโฆ
Sending Voice Agent Transcripts to Slack
Slack is where most teams live in 2026, and for voice agent deployments, getting call transcripts and key events into Slack closes a critical ops loop. Escalations land in the right channel with context. QA reviews happen where the team already works.
Connecting Voice Agents to Snowflake or BigQuery
Voice agent deployments generate a lot of data. Every call produces a transcript, metadata (duration, outcome, caller info), function-call traces, sentiment signals, and operational metrics.
Voice AI, twice a month.
Get the best of the SIMBA resources hub โ new articles, trend notes, and operator guides. No spam.
