Inbox webhooks
Events for messages, conversations, reactions, comments, and reviews received in the inbox.
Events for everything that lands in (or leaves) the inbox: direct messages and their lifecycle, conversations, emoji reactions, comments on tracked posts, and reviews. Delivery, retries, idempotency, and signature verification work the same for every event and are covered in the webhooks overview.
Events
| Event | Description |
|---|---|
message.received | Fired when a new inbox message is received. |
message.sent | Fired when an outgoing message is sent from the inbox. |
conversation.started | Fired once when a new conversation begins between an account and a contact, on any DM platform. |
message.edited | Fired when a sender edits a previously-sent message. |
message.deleted | Fired when a sender deletes (unsends) a message. |
message.delivered | Fired when an outgoing message is delivered to the recipient. |
message.read | Fired when an outgoing message is read by the recipient. |
message.failed | Fired when an outgoing message fails to deliver (WhatsApp only). |
reaction.received | Fired when a participant adds or removes an emoji reaction (Instagram, Facebook, WhatsApp, Telegram, Slack). |
comment.received | Fired when a new comment is received on a tracked post. |
review.new | Fired when a new review is posted on a connected account. |
review.updated | Fired when a review is edited or a reply is added. |
message.received
Fired when a new inbox message is received. Subscribe with Create webhook settings or Update webhook settings.
Stable webhook event ID
"message.received"The conversation context included in inbox webhook payloads.
The account context included in inbox webhook payloads.
Platform-specific message context (present when the message is a quick reply tap, postback button tap, inline keyboard callback, or a quote-reply to an earlier message)
UTC time at which Zernio generated this event (set once when the event payload is built, before delivery is queued). Retries and redeliveries keep the original value, so it reflects the event, not the delivery attempt.
date-timeResponse Body
message.sent
Fired when an outgoing message is sent from the inbox. Subscribe with Create webhook settings or Update webhook settings.
Stable webhook event ID
"message.sent"The conversation context included in inbox webhook payloads.
The account context included in inbox webhook payloads.
UTC time at which Zernio generated this event (set once when the event payload is built, before delivery is queued). Retries and redeliveries keep the original value, so it reflects the event, not the delivery attempt.
date-timeResponse Body
conversation.started
Fired once when a new conversation begins between one of your connected accounts and a contact, in either direction. Platform-agnostic — covers every DM platform (Instagram, Messenger/Facebook, Telegram, WhatsApp, Twitter, Reddit, Bluesky) with a single subscription. Naturally deduped: a given conversation only fires this event the very first time it appears.
Pre-connect history does not fire this event. When an Instagram or Facebook account connects, Zernio replays the DM history it already has on Meta into the inbox. That replayed history emits neither conversation.started nor message.received.
This is the opposite of the post backfill, where every pre-existing native post is reported. Read replayed DMs from List inbox conversations; they are stored as already read, so they never affect unread counts.
Subscribe with Create webhook settings or Update webhook settings.
Stable webhook event ID
"conversation.started"The account context included in inbox webhook payloads.
When the conversation document was created.
date-timeUTC time at which Zernio generated this event (set once when the event payload is built, before delivery is queued). Retries and redeliveries keep the original value, so it reflects the event, not the delivery attempt.
date-timeResponse Body
message.edited
Fired when the sender edits a previously-sent message. Supported on Instagram, Facebook Messenger, and Telegram. The payload carries the full editHistory (oldest prior version first) so you can reconstruct every version of the message. message.text is the latest version. Subscribe with Create webhook settings or Update webhook settings.
"message.edited"The message object included in inbox webhook payloads.
Prior versions of the message, oldest first.
Total number of edits applied to this message.
When the most recent edit happened.
date-timeThe conversation context included in inbox webhook payloads.
The account context included in inbox webhook payloads.
UTC time at which Zernio generated this event (set once when the event payload is built, before delivery is queued). Retries and redeliveries keep the original value, so it reflects the event, not the delivery attempt.
date-timeResponse Body
message.deleted
Fired when the sender deletes (unsends) a message. Supported on Instagram (incoming unsend) and WhatsApp (when the business deletes an outgoing message via the Cloud API). The payload retains the pre-delete text and attachments so API consumers can access the original content, useful for moderation, compliance, or archival. The Zernio dashboard UI does not show this content. Subscribe with Create webhook settings or Update webhook settings.
"message.deleted"The message object included in inbox webhook payloads.
date-timeThe conversation context included in inbox webhook payloads.
The account context included in inbox webhook payloads.
UTC time at which Zernio generated this event (set once when the event payload is built, before delivery is queued). Retries and redeliveries keep the original value, so it reflects the event, not the delivery attempt.
date-timeResponse Body
message.delivered
Fired when an outgoing message is delivered to the recipient. Supported on WhatsApp and Facebook Messenger. Instagram doesn't emit a separate delivery event (only message.read). Subscribe with Create webhook settings or Update webhook settings.
"message.delivered" | "message.read" | "message.failed"The message object included in inbox webhook payloads.
When the platform reported this status.
date-timePopulated only on message.failed.
The conversation context included in inbox webhook payloads.
The account context included in inbox webhook payloads.
UTC time at which Zernio generated this event (set once when the event payload is built, before delivery is queued). Retries and redeliveries keep the original value, so it reflects the event, not the delivery attempt.
date-timeResponse Body
message.read
Fired when an outgoing message is read by the recipient. Supported on WhatsApp, Facebook Messenger, and Instagram. Subscribe with Create webhook settings or Update webhook settings.
"message.delivered" | "message.read" | "message.failed"The message object included in inbox webhook payloads.
When the platform reported this status.
date-timePopulated only on message.failed.
The conversation context included in inbox webhook payloads.
The account context included in inbox webhook payloads.
UTC time at which Zernio generated this event (set once when the event payload is built, before delivery is queued). Retries and redeliveries keep the original value, so it reflects the event, not the delivery attempt.
date-timeResponse Body
message.failed
Fired when an outgoing message fails to deliver. Currently only emitted for WhatsApp (Messenger, Instagram, and Telegram don't expose per-message failure via webhook). The payload error object includes code, title, and message from the platform, useful for categorising failures (e.g. 131026 for "recipient phone not reachable"). Subscribe with Create webhook settings or Update webhook settings.
"message.delivered" | "message.read" | "message.failed"The message object included in inbox webhook payloads.
When the platform reported this status.
date-timePopulated only on message.failed.
The conversation context included in inbox webhook payloads.
The account context included in inbox webhook payloads.
UTC time at which Zernio generated this event (set once when the event payload is built, before delivery is queued). Retries and redeliveries keep the original value, so it reflects the event, not the delivery attempt.
date-timeResponse Body
reaction.received
Fired when a participant adds or removes an emoji reaction on a message. Supported on Instagram, Facebook, WhatsApp, Telegram and Slack (Telegram requires the bot to be an administrator in the chat; reactions in private chats are never delivered to bots). Available on the Usage plan (or AppSumo with the Inbox add-on).
Instagram and Facebook accounts connected before August 2026 do not receive this event until their webhook subscription is refreshed. Meta only applies the reactions field when an account is connected and does not backfill it. Sending a reaction is unaffected. If an account sends reactions fine but never receives them, reconnect it.
This is distinct from message.received: a reaction is not a message. Branch on it separately so a 👍 isn't treated as an inbound DM.
reaction.actionisaddedorremoved.reaction.emojiis the emoji reacted with. On WhatsApp, Instagram and Facebook removals the platform does not report which emoji went away, so this is an empty string whenactionisremoved. Match onplatformMessageIdrather than the emoji to clear a reaction you are mirroring.reaction.platformMessageIdis the platform-native id of the reacted-to message and is always present.reaction.messageIdis the Zernio message id of that message when it can be resolved.
Subscribe with Create webhook settings or Update webhook settings.
Stable webhook event ID
"reaction.received"The conversation context included in inbox webhook payloads.
The account context included in inbox webhook payloads.
UTC time at which Zernio generated this event (set once when the event payload is built, before delivery is queued). Retries and redeliveries keep the original value, so it reflects the event, not the delivery attempt.
date-timeResponse Body
comment.received
Fired when a new comment is received on a tracked post. Subscribe with Create webhook settings or Update webhook settings.
The payload includes an optional comment.ad object when the comment was made on paid content. For Instagram this carries ad.id and ad.title directly from the Meta webhook. For Facebook it carries ad.promotionStatus ("active" for boosted organic posts, "ineligible" for dark post creatives). The field is absent for comments on organic posts that are not currently promoted, so clients can filter ad-driven comments with a simple if (comment.ad) { ... } check.
Instagram comments may also carry comment.author.instagramProfile (isFollower, isFollowing, followerCount, isVerified). It is best-effort: Meta only reveals the follow relationship for people who have messaged the account, and commenting does not grant that consent, so the object is absent for most first-time commenters. An absent object means unknown, never "not a follower". To resolve it on demand see Instagram follow status; to gate an auto-DM on it, use a comment automation's audience rules.
Stable webhook event ID
"comment.received"UTC time at which Zernio generated this event (set once when the event payload is built, before delivery is queued). Retries and redeliveries keep the original value, so it reflects the event, not the delivery attempt.
date-timeResponse Body
review.new
Fired when a new review is posted on a connected account. Currently supported for Google Business Profile (real-time via Pub/Sub). Available on the Usage plan (or AppSumo with the Inbox add-on). Subscribe with Create webhook settings or Update webhook settings.
Stable webhook event ID
"review.new"Review data shared by review.new and review.updated payloads.
UTC time at which Zernio generated this event (set once when the event payload is built, before delivery is queued). Retries and redeliveries keep the original value, so it reflects the event, not the delivery attempt.
date-timeResponse Body
review.updated
Fired when a review changes: the reviewer edits their text or rating, or a reply is added (via the API or directly through the Google Business dashboard). Available on the Usage plan (or AppSumo with the Inbox add-on). The payload has the same shape as review.new; when a reply is present, review.hasReply is true and review.reply is populated. Subscribe with Create webhook settings or Update webhook settings.
Stable webhook event ID
"review.updated"Review data shared by review.new and review.updated payloads.
UTC time at which Zernio generated this event (set once when the event payload is built, before delivery is queued). Retries and redeliveries keep the original value, so it reflects the event, not the delivery attempt.
date-time