Llevar una app a producción consiste en apilar capas sobre lo que ya funciona. El diagrama de abajo muestra el orden: empezar por la app en línea, protegerla con autenticación y RLS, monetizarla con pagos y, por último, conectar workflows externos mediante un webhook.
Diagrama ilustrativo — recreación conceptual de las capas de producción, no es una captura de pantalla real.
🛡️ Por qué autenticar
Una app sin inicio de sesión es una app abierto: cualquier persona con la URL puede activar el workflow y consumir tus tokens de IA, y tú pagas por el uso de los demás. Autenticarse resuelve dos problemas a la vez: protege el uso (solo los usuarios registrados activan el backend) y protege los datos (cada quien solo ve lo suyo).
💡 El riesgo de la app abierta
Mientras la app esté sin autenticación en producción, cualquiera puede consumir tus tokens. Agregar el inicio de sesión es el primer paso de la «producción real»: antes de pensar en ingresos, cierras la puerta.
- •Uso: solo los usuarios autenticados activan el workflow.
- •Datos: cada usuario tiene los suyos, aislados de los demás.
- •Costo: dejas de pagar por el consumo de desconocidos.
✗ App abierta en producción
- ✗Cualquier URL compartida se convierte en consumo de tus tokens.
- ✗Sin usuarios, no hay forma de aislar los datos.
- ✗Sin iniciar sesión, no hay forma de cobrar después.
✓ App autenticada
- ✓El inicio de sesión/registro filtra quién activa el backend.
- ✓Cada usuario tiene datos propios y protegidos.
- ✓Base lista para niveles gratis y pagos.
🎯 Consejo práctico
No dejes una app sin autenticación en línea durante mucho tiempo. El inicio de sesión es la primera capa de producción; todo lo demás (seguridad más detallada, pagos) se apoya en ella.
🔑 Autenticación con Supabase
O Supabase entra como proveedor de base de datos y autenticación: en Plan Mode, le pides a la IA que agregue el inicio de sesión y el registro a la app usando Supabase. En la plataforma, creas el proyecto y defines el contraseña de la base de datos (distinta de la contraseña de inicio de sesión) y eliges la región.
Configuración de Supabase
Crear el proyecto
Define la contraseña de la base de datos (¡distinta de la contraseña de inicio de sesión!) y elige la región más cercana a tus usuarios.
Copiar URL + publishable key
Obtén la project URL y la publishable key de Supabase para usarlas como variables de entorno.
Agregar como env vars en Vercel
Agrega la URL y la key como variables de entorno en Vercel y vuelve a implementar para que el frontend conozca Supabase.
⚠️ Atención
- ✗La contraseña de la base de datos no es la contraseña de inicio de sesión; guarda ambas por separado.
- ✗Secretos solo en env vars; nunca en el código del frontend ni en el chat.
Base de datos + autenticación listas.
≠ contraseña de inicio de sesión.
Cerca del usuario.
Variables de entorno en Vercel.
🧱 Row-Level Security (RLS)
Row-Level Security son reglas que viven dentro de la base de datos, no en el código de la interfaz. Garantizan que cada usuario solo vea sus propias filas, incluso si hay un error en el frontend. Es una capa de defensa que no depende de que el código de la pantalla sea perfecto: un bloqueo en el nivel más profundo.
✗ Sin RLS
- ✗Un bug en el frontend puede filtrar datos de otro usuario.
- ✗La seguridad depende por completo del código de la pantalla.
- ✗Un solo fallo expone toda la base de datos.
✓ Con RLS activo
- ✓La base de datos rechaza devolver filas de otro usuario.
- ✓Defensa en profundidad: una barrera adicional además del frontend.
- ✓Aislamiento por fila, en el nivel más bajo.
🧭 Defensa en profundidad
Una buena seguridad no confía en una sola capa. RLS se suma a la autenticación: aunque se eluda el inicio de sesión o haya un error en la pantalla, la base de datos sigue rechazando lo que no pertenece al usuario. Activa RLS en la tabla y haz una prueba.
🎯 Consejo práctico
Trata el RLS como innegociable: actívalo desde el inicio y confirma en la auditoría de seguridad que esté habilitado en todas las tablas con datos de usuario.
No en el frontend.
Aísla datos.
Defensa en profundidad.
En la tabla, y probar.
🗄️ Migración SQL y URLs de autenticación
Dos configuraciones hacen que la autenticación funcione de principio a fin. La migración SQL: ejecutar en el SQL editor de Supabase el SQL generado por la IA para crear la tabla (p. ej., la tabla de leads). Y las URLs de autenticación: configurar la URL de la app (Vercel) y la redirect URL, para que el inicio de sesión vuelva correctamente a la app.
-- migração gerada pela IA create table leads ( id uuid primary key default gen_random_uuid(), user_id uuid references auth.users not null, empresa text, score int, created_at timestamptz default now() ); -- liga o Row-Level Security alter table leads enable row level security;
🗄️ Migración SQL
- •Abre el editor SQL de Supabase.
- •Pegar y ejecutar el SQL generado por la IA.
- •Confirma la tabla creada (por ejemplo, leads).
🔗 URLs de autenticación
- •Define la URL de la app (la de Vercel).
- •Define la redirect URL del inicio de sesión.
- •En authentication → URL configuration.
🎯 Consejo práctico
Si el inicio de sesión «funciona» pero no vuelve a la app, casi siempre el sospechoso es la redirect URL. Confirma que la URL de Vercel y la de redirección sean exactas en la configuración de auth de Supabase.
Ejecuta la migración.
Creada con SQL.
La de Vercel.
Vuelve del inicio de sesión.
🔎 Auditoría de seguridad
Antes de continuar, haz una auditoría explícita: limpia la conversación y pídele a la IA que actúe como especialista en seguridad y revise la app. Una auditoría solicitada a propósito detecta vulnerabilidades que pasan desapercibidas en el día a día y te da una lista clara de lo que debes corregir.
La lista de verificación de la auditoría
Rutas protegidas
Confirma que las páginas/endpoints sensibles exijan un usuario autenticado.
Ninguna clave expuesta
Garantizar que ninguna clave de API aparezca en el frontend (que se ejecuta en el navegador del usuario).
Secretos solo en env vars
Verificar que todos los secretos provengan de variables de entorno, nunca del código versionado.
RLS activo
Verifica que Row-Level Security esté activado en todas las tablas con datos de usuarios.
✓ Auditoría aprobada
- ✓Las rutas sensibles requieren iniciar sesión.
- ✓Nada de claves en el frontend.
- ✓RLS confirmado en todas las tablas.
✗ Señales de alerta
- ✗Endpoint accesible sin autenticación.
- ✗La secret key llega al navegador.
- ✗Tabla con datos de usuario sin RLS.
🎯 Consejo práctico
Pide la auditoría con un alcance explícito («revisa las rutas protegidas, las claves expuestas, los secretos en env y RLS»). Cuanto más específica sea la solicitud, más útil será el informe; corrige todo lo que falle antes de avanzar.
💳 Stripe: modelo freemium
Con el Stripe, la aplicación se convierte en un SaaS: un modelo freemium con un tier gratis limitado y un tier pago por suscripción, vía Stripe Checkout. La motivación es la misma que para la autenticación —limitar el uso para que no pagues por el consumo ilimitado de IA de los usuarios—, pero ahora con ingresos del otro lado.
🆓 Tier gratis
Limitado; por ejemplo: 2 calificaciones de leads por día.
- •Permite probar la app.
- •El límite controla tu costo de tokens.
⭐ Tier pro
Suscripción — p. ej.: US$ 29/mes, cualificaciones ilimitadas.
- •Cobro recurrente mediante Checkout.
- •Ingresos que sostienen la app.
🧭 De workflow a producto
El pago completa la transición: lo que empezó como "solo un workflow" ahora es una app que puede generar ingresos. En Plan Mode, la IA crea los paquetes, las env vars, las tablas, el cliente/servidor de Stripe y la página de precios, y actualiza la navbar.
🎯 Consejo práctico
Piensa en el freemium como dos objetivos complementarios: el nivel gratis protege tus costos y el nivel de pago genera ingresos. Define el límite del nivel gratis teniendo en cuenta el consumo real de tokens.
Gratis + de pago.
Controla el costo.
Recurrente.
Flujo de pago.
🧾 Producto, claves y webhook de Stripe
La integración de Stripe reúne cuatro piezas que vienen de distintos momentos. Creas el producto recurrente y copia el price ID; toma las claves (publicable + secreta); crea el webhook apuntando a tu URL con los eventos correctos; y ejecuta la migración de la tabla de suscripciones en Supabase.
Las piezas de la integración
Producto recurrente + price ID
Crea un producto de suscripción mensual, define el precio y copia el price ID.
Claves: publishable + secret
En developers → API keys, copia la publishable key y la secret key.
Webhook + eventos + webhook secret
Crea un endpoint que apunte a la URL de Vercel + /api/stripe-webhook, escuchando checkout.session.completed y los eventos de suscripción; copia el webhook secret.
Migración de la tabla de suscripciones
Ejecuta el SQL generado para crear la tabla de subscriptions y agrega las cuatro claves como variables de entorno en Vercel; vuelve a hacer el deploy.
⚠️ Atención
- ✗Usa la URL exacta del webhook que proporcionó la IA; no inventes una.
- ✗Mantén un bloc de notas para pegar las claves/ID durante el proceso.
- ✗Prueba el checkout con una tarjeta de prueba (fecha futura, cualquier CVC).
Del producto.
Publishable + secret.
Eventos + secret.
Tabla en la base de datos.
🪝 Frontend para workflow de n8n
Para darle una interfaz atractiva a un workflow de n8n, el patrón es cambiar dos nodos: el primero (el formulario) por un Webhook trigger, y el último por un nodo "Respond to Webhook". El frontend (generado y mejorado con la skill de diseño) envía los datos a la URL del webhook y muestra la respuesta; está conectado mediante una env var en Vercel.
Convertir el workflow + conectar el frontend
Cambiar el primer nodo por un Webhook
Quita el nodo de formulario y agrega un Webhook trigger, conectándolo a la lógica existente.
Cambiar el último nodo por "Respond to Webhook"
Quita el nodo de salida final y agrega "Respond to Webhook" para devolver la respuesta al frontend.
Publicar y copiar la URL de producción
Publica el workflow en n8n y copia la URL de producción del webhook (no la de prueba).
Conectar mediante una variable de entorno en Vercel
Agrega la URL del webhook de n8n como env var en Vercel y vuelve a hacer el deploy; prueba completando el formulario en producción.
🎯 Consejo práctico
El patrón para conectar cualquier workflow de n8n a un sitio siempre es el mismo: reemplaza el primer y el último nodo por webhooks. Confirma que el workflow esté publicado antes de copiar la URL y usa siempre la de producción.
Reemplaza el formulario.
Devuelve la respuesta.
URL publicada.
Conecta en Vercel.
🪜 Iteración incremental (recap)
Todo el recorrido es una lección de iteración incremental: la app empezó como un prompt de una frase y creció por capas — diseño → autenticación → pago → integración. La buena ingeniería es así: empezar en pequeño, publicar pronto y escalar según la necesidad, sin planificarlo todo de una vez.
Las capas, en orden
App + diseño
De la idea a la app en línea, con un diseño profesional que se aleja del aspecto típico de la IA (Módulo 4.1).
Autenticación + seguridad
Usuarios reales con sus datos protegidos: Supabase, RLS y auditoría.
Pago + integración
Ingresos por suscripción con Stripe y workflows externos conectados mediante webhook.
✓ Iteración incremental
- ✓Empezar poco a poco y publicar la primera versión.
- ✓Crece por capas, una feature a la vez.
- ✓Recopilar feedback real entre las capas.
✗ Big bang
- ✗Intentar planificar todo antes de publicar nada.
- ✗Agregar diseño, auth y pagos de una sola vez.
- ✗Aplazar el lanzamiento esperando la «versión perfecta».
🎯 Consejo práctico
Resultado de la ruta: puedes conectar un backend/lógica a un frontend atractivo que la gente realmente usa. No necesitas planificar todo de antemano: publica algo pequeño y crece por capas.
Autocuración (opcional): ¿por qué Row-Level Security es una capa adicional de seguridad?
📌 Resumen del módulo
Fin de la ruta:
Pasaste del concepto a una app real publicada, con automatizaciones, deploy, autenticación y pagos. Es hora de construir la tuya.