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

# Reserva citas de barbería con Google Sheets

> Consulta disponibilidad y registra citas usando Date y Time. Dos pestañas sencillas, dos acciones y ningún ID de horario.

El cliente elige una hora, da su nombre y el agente registra la cita. La hoja marca automáticamente ese horario como ocupado.

Este ejemplo usa **un barbero, Diego, con una cita de 30 minutos por horario**, en hora de Ciudad de México. Solo necesitas dos pestañas:

| Pestaña | Columnas | Permiso de Visito |
| - | - | - |
| **Availability** | Date, Time, Available | Leer |
| **Bookings** | Date, Time, Customer | Crear filas |

**No necesitas inventar IDs de horarios.** Selecciona **Date y Time juntas** en la protección contra duplicados de la acción. Visito comprueba ambos valores antes de agregar una fila.

## 1. Crea las dos pestañas

Crea un archivo llamado **Hairdresser Demo — Availability and Bookings**. Renombra la primera pestaña **Availability** y agrega otra llamada **Bookings**.

En **Availability**, escribe estos encabezados en **A1:C1**:

```text theme={null}
Date	Time	Available
```

En **Bookings**, escribe estos encabezados en **A1:C1**:

```text theme={null}
Date	Time	Customer
```

Deja Bookings vacía debajo de los encabezados. El agente agregará una fila cuando el cliente confirme una cita.

<img src="https://mintcdn.com/muhammadtest/nStPtyl8oIGuFGuS/images/product-guide/en/sheets-simple-bookings-empty.png?fit=max&auto=format&n=nStPtyl8oIGuFGuS&q=85&s=5da7ba1adb073b85a2f07ca4437970c6" alt="Bookings empieza con Date, Time y Customer, sin registros." width="1920" height="873" data-path="images/product-guide/en/sheets-simple-bookings-empty.png" />

### Agrega los horarios disponibles

En ambas pestañas, selecciona **A2:B1000 → Formato → Número → Texto sin formato** antes de introducir fechas y horas. Usa **YYYY-MM-DD** para Date y **HH:mm** para Time; por ejemplo, `2026-10-05` y `10:00`. Así ambas pestañas pueden comparar los mismos valores.

Agrega estas filas a Availability. La última columna se calculará con una fórmula:

| Date | Time | Available |
| - | - | - |
| 2026-10-05 | 10:00 | 1 |
| 2026-10-05 | 10:30 | 1 |
| 2026-10-05 | 11:00 | 1 |
| 2026-10-05 | 11:30 | 1 |
| 2026-10-06 | 10:00 | 1 |
| 2026-10-06 | 10:30 | 1 |
| 2026-10-06 | 11:00 | 1 |
| 2026-10-06 | 11:30 | 1 |

Elige fechas futuras cuando hagas tu prueba. Cada combinación Date + Time debe aparecer una sola vez en Availability.

También puedes pegar la [plantilla de disponibilidad](/examples/google-sheets-hairdresser/availability.tsv) y los [encabezados de reservas](/examples/google-sheets-hairdresser/bookings.tsv) en A1 de sus respectivas pestañas. Crea ambas pestañas antes de pegar las fórmulas. Usa la fila 1 para los encabezados, sin celdas combinadas ni títulos encima.

## 2. Calcula la disponibilidad automáticamente

En **Availability!C2**, escribe:

```excel theme={null}
=MAX(0,1-COUNTIFS(Bookings!A$2:A$1000,A2,Bookings!B$2:B$1000,B2))
```

Copia la fórmula hasta C9. Cuenta las reservas que tienen **la misma Date y la misma Time**:

* Sin reserva: **Available = 1**.
* Con reserva: **Available = 0**.

<img src="https://mintcdn.com/muhammadtest/nStPtyl8oIGuFGuS/images/product-guide/en/sheets-simple-availability-before.png?fit=max&auto=format&n=nStPtyl8oIGuFGuS&q=85&s=7bb5810cd20df4b2cca9250482339698" alt="Tres columnas de disponibilidad y la fórmula que compara Date y Time." width="1920" height="873" data-path="images/product-guide/en/sheets-simple-availability-before.png" />

