# Reservar citas de Cal.com o Calendly desde el chat

> Deja que los visitantes reserven una cita en el chat desde tu calendario de Cal.com o Calendly: conectar una clave de API o un token de acceso personal, elegir un tipo de evento, qué ven los visitantes, dónde aparecen las reservas y los límites.

Con las reservas activadas, tu agente puede mostrar bajo su respuesta horas libres de tu calendario de Cal.com o Calendly. El visitante elige una hora, introduce su nombre y su correo, y la cita se reserva al momento en tu calendario. El agente decide cuándo mostrar las horas. Las horas siempre salen de tu calendario, nunca del modelo de IA.

> Se admiten Cal.com y Calendly. No se pueden conectar Google Calendar ni otros calendarios. Para enviar a los visitantes a otra página de reservas, añade un [botón personalizado](/es/docs/custom-buttons) que enlace a ella.

## Antes de empezar

Necesitas una cuenta con al menos un tipo de evento, como una llamada de presentación de 30 minutos, y una clave que permita a intoCHAT usarla:

- **Cal.com**: una clave de API. Créala en Cal.com, en **Settings**, **Developer**, **API keys**. Empieza por `cal_`.
- **Calendly**: un token de acceso personal. Créalo en Calendly, en **Integrations**, **API & Webhooks**, **Personal access tokens**. Dale los permisos (scopes) `users:read`, `event_types:read`, `availability:read` y `scheduled_events:write`. Calendly muestra el token una sola vez, así que cópialo enseguida.

> Calendly solo permite reservar a través de su API en los planes de pago (Standard y superiores). En el plan Free, Calendly rechaza todas las reservas, así que los visitantes verían horas libres que no pueden reservar. intoCHAT no puede comprobar tu plan al conectar.

## Conectar tu calendario

