user_preferences Webhook

Field reference for WhatsApp user_preferences webhooks: marketing message stop and resume events, BSUID identifiers, error 131050, and why Dualhook does not subscribe to it.

The user_preferences field reports when a WhatsApp user stops or resumes marketing messages from a business. It is the webhook that tells you who opted out before a marketing send fails with error 131050.

What user_preferences Reports

Each event carries a user_preferences[] entry with:

FieldValues
categoryAlways marketing_messages.
valuestop (the user stopped marketing messages) or resume (the user resumed them).
detailUser requested to stop marketing messages or User requested to resume marketing messages.
timestampUnix timestamp of the preference change.

When It Fires

Meta sends it when a WhatsApp user stops or resumes marketing messages from the business. It does not fire when a user gives Interested or Not interested feedback through the Offers and announcements setting.

Payload Shape

{
  "object": "whatsapp_business_account",
  "entry": [
    {
      "id": "<WABA_ID>",
      "changes": [
        {
          "field": "user_preferences",
          "value": {
            "messaging_product": "whatsapp",
            "metadata": {
              "display_phone_number": "15550783881",
              "phone_number_id": "106540352242922"
            },
            "contacts": [
              {
                "profile": { "name": "Sheena Nelson" },
                "wa_id": "16505551234",
                "user_id": "US.13491208655302741918",
                "parent_user_id": "US.ENT.506847293015824"
              }
            ],
            "user_preferences": [
              {
                "wa_id": "16505551234",
                "user_id": "US.13491208655302741918",
                "parent_user_id": "US.ENT.506847293015824",
                "detail": "User requested to stop marketing messages",
                "category": "marketing_messages",
                "value": "stop",
                "timestamp": 1731705721
              }
            ]
          }
        }
      ]
    }
  ]
}

User Identifiers

The same identifiers appear in contacts[] and in each user_preferences[] entry, and each one can be missing:

FieldOmitted when
wa_idThe user enabled a username and their phone number cannot be shared with you.
user_idBusiness-scoped user IDs (BSUIDs) are not enabled for your business.
parent_user_idYou have not enabled parent BSUIDs.

parent_user_id is for identification only. Meta never applies a preference at the parent BSUID level, so store the opt-out against the user, not the parent. See BSUID webhook changes for the wider identifier rollout.

Dualhook Handling

Dualhook subscription: not subscribed. Dualhook's Meta app does not subscribe to user_preferences, so a Dualhook connection never delivers it to you, and Meta does not allow Webhook Override for this field. To receive it, subscribe your own Meta app to the field and to the WABA.

Without it, the reliable signal on a Dualhook connection is the failed status with error 131050 on the messages webhook, which Meta delivers to your endpoint directly. Dualhook does not keep an opt-out list or block marketing sends to users who stopped them.

Implementation Notes

  • Key the preference on user_id when present, and fall back to wa_id.
  • Treat stop as a suppression for marketing messages only; it does not cover utility or service messages.
  • Apply resume only if it is newer than the last stop you stored for that user.
  • Suppress on 131050 failures as well, because you may miss preference events or join them to the wrong user.

Related

  • Webhook Subscription FieldsReference list of all 22+ WhatsApp Business Platform webhook subscription fields, what each notifies you of, required permissions, payload size limits, retry policy, and IP allowlisting.
  • Marketing MessagesMarketing template messaging through Dualhook's standard Cloud API runtime, plus boundaries for Meta's separate MM API product.
  • WhatsApp Error 131050: Recipient Opted Out of MarketingWhatsApp error 131050 means the recipient opted out of your marketing messages. You cannot override it — stop retrying and track opt-outs via user_preferences.
  • BSUID Webhook ChangesWhatsApp webhook payload changes for BSUIDs, usernames, parent BSUIDs, optional phone-number fields, statuses, contacts, groups, calling, and Coexistence events.
  • Parent BSUIDsParent BSUID behavior for eligible multi-portfolio WhatsApp businesses, including payload fields, account lookup, supported APIs, and limitations.
Browse more docsStart Free Trial