Someone asked us to stop texting them. How do we make sure it actually stops everywhere?
Opt-out has to be a customer-level fact stored once and read by every system that sends, with the most restrictive value winning any conflict. In practice the flag gets set in whichever tool received the request and never reaches the other three. Treat suppression as a synced field with an audit trail of who set it, when and on what channel, and check it at send time. Requirements vary by jurisdiction and channel, so confirm yours with counsel.
Where the flag goes missing
Requests arrive through every door. A reply of STOP to a text, a customer telling a CSR on the phone, an email unsubscribe click, a technician being asked in the driveway, a review that says do not contact me again.
Each of those lands in a different system, and only one of them is the system your next campaign will read. The failure is rarely that someone ignored the request; it is that the request was recorded somewhere the sending tool never looks.
Channel-level and global, both
Stop texting me is not stop emailing me, and treating every request as a blanket suppression loses legitimate communication the customer wants, including appointment reminders and invoices.
Model both: a per-channel preference and a global do-not-contact. Also distinguish transactional messages tied to work in progress from promotional ones, because customers who opt out of marketing usually still want to know the technician is on the way. Getting that distinction wrong in either direction causes complaints.
Merges and imports are where the flag gets erased
Two events routinely destroy suppression state. A record merge that resolves fields by recency will happily let a newer record without the flag overwrite an older one with it. And a bulk import from a list vendor or an old spreadsheet writes over preferences that were correct.
The rules are simple and must be explicit: on merge, the most restrictive value wins regardless of recency; on import, suppression fields are never overwritten by an inbound file, only added to. Both belong in the integration layer rather than in each tool's own settings, because that is the only place you can guarantee they are applied consistently.
Keep the evidence, and check at send time
Store the timestamp, the channel, the source system, who recorded it and, where you have it, the customer's actual words. If a question comes up later, an audit trail is the difference between a documented process and an argument.
Then make sure the check happens immediately before dispatch against live data, not when the audience was assembled. A list built last week does not know about a request made yesterday. Enforcing that in one shared layer, rather than trusting each platform to behave, is the practical shape of the problem. None of this is legal advice, and the specific obligations differ by state and by channel, so have your counsel review how your integrated stack handles it.
Topics: opt-out · compliance · data hygiene · suppression
Have a version of this question about your own business?
The useful answer usually depends on which systems you run and how they're connected. That's a conversation, not a blog post.