SMS Opt-out Handling Playbook¶
Symptom: Recipients not receiving SMS after opting out or in.
Hypotheses¶
| Hypothesis | Likely Cause | Evidence Tag |
|---|---|---|
| Opt-out list stale | App is out of sync with carrier-level suppression list | [Correlated] |
| STOP keyword processing | Carrier-level blocking is active for the recipient | [Measured] |
| Number reassignment | Recipient's phone number was reassigned to a new user | [Inferred] |
| Opt-in logic failure | The user's START or JOIN keyword was not processed correctly | [Observed] |
flowchart TD
S["Opt-out handling misbehaving"] --> H1{"Opt-out list stale?"}
H1 -- yes --> R1["Sync suppression state from delivery reports"]
H1 -- no --> H2{"STOP keyword processing failing?"}
H2 -- yes --> R2["Fix incoming keyword handling"]
H2 -- no --> H3{"Number reassigned by carrier?"}
H3 -- yes --> R3["Treat recipient as new opt-in required"]
H3 -- no --> H4{"App opt-in logic wrong?"}
H4 -- yes --> R4["Fix consent capture in app"]
H4 -- no --> EV["Collect evidence: delivery reports, Event Grid, app logs"]
EV --> M["Apply mitigation and verify keyword round-trip"] Evidence Collection¶
1. Delivery Reports¶
Filter ACSSMSIncomingOperations for OperationName == "SMSDeliveryReportsReceived" and inspect ResultType (expect Failed) and ResultDescription for opt-out or blocked indicators on outbound messages to the recipient.
2. Event Grid Reports¶
Check Microsoft.Communication.SMSReceived for incoming STOP, UNSUBSCRIBE, or START keywords.
3. App Tracking¶
Review local database of user communication preferences.
Validation¶
[Measured] Monitor Incoming Keywords¶
Verify that the ACS resource received the STOP keyword from the recipient. If it's missing, the app cannot process the opt-out locally.
[Observed] Validate Delivery Error Details¶
Check if the delivery report status code is BlockedByCarrier or OptedOut. These signals confirm carrier-level suppression.
[Correlated] Review Timing¶
Match the user's last received STOP keyword with subsequent delivery failures to that number.
Mitigation¶
- Process Opt-out Events: Subscribe to the
SMSReceivedevent and update your user database immediately when aSTOPkeyword arrives. - Handle Opt-in Keywords: If a user wants to resume, they must send a
STARTorUNSUBSCRIBEkeyword. ACS will automatically handle carrier-level unblocking. - Local Suppression: Always check your local opt-out database before attempting to send an SMS to prevent wasted requests.
- Number Management: Periodically verify number ownership if delivery failures persist for an extended period.
See Also¶
Sources¶
- Azure SMS Opt-out and Keywords Documentation
- Carrier Requirements for SMS Marketing