Troubleshooting: email bounces and spam complaints
bounced is the email channel’s terminal failure status — a receiving
mail server returned the message instead of accepting it. Because email
accepts a message and then bounces it later, the bounce arrives on the
same asynchronous webhook path as delivery. This page decodes the DSN
codes and SMTP replies the provider reports, maps each failure family to
the fix, and shows how to read the sender-reputation summary before you
escalate.
If the message was never accepted at all (failed, rejected on send),
work the channel-agnostic
message failure page
first — this page covers only recipient-side rejects after the provider
accepted the send.
Where you see a bounce
Three surfaces carry the same outcome:- Delivery Log — open the row. A recipient-side bounce resolves to
the terminal status
bounced— the email-only terminal status that lives in the platform’s terminal-failure set alongsidefailed,undelivered, andexpired(see the message status lifecycle reference). The Provider Reference and the failure detail the provider returned travel with the row. - Webhook — email delivery outcomes arrive on the channel-agnostic
messageevents, not email-specific ones. A hard bounce, a soft bounce, and a spam complaint all firemessage.failedwithchannel: "email"and the originatingmessage_id(see the email channel guide). Branch on the payload’s failure detail, not the event type. - Deliverability dashboard / API — the tenant-level summary
endpoint
GET /api/v1/email/suppressions/reputationreturns the aggregate sent / delivered / bounced / complaint counts and rates, the health tier and score, and the current suppression-list size over a lookback window (see the email endpoints reference). Compare a single bounce against this baseline before treating it as a trend.
Hard vs soft vs complaint vs spam-trap
The provider reports a DSN (Delivery Status Notification) code and the SMTP reply from the rejecting server. Classify it before you act:
Read the provider’s raw reply on the Delivery Log row —
5.1.1 (user
unknown) and 5.2.2 (mailbox full) look identical from the bounced
status alone, and the fix differs.
Cause → fix
Reading the deliverability surface
GET /api/v1/email/suppressions/reputation summarises a lookback window
into the numbers to report and trend:
- sent / delivered / bounced / complaint counts and rates — the raw numerator and denominator for each outcome family so a spike in one bucket does not hide in a blended rate.
- health tier and score — an ordinal-priority view of how the provider-side reputation stack currently scores the sender.
- suppression-list size — how many addresses the suppression list is actively holding out of future sends right now.
- shared-IP disclosure — whether the sender shares sending IP with other tenants, which affects how much of your own bounce/complaint budget a given number can consume before the pool-averaged health is diluted.
When to escalate
Escalate when the bounce family is genuinely ambiguous or the numbers are off in a direction you cannot correct from your own list source:- All destinations return the same family at the same time (points at the sending side, not one list).
- The reputation endpoint shows a complaint rate hard-correlated with a specific campaign or template.
- SPF/DKIM/DMARC align and content passes the deliverability-score lint, yet bulk traffic still lands in spam.
- Your tenant ID (Settings → Organization in the dashboard; also
returned as
organizationIdbyGET /api/v1/me). - One message ID of a bouncing row (
msg_…). - The bounce code / SMTP reply as the provider returned it (read from the Delivery Log row’s failure detail).
- Your complaint rate over the lookback window, from the reputation endpoint.
See also
- Email channel guide — webhook events and the
message.failedwire contract - Opt-Out & Suppression — how suppression list entries stop future sends
- Message status lifecycle —
where
bouncedlives and the full transition table - Delivery lifecycle — the concept-level state machine behind Delivery Log rows
- Troubleshooting index — the queue-side and pre-submit checks
- Email endpoints reference — the sender-reputation and warmup endpoint shapes