# Book Cal.com or Calendly meetings from the chat

> Let visitors book a meeting in the chat from your Cal.com or Calendly calendar: connect an API key or personal access token, pick an event type, what visitors see, where bookings show up and the limits.

With booking on, your agent can show open times from your Cal.com or Calendly calendar under its reply. The visitor picks a time, enters their name and email address, and the meeting is booked in your calendar right away. The agent decides when to show the times. The times always come from your calendar, never from the AI model.

> Cal.com and Calendly are supported. Google Calendar and other calendars can't be connected. To send visitors to another booking page, add a [custom button](/en/docs/custom-buttons) that links to it.

## Before you start

You need an account with at least one event type, such as a 30-minute intro call, and a key that lets intoCHAT use it:

- **Cal.com**: an API key. Create it in Cal.com under **Settings**, **Developer**, **API keys**. It starts with `cal_`.
- **Calendly**: a personal access token. Create it in Calendly under **Integrations**, **API & Webhooks**, **Personal access tokens**. Give it the scopes `users:read`, `event_types:read`, `availability:read` and `scheduled_events:write`. Calendly shows the token only once, so copy it right away.

> Calendly only allows booking through its API on paid plans (Standard and above). On the Free plan, Calendly refuses every booking, so visitors would see open times they can't book. intoCHAT can't check your plan when you connect.

## Connect your calendar

