# STOP and opt-out

A text message that reads as an opt-out is treated as a directive before it is treated as correspondence. Connect writes a suppression against that person, records the decision in the audit trail, and refuses outbound contact from that moment — not at the end of a batch and not after a review. This half of SMS works today, even though sending on the live carrier does not.

- **Status:** Foundation
- **Audience:** both
- **Channels:** sms
- **In the app:** #/inbox, #/relationships, #/autonomy-audit
- **Last verified:** 2026-09-10
- **Canonical:** https://connectbyjbrh.com/docs/sms/stop/

## What counts as a stop request

The recognised words are the conventional ones a person expects to work without being told: **STOP**, and the opt-out vocabulary that accompanies it in ordinary use. Matching ignores case and surrounding punctuation, because somebody typing a full stop after it at eleven at night is not filling in a form and should not have to.

What is deliberately not attempted is sentiment. A long message expressing irritation is not silently converted into a permanent block by a model's reading of tone — that would make an unpredictable, unauditable rule out of a legal one. Someone who wants a business to stop writing and does not use an opt-out word is handled the way any other request is: a person sees it in Needs You and decides, and the decision is recorded as theirs.

> **Note** The narrow, literal rule is the feature. An opt-out that fires reliably on a known word is one you can explain to a regulator, to a customer and to a colleague. One that fires on a model's impression of a message is none of those things.

## What is written, and where it lives

**A suppression against the person** — The refusal itself, checked before any outbound message is prepared rather than after one is drafted.
**A memory row tagged `block:sms`** — The durable directive. It lives in the tag list rather than the body, because `directives()` reads only tags — text in the body would be advice the engine can overlook.
**An audit entry** — What was decided, under which rule, and what followed. A refusal is a decision, so it is recorded like one.
**The message itself** — Kept on the conversation. The evidence for a suppression is the customer's own words, and deleting them would leave the block unexplained.

The tag is what makes the refusal portable. A block recorded as a property of one channel's settings is a block one channel honours; a tagged memory row against the contact is resolved on every future decision about that person, by the same memory tiers autonomy uses. That is why an opt-out here can be made to reach further than SMS — see [SMS suppression](/docs/sms/sms-suppression/) for the difference between a channel-scoped block and a do-not-contact entry.

## How quickly it takes effect

1. The inbound message is scanned at ingest, before the agent loop sees it.
   - Result: The suppression exists before any reasoning happens. There is no window in which a draft is written against someone who has just opted out.
2. Anything already queued for that person is re-checked against suppression at the send boundary.
   - Result: A follow-up scheduled yesterday does not go out today. Suppression is evaluated when a send is attempted, not when it was planned.
3. The refusal is recorded with its reason.
   - Result: The Decision Log shows a refusal rather than a silence, so nobody spends an afternoon wondering why a sequence stopped.

> **Careful** A message already handed to a provider cannot be recalled. If an email left Connect a second before the stop request arrived, it will still be delivered. That is a property of every messaging network, not a gap in the rule.

## What this does not cover

Honouring **STOP** does not make Connect an SMS sender. On the live carrier there is no outbound SMS at all, so the practical effect of a stop request today falls on the channels that can send — the person stops receiving email and WhatsApp under the same directive, provided the block is recorded at contact level rather than for `sms` alone.

Nor does it cover the paperwork a sender needs in India. Being able to honour an opt-out is not the same as being permitted to send: commercial SMS there additionally requires DLT registration with the telecom operators, which is a process rather than a setting.

## Questions

### Does a stop request block every channel or only SMS?

It depends on the scope the directive is written at. A `block:sms` tag stops SMS; a block recorded against the contact with no channel qualifier stops everything. If somebody says stop by text and means stop entirely, widen the directive on the contact — the workflow is in [A do-not-contact reaching every channel](/docs/workflows/dnc-across-channels/).

### Can the Assistant clear a block?

No. The Assistant's rights are deliberately narrower than a person's, and clearing a do-not-contact entry is one of the things it may not do at all. A person with the right permission clears one, and the clearing is audited.

### What does the customer receive back?

On the live carrier, nothing by SMS, because no SMS can be sent. With a provider that carries SMS, a confirmation is the conventional and often expected courtesy, and it is subject to the same registration rules as any other outbound message in India.

## Related

- [SMS suppression](https://connectbyjbrh.com/docs/sms/sms-suppression/)
- [SMS in Connect](https://connectbyjbrh.com/docs/sms/)
- [An SMS STOP, end to end](https://connectbyjbrh.com/docs/workflows/sms-stop/)
- [A do-not-contact reaching every channel](https://connectbyjbrh.com/docs/workflows/dnc-across-channels/)
- [Receiving SMS](https://connectbyjbrh.com/docs/sms/inbound-sms/)
- [Opting out of WhatsApp](https://connectbyjbrh.com/docs/whatsapp/opt-out/)

## What this page is based on

- `docs-source/sources/CHANNELS.md` §3 — STOP and suppression
- `docs-source/sources/GENERAL.md` §3, §5 and §6 — tagged directives, autonomy and audit
- Connect capability registry (docs-source/facts.py) — `sms_stop`, `block_directive`
