Audience
Suppressions
The suppression list is a per-project set of email addresses Deckle will never send to. It protects your sender reputation by keeping known-bad and opted-out recipients out of every send.
Every send is checked against the suppression list first. If a recipient is on it, the send is rejected before it ever reaches AWS SES — so a hard bounce or complaint you’ve already seen can’t happen twice.
What is the suppression list#
The suppression list is a project-scoped set of addresses that Deckle refuses to deliver to. It exists to protect your deliverability: repeatedly emailing an address that hard-bounced, or one that marked you as spam, is exactly what damages a sender’s reputation. Because Deckle uses Model A — you send from your own verified domain — that reputation is yours to protect.
Suppression is enforced on every send path: transactional API sends, SMTP, campaigns, and automations. There is no way to opt an individual send out of the check.
Automatic vs manual#
Addresses land on the list two ways. Most entries are added for you, but you can also curate the list by hand.
Added automatically#
When AWS SES reports a hard bounce or a complaint, the notification flows back to Deckle over SNS and the recipient is suppressed automatically. You don’t have to do anything — the address is on the list before you could send to it again. Contacts who unsubscribe are suppressed the same way.
Added manually#
You can add and remove addresses yourself, from the dashboard (Audience → Suppressions) or through the API. Manual entries are useful for addresses you already know are bad, or for honoring an opt-out request that came in over another channel. Removing an address clears it from the list so future sends go through again.
Removing is not always safe
Deleting ahard_bounce or complaint entry lets you send to that address again, but the underlying reason usually still holds. Only remove entries you know are safe to re-engage.Manage the list#
The SDK exposes list, create, and delete on deckle.suppressions. Listing is cursor-paginated like every other list endpoint.
import { Deckle } from "@deckle/sdk";
const deckle = new Deckle(process.env.DECKLE_API_KEY!);
const { data, has_more, next_cursor } = await deckle.suppressions.list({
limit: 50,
});
for (const entry of data) {
console.log(entry.email, entry.reason);
}Full endpoint reference
For request bodies, response shapes, and status codes, see the Suppressions API reference.Reasons#
Every entry carries a reason that records how the address got onto the list.
| Reason | Added by | What it means |
|---|---|---|
hard_bounce | Automatic | SES reported a permanent bounce — the mailbox doesn’t exist or rejected mail outright. |
complaint | Automatic | The recipient marked a message as spam, reported via an SES feedback loop. |
unsubscribe | Automatic | The contact opted out through a one-click unsubscribe or the hosted preference page. |
manual | You | Added by hand in the dashboard or through the API. |
Sending is blocked#
Any send targeting a suppressed address is rejected with HTTP 422 and the standard error body. The message is never queued and never reaches SES.
{
"error": "Recipient jane@example.com is suppressed (hard_bounce)"
}The reasons a send can be blocked at this stage are:
- The recipient is on the suppression list for any reason (
hard_bounce,complaint,unsubscribe, ormanual). - To resume sending, remove the address with
deckle.suppressions.delete(email)— but only once you know the underlying issue is resolved.
Test the check
The AWS SES simulator addressbounce@simulator.amazonses.com triggers a hard bounce, which auto-suppresses it. Send to it once with a test key to watch the list update.