Barbería Odiseo × Notion
Una app de reservas cuyas citas confirmadas aparecen solas como filas en una base de datos de Notion, filtrable por día y visible en Notion Calendar.
La idea del módulo
Una integración con una herramienta externa no solo trae datos hacia tu app: también puede publicar lo que ocurre en la app dentro de la herramienta que el negocio ya usa para organizarse. El barbero no aprende una interfaz nueva — sigue mirando su Notion de siempre.
Datos fijos del ejemplo
- Barbería: Odiseo
- Barbero: Diego — es el único, así que no hace falta selector de barbero
- Servicios: Corte clásico ($15) · Arreglo de barba ($10) · Corte + barba ($22)
- Horario: lunes a sábado, 9:00–19:00
- Base de Notion destino: Agenda Odiseo
Se descarta el conector OAuth nativo para Notion. En su lugar se usa una integración interna de Notion con API key. La base de datos “Agenda Odiseo” se crea a mano y vacía; Horizons solo se conecta a ella, completa las propiedades que falten y escribe las filas.
Configuración previa (una sola vez)
Esto se hace antes de escribir cualquier prompt en Horizons.
-
Crea la integración en Notion
Entra a notion.so/my-integrations con la cuenta de la barbería y pulsa + New integration. Dale un nombre (ej.
Horizons – Barbería Odiseo) y asígnala al workspace correcto. - Activa solo los permisos necesarios En Capabilities: Read content, Insert content y Update content. No actives permisos sobre información de usuarios: no se necesitan.
-
Copia el secreto
Guarda el Internal Integration Secret (empieza por
secret_ontn_). Trátalo como una contraseña: nunca se pega en un prompt ni en el chat. - Crea la base de datos vacía En Notion, una base nueva de tipo Tabla llamada Agenda Odiseo. Sin agregarle ninguna propiedad: solo la columna de título por defecto.
-
Comparte la base con la integración
Botón ··· de la base → Conexiones → busca y añade
Horizons – Barbería Odiseo. -
Copia el ID de la base
Está en su URL: el bloque de 32 caracteres antes de
?v=, sin guiones. -
Guarda los dos valores aparte
La API key y el ID van al archivo
.envque Horizons crea en el Prompt 3 — nunca en el chat ni en un documento compartido.
Cómo debe quedar “Agenda Odiseo”
Estado inicial — lo que creas tú a mano: solo la propiedad Nombre de tipo Título.
Estado final — después del Prompt 4:
| Propiedad | Tipo en Notion | Opciones |
|---|---|---|
| Nombre | Título — ya existía | — |
| Servicio | Selección | Corte clásico · Arreglo de barba · Corte + barba |
| Fecha | Fecha | — |
| Hora | Texto | — |
| Estado | Selección | Pendiente · Confirmada · Cancelada |
No renombres ni borres la columna de título por defecto (“Nombre”): toda base de datos de Notion exige exactamente una propiedad de tipo Título, y esa ya cumple ese papel. Horizons solo necesita agregar las otras cuatro.
Los seis prompts
Construyen toda la app desde cero. Uno por uno, comprobando entre cada paso.
Crea una aplicación de citas para Barbería Odiseo. En la pantalla principal, el cliente ve tres servicios como tarjetas seleccionables: Corte clásico ($15), Arreglo de barba ($10) y Corte + barba ($22). Debajo, un formulario con nombre del cliente, fecha y hora. Solo se puede reservar de lunes a sábado, entre las 9:00 y las 19:00, y no se puede elegir un horario que ya tenga una reserva pendiente o confirmada (evita reservas duplicadas en el mismo horario). Guarda cada reserva en una tabla con cliente, servicio, fecha, hora y estado, que empieza siempre en "pendiente". Al confirmarse el envío, muestra un resumen claro de la cita.
Crea una vista privada para el barbero, en una URL distinta a la del cliente, protegida con inicio de sesión de usuario y contraseña. Genera automáticamente una cuenta de acceso para Diego y muéstrame el usuario y la contraseña generados una sola vez, para guardarlos. Solo quien inicie sesión puede ver todas las reservas, ordenadas por fecha y hora, agrupadas por día y con su estado visible, y marcar cada una como "confirmada" o "cancelada". Resalta las reservas de hoy.
Crea un archivo .env en la raíz del proyecto con estas dos variables, sin ningún valor asignado: NOTION_API_KEY= NOTION_DATABASE_ID= No les pongas ningún valor de ejemplo ni me los pidas por chat: yo voy a pegarlos directamente en ese archivo.
.env que Horizons acaba de crear. Nunca en el chat, nunca en un documento que compartas.La base de datos "Agenda Odiseo" ya existe en Notion (ID guardado en NOTION_DATABASE_ID) y está vacía, solo con su columna de título por defecto. Usando la API de Notion con el secreto guardado en NOTION_API_KEY, añade a esa base estas propiedades: Servicio (selección: Corte clásico, Arreglo de barba, Corte + barba), Fecha (fecha), Hora (texto) y Estado (selección: Pendiente, Confirmada, Cancelada). No toques ni renombres la columna de título existente. Esto se ejecuta una sola vez.
Usando la base de datos de Notion guardada en NOTION_DATABASE_ID, crea una fila nueva cada vez que una reserva pase a estado "confirmada": el título de la fila es el nombre del cliente, y completa Servicio, Fecha, Hora y Estado. Si una reserva se cancela, actualiza el estado de su fila en Notion en vez de crear una nueva.
Antes de usar la app con clientes reales, crea cinco reservas de prueba en distintos días y horarios, confirma tres y cancela una. Verifica que las confirmadas aparezcan como filas en "Agenda Odiseo" en Notion, que la cancelada actualice su estado sin duplicarse, y que no se puedan crear dos reservas en el mismo horario. Después, elimina las reservas de prueba.
Dos reglas para no romper nada
- Empieza siempre en el sandbox de Horizons, con datos de prueba — nunca contra la página de Notion que el negocio usa de verdad.
- Si un prompt no sale a la primera, divídelo en dos pasos más pequeños en vez de reintentar el mismo prompt amplio. Reintentar cuesta créditos y suele traer el mismo resultado.