Deliverability

Transactional Email Bounces

Handle hard bounces, soft bounces, delayed bounces, complaints, and suppressions for transactional email.

Updated

TL;DR

A hard bounce should usually suppress the recipient. A soft bounce should be retried according to provider policy. Delayed bounces can arrive after SMTP acceptance, so final state must come from webhooks or bounce processing, not the initial send response.

What you will learn

  • Distinguish hard, soft, and delayed bounces
  • Update application state from delivery webhooks
  • Prevent repeat sends to bad recipients

Bounce types

TypeMeaningTypical action
Hard bouncePermanent failure, such as invalid addressSuppress recipient
Soft bounceTemporary failure, such as mailbox fullRetry or defer
Delayed bounceFailure reported after initial acceptanceUpdate final state from webhook
ComplaintRecipient marked as spamSuppress and investigate

The exact classification can vary by receiving server and provider. Store the raw status code and provider reason for audit.

Why bounces arrive late

SMTP is a relay protocol. A provider can accept a message, then later learn that the receiving system rejected it. That final failure can arrive minutes or hours later.

Your application should not mark a message as delivered from the send API response alone. Use delivery events and bounce webhooks.

Application states

Use explicit states:

  1. queued
  2. accepted
  3. delivered
  4. deferred
  5. bounced
  6. complained
  7. suppressed

Keep delivered separate from accepted. A reset token, login link, or receipt may be created before delivery, but support and analytics need the final delivery state.

Suppression rules

Suppress immediately for:

  1. Invalid mailbox hard bounces.
  2. Spam complaints.
  3. Manual unsubscribe or legal opt-out.
  4. Known abusive or role-based addresses if your policy forbids them.

Be careful with:

  1. Mailbox full.
  2. Temporary policy deferrals.
  3. Greylisting.
  4. DNS or routing failures.
  5. Provider throttling.

For those, retry and watch repeated failures before suppressing.

Migration checklist

Before moving providers:

  1. Export hard bounces.
  2. Export spam complaints.
  3. Export unsubscribes.
  4. Export manual suppressions.
  5. Preserve the reason and timestamp.
  6. Import suppressions before first production sends.
  7. Keep old webhooks active until delayed events drain.

This is one of the highest-value steps in a provider migration. Missing suppressions can recreate failures you already paid to learn about.

References

Frequently asked questions

Does an API accepted response mean the email delivered?
No. Accepted means the provider accepted the message. Delivery can still fail later and arrive as a bounce or defer event.
Should password reset emails suppress on every bounce?
Suppress on hard bounces and complaints. Treat temporary or ambiguous bounces more cautiously so a transient mailbox issue does not lock a real user out forever.

Related guides

Put the guide into production

Postscale brings sending, inbound processing, DMARC reporting, and masked addresses behind one API so the operational pieces stay connected.