Todos los eventos llegan con la misma envoltura. Lo que cambia es data.

message.received

Un cliente te escribió. Llega por cada mensaje, de WhatsApp o de Instagram. Las reacciones (👍, ❤️) no lo disparan.
string
Id del mensaje en eltick.
string
Id del mensaje en WhatsApp. No viene en Instagram.
string
Solo en Instagram: "instagram".
string
La conversación en el chat de eltick.
string
Tu número de WhatsApp que recibió el mensaje (útil si tienes varios).
object
id, name (el nombre de perfil) y phone (WhatsApp) o instagram (usuario de Instagram).
string
El tipo de mensaje: text, image, video, audio, document, sticker, location, contacts, button (tocó un botón de una plantilla), interactive (eligió una opción), entre otros.
string | null
El texto del mensaje. En adjuntos, el pie de foto o una descripción (por ejemplo “📷 Imagen”); en botones, el texto del botón.
string
Cuándo lo mandó el cliente.
Cada mensaje entrante abre (o renueva) la ventana de 24 horas: durante ese tiempo puedes responder con text libre por la API.

message.status

Cambió el estado de un mensaje que mandaste, ya sea por la API, desde el chat o en una campaña.
string
El id de WhatsApp del mensaje: el mismo wamid que te devolvió POST /messages. Úsalo para encontrar el mensaje en tu sistema.
string
sent, delivered, read o failed.
string | null
Si el mensaje salió de una campaña, su id.
number | null
Con failed, el código de Meta. Por ejemplo 131026 (no se pudo entregar). Mira la tabla en Errores.
El estado solo avanza: sent → delivered → read. Si WhatsApp nos informa varios cambios juntos, te mandamos solo el más avanzado, así que puedes recibir read sin haber recibido delivered. Nunca vas a recibir un estado “hacia atrás”.
Si mandas campañas grandes, este evento llega una o más veces por cada destinatario. Suscríbete solo si lo vas a usar, y asegúrate de que tu servidor aguante el volumen.

contact.created

Se sumó un contacto nuevo a tu cuenta.
string
De dónde vino:
  • inbound: te escribió por WhatsApp por primera vez.
  • instagram: te escribió por Instagram por primera vez (en lugar de phone trae instagram, el usuario).
  • api: lo creaste con POST /contacts.
Los contactos que sumas desde la app (importando una planilla o a mano) y los que se crean al mandar un mensaje con POST /messages a un teléfono nuevo no disparan este evento.

contact.opted_out

Un contacto pidió no recibir más mensajes: tocó el botón de baja de una plantilla o escribió algo como “baja”, “stop”, “no recibir más” o “darme de baja”.
eltick deja a ese contacto afuera de las campañas automáticamente. Si tienes otros sistemas que le mandan mensajes (tu CRM, tu tienda), usa este evento para marcarlo también ahí. Más en Bajas y consentimiento.
La API no bloquea los envíos a contactos dados de baja: POST /messages los manda igual. Antes de mandar mensajes de marketing por la API, revisa optedOut en el contacto o guarda estas bajas en tu sistema.

campaign.completed

Una campaña terminó de enviarse.
Los números son una foto del momento en que terminó el envío: las entregas y lecturas siguen subiendo durante las horas siguientes. Para los valores al día, consulta GET /campaigns.

Evento de prueba

El botón Probar de Ajustes › API y webhooks manda este message.received, con "test": true y datos de ejemplo:
Verifica la firma igual que siempre, pero no lo proceses como un mensaje real.