Skip to main content

WhatsApp Coexistence Webhooks

WhatsApp Coexistence adds customer-facing events for messages sent from the WhatsApp Business app and for changes to the coexistence connection. Return an HTTP 2xx response promptly. Verify every webhook using the Telnyx webhook signature before processing it. See Receiving webhooks.

Event summary

Meta also sends history and smb_app_state_sync synchronization webhooks. Telnyx validates and processes these internally. They are not forwarded to the customer webhook URL.

message.echo

message.echo represents a message sent from the WhatsApp Business app. It is outbound and includes origin: whatsapp_business_app.
The payload has the following coexistence-specific semantics: message.echo is non-billable and does not open or extend the Cloud API customer service window. Avoid feeding it into inbound autoresponse, opt-out, or bot workflows.

Handle message echoes

Python
Node.js

whatsapp.account.update

Coexistence lifecycle changes arrive as whatsapp.account.update. Inspect data.payload.event to determine the transition.
Treat lifecycle events as idempotent. Duplicate or delayed Meta events can arrive, and Telnyx fences stale transitions against the current connection lifecycle. Meta may include disconnection_info with a PARTNER_REMOVED event. The current Telnyx customer webhook does not expose that object, so integrations must use data.payload.event as the lifecycle signal.

Message edits and revocations

WhatsApp user edits and revocations are delivered through the standard message.received event. Inspect data.payload.body.type to distinguish them. Telnyx does not emit separate message.edited or message.revoked event names.

Edited message

An edit can apply to text or to a media caption. Meta accepts edits for up to 15 minutes after the original message was sent.

Revoked message

A user can revoke a message for up to two days after it was sent.
When Telnyx has already mapped the original Meta message ID, original_message_id is the Telnyx message UUID. If the mapping is unavailable, the field can contain the original Meta wamid, so treat it as an opaque string.

Delivery and retry handling

  • Return an HTTP 2xx response before starting long-running work.
  • Deduplicate message echoes using data.payload.id or data.payload.body.foreign_id.
  • Persist lifecycle processing by WABA ID and event type.
  • Do not assume that Meta events arrive in chronological order.
  • Keep unknown fields and enum values when storing the payload so integrations remain compatible with future additions.

Unsupported or internal events

history and smb_app_state_sync are synchronization protocol events. Telnyx consumes them internally and does not deliver them as customer webhook events. Messages sent from unsupported companion clients might not generate message.echo. Treat the customer webhook stream as best-effort visibility, not a complete archive of Business app activity.