1. Abre tu agente y ve a la pestaña **Actions** (acciones). La tarjeta **Booking** está debajo de tus acciones y formularios.
2. En **Calendar**, elige **Cal.com** o **Calendly**.
3. Pega la clave en **Cal.com API key**, o el token en **Personal access token**, y haz clic en **Connect**. intoCHAT lo comprueba cargando tus tipos de evento.
4. Elige el tipo de evento en **Event type visitors book** (tipo de evento que reservan los visitantes). Cada uno muestra su título y su duración. Un tipo de evento marcado como «(hidden in Cal.com)» o «(secret in Calendly)» está oculto en tu página pública de reservas, pero los visitantes pueden reservarlo igualmente desde el chat. Un tipo de evento de Calendly marcado como «(can't be booked from the chat)» no se puede elegir; el motivo aparece debajo de la lista. Consulta [Tipos de evento de Calendly que el chat no puede reservar](#tipos-de-evento-de-calendly-que-el-chat-no-puede-reservar).
5. Si quieres, rellena **When to offer booking** (cuándo ofrecer reservas): lo lee el agente, los visitantes no lo ven, hasta 1.000 caracteres. Si lo dejas vacío, el agente usa el texto que aparece en el campo: «When the visitor wants to book a meeting, call, demo or appointment, or asks when the team is available.»
6. Haz clic en **Save**. Las reservas se activan en cuanto se guardan.

La clave o el token se guarda cifrado y no se vuelve a mostrar. La tarjeta solo muestra una clave de Cal.com como `cal_…` y sus cuatro últimos caracteres, y un token de Calendly solo como `…` y sus cuatro últimos caracteres. intoCHAT lo usa para leer tus tipos de evento y tus horas libres y para crear reservas, nada más.

Si Cal.com rechaza la clave, la tarjeta dice «Cal.com didn't accept this API key.» Si Calendly rechaza el token, dice «Calendly didn't accept this personal access token.» Comprueba que copiaste la clave o el token completo y que no ha caducado, no se ha revocado ni se ha borrado. Si al token le falta un permiso, la tarjeta indica los permisos que necesita. Si la cuenta aún no tiene tipos de evento, crea uno y vuelve a hacer clic en **Connect**. Puedes comprobar claves hasta 10 veces en 10 minutos.

### Tipos de evento de Calendly que el chat no puede reservar

El chat solo pide al visitante un nombre y un correo. Un tipo de evento de Calendly no se puede reservar desde el chat cuando:

- tiene una pregunta de reserva activada y obligatoria,
- solo ofrece ubicaciones que piden algo al invitado, como el número de teléfono del invitado para que tú lo llames o un lugar que elige el invitado,
- es una encuesta de reunión (meeting poll).

Se pueden reservar los tipos de evento con videollamada (Zoom, Google Meet, Microsoft Teams, Webex, GoTo Meeting), con un número de teléfono al que llama el invitado, con un lugar que fijas tú o sin ninguna ubicación. Cuando un tipo de evento ofrece varias ubicaciones, intoCHAT reserva la primera de estas. Las preguntas de reserva opcionales quedan vacías.

## Gestionar las reservas

Cuando hay un calendario conectado, la tarjeta muestra el calendario, los cuatro últimos caracteres de la clave o el token y el tipo de evento.

- El interruptor **On** / **Off** de la cabecera de la tarjeta hace que el agente deje de ofrecer reservas, sin desconectar.
- **When to offer booking** se puede cambiar en cualquier momento. Haz clic en **Save** para guardar el cambio.
- **Change event type** vuelve a cargar tus tipos de evento y cambia al que elijas. Un agente reserva un solo tipo de evento a la vez.
- **Replace key** (Cal.com) o **Replace token** (Calendly) conecta con una clave o un token nuevo. Ahí también puedes elegir el otro calendario. Si la tarjeta dice que la clave o el token guardado ya no se puede leer y que por eso los visitantes no pueden reservar, el botón se llama **Reconnect**: vuelve a pegarlo.
- **Disconnect** detiene las reservas y borra la clave o el token guardado. Las citas ya reservadas siguen en tu calendario y en la lista **Bookings** de la pestaña **Leads**.

## Qué ven los visitantes

El agente lee **When to offer booking**. Cuando la conversación encaja, muestra horas libres bajo su respuesta y las menciona en una frase breve. No enumera las horas en su texto, no pide el nombre ni el correo del visitante en el chat y nunca dice que una cita está reservada antes de que el visitante la reserve.

El selector de horas muestra el título y la duración del tipo de evento, y la zona horaria del visitante, por ejemplo «Horas en Europe/Madrid»:

- Muestra hasta 5 días con horas libres y hasta 8 horas por día, repartidas a lo largo del día para que aparezcan tanto mañanas como tardes.
- Por defecto, el agente mira los 7 días siguientes. Cuando el visitante pide días concretos, mira esos, hasta 14 días a la vez y hasta un año por delante.
- Las horas están en la zona horaria del navegador del visitante, o en UTC si el navegador no indica ninguna. Se escriben como el navegador del visitante escribe las fechas y las horas.

Para reservar, el visitante elige un día y una hora, introduce «Nombre» y «Correo electrónico» y hace clic en «Reservar». «Elegir otra hora» vuelve a la lista. Justo antes de reservar, intoCHAT vuelve a preguntar a tu calendario si la hora sigue libre. Si otra persona la ha cogido mientras tanto, el visitante ve «Esa hora se acaba de reservar. Elija otra, por favor.» y la hora desaparece de la lista.

Una vez reservada la cita, se añade al chat una confirmación como mensaje del agente, por ejemplo «Reservado: Llamada de presentación, el martes, 13 de octubre de 2026, 14:30 (Europe/Madrid). Debería recibir una confirmación en ana@example.com.» Si tu tipo de evento de Cal.com requiere que confirmes las reservas, empieza en su lugar por «Solicitado:» y dice que la cita aún debe confirmarse. Cal.com o Calendly envía sus correos e invitaciones de calendario habituales. intoCHAT no envía al visitante ningún correo propio.

El texto del selector sigue el **Widget language** de la pestaña [Appearance](/es/docs/appearance). El título del tipo de evento aparece tal como lo escribiste en Cal.com o Calendly. Después de recargar, un selector cuya hora se reservó muestra «Se reservó una cita en este chat.»

Si el calendario no tiene horas libres en los días pedidos, el agente lo dice y puede ofrecer mirar otros días. Si no se puede contactar con tu calendario, el agente dice que las reservas no funcionan en este momento. Nunca se inventa horas.

Las reservas funcionan en la burbuja de chat, el iframe en la página, el enlace directo, la [página de ayuda](/es/docs/help-page) y el **Playground**. No se ofrecen en los chats temporales, porque en ellos no se guarda nada. Si un visitante quiere reservar desde uno, el agente le pide que salga del chat temporal y vuelva a preguntar.

## Las reservas desde el Playground son reales

> Una cita reservada en el **Playground** es una reserva real. El selector lo indica allí, por ejemplo: «Playground: booking here is real. It creates the meeting in your Calendly calendar, and Calendly sends its usual emails.» También aparece en la lista **Bookings** y envía el webhook `booking.created` y el aviso de Slack como cualquier otra reserva. Cancela las reservas de prueba en Cal.com o Calendly.

## Dónde aparecen las reservas

- **Pestaña Leads**: la tarjeta **Bookings** lista cada cita reservada desde el chat, con el nombre, el correo y la zona horaria del visitante, y un enlace a la conversación. Consulta [Avisos y exportación](/es/docs/lead-alerts-and-export#reservas).
- **Pestaña Conversations**: la confirmación aparece en la transcripción como un mensaje del agente. Bajo la respuesta que mostró las horas, **Why this answer** incluye «Booking:» seguido del título del tipo de evento en **Actions called**. En la exportación CSV, el mensaje de esa respuesta termina con `[Booking times: ` y el título del tipo de evento. Consulta [Conversaciones y datos](/es/docs/conversations-and-dashboard).
- **Webhooks**: suscribe un webhook a **Meeting booked** para recibir el evento `booking.created`. Su `provider` es `calcom` o `calendly`. Consulta [Webhooks](/es/docs/webhooks#datos-de-booking-created).
- **Slack**: marca **Booked meeting** en **Post a message for** en la tarjeta **Slack alerts**. Consulta [Avisos en Slack](/es/docs/lead-alerts-and-export#avisos-en-slack).

## Límites

- **Cal.com o Calendly**, un calendario y un tipo de evento por agente.
- **Calendly necesita un plan de pago** (Standard y superiores) para reservar a través de su API. Calendly también limita cuántas reservas acepta su API: en los planes de pago distintos de Enterprise, 10 por minuto, 50 por hora y 100 por día por usuario de Calendly; durante una prueba de Calendly, 5 por día. Por encima de eso, los visitantes ven «Demasiados intentos. Espere un momento, por favor.»
- **No se sincroniza nada de vuelta desde tu calendario.** Si una cita se cambia de hora o se cancela en Cal.com o Calendly, la lista **Bookings** y la conversación siguen mostrando la reserva original. Los visitantes no pueden cancelar ni cambiar la hora desde el chat; eso se hace en Cal.com o Calendly.
- **Una reserva no es un lead.** El nombre y el correo del visitante no añaden un lead, y una reserva no envía ningún aviso de lead ni el webhook `lead.created`. Las reservas no se cuentan en **Outcomes** del panel ni en los correos de resumen.
- **Solo conversaciones guardadas.** Una reserva siempre pertenece a una conversación guardada, así que en los chats temporales no se puede reservar.
- **Intentos.** Un visitante puede intentar reservar hasta 5 veces por minuto. Después ve «Demasiados intentos. Espere un momento, por favor.»
- **Una reserva por hora.** La misma hora no se puede reservar dos veces en una conversación; un segundo clic muestra la primera reserva. En la misma conversación se pueden reservar otras horas.
- **Mensajes.** La respuesta que muestra las horas cuenta como un mensaje, como cualquier respuesta. Reservar la hora no consume ningún mensaje.
- **Los agentes duplicados** no copian la conexión con el calendario. Vuelve a conectar Cal.com o Calendly en la copia si debe ofrecer reservas.
- **Cambiar el tipo de evento** no cambia las citas ya reservadas. La lista **Bookings** conserva el título con el que se reservó cada cita, también después de **Disconnect**.

## Siguientes pasos

- Envía las reservas a tus propios sistemas: [Webhooks](/es/docs/webhooks).
- Recoge en su lugar datos como una petición de presupuesto: [Formularios de chat](/es/docs/chat-forms).
- Enlaza a otra página de reservas: [Botones personalizados](/es/docs/custom-buttons).
