Skip to main content
Xobito sends outbound webhooks across these groups: contacts / statuses / sources CRUD (9 events), message delivery status (4 events: sent / delivered / read / failed), and inbound messages (message.received). CRUD events use the contact-style payload envelope. Message delivery and inbound events use a simpler payload — see below.

CRUD events (contacts / statuses / sources)

Message delivery status events

Live as of 2026-05-28. Fires every time Meta reports a status change for a message you sent via the Send Message endpoints. Mapping back to your record: the data.message_id is the exact same wamid.* returned in the data.whatsapp_response.messages[0].id field of every successful send response. Keep a (message_id → your_record_id) table and match on it. Headers for message delivery webhooks:

Example payload — message.sent

The first (sent) event also includes the outbound message content (text + type) when available, so you can mirror messages sent from the dashboard — not just ones you sent via the API. (delivered / read / failed events omit content; you already have it from sent.)

Example payload — message.delivered

Example payload — message.read

Example payload — message.failed

Idempotency: Meta occasionally retries status webhooks to us, which can result in duplicate POSTs to your URL. Dedupe on your end by the (message_id, status) pair — ignore the second if you’ve already processed it.
Ordering is best-effort. Network latency means delivered may occasionally arrive before sent, or read before delivered. Compare timestamps if order matters to you.

Inbound message events

Fires every time a contact sends a message to your WhatsApp number. Lets you mirror the full two-way conversation on your side. Headers — same as delivery events (X-Webhook-Signature, X-Webhook-Event: message.received, X-Webhook-Timestamp, User-Agent).

Example payload — text

Example payload — media (image/document/audio/video)

Fields
Enable inbound + delivery webhooks the same way (see Webhooks Overview) — set Webhook URL and turn webhook access on. Inbound events fire automatically; no per-event toggle.
The following events still do not fire outbound webhooks:
  • Campaigns — campaign.started, campaign.completed, etc.
  • Templates — template.approved, template.rejected, etc.
  • Tickets and conversations — no outbound webhooks.
If you need any of these, poll the relevant API endpoint on an interval you control.

Distinguishing events

Use model + event together. For example, a contact deletion is model: "App\\Models\\Tenant\\Contact" plus event: "deleted".

Example payloads

Contact created

Contact updated

Contact deleted

Status created

Status updated

Status deleted

Source created

Source updated

Source deleted

Next

Webhook Security

Verify every request with the HMAC-SHA256 signature.