Los rangos `$2:$1000` permanecen fijos al copiar la fórmula. `A2` y `B2` cambian según la fila. Si tu configuración regional exige punto y coma, sustituye las comas por punto y coma.

No sobrescribas las fórmulas de Available. La fórmula reduce la disponibilidad; la protección de la acción impide que Visito agregue dos reservas con la misma Date + Time. No hace falta una acción adicional para descontar disponibilidad.

## 3. Crea una copia para pruebas

En Google Sheets, usa **Archivo → Hacer una copia** y llámala **Hairdresser Demo — TEST**. Copia ambas pestañas y sus fórmulas. Deja Bookings vacía en la copia.

Debe ser **otro archivo**, con los mismos encabezados y formatos. Las escrituras del área de pruebas usan esta copia. Mantén nombres claros para distinguir los dos archivos en Google Picker.

## 4. Crea “Check haircut availability”

Abre **Configuración → Acciones → Google Sheets**. Si aún no tienes una conexión, conecta tu cuenta en Integraciones; la selección de la hoja ocurre dentro de la acción.

1. Elige tu conexión de Google.
2. Pulsa **Elegir hoja de cálculo** y selecciona el archivo principal en Google Picker.
3. Selecciona **Availability**.
4. Marca **Date**, **Time** y **Available**, y continúa.

<img src="https://mintcdn.com/muhammadtest/nStPtyl8oIGuFGuS/images/product-guide/en/sheets-simple-picker.png?fit=max&auto=format&n=nStPtyl8oIGuFGuS&q=85&s=90f82e2ec62fb49f5e16d087e296b14a" alt="Google Picker permite distinguir el archivo principal de su copia de pruebas." width="1512" height="772" data-path="images/product-guide/en/sheets-simple-picker.png" />

<img src="https://mintcdn.com/muhammadtest/nStPtyl8oIGuFGuS/images/product-guide/en/sheets-simple-read-columns.png?fit=max&auto=format&n=nStPtyl8oIGuFGuS&q=85&s=7fb86e4b711009cda93c8bcd13c61bb4" alt="Archivo principal, pestaña Availability y tres columnas seleccionadas." width="1512" height="772" data-path="images/product-guide/en/sheets-simple-read-columns.png" />

Configura estos permisos y tipos:

| Columna | Leer | Actualizar | Crear filas | Tipo |
| - | - | - | - | - |
| Date | Sí | No | No | Fecha |
| Time | Sí | No | No | Texto |
| Available | Sí | No | No | Entero |

Available aparece como **Generada por la hoja**. Sus controles de escritura están deshabilitados.

<img src="https://mintcdn.com/muhammadtest/nStPtyl8oIGuFGuS/images/product-guide/en/sheets-simple-read-permissions.png?fit=max&auto=format&n=nStPtyl8oIGuFGuS&q=85&s=88d4738bf5a225e9542dc78bca19bb77" alt="Permisos de solo lectura para las tres columnas de disponibilidad." width="1512" height="772" data-path="images/product-guide/en/sheets-simple-read-permissions.png" />

En el último paso, usa el nombre **Check haircut availability**, selecciona el alcance de negocios y describe su propósito:

> Consulta cortes de cabello de 30 minutos con Diego en hora de Ciudad de México. Revisa la disponibilidad antes de ofrecer o reservar un horario. Ofrece solo filas donde Available sea 1. Copia Date (YYYY-MM-DD) y Time (HH:mm) exactamente de la fila elegida a Book a haircut. No inventes horarios ni precios. Después de una escritura verificada, vuelve a consultar y comprueba que ese horario tenga Available = 0.

<img src="https://mintcdn.com/muhammadtest/nStPtyl8oIGuFGuS/images/product-guide/en/sheets-simple-read-purpose.png?fit=max&auto=format&n=nStPtyl8oIGuFGuS&q=85&s=3f57e27489822b9f77df657184cb6811" alt="El propósito explica cuándo debe consultar la hoja el agente." width="1512" height="772" data-path="images/product-guide/en/sheets-simple-read-purpose.png" />

Guarda. Esta acción no puede consultar nombres de clientes porque están en otra pestaña.

## 5. Crea “Book a haircut”

Crea otra acción de Google Sheets. Elige el mismo archivo principal, la pestaña **Bookings** y sus tres columnas.

<img src="https://mintcdn.com/muhammadtest/nStPtyl8oIGuFGuS/images/product-guide/en/sheets-simple-booking-columns.png?fit=max&auto=format&n=nStPtyl8oIGuFGuS&q=85&s=e7925201a2d99e8c71cd66783aa2b113" alt="Selección de Date, Time y Customer en Bookings." width="1512" height="772" data-path="images/product-guide/en/sheets-simple-booking-columns.png" />

| Columna | Leer | Actualizar | Crear filas | Tipo |
| - | - | - | - | - |
| Date | No | No | Sí | Fecha |
| Time | No | No | Sí | Texto |
| Customer | No | No | Sí | Texto |

Una pestaña vacía puede sugerir Texto para todas las columnas. Cambia Date a **Fecha** manualmente. Deja Leer apagado para que el agente no consulte nombres de otros clientes.

<img src="https://mintcdn.com/muhammadtest/nStPtyl8oIGuFGuS/images/product-guide/en/sheets-simple-booking-permissions.png?fit=max&auto=format&n=nStPtyl8oIGuFGuS&q=85&s=83c4a577b32c82115a8378c2ef5e2984" alt="Creación de las tres columnas, sin lectura ni actualización." width="1512" height="772" data-path="images/product-guide/en/sheets-simple-booking-permissions.png" />

En el último paso:

1. Nombra la acción **Book a haircut**.
2. En **Evitar filas duplicadas**, elige **Usar columnas existentes juntas**.
3. Marca **Date** y **Time**. No marques Customer: otro nombre no debe permitir una segunda reserva del mismo horario.
4. Date y Time pasan a ser obligatorias automáticamente. Marca también **Customer** como obligatorio.
5. Selecciona **Hairdresser Demo — TEST → Bookings** como destino de pruebas.
6. Usa el mismo alcance de negocios que la acción de disponibilidad.

<img src="https://mintcdn.com/muhammadtest/nStPtyl8oIGuFGuS/images/product-guide/en/sheets-simple-booking-unique-columns.png?fit=max&auto=format&n=nStPtyl8oIGuFGuS&q=85&s=c7dac04e8af9fad26597a9d94ada7fb3" alt="Date y Time juntas evitan duplicados; los tres valores son obligatorios." width="1512" height="772" data-path="images/product-guide/en/sheets-simple-booking-unique-columns.png" />

<img src="https://mintcdn.com/muhammadtest/nStPtyl8oIGuFGuS/images/product-guide/en/sheets-simple-test-target.png?fit=max&auto=format&n=nStPtyl8oIGuFGuS&q=85&s=03288c4a95b5162fa5b6bbf17d349fb6" alt="La acción de reservas usa el archivo TEST separado en el área de pruebas." width="1512" height="772" data-path="images/product-guide/en/sheets-simple-test-target.png" />

Un propósito de ejemplo:

> Registra una cita solo después de que el cliente elija un horario y dé su nombre. Primero usa Check haircut availability y exige Available = 1. Copia Date y Time exactamente de esa fila disponible. Customer es el nombre proporcionado. Pregunta solo los datos que falten. Después de una escritura verificada, informa que la cita quedó registrada y consulta la disponibilidad otra vez. Si esa Date y Time ya existen, ofrece otro horario. Nunca cambies valores para evitar un conflicto. No reintentes una escritura sin verificar ni afirmes que funcionó.

Guarda y revisa el modo. Para la prueba controlada en Webchat, activa deliberadamente **ambas acciones** y usa un archivo principal desechable.

