The short answer
Texting a merchant needs the same prior express written consent as an automated call, plus a second layer the law does not impose: carrier and aggregator rules that require an identified sender, a working opt-out keyword, and campaign registration. The carriers act first and they act without a hearing — a number that draws complaints is filtered long before a regulator hears about it.
Two separate rulebooks govern a text message to a merchant, and only one of them is law. The legal layer is the TCPA and its state equivalents. The operational layer is the carriers and the messaging aggregators, who will throttle or block a sending number on their own judgement and on their own timetable.
| Requirement | Source | What happens if you skip it |
|---|---|---|
| Prior express written consent | TCPA | Statutory damages, per message |
| Sender identified in the message | Carrier rules | Filtering, then blocking |
| STOP honoured immediately | Both | Claims, and campaign suspension |
| 10DLC campaign registration | Carrier rules | Undelivered messages, silently |
| No prohibited content categories | Carrier rules | Campaign rejected outright |
The silent failure
The characteristic SMS problem is not a fine, it is delivery. Unregistered or poorly-rated traffic gets filtered without an error — the platform reports the message as sent, the merchant never receives it, and the floor spends a fortnight concluding the leads are dead. Check delivery receipts against replies before you conclude anything about a batch.
Opt-out has to be real
- STOP, and its common variants, suppress immediately and permanently.
- A merchant who says "stop texting me" in a sentence has opted out as effectively as one who typed the keyword. Reps have to be able to action that.
- Suppression propagates to every channel and every tool, not just the one it arrived on.
- Opt-out survives a CRM migration. This is the one that breaks in practice.
The last two are the same failure as the do-not-call plumbing problem, and they have the same fix: one suppression table that every outbound tool reads before it sends, rather than a flag in whichever system the rep happened to be looking at.