Anatomía de un rebote: soft vs hard, qué los causa y cómo reaccionar

Diferencia técnica entre soft bounce y hard bounce, qué códigos SMTP los identifican, cómo afecta cada uno a la reputación y qué hacer con la lista después de cada rebote.

Por qué un rebote bien procesado cuesta menos que uno mal procesado

Tu lista de envío recibe un bounce y la mayoría de las plataformas SaaS lo procesan automáticamente: lo marcan como inactivo y lo sacan de la lista activa. Eso funciona en el 80% de los casos, pero el 20% restante es donde se rompe la reputación del dominio remitente.

Hay dos errores frecuentes en operaciones de email panameñas que vemos en auditorías: tratar todos los bounces como hard (perdiendo contactos recuperables) o tratar todos como soft (acumulando hard bounces y dañando reputación de IP). Ambos cuestan dinero. El primero pierde revenue legítimo; el segundo cuesta semanas de recovery con Gmail Postmaster cuando la reputación baja a estado Bad.

Este post explica la anatomía técnica de cada tipo de rebote, los códigos SMTP que los identifican, qué hacer en cada caso y cuándo conviene reactivar un contacto previamente rebotado.

Definición técnica: soft vs hard

Un bounce es un mensaje de no-entrega que devuelve el servidor receptor al remitente. Técnicamente, todos los bounces son notificaciones MAIL FROM al return-path declarado en el envelope SMTP. La distinción soft/hard no es del protocolo SMTP estándar; es una convención de la industria sobre cómo interpretar los códigos de respuesta.

Los códigos SMTP siguen el formato CCC X.Y.Z, donde:

  • CCC: código numérico de 3 dígitos (2xx success, 4xx temporary failure, 5xx permanent failure)
  • X: clase de error (1=address, 2=mailbox, 3=system, 4=network, 5=protocol, 6=content, 7=security)
  • Y.Z: subdetalle específico

La convención operativa:

  • Hard bounce: cualquier código 5xx (rechazo permanente). Implica que la dirección o el dominio receptor no aceptan ni aceptarán el mensaje. Acción: remover el contacto de la lista activa.
  • Soft bounce: cualquier código 4xx (rechazo temporal). Implica condición transitoria que puede resolverse. Acción: reintento con backoff (24-72 horas, hasta 3-5 veces).

El problema es que algunos códigos 5xx en realidad reflejan condiciones temporales (typo del receptor en una regla anti-spam) y algunos códigos 4xx en realidad reflejan condiciones permanentes (mailbox abandonado que sigue rechazando hasta que se purge). De ahí la importancia de no automatizar ciegamente la decisión por el primer dígito.

Los 10 códigos de bounce más frecuentes en operaciones panameñas

De las auditorías de logs de bounce de los últimos 18 meses de clientes CMP, estos son los códigos que cubren el 87% de los rechazos:

550 5.1.1 — Mailbox does not exist (HARD)

La dirección email no existe en el dominio receptor. Causa operativa más frecuente: typo en el formulario de captura de leads o address roleo en una empresa donde el empleado se fue.

Tratamiento: remover de lista en menos de 24 horas. Cualquier reintento daña reputación.

550 5.1.2 — Bad destination system address (HARD)

El dominio receptor no resuelve DNS o el registro MX está mal configurado. Causa: typo del dominio (gmal.com en vez de gmail.com), o dominio que cerró operaciones.

Tratamiento: remover. Para typos detectables (gmial.com, hotnail.com), conviene un script de fuzzy-matching antes de remover, que sugiera la corrección al usuario en el siguiente formulario.

550 5.7.1 — Relaying denied / message rejected (HARD pero matizar)

El servidor receptor rechaza el mensaje por política. Variantes:

  • 550 5.7.1 Message rejected due to content: el contenido activa un filtro permanente (palabras prohibidas, dominio en blocklist). Tratamiento: investigar contenido, no remover contacto.
  • 550 5.7.1 Sender IP rejected: la IP remitente está en blocklist del receptor. Tratamiento: investigar IP, no remover contacto.
  • 550 5.7.1 Relay access denied: configuración. Tratamiento: revisar SPF y SMTP relay.

Tratamiento general: no remover el contacto automáticamente; investigar la causa raíz primero. Si después de revisar contenido e IP el rechazo persiste, entonces sí remover.

550 5.7.26 — DMARC alignment failed (HARD)

