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

# Cal.com

> Connect your own Cal.com account so every booking lands on a contact, runs your appointment automations, and lets an AI agent offer and book real open times.

If you already take bookings on Cal.com, connect it here. Each booking made on your Cal.com
pages lands in Watx — on a contact with a WhatsApp thread when the booker gave a phone
number — and fires the same
**Appointment booked**, **Appointment cancelled** and **Appointment rescheduled** triggers a
Watx [booking form](/forms/bookings) does. An AI agent with the **Cal.com booking** skill can
also offer your real open times and book one in the conversation.

Bookings stay in Cal.com. Watx keeps a copy of each one so it can message the customer about it.

## Connect your account

**Integrations → Cal.com → Connect** opens a three-step dialog. Connecting, testing,
refreshing and disconnecting are **owner and admin** work; other roles see the card with the
buttons disabled.

<Steps>
  <Step title="API key">
    In Cal.com, open **Settings → Developer → API keys** and create a key. Choose
    **Never expires**, or set yourself a reminder: an expired key stops bookings arriving.

    Paste the key (it starts with `cal_`) into Watx and press **Connect**. Watx checks the
    key with Cal.com **before** it is stored, so a wrong key is refused on the spot. It is
    stored encrypted and never shown again. The dialog shows only the last four characters,
    as `cal_live_…a1b2`, and the Cal.com account it belongs to.
  </Step>

  <Step title="Ask for a phone">
    Watx reads your event types from Cal.com and shows, for each one, whether its booking
    page asks for a phone number. See the next section, which is the step that matters most.
  </Step>

  <Step title="Bookings">
    Watx registers a booking webhook on your Cal.com account for you, so there is nothing to
    paste back. This step confirms the webhook is registered, shows when the last booking
    update arrived, and lists your recent bookings. Make a test booking to check.
  </Step>
</Steps>

**Test connection** on step 1 re-checks the key, registers the webhook again and refreshes
your event types. Use it after any error. To use a different key, paste it on step 1 and
press **Replace key**. If the new key belongs to a different Cal.com account, the event
types from the old one are dropped.

If the key works but the webhook could not be registered, the connection is saved anyway and
the card says **Needs attention** with the reason. Bookings do not arrive until it is fixed.

## Make each booking page ask for a phone

Cal.com asks for a name and an email by default. Without a phone number, Watx has nobody to
message on WhatsApp. The booking is still recorded, but no confirmation or reminder can
reach the customer, and nothing fails visibly, because nothing was tried.

Step 2 labels every event type:

| Label | Meaning |
| - | - |
| **Asks for a phone** | A required phone question, or the attendee's phone as the only location |
| **Phone optional** | A phone question the booker can skip, or attendee phone as one of several locations |
| **No phone question** | Bookings from this page arrive with an email only |

To fix one, press **Edit** beside it, go to **Advanced → Booking questions** in Cal.com, turn
on **Phone number** (or add a question of type Phone), mark it **required** and save. Then
press **Refresh from Cal.com**.

While any visible event type has no phone question, the card shows how many booking pages
are affected. Event types hidden on your Cal.com profile are listed but not counted.

## What a booking does in Watx

**A booking with a phone number** finds the contact with that number, or creates one with
the source **Cal.com booking**, and opens a WhatsApp thread for them. A new customer who has
never written to you is still reachable, through a [template](/whatsapp/templates).

**A booking with an email only** is linked to an existing contact with the same email, if
there is one. Otherwise it is recorded with no contact: Watx does not create a contact
nobody can message. The recent bookings list marks these "no phone, not linked to a
contact".

Bookings also appear on the contact's [activity timeline](/contacts/activity-timeline).

### Triggers

Each booking fires one of the three appointment [triggers](/automations/triggers). They are
the same triggers booking forms use, so one confirm-and-remind automation can serve both.

| What happened in Cal.com | Trigger |
| - | - |
| A booking is confirmed | **Appointment booked** |
| A booking replaces an earlier one | **Appointment rescheduled** |
| A confirmed booking is cancelled | **Appointment cancelled** |

A booking that needs your confirmation fires nothing until you accept it in Cal.com, and a
request you decline fires nothing. A late or repeated delivery from Cal.com never fires a
trigger twice, and never brings a cancelled booking back.

In the trigger's **Appointment type** picker, your Cal.com event types are listed beside your
booking forms as "Title (Cal.com)". Leave it on **Any type** to fire for all of them.

These triggers carry no channel. Booking details are available as tokens, in the same place
a booking form puts them:

| Token | Notes |
| - | - |
| `vars.booking.starts_at`, `vars.booking.ends_at` | What a **Wait until** reminder reads |
| `vars.booking.timezone` | The booker's time zone, or your Cal.com account's when the booker gave none |
| `vars.booking.manage_url` | Cal.com's own page, where the customer reschedules or cancels |
| `vars.booking.meeting_url` | The video link, when the location has one |
| `vars.booking.title`, `vars.booking.attendee_name`, `vars.booking.cancellation_reason` | Cal.com bookings only |

See [Variables and expressions](/automations/expressions).

### Sending a booking link

The **Send booking link** [step](/automations/steps) can send a Cal.com event type's booking
page as well as a booking form. Pick the event type in the step's **Appointment type** field.

## Let an AI agent book

Turn on the **Cal.com booking** [skill](/ai-agents/skills) on an agent. It is off by default.

| Setting | What it does |
| - | - |
| **What it books** | The Cal.com event type bookings are made on. Its length, location and confirmation rules come from Cal.com |
| **When to offer a booking** | Optional. Without it, the agent offers whenever a customer asks to meet or talk |

The agent looks up open times up to 14 days ahead, offers two or three, and books only after
the customer agrees to one. The booking carries the phone number from the contact, never a
number the agent typed. The agent then sends the time and Cal.com's link for that booking.

* The skill's tools are withheld while Cal.com is not connected, and the agent's
  [readiness checklist](/ai-agents/readiness) says so.
* When you ask the agent to draft a reply in the inbox (**Draft a reply with AI**), it can
  look up times but cannot book, so drafting never creates a booking.
* A booking made by the agent fires **Appointment booked** once, like any other.

## Disconnect

**Disconnect** in the dialog removes Watx's webhook from Cal.com and forgets the key. The
cached event types go with it. Bookings already recorded stay on your contacts.

<Warning>
  Disconnecting does not revoke the key. It keeps working until you delete it in Cal.com
  under **Settings → Developer → API keys**.
</Warning>

## Not supported

* **Team event types.** Only the event types of the account that owns the key are read.
* **Cancelling or rescheduling from Watx.** Neither you nor an agent can do it here; the
  customer uses the Cal.com link in their confirmation, and you use Cal.com.
* **Public API webhooks for Cal.com bookings.** The `booking.*` events under
  **Settings → Developer → Webhooks** are sent for Watx booking forms only. Use an automation
  on the appointment triggers instead.


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