🛡️ Confirmación de envío y manejo de errores en la API de HSM
Detectar fallos parciales de tus campañas (mensaje enviado, pero error interno posterior) con información clara y accionable.
¿Por qué te importa?
Cuando envías plantillas (HSM) a través de la API de Adereso, queremos que sepas con certeza si tu mensaje llegó a WhatsApp. La API responde con un código HTTP específico para cada escenario y, en el caso de campañas, deja la información del envío visible directamente en la entrada de campaña.
Esto te permite:
- Confiar en el estado de cada envío sin reconciliar manualmente con logs.
- Reintentar peticiones sin riesgo de duplicar mensajes en el WhatsApp del destinatario.
- Detectar fallos parciales (mensaje enviado, pero error interno posterior) con información clara y accionable.
Códigos HTTP que puedes recibir
Adereso no reintenta automáticamente los errores 4xx: son fallos definitivos de la petición y reintentar sin cambios reproducirá el mismo error. Los 5xx y 503 sí son seguros de reintentar desde tu lado.
Código | Significado | Acción esperada |
200 | El mensaje se envió correctamente y todo se procesó internamente. | Marcar como enviado. |
207 | El mensaje sí se envió a WhatsApp, pero el procesamiento posterior interno presentó un problema. El destinatario igual recibe el mensaje. | Marcar como enviado. No reintentar (duplicaría en WhatsApp). |
400 | Petición inválida: parámetros faltantes, plantilla inexistente, entrada de campaña ya procesada, destinatario con ticket abierto sin retry configurado. | Revisar la petición. Reintentar sin cambios reproduce el error. |
402 | Cuenta sin saldo, bloqueada por Meta o impedida de enviar. | Resolver con tu administrador. Reintentar sin resolver el estado de la cuenta reproduce el error. |
500 | Error inesperado durante el envío. | Reintentar es seguro. Si persiste, contactar a soporte. |
503 | Otra instancia de tu sistema está procesando la misma entrada de campaña. | Reintentar más tarde es seguro y esperado. |
Cuerpo de respuesta 207
{
"status": 207,
"message_id": "wamid.XXX",
"ticket_id": "case123",
"entry_id": 7,
"warning": "hsm_sent_but_post_processing_failed",
"stage": "update_entry_status"
}message_id: identificador del mensaje en WhatsApp. Confirma que el envío fue exitoso.
ticket_id(si aplica): ticket asociado en Adereso.
stage: etapa interna donde ocurrió el problema. Útil para soporte.
warning: indicador estable que tu integración puede detectar.
200 (envío exitoso) y para código 400 (petición rechazada / entrada ya procesada). Cómo se ve en una entrada de campaña
Las entradas de campaña exponen el campo error_details, consultable vía la API de mensajes de campaña. Cuando ocurre un fallo parcial, contiene:
{
"error_description": "Message was delivered to WhatsApp, but an internal post-processing error occurred.",
"status_code": 207,
"response": {
"stage": "update_entry_status",
"mid": "wamid.XXX",
"case_id": "case123"
}
}La descripción está pensada para ser leída directamente. El campo stage permite que soporte localice rápidamente el punto exacto del flujo.
Valores posibles de stage
stage | Significado |
send_hsm_post_process | Falló el procesamiento tras la confirmación del proveedor. |
generate_message | El mensaje salió, pero no se registró el documento interno. |
update_entry_status | El mensaje salió, pero no se logró marcar la entrada de campaña. |
campaign_metadata | El mensaje salió y la entrada quedó marcada, pero no se enlazó la metadata de analítica de campaña. |
unhandled | Error inesperado capturado por la red de seguridad. |
En todos los casos el destinatario recibe el mensaje. Reintentar produciría duplicación.
Garantías que la API te entrega
- Sin duplicados al destinatario: si reintentas una entrada de campaña ya enviada, la API rechaza con
400sin volver a llamar al proveedor de WhatsApp.
- Estado temprano de la entrada: en cuanto WhatsApp confirma la recepción, la entrada queda marcada como enviada con su
midyticket_id. Esto sucede antes de cualquier paso posterior (apertura de bot, cierre de ticket).
- Los fallos posteriores no revierten el envío: cualquier problema posterior queda registrado en
error_detailsconstatus_code = 207, nunca como una entrada en fallo.
- El código de respuesta refleja la entrega, no operaciones secundarias: actualizaciones de metadata, tags o template del ticket asociado se hacen best-effort. Si fallan, quedan en logs internos pero el código que recibes (
200o207) sigue describiendo fielmente el resultado del envío.
- El
207se entrega aunque el detalle no se persista: en el caso extremo de que la propia escritura delerror_detailsfalle (por ejemplo, blip transitorio de base de datos), la API igual responde207conmessage_idyticket_id. Tu sistema no recibe un500engañoso cuando el mensaje sí llegó al destinatario.
Casos de uso
- Reconciliación automática: tu sistema puede sincronizar el estado leyendo
statusyerror_detailssin lógica especial para reintentos.
- Campañas masivas con intermitencias: la entrada queda registrada en cuanto WhatsApp confirma; cualquier inestabilidad posterior es transparente para tu reporte.
- Auditoría sin envíos duplicados: al recibir 207, puedes consultar el
middirectamente con soporte sin reintentar.
Solución de problemas
Recibí 207. ¿Debo reintentar?
No. El mensaje ya está en el WhatsApp del destinatario. Reintentar lo duplicaría.
error_details indica fallo de post-procesamiento. ¿Mi cliente recibió el mensaje?
Sí. Si status_code es 207, la entrega a WhatsApp fue exitosa.
¿Qué hago con el stage?
Es un identificador técnico para soporte. Inclúyelo cuando reportes un caso para acelerar el diagnóstico.
Una segunda petición al mismo entry_id devuelve 400.
Comportamiento esperado: protección contra envíos duplicados.
Glosario
- HSM: plantilla pre-aprobada por Meta para iniciar conversaciones en WhatsApp.
mid: identificador único del mensaje en WhatsApp (formatowamid.XXX).
ticket_id: identificador del ticket de Adereso asociado al mensaje.
entry_id: identificador de la entrada dentro de una campaña.
- Stage: etapa interna del procesamiento posterior al envío.
Resumen rápido
200 → Todo OK. Marcar como enviado.
207 → Mensaje SÍ llegó al destinatario. Error interno posterior. No reintentar.
400 → Petición inválida. Revisar parámetros. Reintentar sin cambios reproduce el error.
402 → Cuenta sin saldo o bloqueada. Resolver con administrador.
500 → Error interno. Reintentar es seguro.
503 → Concurrencia. Reintentar más tarde. Árbol de decisión para integradores
Cuando tu sistema recibe la respuesta del envío de HSM:
- ¿El código es
200? → Éxito total. Guardarmessage_idyticket_id. No hacer nada más.
- ¿El código es
207? → El mensaje llegó al destinatario. Guardarmessage_idyticket_id. Registrar elwarningystagepara auditoría. No reintentar.
- ¿El código es
400o402? → Fallo definitivo. Revisar la petición o el estado de la cuenta. Reintentar sin cambios reproduce el error.
- ¿El código es
500o503? → Reintentar es seguro. Usar backoff exponencial.
Gaps identificados en esta documentación
Los siguientes puntos necesitan completarse para que esta documentación esté lista para publicación: