Qué recordamos
Sesiones, inscripciones, pedidos, productos, eventos y trabajos pendientes.
Clase 6 · De demo a producto I
Pasamos de archivos y demostraciones a un producto que guarda estados en Supabase, protege cada fila y ejecuta procesos visuales en n8n sin duplicar efectos.
Arquitectura mínima
Supabase en lenguaje de negocio
Sesiones, inscripciones, pedidos, productos, eventos y trabajos pendientes.
Una inscripción de una persona a una clase, con estado y consentimiento.
La base aplica la regla incluso si el frontend comete un error.
“Inscribir en una clase” valida identidad, sesión, consentimiento y agenda en una transacción.
Optimiza patrones reales como “trabajos en cola listos para ejecutar”.
Estados inválidos, duplicados o referencias a una sesión inexistente.
Anon, authenticated y service role
| Modo | Uso correcto | No debe hacer |
|---|---|---|
| Anon | Cargar contenido público e iniciar autenticación. | No bypass de RLS ni credenciales administrativas. |
| Authenticated | Registrar la sesión elegida usando el JWT de esa persona. | No leer inscripciones ajenas ni ejecutar trabajos del servidor. |
| Service role | n8n, migraciones, backfills y jobs deliberadamente administrativos. | Nunca aparecer en HTML, JavaScript del navegador, logs públicos o Analytics. |
n8n como orquestador
Schedule o webhook con método, ruta, autenticación y respuesta explícitos.
EntradaReclama un trabajo pendiente de forma atómica y evita que dos workers lo tomen.
LockConstruye el payload sin mezclar datos personales con telemetría.
DatosLlama al proveedor con timeout, respuesta completa y error observable.
EfectoGuarda accepted, retry o dead_letter según la respuesta real.
EstadoCentraliza alertas y contexto de diagnóstico sin fingir éxito.
OperaciónIdempotencia
Una persona + una sesión + un tipo de recordatorio producen una sola identidad lógica.
La base inserta o actualiza en una operación, sin “consultar y luego decidir”.
Cada worker reclama un trabajo diferente sin esperar ni duplicar.
Accepted no significa delivered. El estado conserva lo que el proveedor realmente confirmó.
idempotency_key = session_id + ':' + user_id + ':' + reminder_key
Estados del job:
queued → processing → accepted
↘ queued (retry)
↘ dead_letter
unsubscribed → cancelledUna clave idempotente representa la intención del negocio, no el intento técnico: por ejemplo, inscripción + clase + tipo de recordatorio. Dos clics o un timeout pueden producir varios intentos, pero deben converger en una sola inscripción y un solo trabajo pendiente. El historial conserva los intentos sin multiplicar el efecto externo.
Interacción · Verdad operacional
Laboratorio de punta a punta
La prueba termina con dos recorridos: el feliz confirma identidad, persistencia, cola y respuesta; el de recuperación repite la misma petición, simula proveedor caído y demuestra que el estado puede reanudarse sin duplicar. Un HTTP 200 aislado no acredita ninguno de los dos recorridos.
Observabilidad
| Pregunta | Fuente de verdad |
|---|---|
| ¿Quién se inscribió? | Fila confirmada por el RPC autenticado. |
| ¿Qué aceptó? | Texto, versión, timestamp y landing de origen. |
| ¿Qué se programó? | Jobs únicos por sesión y recordatorio. |
| ¿Qué intentó n8n? | Ejecución y transición del job. |
| ¿Qué aceptó el proveedor? | Status, mensaje del proveedor y timestamp. |
| ¿Qué midió GA4? | Señal agregada sin PII; nunca reemplaza la base operacional. |
Puente a la clase 7
En la última clase montamos el sistema en un VPS, conectamos dominio y HTTPS, protegemos secretos y desplegamos con backup, validación y rollback.