Webhook firmado que se envía en cada cambio de estado de entrega (sent, delivered, read, failed) de un mensaje de WhatsApp que envíasEl Webhook de confirmaciones de lectura envía un callback HTTP firmado a tu servidor cada vez que cambia el estado de un mensaje de WhatsApp que has enviado —
sent, delivered, read o failed. Úsalo para el seguimiento de entregas, la confirmación de lectura y los registros de auditoría.
Se configura por remitente de WhatsApp, de modo que distintos remitentes pueden apuntar a endpoints diferentes.
Configuración del webhook
Para activar las confirmaciones de lectura de un remitente:- Edita tu remitente de WhatsApp y abre la sección Webhook de confirmaciones de lectura
- Introduce tu URL de webhook y guarda
- Se genera automáticamente un secreto de firma — úsalo para verificar la firma de cada solicitud
whatsapp_message_id devuelto por los endpoints Enviar mensaje de plantilla y Enviar mensaje de texto libre, de modo que puedas asociar cada actualización con el mensaje original.
Formato de la solicitud
El webhook se envía como una solicitud POST a tu URL configurada con un cuerpo JSON y un encabezadoX-Signature-256.
Estructura del payload
string
El tipo de evento. Valor:
message_statusinteger
Identificador numérico del mensaje — el mismo
whatsapp_message_id devuelto al enviar el mensaje. Úsalo para correlacionar la actualización de estado con el envío original.string
Identificador del mensaje del proveedor para mensajes enviados a través de Twilio, o
nullstring
Identificador del mensaje del proveedor (
wamid de WhatsApp) para mensajes enviados a través de la Meta Cloud API, o nullstring
Identificador único (UUID) de la conversación a la que pertenece el mensaje, o
nullstring
Identificador único (UUID) del asistente conectado al remitente, o
nullobject
El remitente de WhatsApp desde el que se envió el mensaje
string
El número de teléfono del destinatario
string
El número de teléfono del remitente
string
Dirección del mensaje. Valor:
outboundstring
El nuevo estado de entrega. Valores posibles:
sent, delivered, read, failed, undeliveredinteger
Código de error del proveedor cuando
status es failed o undelivered; en caso contrario, nullstring
Mensaje de error sin procesar del proveedor cuando el mensaje falló; en caso contrario,
nullstring
Descripción legible para humanos del error; en caso contrario,
nullstring
Marca de tiempo ISO 8601 de cuándo la plataforma registró el cambio de estado, en la zona horaria configurada del propietario del número de WhatsApp
string
Marca de tiempo ISO 8601 de la hora del evento según el propio operador, en la zona horaria configurada del propietario. Presente en los mensajes enviados a través de la Meta Cloud API;
null en Twilio (el callback de estado de Twilio no incluye una hora de evento). Prefiere este valor cuando esté presente — es la hora autorizada por el operador.Verificación de la firma
Cada solicitud incluye un encabezadoX-Signature-256 que contiene un HMAC-SHA256 del cuerpo de la solicitud sin procesar, firmado con el secreto de firma de tu remitente:
Comportamiento de los reintentos
Si tu endpoint devuelve un estado que no es 2xx o la solicitud falla, la entrega se reintenta:
Los errores del servidor (5xx) y los límites de frecuencia (429) se reintentan. Los errores del cliente (4xx) se consideran un endpoint mal configurado y no se reintentan.
Notas importantes
- El webhook se configura por remitente — cada remitente puede tener su propia URL y su propio secreto.
- Los eventos activados por el botón Realizar solicitud de prueba en los ajustes del remitente incluyen un campo adicional
test: truey usan valores de ejemplo. Las actualizaciones de estado reales nunca incluyentest. readsolo se dispara si el destinatario tiene activadas las confirmaciones de lectura en su configuración de privacidad de WhatsApp.deliveredsiempre se dispara.- Los estados pueden llegar fuera de orden o ser reenviados por el proveedor. Solo reenviamos un avance genuino, así que no recibirás un
delivereddespués de unreadpara el mismo mensaje — pero aun así deberías tratar el webhook como la fuente de verdad y deduplicar porwhatsapp_message_id+status. timestampes siempre la hora en que la plataforma registró el cambio (en la zona horaria del propietario del número).provider_timestampes la hora de evento autorizada por el operador cuando está disponible — prefiérela por su precisión, y recurre atimestampcuando seanull.- Usa Regenerar en los ajustes del remitente para rotar el secreto de firma si alguna vez queda expuesto.