El receptor (típicamente Gmail o Yahoo) verificó DMARC y la alineación falló. El mensaje no llega y no llegará hasta que se arregle la autenticación.

Tratamiento: no remover el contacto. Pausar envíos al dominio receptor, revisar SPF/DKIM alignment, corregir, reanudar. Este código apareció masivamente desde febrero 2024 con el enforcement de Gmail/Yahoo bulk sender requirements.

421 4.7.0 — Sender throttled (SOFT, peligroso)

El receptor está aplicando throttling explícito al remitente por reputación pobre o spike de complaints. No es un soft bounce normal: es Gmail diciendo “estás enviando mal, baja el ritmo”.

Tratamiento: pausar campaña inmediatamente si más del 3% del envío recibe 421 4.7.0. Revisar Postmaster Tools, spam rate, IP reputation. Reintentar en este estado garantiza más bounces y daño compuesto a la reputación.

451 4.2.1 — Mailbox temporarily disabled (SOFT)

Buzón temporalmente desactivado por el proveedor (cuenta suspendida, mantenimiento, política temporal).

Tratamiento: reintento con backoff. Después de 5 días seguidos de 451 4.2.1 al mismo destino, tratar como hard bounce.

421 4.2.2 — Mailbox full (SOFT)

Buzón del destinatario lleno.

Tratamiento: reintento por 7 días. Si persiste, mover a inactivo (probabilidad alta de cuenta abandonada). No tratar como hard bounce inmediato; algunos buzones se vacían en pocos días.

552 5.3.4 — Message size exceeds limit (HARD para ese mensaje)

El mensaje excede el tamaño máximo del receptor. Gmail acepta hasta 25 MB, pero proveedores corporativos pueden tener límites de 5-10 MB.

Tratamiento: no remover contacto. Revisar peso del mensaje, optimizar imágenes, considerar enviar versión liviana. Es un problema del envío, no del contacto.

554 5.7.1 — Message contains spam-like content (HARD para ese envío)

El contenido del mensaje activa filtros que lo categorizan como spam permanentemente para ese receptor.

Tratamiento: no remover contacto. Revisar contenido, simplificar HTML, quitar palabras gatillo (free, urgent, $$$, etc.), validar con tools como mail-tester.com antes de reenvío.

250 OK no message accepted — Acceptance with silent drop (HARD enmascarado)

El servidor acepta el mensaje con 250 OK pero después lo descarta silenciosamente. No genera bounce, pero el mensaje nunca llega al destinatario. Difícil de detectar sin Postmaster Tools.

Tratamiento: solo detectable agregando reports de Google Postmaster Tools, comparando deliveries reportadas vs aceptaciones reportadas. Si ratio acceptance/delivery está bajo en un dominio receptor específico, hay drop silencioso.

La matriz de decisión: qué hacer con cada bounce

Matriz de decisión de bounce

Ingresa el código SMTP exacto del bounce que recibiste y obtén el tratamiento recomendado.

El error operativo que vemos en 6 de cada 10 auditorías

La configuración por default en Mailchimp, Brevo y SendGrid maneja bounces así:

  • Hard bounce: 1 ocurrencia → contacto pasa a estado “cleaned” automáticamente
  • Soft bounce: 7 ocurrencias en 30 días → contacto pasa a estado “cleaned”

Esto funciona para operaciones pequeñas (menos de 10.000 envíos mensuales), pero a partir de cierta escala genera dos problemas:

Problema 1: La automatización no distingue 550 5.1.1 (dirección inexistente, remover) de 550 5.7.26 (DMARC failed, problema del remitente). Trata todo como hard y pierde contactos legítimos cuya autenticación se arreglaba en una hora.

Problema 2: La automatización trata todos los 4xx como soft normales, sin detectar el 421 4.7.0 que es throttling crítico. La operación sigue enviando mientras Gmail acumula la señal negativa de “remitente que ignora throttling”.

La solución operativa es agregar una capa de procesamiento de bounce logs propia que distingue por subcódigo, no solo por primer dígito. PowerMTA y KumoMTA permiten esto nativamente con accounting files. Mailchimp y Brevo no, pero exponen webhooks de bounce que un sistema externo puede procesar.

Procesamiento de bounce logs: qué buscar

Cuando recibís el bounce log del MTA (o el webhook de la plataforma), estos son los campos críticos:

timestamp: 2025-01-08T14:32:18Z
recipient: [email protected]
sender: campañ[email protected]
smtp_code: 550
enhanced_status: 5.1.1
diagnostic: "User unknown in virtual mailbox table"
attempts: 1
final: true

Los puntos clave del análisis:

  1. enhanced_status (X.Y.Z): tiene más información que smtp_code. 5.1.1 ≠ 5.7.1 ≠ 5.7.26.
  2. diagnostic: el texto libre del receptor explica la causa real. “User unknown” es diferente a “blocked by policy”.
  3. final: si es false, el MTA reintentará. Si es true, es decisión definitiva.
  4. attempts: cuántos reintentos antes del bounce final. Si >5 con 4xx, el contacto está agotado.

Un dashboard básico de bounce health debería agrupar por:

  • enhanced_status (top 10 códigos)
  • domain del receptor (donde están los problemas)
  • tipo (hard/soft/investigar)
  • tendencia 7/30 días

Si hard bounces sube del 0.3% al 1.2% en una semana, hay calidad de captura cayendo (formulario sin double opt-in, list-broker entrando) y la operación debe pausar nuevas captaciones hasta diagnosticar.

Cuándo conviene reactivar un contacto que rebotó

La pregunta que aparece en cada reunión de planning: ¿podemos recuperar los contactos que limpiamos hace 6 meses?

La respuesta depende del código de bounce original, no del tiempo transcurrido:

Hard 5.1.1 (dirección no existe): probabilidad de recuperación cercana al 0%. Una dirección que no existió hace 6 meses no va a existir ahora. Reactivar es regenerar el bounce.

Hard 5.7.1 por contenido: posible recuperación si el contenido cambió. La dirección existe; solo el mensaje anterior fue rechazado. Conviene re-incluir con campaña nueva tras revisar contenido.

Hard 5.7.26 (DMARC failed): alta probabilidad de recuperación una vez arreglada la autenticación del remitente. La dirección existe; solo la configuración impedía la entrega.

Soft 4.2.2 cerrado como inactivo: probabilidad media-baja (5-15%). Probable cuenta abandonada, pero algunos buzones se vacían tras meses.

Soft 4.7.x cerrado como inactivo: probabilidad alta (40-60%) si el remitente arregló la causa raíz de la reputación. Conviene reactivar vía canal alternativo primero (WhatsApp opt-in, SMS) para confirmar que el contacto sigue interesado, y solo después re-incluir en email.

La regla operativa de CMP en auditorías: nunca reactivar más del 5% de los bounces históricos en una sola oleada. Hacerlo dispara el ratio de bounce de nuevo y daña reputación. Reactivaciones se hacen en batches de 200-500 contactos por semana, midiendo el bounce rate del subset antes de continuar.

Cómo configurar el procesamiento de bounce en PowerMTA y KumoMTA

En PowerMTA, el comportamiento de bounce se controla con la directiva bounce-after:

<bounce-after>
  retry-attempts = 5
  retry-after = 3h, 6h, 12h, 24h, 48h
  max-soft-bounces = 5
  permanent-bounce-codes = 5.1.1, 5.1.2, 5.1.10
</bounce-after>

En KumoMTA (sintaxis Lua):

kumo.on('smtp_server_message_received', function(msg)
  msg:set_meta('queue_attempts', 5)
  msg:set_meta('retry_intervals', {180, 360, 720, 1440, 2880})  -- minutos
end)

kumo.on('bounce_processed', function(msg, response)
  if response.code:match('^5%.7%.26') then
    -- DMARC failed: NO sacar contacto, alertar a operaciones
    kumo.log_event('dmarc_bounce', { recipient = msg:recipient() })
    return 'investigate'
  end
  if response.code:match('^4%.7%.0') then
    -- Throttling: pausar campaña
    kumo.queue.pause('current')
    return 'paused'
  end
end)

En plataformas SaaS sin acceso al MTA (Mailchimp, Brevo), el manejo se hace con webhooks. Configurar el webhook de bounce para que pase a un sistema externo (incluso un Google Sheet con Apps Script o una función Lambda) los bounces que no son 5.1.1 ni 5.1.2 ni 5.1.10, y revisarlos manualmente antes de que la plataforma los marque como cleaned automáticamente.

Resumen operativo

Tres reglas que aplicamos en todas las auditorías de CMP:

  1. Distinguir por subcódigo, no por primer dígito. 5xx no significa siempre “borrar contacto”. 4xx no significa siempre “reintentar”.

  2. El 421 4.7.0 es alerta crítica, no soft normal. Si más del 3% del envío recibe este código, pausar la campaña inmediatamente.

  3. Reactivar bounces antiguos es trabajo de canal alternativo, no de email. Re-incluir directo en lista activa regenera el bounce. Validar primero por WhatsApp/SMS.

Aplicar estas reglas reduce el daño compuesto a la reputación, preserva contactos legítimos que se hubieran perdido por automatización ciega, y permite que la operación de envíos siga creciendo sin tener que recuperar reputación cada trimestre.

Preguntas frecuentes sobre este tema

¿Cuántos hard bounces puede tener una campaña antes de dañar la reputación?
El umbral operativo seguro es 0.5% de hard bounces por envío individual. Entre 0.5% y 2% genera señales negativas que se acumulan en la reputación del dominio durante 7-14 días. Por encima de 2% en un solo envío, Gmail y Microsoft activan throttling inmediato a ese remitente y el siguiente envío entra a spam en gran porcentaje. La regla operativa: si una campaña arroja más de 0.5% de hard bounces, hay que pausar envíos a esa lista hasta limpiarla. Para listas grandes (>50.000 contactos), un solo envío con 1.5% de hard bounces puede costar 4-6 semanas de recuperación.
¿Cuándo un soft bounce se convierte en hard bounce?
La regla estándar de la industria: después de 3-5 intentos consecutivos con soft bounce en la misma dirección, la dirección se trata como hard bounce y sale de la lista activa. PowerMTA y KumoMTA configuran este umbral en el parámetro retry-after y max-bounce-soft. Plataformas SaaS como Mailchimp lo automatizan: tras 7 días de soft bounce continuo, el contacto pasa a estado cleaned. La pregunta clave no es el número de intentos, sino el patrón: un buzón temporalmente lleno se desbloquea en 24-72 horas, mientras que una dirección con problemas estructurales (cuenta abandonada, dominio en remoción) seguirá soft-bouncing indefinidamente y debe tratarse como hard.
¿Qué significa el código SMTP 550 5.1.1?
El código 550 5.1.1 es el hard bounce más frecuente: 'mailbox does not exist'. La dirección email simplemente no existe en el dominio receptor. Causas operativas: typo en el formulario de registro, cuenta de empresa eliminada, cambio de dominio sin redirect, dirección comprada/generada por list-broker. Acción inmediata: sacar el contacto de la lista activa, no reintentar bajo ninguna circunstancia. Acumular reintentos a direcciones 5.1.1 es lo que dispara que Gmail bloquee el dominio remitente completo, no solo ese contacto. El código 550 5.1.10 es variante: 'recipient address rejected: user unknown' — mismo tratamiento.
¿Cómo distingue Gmail entre un rebote por contenido y un rebote por reputación?
Gmail nunca devuelve bounce por contenido (manda a spam, no rebota), pero sí devuelve bounce 421 4.7.0 ('our system has detected an unusual rate of unsolicited mail') cuando el ratio de spam complaints sube por encima del umbral. Esto NO es un soft bounce normal: es Gmail aplicando throttling explícito al remitente. Si aparece esta secuencia de 421 4.7.0 en más del 5% de un envío, hay que pausar la campaña inmediatamente y revisar Postmaster Tools, ya que el daño a reputación crece exponencialmente mientras la operación sigue enviando. Reintentar el envío en ese estado garantiza que el próximo envío entre a spam casi por completo.
¿Vale la pena reactivar contactos que rebotaron hace 6 meses?
Para hard bounces (5.x.x): nunca. Una dirección que no existió hace 6 meses no existe ahora; reintentar regenera el bounce y daña la reputación de nuevo. Para soft bounces que se cerraron como inactivos: depende del código. Bounces 4.2.2 (mailbox full) tienen probabilidad cercana al cero de recuperación tras 90 días (cuenta abandonada). Bounces 4.7.x (rate limiting / spam rejection) sí tienen probabilidad de recuperación, pero requieren reactivar mediante un canal alternativo (WhatsApp, SMS) antes de re-incluir en email. La regla operativa: limpieza de bounces es definitiva, las reactivaciones se hacen por canal distinto, no reintentando email.

¿Le suena conocido el problema?

Una conversación de quince minutos por WhatsApp. Si el caso del artículo se parece al suyo, le decimos qué corresponde primero, sin presentación de la firma.

Botón flotante de WhatsApp