- Only MARKETING-category templates are blocked. Utility and authentication templates, and free-form messages inside an open session, always go through.
- The preference is scoped to the number the contact stopped. Sends from your other numbers are unaffected.
- A contact with no recorded preference is subscribed.
How a stop is recorded
Kapso records a stop from two kinds of signal, and thesource field tells you which one:
Error
131050 means Meta refused the message because the contact has stopped marketing messages.
Both error-derived sources produce the same preference state as the webhook: the contact is
stopped on that number, later marketing sends are refused, and
whatsapp.contact.marketing_preference_changed
fires. A later resume from Meta clears the stop regardless of how it was recorded.
Blocked sends
Sending a marketing template to a stopped contact returns422:
- Broadcasts mark the recipient
suppressedand skip them. See Marketing opt-outs in broadcasts. - Workflow send-template steps record the send as skipped and the workflow continues.
Check a contact’s preference
status is stopped or resumed. marketing_allowed is what you should branch on before a marketing send. An empty data array means the contact never changed their preference — subscribed everywhere.
Fetch a single number with GET /whatsapp/contacts/{identifier}/marketing_preferences/{phone_number_id}. A 404 with "Marketing preference not found" means the contact has no recorded preference on that number — subscribed. Check the error string before treating a 404 as subscribed: a mistyped identifier returns "WhatsApp contact not found" and an unknown number returns "WhatsApp configuration not found".
Mirror opt-outs into your system
Subscribe towhatsapp.contact.marketing_preference_changed. It fires on every real transition — stop and resume — with a monotonic sequence to order deliveries by.

