Webhook Events
Event types
| Event | Trigger |
|---|---|
message.queued | Message accepted and placed in the delivery queue |
message.sent | Message handed off to the provider |
message.delivered | Provider confirmed delivery to the device |
message.read | Recipient opened the message |
message.failed | All delivery attempts exhausted |
Subscribe to * to receive all events.
Payload shape
Every event POSTed to your endpoint has this JSON body:
{
"event": "message.delivered",
"messageId": "msg_01j...",
"tenantId": "ten_01j...",
"provider": "whatsapp",
"to": "+905551234567",
"status": "delivered",
"externalId": "waid.123456",
"error": null,
"timestamp": "2025-01-01T12:05:00.000Z"
}
| Field | Type | Description |
|---|---|---|
event | string | Event name |
messageId | string | Your Notifo message ID |
tenantId | string | Your tenant ID |
provider | string | Channel provider (whatsapp, telegram, sms) |
to | string | Recipient |
status | string | Current message status |
externalId | string | null | Provider-assigned message ID |
error | object | null | Error details on message.failed |
timestamp | ISO 8601 | Event time (UTC) |
Request headers
Each webhook delivery includes these headers:
| Header | Description |
|---|---|
X-Notifo-Signature | sha256=<hmac> — use this to verify authenticity |
X-Notifo-Event | Event name (e.g. message.delivered) |
X-Notifo-Delivery-Id | Unique UUID for this delivery attempt |
Content-Type | application/json |