1. Open your agent and go to the **Actions** tab. The **Booking** card is below your actions and forms.
2. Under **Calendar**, choose **Cal.com** or **Calendly**.
3. Paste the key into **Cal.com API key**, or the token into **Personal access token**, and click **Connect**. intoCHAT checks it by loading your event types.
4. Choose the event type under **Event type visitors book**. Each one shows its title and length. An event type marked "(hidden in Cal.com)" or "(secret in Calendly)" is hidden on your public booking page, but visitors can still book it from the chat. A Calendly event type marked "(can't be booked from the chat)" can't be picked; the reason is shown below the list. See [Calendly event types the chat can't book](#calendly-event-types-the-chat-can-t-book).
5. Optionally, fill in **When to offer booking**: read by the agent, not shown to visitors, up to 1,000 characters. Left empty, the agent uses the text shown in the field: "When the visitor wants to book a meeting, call, demo or appointment, or asks when the team is available."
6. Click **Save**. Booking is on as soon as it is saved.

The key or token is stored encrypted and is never shown again. The card shows a Cal.com key only as `cal_…` and its last four characters, and a Calendly token only as `…` and its last four characters. intoCHAT uses it to read your event types and open times and to create bookings, nothing else.

If Cal.com refuses the key, the card says "Cal.com didn't accept this API key." If Calendly refuses the token, it says "Calendly didn't accept this personal access token." Check that you copied the whole key or token and that it hasn't expired, been revoked or been deleted. If the token is missing a scope, the card names the scopes it needs. If the account has no event types yet, create one and click **Connect** again. You can check keys up to 10 times in 10 minutes.

### Calendly event types the chat can't book

The chat asks the visitor only for a name and an email address. A Calendly event type can't be booked from the chat when it:

- has a booking question that is switched on and required,
- only offers locations that ask the invitee for something, such as the invitee's phone number for you to call, or a place the invitee chooses,
- is a meeting poll.

Event types with a video call (Zoom, Google Meet, Microsoft Teams, Webex, GoTo Meeting), a phone number the invitee calls, a place you set yourself, or no location at all can be booked. When an event type offers several locations, intoCHAT books the first one of these. Optional booking questions stay empty.

## Manage booking

Once a calendar is connected, the card shows the calendar, the last four characters of the key or token, and the event type.

- The **On** / **Off** switch in the card's header stops the agent from offering booking, without disconnecting.
- **When to offer booking** can be changed at any time. Click **Save** to keep the change.
- **Change event type** loads your event types again and switches to the one you pick. An agent books one event type at a time.
- **Replace key** (Cal.com) or **Replace token** (Calendly) connects with a new key or token. You can also choose the other calendar there. If the card says the saved key or token can't be read any more, so visitors can't book, the button reads **Reconnect**: paste it again.
- **Disconnect** stops booking and deletes the saved key or token. Meetings already booked stay in your calendar and in the **Bookings** list on the **Leads** tab.

## What visitors see

The agent reads **When to offer booking**. When the conversation fits, it shows open times under its reply and mentions them in a short sentence. It doesn't list the times in its text, doesn't ask for the visitor's name or email in the chat, and never says a meeting is booked before the visitor books it.

The time picker shows the event type's title and length, and the visitor's time zone, for example "Times in Europe/Berlin":

- It shows up to 5 days with open times and up to 8 times per day, spread over the day so mornings and afternoons both appear.
- By default, the agent looks at the next 7 days. When the visitor asks for particular days, it looks at those, up to 14 days at a time and up to a year ahead.
- Times are in the time zone of the visitor's browser, or in UTC when the browser doesn't give one. They are written the way the visitor's browser writes dates and times.

To book, the visitor picks a day and a time, enters **Name** and **Email** and clicks **Book**. **Choose another time** goes back to the list. Right before booking, intoCHAT asks your calendar again whether the time is still open. If someone else took it in the meantime, the visitor sees "Sorry, that time was just taken. Please choose another one." and the time disappears from the list.

Once the meeting is booked, a confirmation is added to the chat as a message from the agent, for example "Booked: Intro call on Tuesday, October 13, 2026 at 2:30 PM (Europe/Berlin). A confirmation should arrive at ana@example.com." If your Cal.com event type needs you to confirm bookings, it starts with "Requested:" instead and says the meeting still has to be confirmed. Cal.com or Calendly sends its usual emails and calendar invites. intoCHAT sends the visitor no email of its own.

The picker's text follows the **Widget language** on the [Appearance](/en/docs/appearance) tab. The event type's title is shown as you wrote it in Cal.com or Calendly. After a reload, a picker whose time was booked shows "A meeting was booked in this chat."

If the calendar has no open times in the days asked for, the agent says so and can offer to look at other days. If your calendar can't be reached, the agent says that booking isn't working at the moment. It never makes up times.

Booking works in the chat bubble, the inline iframe, the direct link, the [Help Page](/en/docs/help-page) and the **Playground**. It isn't offered in temporary chats, because nothing in them is saved. If a visitor wants to book there, the agent asks them to leave the temporary chat and ask again.

## Bookings from the Playground are real

> A meeting booked in the **Playground** is a real booking. The picker there says, for example: "Playground: booking here is real. It creates the meeting in your Calendly calendar, and Calendly sends its usual emails." It also appears in the **Bookings** list and sends the `booking.created` webhook and the Slack alert like any other booking. Cancel test bookings in Cal.com or Calendly.

## Where bookings show up

- **Leads tab**: the **Bookings** card lists every meeting booked from the chat, with the visitor's name, email address and time zone, and a link to the conversation. See [Lead alerts and export](/en/docs/lead-alerts-and-export#bookings).
- **Conversations tab**: the confirmation appears in the transcript as a message from the agent. Under the reply that showed the times, **Why this answer** lists "Booking:" followed by the event type's title under **Actions called**. In the CSV export, that reply's message ends with `[Booking times: ` and the event type's title. See [Conversations and stats](/en/docs/conversations-and-dashboard).
- **Webhooks**: subscribe a webhook to **Meeting booked** to receive the `booking.created` event. Its `provider` is `calcom` or `calendly`. See [Webhooks](/en/docs/webhooks#booking-created-data).
- **Slack**: tick **Booked meeting** under **Post a message for** in the **Slack alerts** card. See [Slack alerts](/en/docs/lead-alerts-and-export#slack-alerts).

## Limits

- **Cal.com or Calendly**, one calendar and one event type per agent.
- **Calendly needs a paid plan** (Standard and above) to book through its API. Calendly also limits how many bookings its API takes: on paid plans other than Enterprise, 10 a minute, 50 an hour and 100 a day per Calendly user; during a Calendly trial, 5 a day. Past that, visitors see "Too many attempts. Please wait a moment and try again."
- **No sync back from your calendar.** If a meeting is rescheduled or cancelled in Cal.com or Calendly, the **Bookings** list and the conversation still show the original booking. Visitors can't cancel or reschedule from the chat; that happens in Cal.com or Calendly.
- **A booking is not a lead.** The visitor's name and email address don't add a lead, and a booking sends no lead alert and no `lead.created` webhook. Bookings aren't counted under **Outcomes** on the dashboard or in the summary emails.
- **Saved conversations only.** A booking always belongs to a saved conversation, so temporary chats can't book.
- **Attempts.** A visitor can try to book up to 5 times a minute. After that they see "Too many attempts. Please wait a moment and try again."
- **One booking per time.** The same time can't be booked twice in one conversation; a second click shows the first booking. Other times can be booked in the same conversation.
- **Messages.** The reply that shows the times counts as one message, like any reply. Booking the time doesn't use a message.
- **Duplicated agents** don't copy the calendar connection. Connect Cal.com or Calendly again in the copy if it should offer booking.
- **Changing the event type** doesn't change meetings already booked. The **Bookings** list keeps the title each meeting was booked under, also after **Disconnect**.

## Next steps

- Send bookings to your own systems: [Webhooks](/en/docs/webhooks).
- Collect details such as a quote request instead: [Chat forms](/en/docs/chat-forms).
- Link to another booking page: [Custom buttons](/en/docs/custom-buttons).
