data is identical.
This page documents the 6 types: message.exchange, message.status, call.update, group.flow, instance.state and label.update.
Envelope
event name in the events field of the config. Empty = all types.
Filtering and routing
byEvents=true (webhook only), the event name is appended to the URL:
- Config:
url: "https://app/wh",byEvents: true - Delivery:
POST https://app/wh/message.exchange
message.exchange
Messages sent and received (text, media, sticker, document, audio, poll, contact, location, etc.), edits and revocations.
Payload
Conditional fields
Only the fields relevant to the message type are populated. Edits haveedit populated; revocations arrive with type: "message_revoke" in data.message.type.
chat.isCommunity appears only when true, indicating the chat is the announcement channel (parent / announcement channel) of a WhatsApp community. Subgroups linked to a community keep type: "group" and do not include the isCommunity field. In regular groups and DMs the field is also omitted.adOrigin — origin attribution (Click-to-WhatsApp)
Present only on the first received message of a conversation started from a Meta ad or an entry point (wa.me link, search, QR). Lets you route the lead by campaign without querying the database. Two scenarios:
- Native ad (Click-to-WhatsApp / Call Ads) —
entryPointSourceisctwa_adand the full block is included:sourceId(ad ID — groups leads by campaign),ctwaClid(Meta attribution key, use it with the Conversions API),sourceApp,sourceUrl,title,body,mediaType,greetingMessageBody, plusconversionSource,entryPointExternalSource,ctwaPayload(base64 token for the Conversions API),originalImageUrl, andclickToWhatsappCall. - Non-ad entry point — wa.me link (
click_to_chat_link), WhatsApp search (global_search_new_chat), QR code, etc. OnlyentryPointSourceis present (plusentryPointApp/entryPointDelaySecondswhen available), withoutsourceId/ctwaClid— Meta does not attach ad data to these.
Organic messages — and any message that is not the first of the conversation — do not carry
adOrigin. An ad’s pre-filled text is not proof of origin: reliable attribution comes from sourceId / ctwaClid.Example (image received)
message.status
Delivery receipts: delivered, read, played, etc.
Payload
status enum
messageSenderin groups: JID of the original message author (relevant when someone reads a message from another participant).chat.isCommunityfollows the same rule asmessage.exchange: present andtrueonly when the chat is the announcement channel of a community.
call.update
Call events: offer, accepted, rejected, terminated, latency.
Payload
type enum
group.flow
Group changes: members, metadata, settings.
Payload, participant change
Metadata subtypes
instance.state
Changes in the instance’s own state (connection, QR, ban, pairing).
Payload
state enum
label.update
Label edits/associations (WhatsApp Business labels).
Payload
type × action combinations
Events not emitted (internal)
Captured by thewhatsmeow handler but not propagated via webhook/WS:
*events.Picture, profile picture change (logged only).*events.FBMessage, Facebook Business (logged only).*events.HistorySync, history sync (processed and stored in DB).
References
Configure webhook
Filter events via
events[] in the config.Configure WebSocket
Same filter syntax as the webhook.
Connect via WebSocket
Receive events in real time.
Events overview
Webhook vs WebSocket comparison.