Resend en Producción: Patrones Avanzados que el Tutorial Básico No Te Enseña

Resend en Producción: Patrones Avanzados que el Tutorial Básico No Te Enseña

Programming· 3 min read

Tu Setup Básico de Resend Falla en Producción. Aquí Está Por Qué

Tienes la API key. Enviaste tu primer email. Funciona en local.

Luego llegas a producción y empiezan los problemas reales.

Emails que se pierden sin error visible. Webhooks que no se procesan. Templates que explotan con datos inesperados.

El problema real del email no es enviarlo. Es garantizar que llega, que se procesa, y que sabes cuándo falla.

Esto es lo que el tutorial básico de Resend no te cuenta.

---

Patrón #1: Webhooks con Verificación de Firma

La mayoría de developers conectan el webhook de Resend directamente a su API sin verificar la firma.

Cualquiera puede hacer un POST a tu endpoint y simular eventos falsos.

Enfoque peligroso:

[@portabletext/react] Unknown block type "code", specify a component for it in the `components.types` prop

Verificación de firma con Svix (que usa Resend internamente):

[@portabletext/react] Unknown block type "code", specify a component for it in the `components.types` prop

Instala `svix` como dependencia. Resend firma todos los webhooks con este estándar.

El secret lo encuentras en el dashboard de Resend bajo tu webhook endpoint.

---

Patrón #2: Cola de Emails con Reintentos Inteligentes

Enviar emails directamente desde una Server Action o API route es el error más común en producción.

Si la llamada a Resend falla, pierdes el email para siempre.

El patrón correcto usa una cola de trabajos.

Implementación con Inngest

[@portabletext/react] Unknown block type "code", specify a component for it in the `components.types` prop
[@portabletext/react] Unknown block type "code", specify a component for it in the `components.types` prop

Resultado: Si Resend devuelve un error 5xx, Inngest reintenta automáticamente con backoff exponencial. Cero emails perdidos.

---

Patrón #3: Templates con React Email y Type Safety

El real problema de los templates de email no es el diseño. Es que explotan silenciosamente con props inesperadas.

La solución es tipar completamente tus componentes de React Email.

[@portabletext/react] Unknown block type "code", specify a component for it in the `components.types` prop
[@portabletext/react] Unknown block type "code", specify a component for it in the `components.types` prop

Con este patrón, un cambio en la interfaz del template rompe en compilación, no en producción a las 3am.

---

Patrón #4: Monitorización de Deliverability con Webhooks

Saber que enviaste el email no es suficiente. Necesitas saber si llegó.

Resend emite estos eventos via webhook:

email.sent — El email salió de Resend

email.delivered — El servidor destino lo aceptó

email.opened — El destinatario lo abrió (requiere tracking pixel)

email.bounced — Rebote permanente — elimina este email de tu lista

email.complained — Marcado como spam — acción urgente requerida

[@portabletext/react] Unknown block type "code", specify a component for it in the `components.types` prop

Ignorar bounces y complaints destruye tu reputación de dominio. Los ISPs como Gmail y Outlook penalizan dominios con tasa alta de complaints. Un complaint rate por encima del 0,1% activa filtros automáticos.

---

Patrón #5: Batch Sending para Notificaciones Masivas

Cuando necesitas enviar emails a miles de usuarios, no hagas un bucle con resend.emails.send en cada iteración.

Enfoque que agota el rate limit:

[@portabletext/react] Unknown block type "code", specify a component for it in the `components.types` prop

Batch con control de concurrencia:

[@portabletext/react] Unknown block type "code", specify a component for it in the `components.types` prop

p-limit controla la concurrencia. Promise.allSettled captura fallos individuales sin abortar el batch completo.

---

Variables de Entorno para un Setup Completo

[@portabletext/react] Unknown block type "code", specify a component for it in the `components.types` prop

Nunca hardcodees la API key. Nunca la incluyas en client-side code — Next.js server-only o Edge Functions exclusivamente.

---

Resumen: El Setup de Producción Completo

Verifica firmas en todos los webhooks con svix — seguridad no opcional

Usa una cola (Inngest, Trigger.dev, o BullMQ) — cero emails perdidos por fallos transitorios

Tipa tus templates con React Email — errores en compilación, no en runtime

Procesa bounces y complaints — tu reputación de dominio depende de esto

Controla concurrencia en envíos masivos con p-limit — respeta los rate limits

El email transaccional bien implementado es infraestructura invisible: nadie lo nota cuando funciona. Todo el mundo lo nota cuando falla.

Resend te da las herramientas. Estos patrones garantizan que las uses correctamente en producción real.

Brian Mena

Brian Mena

Software engineer building profitable digital products: SaaS, directories and AI agents. All from scratch, all in production.

LinkedIn