Honour opt-out replies on outbound WhatsApp campaigns #15196
achiya-automation
started this conversation in
Feature Requests
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
The problem
A contact who replies "stop" / "unsubscribe" to a WhatsApp campaign keeps receiving the next one. Chatwoot has no concept of an opted-out contact — searching the codebase for
opt_outreturns nothing, and the only related matches forunsubscribeare webhook teardown for Instagram/Facebook/Twitter, not recipient opt-out.Why it matters commercially
This is not a nicety. Meta's quality rating is computed from block reasons over a rolling 7-day window, and "Spam" / "Didn't sign up" are the two most damaging. Meta's own guidance is explicit: provide a clear way to opt out in the message. A business that keeps messaging someone who asked to stop gets its number rated down, then throttled, then disabled — and Chatwoot is the tool that sent those messages.
For an operator running campaigns from Chatwoot today, the only workaround is to watch inbound replies by hand and remove contacts manually. That does not scale past a few hundred contacts, and one miss costs the number.
What it would take
Roughly: a keyword match on inbound messages, a suppressed flag on the contact, and a check in the campaign send path. Meta's
131050error code ("user is not accepting marketing") should set the same flag.Two details worth getting right, from running this in production:
131049is an adaptive per-user cap, not a refusal — it relaxes over time and is waived inside an open 24h service window. Treating it as an opt-out permanently discards leads who never objected to anything.Offer
I've implemented this in an MIT-licensed add-on (chatwoot-power-tools, see docs/meta-compliance.md) and I'd be glad to write a native Rails/Vue PR for core instead, in whatever shape you'd prefer. Happy to scope it down to just the English keyword set if the bilingual matching is out of scope.
All reactions