SocialMate emits 35 webhook events. Free can subscribe to 9 of them; Pro unlocks them all. The full catalogue with sample payloads lives in the webhook events docs.

The event catalogue
- Messaging:
message.received,message.sent,message.delivered,message.read,message.reaction,poll.vote - Groups:
group.participants_updated— join, leave, promote, demote - Accounts:
account.connected,account.disconnected,account.banned,contacts.updated - Tunnel:
tunnel.started,tunnel.url_changed,tunnel.stopped - Sync:
sync.started,sync.completed,sync.failed - Media:
media.discovered,media.downloaded,media.failed,media.deleted,media.context_updated - Queue:
queue.item.enqueued,queue.item.processing,queue.item.sent,queue.item.failed,queue.item.cancelled,queue.batch.created,queue.batch.completed,queue.batch.cancelled - Anti-ban:
account.danger_mode_enabled,account.danger_mode_disabled - License:
license.activated,license.deactivated,license.tier_changed
Delivery receipts (Pro)
message.sent only means the message was handed to WhatsApp — it never tells you it actually landed. message.delivered (two grey ticks) fires when it reaches the recipient’s phone, and message.read (two blue ticks) when they open it. That closes the loop for notification workflows: an automation that sends an order confirmation or a shipping update can finally learn whether the customer received it and whether they read it. Both carry the messageId of the message you sent — correlate on that — plus a status of delivered or read. Each fires at most once per message, only on a forward step through sent → delivered → read, so WhatsApp’s repeated acknowledgements can’t produce duplicate deliveries.
Two honest limits. message.read depends on a setting the recipient controls: a contact who has switched read receipts off can read your message and you will never get the event, so a missing message.read does not mean “unread”. And message.delivered is a report, not a guarantee — if their phone is off or offline the event simply doesn’t arrive yet, and may never; treat its absence as “not confirmed”, not “failed”.
Good to know: events that carry media (message.received, message.sent, media.discovered) are delivered once the file has finished downloading — usually a few seconds — so the payload arrives with a ready-to-fetch link instead of a file that isn’t there yet (a genuinely stuck download stops holding the event after about two minutes).
Tip. Build a single receiver that switches on the event type. Verify the HMAC-SHA256 signature on every request before trusting the payload.