Guides
Step-by-step guide to connecting Cal.com to Thoughtly so your AI voice agent can check availability, present open slots, and book appointments mid-call — no human calendar management required.
Last updated
When a lead calls about a home insurance quote, a mortgage pre-approval, or an enrollment deadline, they want an answer and a next step — not a promise that someone will call back. The fastest next step is almost always a booked meeting. If the meeting gets scheduled while the lead is still on the phone, the show rate climbs and the competitor window shrinks to zero.
Cal.com is an open-source scheduling platform built for teams that want flexible calendar infrastructure, open APIs, and granular event-type configuration. Thoughtly's native Cal.com integration lets your AI voiceAI voiceAn artificially generated, natural-sounding voice produced by a TTS model. Thoughtly supports a library of AI voices and brand-specific cloning. agent check real-time availability, present open slots to the caller, and book the appointment mid-call without a human ever touching the calendar.
This guide walks through every step: connecting Cal.com, building the agent flow, handling edge cases like timezone mismatches and full calendars, and deciding which operational metrics to track after launch.
The integration lives in Thoughtly's global Integrations page, not inside individual agents. Once connected, every agent in your workspace can use Cal.com actions.
Use the hosted Cal.com OAuthOAuthAn authentication standard that lets Thoughtly connect to your CRM or app without storing your password. connection for this integration. Thoughtly does not currently support self-hosted Cal.com instances through the native Cal.com connector.
Thoughtly exposes two mid-call actions for Cal.com. Understanding what each one does — and when to use it — prevents the most common integration mistakes.
| Action | What It Does | When to Use |
|---|---|---|
| Check Booking Availability | Queries Cal.com for open slots on a specific date or date range for a given event type | Before presenting time options to the caller — always run this first so your agent only offers real availability |
| Create Booking | Books a confirmed appointment on the selected slot with attendee details | After the caller has chosen a specific time and your agent has confirmed the selection |
Both actions support Thoughtly variables in their input fields. You can reference data captured earlier in the conversation — caller email, preferred date, timezone — and pass it directly into the action configuration without writing code.
This is the recommended default for most lead-conversion use cases. The agent asks the caller for a preferred date, checks Cal.com availability in real time, presents open slots, and books the appointment — all within the same call.
Create a Speak node in the Agent Builder that asks something natural: "What day works best for you, and what timezone should I use?" If your business only serves one timezone, you can skip the timezone question and rely on the agent's configured timezone.
Add two variables to this node:
Use strict extraction instructions so the date is clean and parseable. Date-only values should use YYYY-MM-DD. Selected appointment times should use a full timestamp format such as YYYY-MM-DDTHH:MM:SS with the resolved timezone passed separately when the action asks for it.
Route this node directly to the availability-check node. Keep loops for slot selection in the next step, not here.
Create a second Speak node with a brief hold message: "Let me check what times are open."
Open the Actions panel on this node and add the Check Booking Availability action from Cal.com. Map the input fields:
preferred_date (from the previous node)If you have multiple Cal.com accounts connected, select the correct account in the Action's Account tab. This matters for multi-location businesses where each location has its own Cal.com workspace.
Create a Speak node that reads the returned availability and presents a short list — no more than three options. Use a prompt instruction that tells the agent to only offer slots that actually exist in the response:
timeslots: {{response}}
Your task is to provide a few (no more than 3) available time slots from the list, based on the person's request. If the timeslots is empty just say: "I don't have any openings for this day, should I check another one?"
Only provide and talk about information that is available in the timeslots list. If it is empty, do not come up with information; simply let the customer know that you don't have an opening for that date.Add a variableVariableA named value the voice agent stores during a conversation — caller name, intent, qualifying answers — and uses to drive routing and post-call actions. called selected_time to capture the caller's chosen slot as a full timestamp, such as YYYY-MM-DDTHH:MM:SS. Then configure outcomes:
selected_time is valid → continue to the booking nodeThis loop is safe because Thoughtly variables re-extract and overwrite on each pass, so the new date replaces the old one automatically.
Create a Speak node with a brief confirmation message: "One moment while I book that for you."
Add the Create Booking action from Cal.com and map the fields:
Node #3: Answer)Node #2: Answer)Use a Message-mode Speak node for the booking hold message and enable the relevant speech safeguards, especially Uninterrupted. For nodes that run actions, keep the spoken line fixed and concise so action configuration does not bleed into the agent's conversational response.
Add rule-based outcomes to handle the response:
Use a Message-mode Speak node for an exact script: "You're all set for [date and time]. You'll receive a confirmation email from Cal.com shortly." This ensures the caller hears the precise appointment details and knows what to expect.
If your workflowWorkflowAn automated, multi-step process — usually triggered by an event (form fill, new lead) and orchestrating one or more voice / SMS / email actions. includes a CRMCRMThe system of record for leads, contacts, deals, and activity. Thoughtly reads from and writes to your CRM continuously. update — writing the appointment time back to HubSpot, Salesforce, or GoHighLevel — trigger it from a post-call automation using Thoughtly's On Call Completed event. Keep the CRM write out of the live call flow so it doesn't introduce latency.
If your calls are outbound — for example, following up on form fills or re-engaging dormant leads — you can fetch Cal.com availability before the call starts and pass the slots in as metadata. This eliminates the mid-call API round trip and makes the conversation faster.
Pattern B works best for near-term scheduling windows — typically within a week. If callers frequently request dates further out, stick with Pattern A so the availability check runs against current calendar state.
Timezone mismatches are the single most common cause of mis-booked appointments. Design the flow around this fallback order:
For businesses operating in a single timezone — a mortgage brokerage in Dallas or a dental group in Phoenix — set the agent's timezone once in Advanced Settings and don't ask callers. For national or multi-timezone operations, add a brief question early in the call and pass the extracted value into the Cal.com action.
For multi-location businesses, the simplest supported pattern is to connect separate hosted Cal.com accounts or workspaces and route callers to the right booking action based on information the agent captures, such as state, zip code, or requested location.
Connecting the integration is table stakes. The metric that matters is whether it changes conversion outcomes.
| Metric | What to Track | Target |
|---|---|---|
| Booking rate | Percentage of qualified calls where an appointment is successfully booked | 40–60% of qualified leads for high-intent inbound |
| Booking confirmation latency | Time from caller saying "yes" to Cal.com returning a confirmed booking | Monitor against your baseline; investigate repeated slow confirmations or action timeouts |
| Show rate | Percentage of booked appointments that actually happen | 70%+ for same-day/next-day bookings; track against your pre-AI baseline |
| Availability-check failure rate | How often the Check Booking Availability action returns an error or empty result | Track via action logs; repeated failures usually point to calendar configuration, token, or event-type issues |
| Fallback-to-human rate | How often the agent transfers to a human because scheduling failed | Track through routing or CRM outcomes; high rates signal flow design problems or limited calendar availability |
Use Thoughtly's available call data, CRM outcomes, and integration logs to monitor these in aggregate. Some reporting views require additional automation or CRM setup; do not assume every metric appears as a default dashboard field. If booking performance drops suddenly, check three things in order: OAuth token status, Cal.com event-type availability settings, and whether your agent still routes to the correct action nodes.
Thoughtly supports both Cal.com and Calendly as native scheduling integrations. Choosing between them depends on your team's infrastructure preferences, not on Thoughtly's capabilities — both integrations follow the same agent-builder pattern.
| Factor | Cal.com | Calendly |
|---|---|---|
| Hosting | Hosted Cal.com for the native Thoughtly connector | Cloud-only (Calendly-hosted) |
| Open source | Yes — MIT license, full API access | No — proprietary |
| Best fit | Teams already using hosted Cal.com who want flexible event types and open scheduling infrastructure | Teams that want zero-maintenance scheduling with a polished consumer experience |
| Thoughtly actions | Check Booking Availability, Create Booking | Check Availability, Schedule Event With Reference |
| Multi-account | Supported — connect multiple Cal.com workspaces | Supported — connect multiple Calendly accounts |
If you already use Cal.com, keep using Cal.com. If you already use Calendly, keep using Calendly. Thoughtly does not preference one over the other, and the agent-building pattern is identical.
The native Cal.com integration currently focuses on checking availability and creating bookings during the call. For rescheduling or cancellation workflows, validate the desired path with Thoughtly and Cal.com before building it into a live agent; many teams handle changes through post-call follow-up or a human handoff.
Not through the native connector today. Use hosted Cal.com for the OAuth-based Thoughtly integration. If self-hosted Cal.com support is important for your team, raise it with Thoughtly before you design the scheduling workflow around it.
If the availability check returns an empty result, your agent should offer to check a different date rather than trying to book anyway. The slot-presentation prompt included in this guide handles this automatically — the agent tells the caller "I don't have any openings for this day" and asks if they'd like to try another date.
Yes. Integrations are connected at the workspace level, and each agent independently chooses which scheduling actions to use. You could have one agent booking through Cal.com for your mortgage team and another agent using Calendly for your insurance team, all within the same Thoughtly workspace.
Add rule-based outcomes after the Create Booking action that check the actual action outputs available in your workspace, such as a success flag, status field, or returned booking ID. If booking fails — because the slot was claimed between the availability check and the booking attempt, for example — route to a recovery node that re-checks availability and offers new slots. If the second attempt also fails, transfer to a human.