<img src="https://mintcdn.com/muhammadtest/nStPtyl8oIGuFGuS/images/product-guide/en/sheets-simple-actions-list.png?fit=max&auto=format&n=nStPtyl8oIGuFGuS&q=85&s=a99ebe9abb221dbfb4fa7ed86c09921d" alt="Las dos acciones de Google Sheets con operaciones distintas." width="1512" height="772" data-path="images/product-guide/en/sheets-simple-actions-list.png" />

## 6. Prueba la conversación

**¿Por qué Webchat?** La acción de solo lectura usa el archivo principal en el área de pruebas, mientras que la acción de reservas escribe en la copia. Juntas allí no mostrarían una reducción de disponibilidad en el archivo principal. Webchat con acciones Activas usa el principal en ambos casos.

El área de pruebas sí ejecuta acciones de Sheets. Para una prueba completa aislada, configura también una acción de lectura separada contra los datos de prueba. No hagas pruebas sobre reservas reales.

Inicia una conversación nueva en Webchat. Las capturas usan estos mensajes en inglés:

1. “I'd like a men's haircut with Diego on October 5, 2026. What morning times are available?”
2. “10:00 AM works for me. Can you book it?”
3. El agente debe pedir el nombre **antes de escribir**.
4. “My name is Alex Demo. Please book the 10:00 AM haircut with Diego on October 5.”

<img src="https://mintcdn.com/muhammadtest/nStPtyl8oIGuFGuS/images/product-guide/en/sheets-simple-chat-name.png?fit=max&auto=format&n=nStPtyl8oIGuFGuS&q=85&s=8d98fb90cee4cf00a9efc3f821240335" alt="El agente consulta horarios y pide solo el nombre que falta." width="1920" height="873" data-path="images/product-guide/en/sheets-simple-chat-name.png" />

<img src="https://mintcdn.com/muhammadtest/nStPtyl8oIGuFGuS/images/product-guide/en/sheets-simple-chat-booked.png?fit=max&auto=format&n=nStPtyl8oIGuFGuS&q=85&s=e827a8e823b2c5658e2e6630f7db3856" alt="La cita queda registrada después de completar la acción." width="1920" height="873" data-path="images/product-guide/en/sheets-simple-chat-booked.png" />

Comprueba las dos pestañas, no solo la respuesta. Debe haber exactamente una fila en Bookings y **0** en ese horario de Availability:

<img src="https://mintcdn.com/muhammadtest/nStPtyl8oIGuFGuS/images/product-guide/en/sheets-simple-bookings-after.png?fit=max&auto=format&n=nStPtyl8oIGuFGuS&q=85&s=7630d02d647cd175c34ac42684f5df75" alt="Una reserva con Date, Time y Customer, sin ID." width="1920" height="873" data-path="images/product-guide/en/sheets-simple-bookings-after.png" />

<img src="https://mintcdn.com/muhammadtest/nStPtyl8oIGuFGuS/images/product-guide/en/sheets-simple-availability-after.png?fit=max&auto=format&n=nStPtyl8oIGuFGuS&q=85&s=9b5685742dc1fdc27cd512178fa2c8b3" alt="El horario elegido deja de estar disponible." width="1920" height="873" data-path="images/product-guide/en/sheets-simple-availability-after.png" />

Pregunta después: “Could my friend Sam Demo also book that same 10:00 AM slot?” El agente debe ofrecer otras horas sin agregar otra reserva para las 10:00.

<img src="https://mintcdn.com/muhammadtest/nStPtyl8oIGuFGuS/images/product-guide/en/sheets-simple-chat-occupied.png?fit=max&auto=format&n=nStPtyl8oIGuFGuS&q=85&s=3206fa19065889a3a6761bc7ac906177" alt="El agente ofrece alternativas al horario ocupado." width="1920" height="873" data-path="images/product-guide/en/sheets-simple-chat-occupied.png" />

Las capturas corresponden a una prueba local controlada. Se deshabilitó su planificador para aislar la ejecución de herramientas; no es un paso de configuración para clientes ni una validación del enrutamiento en producción. Una escalación puede ocurrir antes de que el agente de respuesta reciba sus herramientas.

