The account_update field is the broad WABA lifecycle webhook. It covers partner sharing, permission grants and revocations, policy violations, offboarding, reconnection, pricing-tier changes, MM API terms, and business-location updates.
What account_update Reports
Use this field for account-level changes that affect whether a WABA can stay connected, send messages, use specific features, or remain shared with a provider.
It can report:
- WABA deletion, restriction, violation, disablement, or reinstatement,
- partner app install, uninstall, added, or removed events,
- device-change or phone-number-reregistration offboarding and reconnection,
- authentication-international rate eligibility,
- primary business location country changes,
- MM API for WhatsApp terms acceptance,
- volume-based pricing tier changes,
- partner-led business verification status changes.
Key Event Values
| Event | What to do |
|---|---|
ACCOUNT_DELETED | Treat the WABA as no longer usable. |
ACCOUNT_RESTRICTION | Read restriction_info and stop affected actions until resolved or expired. |
ACCOUNT_VIOLATION / DISABLED_UPDATE | Escalate account quality and policy review. |
PARTNER_ADDED | The WABA was shared with a Solution Partner. For Coexistence onboarding, Meta converts the existing WhatsApp Business app account into a Messaging account that keeps its ID and shares that. |
PARTNER_APP_INSTALLED | A customer granted app permissions. Confirm expected WABA ownership and scopes. |
PARTNER_APP_UNINSTALLED | A customer revoked app permissions. Expect token or management failures. |
PARTNER_REMOVED | The WABA was unshared from the partner. If disconnection_info is present, inspect the reason. |
ACCOUNT_OFFBOARDED | The WABA was offboarded after device change or phone number reregistration. |
ACCOUNT_RECONNECTED | The WABA reconnected after a device change or phone number reregistration. |
AUTH_INTL_PRICE_ELIGIBILITY_UPDATE | Store the effective start time and exception countries. |
VOLUME_BASED_PRICING_TIER_UPDATE | Update pricing-tier reporting for the category, region, and effective month. |
MM_LITE_TERMS_SIGNED | The WABA accepted MM API for WhatsApp terms. |
AD_ACCOUNT_LINKED | The WABA was onboarded to MM API for WhatsApp through Embedded Signup or Intent API and gave the partner access to its ad accounts. |
BUSINESS_PRIMARY_LOCATION_COUNTRY_UPDATE | The primary business location was set. country holds the ISO 3166-1 alpha-2 code. |
PARTNER_CLIENT_CERTIFICATION_STATUS_UPDATE | A partner-led business verification submission changed status. Read partner_client_certification_info. |
Events Missing from Meta's Reference
Meta's reference does not list these events, but Dualhook receives them on account_update. Their meaning is not documented by Meta, so treat them as informational.
| Event | Observed value fields |
|---|---|
WEBHOOK_CONFIG_UPDATED | actor (business_id, business_name), event_time, details.field (subscribed_apps), details.change_action (subscribe or unsubscribe). Fires whenever an app's WABA subscription changes, so it is by far the most frequent account_update event. |
BUSINESS_VERIFICATION_STATUS_UPDATE | business_verification_status: BUSINESS_VERIFIED, BUSINESS_REJECTED, or MORE_INFORMATION_REQUESTED. |
BUSINESS_VERIFICATION_NEEDED | waba_info (waba_id, owner_business_id). |
PHONE_NUMBER_ADDED / PHONE_NUMBER_REMOVED | phone_number. |
PHONE_LINK_CHANGED | actor, event_time, details.change_action (LINK or UNLINK), details.phone_number_id. actor can carry a description instead of a business. |
USERNAME_UPDATED | actor, event_time. |
LOC_CHANGED | actor, event_time, details.change_action (ATTACH). |
PMA_PARTNER_SHARING_CHANGED | actor, event_time, details.change_action (SHARE). |
PMA_DELETED | actor, event_time. |
TEMPLATE_MIGRATED | actor, event_time, details.message_template_id, details.dest_pma_id. |
These events use event_time (a string) inside value, and actor.business_name can name another business, such as a partner whose app changed its subscription.
Payload Shape
The wrapper is stable; the nested object changes by event.
{
"object": "whatsapp_business_account",
"entry": [
{
"id": "<WABA_ID>",
"time": 1743451903,
"changes": [
{
"field": "account_update",
"value": {
"event": "ACCOUNT_RESTRICTION",
"restriction_info": [
{
"restriction_type": "RESTRICTED_BIZ_INITIATED_MESSAGING",
"expiration": 1743451903
}
]
}
}
]
}
]
}
Useful nested objects:
| Object | Used for |
|---|---|
waba_info | Partner app events, partner sharing, MM API terms, ad account linking. |
violation_info | Policy or terms violations. violation_type names the violation; see Meta's violation categories. |
restriction_info | Account restrictions and any remediation text. |
ban_info | Disablement and reinstatement state. |
disconnection_info | Coexistence disconnection reason and who initiated it. |
auth_international_rate_eligibility | Authentication-international pricing effective dates. |
volume_tier_info | Volume-based pricing tier, category, region, and effective month. |
partner_client_certification_info | Partner-led business verification status (APPROVED, PENDING, FAILED, DISCARDED, REVOKED) and rejection_reasons. |
Events about a single business phone number, such as ACCOUNT_VIOLATION and ACCOUNT_RESTRICTION events for calling, also include phone_number with the display phone number.
Documented restriction_info[].restriction_type values:
| Restriction | Effect |
|---|---|
RESTRICTED_BIZ_INITIATED_MESSAGING | Cannot start conversations with customers. |
RESTRICTED_CUSTOMER_INITIATED_MESSAGING | Cannot reply to customer-initiated messages. |
RESTRICTED_ADD_PHONE_NUMBER_ACTION | Cannot add new phone numbers. |
RESTRICTED_UTILITY_TEMPLATES | Cannot create utility templates. |
RESTRICTED_DIRECT_SEND_UTILITY_TEMPLATES | Cannot send utility templates via Direct Send. |
RESTRICTED_BUSINESS_INITIATED_CALLING | Cannot place outbound calls. |
RESTRICTED_USER_INITIATED_CALLING | Cannot receive inbound calls. |
RESTRICTED_BIZ_INITIATED_AND_USER_INITIATED_CALLING | Cannot make or receive calls. |
RESTRICTED_USER_INITIATED_CALLING_CALL_BUTTON_HIDDEN | The call button is hidden from users because of low pickup rates. |
remediation is included only when Meta has remediation steps to offer.
Dualhook Handling
Dualhook subscription: subscribed, mostly forwarded. Dualhook's Meta app subscribes to account_update. Meta does not allow Webhook Override for account-level fields, so every event arrives on Dualhook's app-level callback.
Dualhook treats account_update as a high-priority management field. It interprets each event for connection and account state and forwards it to your configured endpoint, with one exception: partner lifecycle events (PARTNER_ADDED, PARTNER_REMOVED, PARTNER_APP_INSTALLED, PARTNER_APP_UNINSTALLED, PARTNER_CLIENT_CERTIFICATION_STATUS_UPDATE), MM_LITE_TERMS_SIGNED, and ACCOUNT_DELETED concern the partner relationship between your WABA and Dualhook. Dualhook consumes those itself and does not forward them. The undocumented events listed above are forwarded like any other.
Dualhook uses these events to surface account restrictions, offboarding, reconnection, partner removal, permission revocation, pricing-tier signals, and MM API terms acceptance. Dualhook stores operational metadata and delivery status only; no customer message bodies or media are part of this field.
The routing effect depends on the event:
PARTNER_REMOVED,PARTNER_APP_UNINSTALLED, andACCOUNT_DELETEDterminally remove only connection rows on the affected customer WABA. Other WABAs in the same organization are untouched.- A terminal partner event is applied only when it includes the affected WABA and a valid
entry.time, and only when that event is not older than the connection's current authorization. Malformed or stale deliveries are retained for investigation but do not delete anything. ACCOUNT_OFFBOARDEDplaces a reversible hold.ACCOUNT_RECONNECTEDreleases it only after Meta access and webhook routing are validated.- A disablement or scheduled disablement places a durable account hold. Reinstatement releases it only after validation.
- A customer-initiated messaging restriction, alone or together with a business-initiated one, blocks the connection until Meta's supplied expiry. A business-initiated restriction on its own (
RESTRICTED_BIZ_INITIATED_MESSAGING) keeps the connection and its webhook routing active: until the expiry, the Runtime API refuses template sends withbusiness_initiated_restrictedand still relays replies inside an open customer service window. Calling, phone-add, and template-only restrictions remain alerts for the affected operation rather than full connection blocks. - Partner-added and app-installed events are onboarding evidence only. They never reactivate an existing connection by themselves.
Implementation Notes
- Switch on
value.eventfirst, then parse the nested object for that event. - Keep unknown event values. Meta adds new account events over time.
- Treat partner removal/deletion as WABA-scoped terminal events and offboarding/reconnection as reversible routing events.
PARTNER_REMOVEDcan includedisconnection_infofor WhatsApp Business app plus Cloud API setups. Inspect the reason before choosing a recovery path.
Documented disconnection_info.reason values:
| Reason | Meaning |
|---|---|
ACCOUNT_DISCONNECTED | The account was disconnected due to enforcement, or the client explicitly deleted their WhatsApp account. |
BUSINESS_DOWNGRADE | The client registered the business phone number with the consumer WhatsApp app. |
CHANGE_NUMBER | The client changed their phone number. |
COMPANION_INACTIVITY | A companion device was inactive for approximately 30 days. |
PRIMARY_INACTIVITY | The primary device was inactive for approximately 14 days. |
USER_RE_REGISTERED | The client re-registered on a new device. |
- Multiple
VOLUME_BASED_PRICING_TIER_UPDATEevents can describe the same tier change. Use the earliesttier_update_timefor canonical reporting.