
# Communication Consent and Opt-Outs

When somebody asks not to be contacted, that decision has to survive every
campaign, every agent and every channel — not just the one they said it on.
This article covers what Karmaflow.ai stores on a contact, the three ways an
opt-out gets recorded, where it is enforced, and how skipped contacts are
reported.

**The default matters: a contact with no consent record is reachable on every
channel.** Consent here is a record of someone having said *no*. Its absence
is not permission withheld — it is nothing having happened yet. Existing
contacts are unaffected until somebody sets consent on them.

## What you'll need

- **`crm:contacts:read`** to see a contact's consent state.
- **`crm:contacts:edit`** to change it by hand.
- Nothing else. Consent recording is on for every workspace and cannot be
  switched off.

## The two levels

Each contact carries an optional consent record with two levels, and the
difference between them decides what an agent does next.

| Field | Meaning |
|---|---|
| **Do not contact** | The master switch. Suppresses **every** channel. |
| **Opted out of email / SMS / voice** | A per-channel opt-out. Suppresses only the channel it names. |
| Updated / by / reason | Provenance of the last change — when, who or what, and why. |

The master switch is deliberately conservative: it suppresses a channel even
where that channel has no per-channel box of its own. A per-channel opt-out
only ever suppresses the one channel it names.

**Chat has no box of its own.** A chat conversation is evaluated against the
**email** opt-out, because an email address is what a chat conversation
ultimately writes to.

**Nothing is ever cleared automatically.** Every route below only ever *sets*
a flag. Opting somebody back in is a deliberate human action on the contact
record — a later friendly message from the same person is never treated as
consent restored.

## The three ways an opt-out gets recorded

### 1. The contact told the channel

These arrive from the channel itself and are recorded without anyone reviewing
them.

| What happened | Opts out of |
|---|---|
| The contact texted a stop word | SMS |
| A mail unsubscribe, or a spam complaint | Email |
| An agent heard "don't call me again" on a call | Voice |

The texted stop words are the standard carrier vocabulary — **STOP, STOPALL,
UNSUBSCRIBE, CANCEL, END, QUIT**. **START, YES** and **UNSTOP** are the
opt-*in* words. **HELP** and **INFO** ask for help and are neither.

Email has no carrier vocabulary, so an opt-out typed into a reply is read from
the sender's own words — and read conservatively, because an unsubscribe
cannot be undone by automation. Only the opening of a message counts, it is
judged sentence by sentence, and a sentence is skipped when it:

- asks a question about the mechanism — *"How do I unsubscribe my colleague?"*
- is the sender's own footer boilerplate
- negates the ask — *"please do **not** remove me"*

Phrases that can only mean one thing — *"stop emailing me"* — count wherever
they appear. Phrases that name a list to come off count only in a reply to one
of our own automated sends, because ordinary correspondence uses them too
(*"remove me from the Friday series"*). Naming a thread, meeting or series
instead of a list is read as a correction, not an opt-out.

### 2. An agent recorded it

Every customer-facing chat, voice and SMS agent can record an opt-out, and
**this is always on** — it is not a checkbox in the agent's tool picker and it
cannot be switched off. A customer who asks not to be contacted must be
recordable whatever else that agent was configured to do.

The agent records the channel the customer named, or *all* when they want no
contact at all, and the customer's own words are kept as the reason. Recording
it this way also raises the same compliance event as a texted STOP, so a
spoken *"take me off your list"* pauses sequences and fires the same triggers.

### 3. Somebody set it by hand

Open the contact from **CRM → Records → Contacts** and find the
**Communication consent** card on the record. It carries:

- a **Do not contact** checkbox, labelled *suppresses every channel*
- one **Opted out of…** checkbox per channel, under **Per-channel opt-out**
- the date it was last updated, and the reason if one was given

With **Do not contact** ticked, the per-channel boxes dim and the card shows
*Do-not-contact is on — no proactive messages are sent on any channel.*
Changes save as you tick them; a checkmark appears in the card header when the
save lands.

> The per-channel boxes stay visible while the master switch is on so you can
> see the underlying state, but the master switch is what is being enforced.

## Where it is enforced — twice, on purpose

Consent is checked at **reachability time**, when a campaign decides who to
enrol, and checked **again at send time**, immediately before the message goes
out.

The second check is not belt-and-braces. A send can wait in an approval queue,
and a campaign can run for days — the contact may opt out in between. Without
the second check the platform would deliver a message to somebody who had
already said stop, and it would be a message a human had approved.

**A suppressed send is never a silent drop.** It writes a visible row on the
same log as a real send, with status **Suppressed** and the reason on it,
stamped with the strategy or orchestration that tried. It also costs nothing —
no model call and no message fee.

## What your team sees

When a campaign skips somebody, it distinguishes **opted out** from **no
reachable channel**, and the distinction is the point:

- **Opted out** — the contact made a decision.
- **No reachable channel** — you have a data problem.

Reporting the first as the second hides a customer's choice from you, and
makes a campaign look broken when it is working exactly as intended. On a
campaign's recipient list, a contact who has opted out of the channel in play
carries an explicit *opted out* flag on their row rather than quietly
disappearing from it.

## Reachability is more than consent

A contact can be fully opted in and still not be reachable on a channel. Each
channel asks a different question:

| Channel | Needs |
|---|---|
| **Email** | An address on file that has not been marked bad. |
| **Voice** | Any phone number — calling a company's main line is ordinary. |
| **SMS** | A number the contact **confirmed is theirs**: one they stated, or one they texted you from. |

The SMS bar is higher deliberately. Texting is not the same act as calling: the
message is about one person and arrives wherever that line is answered, so a
switchboard number is not good enough. A cold prospect from a bought list has
no confirmed mobile, and a campaign will not text them.

**Nobody is dropped from a campaign for failing one of these.** A contact with
an email address and a switchboard number is simply reachable on email and
voice, and enrols normally. Getting somebody's mobile becomes a goal for the
conversation rather than a reason to exclude them.

## Troubleshooting

**A contact opted out but still received a message.** Check whether the send
predates the opt-out — the log row carries both timestamps. If the send is
genuinely later, check whether the opt-out was recorded on a different channel
from the one that sent; a per-channel opt-out leaves the others open by design.

**A campaign reports far fewer recipients than the list holds.** Look at the
skip reasons on the recipient list before assuming consent. *No reachable
channel* on an SMS campaign usually means the contacts have no confirmed
mobile, which is a data question, not a consent one.

**Somebody wants to opt back in.** This is deliberately manual. Untick the
boxes on the **Communication consent** card and record why in the reason — no
inbound message and no agent will do it for you.

**You need to stop every channel at once.** Use **Do not contact** rather than
ticking all three per-channel boxes. It also covers channels that have no box
of their own, chat among them.

## Related

- [Managing Contacts](/help/crm/contacts)
- [Send a Campaign](/help/orchestrations/send-campaign)
- [Campaign Results](/help/orchestrations/campaign-results)
- [Sent Mail](/help/reports/sent-mail)

[Sign in to Karmaflow.ai](https://omni.karmaflow.ai/auth/login)
