📧 ESTÁNDAR AVANZADO DE CORREOS ELECTRÓNICOS Y ENTREGABILIDAD
🎯 OBJETIVO
Optimizar la entregabilidad a bandeja de entrada (Inbox Rate), gestionar reputación de dominios, procesar eventos de rebote (Bounces) y medir el rendimiento de campañas e emails transaccionales.
🎯 REGLAS INQUEBRANTABLES
[REQUIRED] EMAIL-001: Email Transaccional entregado en < 5 segundos. Todos los correos de sistema (magic links, verificaciones, 2FA) deben encolarse y procesarse con prioridad ultra-alta.
Por qué: un magic link o un código 2FA que tarda minutos en llegar ya expiró para cuando el usuario lo recibe, o el usuario abandonó el flujo antes de que llegara. Encolar y procesar en menos de 5 segundos es lo que mantiene utilizable cualquier flujo que dependa de email.
[REQUIRED] EMAIL-002: Limpieza inmediata de direcciones rebotadas (Bounces / Complaints). Si Resend notifica un rebote duro (hard_bounce) o queja por spam (complaint), la dirección DEBE marcarse como deshabilitada en la base de datos de inmediato.
Por qué: seguir enviando a una dirección que rebotó de forma dura o que marcó el correo como spam no solo es inútil: cada intento fallido adicional daña la reputación del dominio remitente, lo que empieza a afectar la entrega de correos legítimos a otros usuarios.
[REQUIRED] EMAIL-003: Autenticación de Dominio Completa (SPF, DKIM, DMARC p=reject). Queda prohibido enviar correos desde dominios sin registros DMARC configurados.
Por qué: sin SPF, DKIM y DMARC en modo
reject, cualquiera puede enviar correo suplantando tu dominio, y los proveedores de bandeja de entrada tratan ese dominio sin autenticación completa como sospechoso — el correo legítimo empieza a caer en spam junto con el falsificado.
🔔 1. WEBHOOK DE EVENTOS DE EMAIL (RESEND)
// apps/notif-worker/src/webhooks/resend.ts
export async function handleResendWebhook(request: Request, env: Env): Promise<Response> {
const payload = await request.json() as {
type: 'email.sent' | 'email.delivered' | 'email.bounced' | 'email.complained'
data: { email_id: string; to: string[]; created_at: string }
}
switch (payload.type) {
case 'email.bounced':
case 'email.complained': {
const emailAddress = payload.data.to[0]
console.warn(`[EMAIL_BOUNCE_COMPLAINT] Deshabilitando email: ${emailAddress}`)
// EMAIL-002: Marcar como inactivo para proteger la reputación del dominio
await supabase
.from('profiles')
.update({ email_disabled: true, bounce_reason: payload.type })
.eq('email', emailAddress)
break
}
case 'email.delivered':
console.info(`[EMAIL_DELIVERED] ID: ${payload.data.email_id}`)
break
}
return new Response('OK', { status: 200 })
}🧪 2. A/B TESTING DE ASUNTOS DE CORREO
export function selectEmailSubject(userId: string, variantA: string, variantB: string): string {
// Selección determinista 50/50 basada en el ID del usuario
const charCode = userId.charCodeAt(userId.length - 1)
return charCode % 2 === 0 ? variantA : variantB
}📋 CHECKLIST AVANZADO DE EMAIL
- [ ] Registros SPF, DKIM y DMARC
p=rejectvalidados en DNS. - [ ] Webhook de Resend configurado para capturar
email.bouncedyemail.complained. - [ ] Supabase actualiza
email_disabled = trueal recibir un rebote duro. - [ ] Plantillas React Email validadas sin HTML crudo.
- [ ] Tiempo de entrega de emails transaccionales < 5 segundos.