DeckleDocs
Dashboard

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 a hard_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.

ReasonAdded byWhat it means
hard_bounceAutomaticSES reported a permanent bounce — the mailbox doesn’t exist or rejected mail outright.
complaintAutomaticThe recipient marked a message as spam, reported via an SES feedback loop.
unsubscribeAutomaticThe contact opted out through a one-click unsubscribe or the hosted preference page.
manualYouAdded 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, or manual).
  • 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 address bounce@simulator.amazonses.com triggers a hard bounce, which auto-suppresses it. Send to it once with a test key to watch the list update.

Next steps#