Resend — Infraestructura de Email
SSOT. Cualquier otro doc que contradiga este pierde. Reemplaza: Loops.so (T68/T75/T76 superseded), SendGrid (migrado). Ticket de implementación: T153 (Hito Junio, Effort L).
Decisión
| Campo | Valor |
|---|---|
| Proveedor anterior | Loops.so |
| Proveedor nuevo | Resend |
| Motivo principal | API developer-first, React Email nativo, entregabilidad enterprise, Auth0 integration, plugin Claude Code oficial |
| Fecha decisión | 2026-05-28 |
| Tickets absorbidos |
Alcance de T153
Un solo ticket, Effort L, absorbe todo el stack de email:
| Componente | Detalle |
|---|---|
| DNS + dominio | SPF, DKIM, DMARC vía panel Resend |
email.server.ts | SDK resend + wrapper tipado; env var RESEND_API_KEY |
| React Email templates | 15 templates (3 secuencias × 5 emails) en ES/EN |
| Lifecycle events | 13 eventos de ciclo de vida (phase-aware, absorbe T23) |
| Migración SendGrid | Export contacts → import en Resend; baja SendGrid |
| Webhooks inbound | /api/email/webhook para eventos de entrega |
Secuencias de email (Hito 1)
| Secuencia | Trigger | Emails | Flow |
|---|---|---|---|
| A — Post auto-test | source=auto-test en /api/leads | 5 (ES/EN) | Flow A |
| B — Post guía | source=guias en /api/leads | 5 (ES/EN) | Flow B |
| C — Post waitlist | source=waitlist en /api/leads | 5 (ES/EN) | Flow C |
Cada secuencia dispara desde POST /api/leads → email.server.ts → Resend API.
Lifecycle events (Hito 4 / T153 prep)
Eventos phase-aware que se activan en producción con Stripe:
| # | Evento | Momento |
|---|---|---|
| 1 | welcome_capsule_zero | Signup Cápsula Cero |
| 2 | capsule_complete | Cápsula Cero finalizada |
| 3 | urgency_72h | 72h post-cápsula |
| 4 | purchase_confirmed | Stripe webhook payment_intent.succeeded |
| 5 | phase_1_start | Ritual Core fase 1 desbloqueada |
| 6 | phase_2_start | Ritual Core fase 2 desbloqueada |
| 7 | phase_3_start | Ritual Core fase 3 desbloqueada |
| 8 | phase_4_start | Ritual Core fase 4 desbloqueada |
| 9 | subscription_renewal | Renovación mensual |
| 10 | subscription_cancel_confirm | Confirmación de baja |
| 11 | password_reset | Reset de contraseña (Auth0 + Resend) |
| 12 | email_verification | Verificación de email (Auth0 + Resend) |
| 13 | reengagement_30d | 30 días sin actividad |
Integración Auth0
Resend está integrado con Auth0 como custom email provider. Emails de autenticación (verificación, reset de contraseña) van por Resend.
- Setup: Dashboard Auth0 → Email Provider → Resend +
RESEND_API_KEY - Avanzado: Auth0 Actions con Resend SDK para sender por organización
- Monitor: todos los envíos visibles en dashboard Resend
Plugin Claude Code
Resend tiene plugin oficial para Claude Code:
# Instalar
claude plugin install resend@claude-plugins-official
# Config (~/.claude/config.json)
{ "env": { "RESEND_API_KEY": "re_xxxxxxxxx" } }Capacidades del plugin disponibles en sesión:
- Resend SDK (APIs, contacts, domains)
- React Email (template dev)
- Email best practices (SPF/DKIM/DMARC, deliverability)
- Agent Email Inbox (inbound processing)
- Resend CLI (CI/CD)
Configuración de entorno
| Variable | Entorno | Descripción |
|---|---|---|
RESEND_API_KEY | production, preview | API key de Resend (re_...) |
RESEND_FROM_EMAIL | production, preview | Sender: hola@thefittclub.com |
RESEND_DOMAIN | production, preview | thefittclub.com (verificado DNS) |
Secretos en Cloudflare Workers secrets (no en .env).
Buenas prácticas (Resend docs)
- Templates en React Email → compilados a HTML/texto antes de enviar
- Autenticación DNS: SPF + DKIM + DMARC antes de ir a producción
- Webhooks firmados (header
Resend-Signature) validados en/api/email/webhook - Rate limit: Resend gestiona el throttling; no reintentar manualmente en el worker
- Entregabilidad: Tailwind UI usa Resend en producción — “email infrastructure is something we don’t want to think about”
Referencias
- Resend Claude Code Plugin
- Auth0 Integration
- Savour newsletter by Resend
- Tailwind UI caso de uso
- Ticket: T153 —
_docs/03-tickets/01-pending/153-resend-email-infra.md