# Asked once to stop, and it stops

Bounces, complaints, unsubscribes and a reply that just says stop all land on a list. Every send is checked against it on the way out.

[Get started](/signup)
[Documentation](https://docs.aiinbx.com/guides/suppressions)

One send, 144 recipients. Twelve had asked to stop at some point — a bounce, a complaint, an unsubscribe, a reply — so twelve never got it.

How an address lands on one

## Six ways off your list, all of them handled

Five happen without your code running at all.

Hard bounce

Lands on the organisation's list. Nothing tries it again.

Complaint

Filed against the list that message named, the moment it is reported.

Unsubscribe link

Ours, hosted, branded. A scanner clicking it suppresses nobody.

One-click header

What Gmail and Outlook now ask bulk senders for. Answered for you.

A reply saying stop

Read as the opt-out it is. The rest of the thread is left alone.

Your own page

One call, up to a thousand addresses, with a note on where they came from.

Which list

## A list per thing somebody can leave

Every send carries a suppression\_key — per campaign, per product, per customer — and is checked against that list and the organisation’s. So leaving one list leaves one list, and a hard bounce stops everything.

Example: grace@example.com unsubscribed from product-updates, scope optional. What you send her next: “What shipped in August”, sent with suppression\_key product-updates, is suppressed because she left that list. “Your receipt for invoice 4471” and “Reset your password” name no list she is on, and are sent.

Sending for your own customers? Give each of them a [space](https://docs.aiinbx.com/guides/spaces), and their opt-outs stay theirs.

In the console

## Every list, and what each one has stopped

The console's suppressions page: the organisation list, checked on every send, and one keyed list per suppression\_key your sends have named (q4-outreach, product-updates, acme-inc here). Each list shows how many addresses it holds, how many sends it stopped and how many it checked in the last 30 days, and a list whose complaint rate is over the line shows it, as q4-outreach does at 0.34%.

Checking t.neves@vestra.com shows every list it sits on at once: the organisation list, marked as spam, stopping all mail, and q4-outreach, unsubscribed, stopping marketing only. Each entry can be lifted.

Type an address, get the whole answer — across every list at once.

A list's complaint rate over the last 30 days, here 0.34%. Gmail asks bulk senders for under 0.1%, and past 0.3% providers filter the whole domain, not just this list.

Unsubscribes are the system working. Complaints are the domain.

In your code

## Nothing to check before you send

No list to load, no table of your own to join against. The dropped recipients come back on the response.

Step 1, emails.send: filtered before it leaves, nothing to check first.

```
const email = await aiinbx.emails.send({
  ...campaign,
  suppression_key: "q4-outreach",
  unsubscribe: true, // link + one-click headers
})

await recordSkipped(email.suppressed)
```

Step 2, suppressions.add: for the opt-out that happened in your app.

```
await aiinbx.suppressions.add({
  addresses: ["grace@example.com"],
  key: "q4-outreach",
  scope: "optional", // marketing only; receipts still go
  note: "Unsubscribed from the preferences page",
})
```

Step 3, email.unsubscribed: so your own database hears about ours.

```
if (event.type === "email.unsubscribed") {
  const { address, key, scope, source } = event.data

  // "link", "one_click", or "reply" — they wrote back
  await recordOptOut(address, key, scope, source)
}
```

Around it

## The rest of what a list decides

A send to nobody fails.

Every recipient suppressed comes back recipients\_suppressed, not a send that never happened.

Receipts stay out of it.

unsubscribe: true marks a message optional, and a link unsubscribe only stops those. A reply saying stop stops everything.

Taking one off.

Any entry can come off. The console says what that means first — for a complaint, that the next send risks your domain.

It counts what it stops.

Hundreds of blocks on one entry means a code path still mailing somebody who left.

## Give your product an inbox. The hard parts are already handled.

[Get started](/signup)
