Skip to main content
Chirp delivers webhooks as HTTP POST requests to your endpoint whenever a subscribed event occurs. This page documents every event type across SMS, WhatsApp, and Calling, including the payload schema and when each event fires.
New events are opt-in. Existing webhook configurations only receive the events they were created with. To receive any of the events marked New below, update your webhook’s events array via the Update Webhook endpoint or the dashboard.

Delivery behavior

All events share the same delivery contract:

Event categories


SMS Messages

SMS message events fire for inbound and outbound SMS/MMS messages.

messages.sms.received

Fires immediately when an inbound SMS or MMS message arrives on one of your phone numbers.
messages.sms.received
For MMS, type is mms and mediaUrl / mediaId reference the attached media.

messages.sms.sent

Fires when a message you sent has been accepted by the carrier.
messages.sms.sent

messages.sms.delivered

Fires when the carrier confirms delivery to the recipient’s device.
messages.sms.delivered

messages.sms.failed

Fires when message delivery fails. The error field uses the same structure as API error responses.
messages.sms.failed

WhatsApp Messages

WhatsApp message events use a single payload shape (data.message) for both inbound and outbound messages. The direction and timestamp fields tell you which lifecycle stage you’re at.

messages.whatsapp.received

Fires immediately when an inbound WhatsApp message arrives on one of your phone numbers.
messages.whatsapp.received
For media messages (type is image, video, audio, document, sticker, location, contacts, reaction, interactive, order, or system), the corresponding nested object on data.message is populated. See Receiving WhatsApp messages for examples of every type.

messages.whatsapp.sent

Fires when a message you sent has been accepted by WhatsApp servers.
messages.whatsapp.sent

messages.whatsapp.delivered

Fires when WhatsApp confirms the message was delivered to the recipient’s device.
messages.whatsapp.delivered

messages.whatsapp.read

Fires when the recipient opens and reads the message.
messages.whatsapp.read

messages.whatsapp.failed

Fires when message delivery fails. The error field uses the same structure as API error responses.
messages.whatsapp.failed
When Meta returns vague failure codes such as account_restricted or display_name_not_approved, Chirp enriches the error.provider field with Health Status details. See WhatsApp webhooks for the enriched shape.

WhatsApp Templates

Template events fire when Meta updates a template’s status, quality, category, or components.

templates.whatsapp.created

Fires when a template is approved or first synced to Chirp.
templates.whatsapp.created

templates.whatsapp.updated

Fires when any template field changes: status, quality score, category, or components. The change.type field describes what changed.
templates.whatsapp.updated (quality change)

templates.whatsapp.deleted

Fires when a template is deleted from Meta.
templates.whatsapp.deleted

templates.whatsapp.connected

Fires when an existing Meta template is linked to one of your Chirp apps.
templates.whatsapp.connected

WhatsApp Contacts

Contact events track the lifecycle of contacts you’ve interacted with via WhatsApp.

contacts.whatsapp.created

Fires when Chirp first sees a contact (first message sent or received with that phone number).
contacts.whatsapp.created

contacts.whatsapp.updated

Fires when a contact’s profile name changes.
contacts.whatsapp.updated

contacts.whatsapp.deleted

Fires when a contact is removed (e.g., opt-out or data deletion).
contacts.whatsapp.deleted

whatsapp.contact.preferences_updated New

Fires when a contact changes their marketing message preferences (opt-in/opt-out). Meta delivers this in real-time.
whatsapp.contact.preferences_updated
preferences.marketing.status is "stop" when the contact opts out of marketing messages and "resume" when they opt back in. Stop sending marketing messages immediately to remain compliant with WhatsApp’s policies.

whatsapp.contact.automatic_event New

Fires when a Click-to-WhatsApp (CTWA) ad triggers a conversion event (e.g., Purchase). Used for ads attribution. Meta delivers this in real-time.
whatsapp.contact.automatic_event
ctwaClid is the click ID from the ad — pass it back to Meta’s Conversions API to close the attribution loop. It is null for Status ad placements.

WhatsApp Groups

Group events fire when WhatsApp groups owned by your phone numbers change. Every payload includes the affected group, the owning whatsappPhoneNumber, and the app. See WhatsApp Groups for the corresponding REST API.

groups.whatsapp.created

Fires when a new group is created and owned by one of your phone numbers.
groups.whatsapp.created

groups.whatsapp.deleted

Fires when a group is deleted. The payload shape is identical to groups.whatsapp.created with event set to groups.whatsapp.deleted.

groups.whatsapp.suspended

Fires when WhatsApp suspends a group (e.g., for policy violations). The payload shape is identical to groups.whatsapp.created with group.suspended set to true.

groups.whatsapp.suspension_cleared

Fires when WhatsApp lifts a previous suspension. The payload shape is identical to groups.whatsapp.created with group.suspended set to false.

groups.whatsapp.participant_added

Fires when one or more participants join the group.
groups.whatsapp.participant_added
participants[].waId is the participant’s WhatsApp ID (phone number without the +). joinedAt may be null when WhatsApp does not provide a timestamp.

groups.whatsapp.participant_removed

Fires when one or more participants are removed by an admin.
groups.whatsapp.participant_removed
initiatedBy is "business" when an admin removed the participant, or "participant" when the participant left voluntarily (in which case groups.whatsapp.participant_left typically fires instead).

groups.whatsapp.participant_left

Fires when a single participant voluntarily leaves the group.
groups.whatsapp.participant_left

groups.whatsapp.join_request_created

