Módulo 2 · Integración externa

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.

6 prompts API key de Notion Variables de entorno Panel con login

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
Decisión técnica

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.

  1. 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.
  2. 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.
  3. Copia el secreto Guarda el Internal Integration Secret (empieza por secret_ o ntn_). Trátalo como una contraseña: nunca se pega en un prompt ni en el chat.
  4. 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.
  5. Comparte la base con la integración Botón ··· de la base → Conexiones → busca y añade Horizons – Barbería Odiseo.
  6. Copia el ID de la base Está en su URL: el bloque de 32 caracteres antes de ?v=, sin guiones.
  7. Guarda los dos valores aparte La API key y el ID van al archivo .env que 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:

PropiedadTipo en NotionOpciones
NombreTítulo — ya existía—
ServicioSelecciónCorte clásico · Arreglo de barba · Corte + barba
FechaFecha—
HoraTexto—
EstadoSelecciónPendiente · Confirmada · Cancelada
No lo toques

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.

Prompt 1 La app de citas completa
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.
Prueba: intenta reservar un domingo, a las 20:00 y en un horario ya ocupado. Las tres cosas deben rechazarse antes de guardar nada.
Prompt 2 Panel del barbero, con acceso protegido
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.
Guarda las credenciales en cuanto se muestren: Horizons normalmente no vuelve a enseñar la contraseña en texto plano después de crear la cuenta.
Prompt 3 Crear el archivo .env
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.
Después de este prompt pegas tú mismo la API key y el ID en el archivo .env que Horizons acaba de crear. Nunca en el chat, nunca en un documento que compartas.
Prompt 4 Completar la base de datos en Notion
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.
Prueba: abre Notion y mira la base. Las cuatro propiedades nuevas deben estar ahí, con sus opciones exactas, y la columna de título intacta.
Prompt 5 Sincronizar reservas con Notion
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.
Detalle que evita el desastre: cancelar actualiza la fila existente. Sin esa frase, cada cambio de estado crea una fila nueva y la agenda se llena de duplicados.
Prompt 6 Verificación con datos de prueba
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.
Extra en Notion: crea una vista filtrada por la fecha de hoy y otra agrupada por día, y comprueba que las reservas confirmadas se vean en Notion Calendar.

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.