Módulo de Webhooks de Resend
Maneja los eventos de webhooks de Resend para Next.js App Router. Es independiente de los otros módulos de email.
Dependencias
svix(se usa para verificar la firma del webhook; es lo mismo que usa Resend para firmar los payloads de sus webhooks)
Archivos
| Archivo | Propósito |
|---|---|
types.ts | Tipo de evento y forma del payload |
service.ts | Lógica interna: verifica y parsea el payload entrante. No lo importes directamente. |
actions.ts | Una función handler por evento: editalas para agregar tu propia lógica |
route.ts | Punto de entrada delgado: verifica la firma y despacha a actions.ts. Ubicalo en app/api/webhooks/resend/route.ts |
.env.local | Variables de entorno |
Arquitectura
route.ts nunca contiene lógica de negocio: solo verifica el request y llama a la función correspondiente en actions.ts. Así el manejo de eventos se edita en un solo lugar (actions.ts) sin tocar la verificación de la firma.
Resend → route.ts (verify + dispatch) → actions.ts (your logic per event)
Variables de entorno
RESEND_WEBHOOK_SECRET=
Configuración (pasos en el dashboard)
- En el dashboard de Resend, andá a Webhooks → Add Webhook.
- Definí la URL del endpoint como
https://yourdomain.com/api/webhooks/resend. - Seleccioná los eventos:
email.sent,email.delivered,email.bounced,email.failed,email.opened,email.clicked. - Copiá el Signing Secret en
RESEND_WEBHOOK_SECRET.
Uso
Editá el handler del evento que te interese en actions.ts:
export async function onEmailBounced(event: ResendWebhookEvent) {
// e.g. mark the recipient's address as invalid in your database
await db.user.update({
where: { email: event.data.to[0] },
data: { emailValid: false },
});
}
No hace falta cambiar ningún otro archivo: route.ts lo va a llamar automáticamente cuando llegue el evento correspondiente.