## 7. Revisa qué ocurrió

Abre **Acciones → Historial**, filtra por **Book a haircut** y abre la ejecución de prueba. Comprueba **Live**, **Completed** y **Spreadsheet changes verified**.

<img src="https://mintcdn.com/muhammadtest/nStPtyl8oIGuFGuS/images/product-guide/en/sheets-simple-history.png?fit=max&auto=format&n=nStPtyl8oIGuFGuS&q=85&s=ebcc613027fd5909edb2b00bd028507b" alt="Ejecución de la reserva en el historial de Acciones." width="1512" height="772" data-path="images/product-guide/en/sheets-simple-history.png" />

En sus detalles, revisa los valores enviados y la respuesta. La solicitud contiene Date, Time y Customer mediante sus claves internas de columna; no hace falta que el cliente proporcione un ID de horario. Un resultado verificado significa que las celdas cambiadas se leyeron correctamente después de escribir. No confirma pagos ni reservas en otro sistema.

<img src="https://mintcdn.com/muhammadtest/nStPtyl8oIGuFGuS/images/product-guide/en/sheets-simple-execution.png?fit=max&auto=format&n=nStPtyl8oIGuFGuS&q=85&s=6bc138a416ab4710539a671939c77b56" alt="Valores enviados y resultado verificado." width="1512" height="772" data-path="images/product-guide/en/sheets-simple-execution.png" />

Pulsa **Open conversation** para ver la solicitud del cliente, la respuesta y la actividad de las acciones juntas. Abre allí los detalles de la acción de reserva para relacionar su ejecución con el mensaje que la inició.

<img src="https://mintcdn.com/muhammadtest/nStPtyl8oIGuFGuS/images/product-guide/en/sheets-simple-conversation.png?fit=max&auto=format&n=nStPtyl8oIGuFGuS&q=85&s=81724f0dfdc9a465dc44975656f160f4" alt="Detalle de conversación con la solicitud y la acción completada." width="1512" height="772" data-path="images/product-guide/en/sheets-simple-conversation.png" />

<img src="https://mintcdn.com/muhammadtest/nStPtyl8oIGuFGuS/images/product-guide/en/sheets-simple-conversation-execution.png?fit=max&auto=format&n=nStPtyl8oIGuFGuS&q=85&s=c6d2b6ba8ab4c87caaa29f4238e58143" alt="La misma ejecución de reserva abierta desde la conversación." width="1512" height="772" data-path="images/product-guide/en/sheets-simple-conversation-execution.png" />

La barra lateral local muestra un error de tiempo de espera de un panel de información independiente. La reserva en la hoja sí está verificada en el detalle del mensaje y en el historial de Acciones. Una cita en Google Sheets no crea una reserva en Visito Commerce.

## Mantén una hoja sencilla y fiable

* **Otro día:** agrega filas Date y Time a Availability y copia la fórmula. No necesitas crear IDs ni actualizar una lista de IDs permitidos.
* **Formato consistente:** `10:00` y `10 AM` son textos distintos. El agente debe copiar los valores exactos de la hoja.
* **Reiniciar una demostración:** borra los valores de la fila de prueba en Bookings, conservando los encabezados. Available vuelve a 1. No borres reservas reales para reiniciar una prueba.
* **Más barberos:** agrega Barber a ambas pestañas, inclúyela en la fórmula y selecciona Date + Time + Barber como combinación única. Date + Time sola representa una cita para toda la pestaña.
* **No habilites Actualizar en las columnas únicas.** Este ejemplo no implementa cambios de horario, cancelaciones, pagos ni varias plazas por horario.

<Warning>
  La regla de unicidad bloquea combinaciones duplicadas en escrituras de Visito. No comprueba que Date + Time exista en otra pestaña, no impide ediciones manuales en Google Sheets y no convierte la hoja en un sistema completo de agenda. Conserva las instrucciones de consulta de disponibilidad, revisa las reglas del negocio y nunca reintentes automáticamente una escritura sin verificar.
</Warning>


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