Flujos
Landing e interés
Cómo la landing en Vercel valida el envío del formulario y cómo FastAPI registra el interés confirmado en PostgreSQL.
Resumen
La landing se ejecuta en Vercel (Next.js). Si el destinatario confirma su interés, el navegador llama al Route Handler /api/interest, que aplica rate limiting con Upstash, valida Cloudflare Turnstile y reenvía la operación autenticada a api.medinodo.com. Allí FastAPI valida la relación campaña-suscriptor, evita duplicados y registra el evento en el esquema med_tracking.
Flujo de registro de interés
Explicación paso a paso
Confirmación
El destinatario confirma su interés en la landing servida por Vercel.
Rate limit
El Route Handler /api/interest aplica rate limiting distribuido con Upstash Redis.
Anti-abuso
Valida Cloudflare Turnstile para descartar automatización abusiva.
Reenvío autenticado
Reenvía la operación autenticada a api.medinodo.com; Cloudflare Tunnel la conduce hasta FastAPI.
Validación e idempotencia
FastAPI valida que la campaña y el suscriptor existan, evita duplicados y registra el evento en med_tracking.
Capas de validación
Rate limit
Upstash limita la frecuencia de envío por cliente.
Turnstile
Descarta envíos automatizados abusivos.
Idempotencia
Valida campaña-suscriptor y evita duplicados.
Errores posibles
- Rate limit excedido: el envío se rechaza en Vercel antes de llegar a FastAPI.
- Verificación de Turnstile fallida: el formulario no se procesa.
- Campaña o suscriptor inexistentes: FastAPI rechaza el registro.
- Intento duplicado: la idempotencia evita registrar dos veces el mismo interés.
Buenas prácticas
- Encadenar las validaciones en el borde (rate limit y Turnstile) antes de invocar a FastAPI, para no gastar recursos del backend en solicitudes abusivas.
- Mantener el reenvío a
api.medinodo.comautenticado y a través del Tunnel, nunca exponiendo FastAPI directamente.
Consideraciones
El interés vive en med_tracking
El registro de interés se persiste en el esquema propio med_tracking, separado de los datos operativos de listmonk. Ver Base de datos.