> ## Documentation Index
> Fetch the complete documentation index at: https://docs.brosbots.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Cal.com bookings

> Let the agent book appointments during the call with the Cal.com integration.

## Introduction

The **Cal.com** integration lets the agent book appointments directly
during a phone call. When the caller wants to schedule, the agent invokes
the `book_appointment` action - without hanging up.

## Supported templates

Cal.com bookings are available in templates including:

* **Beauty salon / hairdresser**
* **Restaurant** (table reservations)
* **Healthcare** (clinic appointments)

## Enabling bookings

### 1. The onboarding toggle

When creating an agent from a template, enable **"Cal.com bookings"** in
the form. The agent will be configured with the `book_appointment` action
right away.

### 2. Connecting your Cal.com account

After creating the agent:

1. Go to the agent's **Integrations** tab.
2. Find the **Cal.com** section.
3. Provide your Cal.com API key and the Event Type ID.
4. Save the configuration.

<Note>
  The connection is created once on the **Integrations** page and only selected
  in the agent, so one Cal.com account can serve many agents. The **Event Type
  ID** is the number in the URL while you edit the event type in Cal.com
  (`app.cal.com/event-types/**4034029**`). Set **Host Timezone** to the
  calendar's own timezone, e.g. `Europe/Warsaw` - the caller states a local time
  and Cal.com expects UTC.
</Note>

### 3. Action configuration

* **Event type** - which Cal.com event to book (e.g. "Haircut",
  "Consultation", "Table reservation").
* **Required data** - the agent collects the caller's details (name,
  phone, email, preferred time) before booking.
* **Confirmation** - what the agent says after a successful booking.

## What it looks like in a call

1. The caller wants to book (e.g. *"I'd like to book a haircut on Friday"*).
2. The agent collects the required details (name, contact, time).
3. The agent invokes the `book_appointment` tool.
4. The platform calls the Cal.com API with the collected data.
5. The agent confirms the booking details.
6. The booking appears in your Cal.com dashboard.

## The phone number and the date

Two things used to sink a booking after the agent had already told the caller
it was done.

**The attendee's phone.** A Cal.com event type can mark the attendee phone
required, and a booking without one is then refused. The number is taken, in
order, from what the caller gave the agent, the number they are calling from,
and whatever the agent collected earlier in the conversation. That last path is
the one that matters for **calls from the website widget**, which have no
caller id at all. If no number can be found, the agent is told to ask for one
and book again - and does so while still on the call.

**The date.** A language model has no clock, so asked about "Friday" it will
pick a year out of the air. The booking tool is given today's date in the
calendar's timezone, and a booking in the past is refused with today's date in
the message, so the agent re-asks instead of spending the caller's time. In
prompts you can also use `{{today}}` - see
[Template variables](/en/voice-agent/template-variables).

## Anti-hallucination guardrail

With bookings enabled, the agent is instructed to book **only through the
official tool** - it never "pretends" to have booked something without an
actual API call.

## Troubleshooting

| Problem | Solution |
| - | - |
| Bookings fail silently | Hit **Test connection** on that connection - it checks the key and whether this event type can be booked at all |
| The agent doesn't offer to book | Make sure bookings were enabled in onboarding |
| The wrong event type is booked | Verify the Event Type ID in the integration settings |
| Caller details are missing | Check the data collection configuration in the template |
| Cal.com refuses the booking for a missing phone | Nothing to do - the agent asks for the number and retries. To always have one, add it to the data collected during the call |
| Bookings land in the wrong year, or in the past | Fill in **Host Timezone** and add `Today is {{today}}.` to the prompt |

## See also

* [Onboarding templates](/en/voice-agent/onboarding-templates)
* [Integrations overview](/en/integrations/overview)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.