Fires when someone requests to join a group whose joinApprovalMode is approval_required.
groups.whatsapp.join_request_created
Approve or reject the request via POST /v1/whatsapp/groups/{groupId}/join-requests/approve or /reject.

groups.whatsapp.join_request_revoked

Fires when a pending join request is revoked (either by the requester or the admin). The payload shape is identical to groups.whatsapp.join_request_created with event set to groups.whatsapp.join_request_revoked.

groups.whatsapp.settings_updated

Fires when the group subject, description, or profile picture changes.
groups.whatsapp.settings_updated
changes may contain any of subject, description, or profilePicture. When an update fails, updateSuccessful is false and the corresponding errors array is populated.

WhatsApp Account

Account events fire when a WhatsApp Business Account (WABA) is connected or disconnected via Embedded Signup, or when Meta raises an alert.

whatsapp.account.connected

Fires immediately when a customer completes Embedded Signup and grants your app access to their WABA.
whatsapp.account.connected
state and metadata are values you passed during the Embedded Signup flow to correlate the event with your internal user.

whatsapp.account.disconnected

Fires when a WABA is disconnected — either by the customer revoking access or by your app removing it.
whatsapp.account.disconnected

whatsapp.account.alert_raised New

Fires when Meta raises a compliance or policy alert against a WABA or phone number. Meta delivers this in real-time.
whatsapp.account.alert_raised
Any field in alert may be null if Meta does not provide it for that alert type.

WhatsApp WABA

whatsapp.waba.review_updated New

Fires when Meta completes a policy review of the WABA. Meta delivers this in real-time.
whatsapp.waba.review_updated
review.decision is one of APPROVED, REJECTED, PENDING, or DEFERRED.

whatsapp.waba.capability_changed New

Fires when a WABA capability value changes — for example, when your daily conversation limit is upgraded. Meta delivers this in real-time.
whatsapp.waba.capability_changed
oldValue is null if this is the first time Chirp has observed the capability.

WhatsApp Phone Numbers

Phone number events track quality, name verification, security, and registration changes.

whatsapp.phone_number.name_updated New

Fires when Meta makes a decision on a display name change request. Meta delivers this in real-time.
whatsapp.phone_number.name_updated
nameStatus is one of APPROVED, REJECTED, PENDING, or DEFERRED. When nameStatus is REJECTED, nameRejectionReason contains Meta’s reason code.

whatsapp.phone_number.quality_changed New

Fires when Meta updates the quality rating or throughput tier for a phone number. Meta delivers this in real-time.
whatsapp.phone_number.quality_changed
qualityRating is GREEN, YELLOW, or RED, or null for newly-onboarded phones with no rating yet. qualityEvent describes what triggered the change: FLAGGED, ONBOARDED, ONBOARDING, UPGRADE, or THROUGHPUT_UPGRADE.

whatsapp.phone_number.security_event New

Fires when a two-step verification PIN event occurs on a phone number. Meta delivers this in real-time.
whatsapp.phone_number.security_event
eventType is one of:
  • PIN_CHANGED — two-step PIN was changed
  • PIN_RESET_REQUEST — a PIN reset was requested
  • PIN_REQUEST_SUCCESS — PIN reset completed successfully
requester is the Meta Business Suite user ID who triggered the event, or null if not provided by Meta.

whatsapp.phone_number.deregistered New

Fires when Chirp detects that a phone number’s verification status has changed from verified to unverified. This event is poll-driven — phones with messages in the last 7 days are checked every 15 minutes; idle phones every 6 hours. Delivery may lag by up to ~6 hours for idle numbers.
whatsapp.phone_number.deregistered
A deregistered phone number cannot send or receive WhatsApp messages until it is re-registered. If you receive this event, re-register the phone number via the Chirp API or dashboard as soon as possible.

Partner & Payment

These events are delivered as-is from Meta. Chirp logs them for observability but does not currently take automated action on them.

whatsapp.partner_solution.updated New

Fires when a Meta multi-partner solution linked to the WABA is created or updated. Meta delivers this in real-time.
whatsapp.partner_solution.updated

whatsapp.payment_config.updated New

Fires when the payment gateway configuration for the WABA changes. Meta delivers this in real-time.
whatsapp.payment_config.updated

Calling

Calling events track the lifecycle of voice calls. Every payload includes an eventId for idempotency and a data.call object with the call’s identifiers and channel routing. See Calling Webhooks Setup for handler examples.

calls.initiated

Fires when a call is created (outbound) or an incoming call is received (inbound).
calls.initiated

calls.ringing

Fires when an outbound call is ringing at the destination.

calls.answered

Fires when the call is answered. The data.call object includes answeredAt and answeredBy.

calls.completed

Fires when a call ends normally. The data.call object includes duration, endReason, and endedAt.

calls.failed

Fires when a call fails. The payload includes a data.error object with type, code, and message.

calls.no_answer

Fires when no one answers a ringing outbound call before it times out.

calls.participant_joined

Fires when a participant joins the call.
calls.participant_joined

calls.participant_left

Fires when a participant leaves the call. The participant object includes duration and leftAt.

calls.recording.completed

Fires when a call recording has finished processing and a signed download URL is available.
calls.recording.completed

calls.voicemail.received

Fires when a voicemail is left. The payload includes the audio URL and an optional transcription.
Recording and voicemail url fields are time-limited signed URLs. To access them later, use the Recordings API to mint a fresh URL.

Full event list

✦ New events — must be explicitly added to your webhook’s events array to receive.