- Unprocessed bounces are one of the fastest ways to destroy Sender Reputation. Continuing to send to addresses that already hard bounced signals to mailbox providers that you do not maintain your list.
- A bounce processing pipeline has four stages: capture the bounce notification, parse it into structured data, classify it as hard or soft, and act by suppressing or retrying.
- Hard bounces should trigger immediate, permanent suppression. Soft bounces should be retried a limited number of times before escalating to suppression.
- Modern platforms deliver bounce data through different channels: SMTP DSN messages, webhook callbacks, or notification services like AWS SNS. Your pipeline needs to handle whichever your sending infrastructure uses.
- Correct bounce classification depends on reading both the SMTP status code and the enhanced status code, not just the human-readable message, which varies wildly between providers.
Every bulk sender generates bounces. Addresses go stale, mailboxes fill up, domains expire, and typos slip through signup forms. Bounces themselves are normal and unavoidable. What separates senders with healthy Sender Reputation from those who get blocked is what happens after the bounce: whether the bouncing address is promptly removed from future sends, or whether the sender keeps mailing it.
Mailbox providers watch how senders handle bounces closely. A sender who repeatedly mails addresses that have already hard bounced is signaling that they do not maintain their list, do not have permission-based acquisition, and may be a spammer working through a purchased list. That signal damages deliverability for every message you send, not just the ones that bounce.
This guide explains how to build an automated bounce handling pipeline: the four stages every pipeline needs, how to classify bounces correctly, the specific suppression logic that protects your reputation, and the implementation patterns for different sending infrastructures.
Why Bounce Handling Is a Reputation Issue, Not Just a Cleanup Task
The bounce rate is one of the metrics mailbox providers weight most heavily when evaluating a sender. Gmail, Yahoo, and Microsoft all track the percentage of your mail that bounces, and high bounce rates trigger throttling, spam foldering, and outright blocking.
The threshold is lower than most senders expect. A bounce rate above 2% is a warning sign at most providers; above 5% it actively damages reputation. A single send to a stale list that has not been cleaned in a year can easily bounce at 10% or higher, which is enough to trigger immediate reputation damage that takes weeks to recover from.
The compounding problem is repeat bounces. Bouncing an address once is normal. Bouncing the same address repeatedly because you never suppressed it is the specific behavior mailbox providers penalize most heavily, because it is the signature of a sender who does not process bounces at all. An automated pipeline that suppresses on the first hard bounce eliminates this entire category of reputation damage.
The Four Stages of a Bounce Pipeline
Every bounce handling system, regardless of platform, performs four functions. Understanding them as distinct stages makes the implementation clearer.
- Capture. Receive the bounce notification from your sending infrastructure.
- Parse. Extract structured data (recipient, status codes, reason) from the raw notification.
- Classify. Determine whether the bounce is hard (permanent) or soft (temporary).
- Act. Suppress hard bounces immediately; retry soft bounces a limited number of times before escalating.
Stage 1: Capturing Bounce Notifications
How you capture bounces depends entirely on your sending infrastructure. There are three common channels.
SMTP DSN (Delivery Status Notifications)
If you run your own mail server, bounces arrive as DSN messages: specially formatted email sent back to your return-path (envelope sender) address. A DSN is a multipart message with a message/delivery-status part containing the structured bounce data and the original message headers.
To capture DSNs, you configure your return-path to point to a mailbox or pipe that your bounce processor reads. The classic pattern is VERP (Variable Envelope Return Path), where each recipient gets a unique return-path encoding their address, so when the DSN arrives you know exactly which recipient bounced without parsing the message body.
Return-Path: bounce+recipient=example.com@yourdomain.com
Webhook Callbacks
Most ESPs deliver bounce data via webhooks: an HTTP POST to an endpoint you specify, containing structured JSON about the bounce. This is the cleanest channel because the ESP has already parsed the raw bounce into structured fields.
POST /webhooks/bounce HTTP/1.1
Content-Type: application/json
{
"event": "bounce",
"email": "user@example.com",
"type": "hard",
"smtp_code": "550",
"reason": "5.1.1 user unknown",
"timestamp": "2026-01-15T10:30:00Z"
}
Notification Services (AWS SNS)
Amazon SES delivers bounce and complaint notifications through SNS (Simple Notification Service). You subscribe an endpoint (an HTTP endpoint, an SQS queue, or a Lambda function) to an SNS topic, and SES publishes bounce events to it. The payload is JSON similar to a webhook but wrapped in the SNS message envelope.
Critical for SES users: Amazon SES requires you to process bounces and complaints. Accounts that ignore bounce notifications and continue sending to bouncing addresses can be throttled or suspended within days. Setting up SNS bounce processing is not optional infrastructure; it is a requirement for keeping your SES account in good standing.
Stage 2: Parsing the Bounce
Parsing extracts the data you need: the recipient address, the SMTP status code, the enhanced status code, and ideally the human-readable reason. For webhook and SNS channels, the ESP has done most of this for you. For raw DSN messages, you parse the message/delivery-status MIME part.
The fields that matter:
- Recipient: The address that bounced. With VERP, this comes from the return-path; otherwise from the
Final-Recipientfield of the DSN. - SMTP status code: The three-digit code (e.g., 550, 421, 450).
- Enhanced status code: The more granular code (e.g., 5.1.1, 4.2.2) that precisely identifies the failure reason.
- Diagnostic text: The human-readable message, useful for logging but unreliable for classification because it varies between providers.
Stage 3: Classifying Hard vs Soft Bounces
This is the stage where most homegrown bounce processors get it wrong. The classification of hard bounce versus soft bounce must come from the status codes, not the human-readable message, because the message wording varies wildly between mailbox providers while the codes are standardized.
Hard Bounces (Permanent Failures)
Hard bounces are 5xx SMTP codes indicating a permanent failure. The address will never accept mail and should be suppressed immediately. Common hard bounce codes:
- 550 with enhanced code 5.1.1: the mailbox does not exist.
- 553: mailbox name not allowed or invalid.
- 550 with 5.1.10: the recipient address does not exist (Microsoft).
- 541: the recipient address rejected the message.
Soft Bounces (Temporary Failures)
Soft bounces are 4xx codes indicating a temporary problem. The address may accept mail later, so these should be retried before escalating. Common soft bounce codes:
- 421: the service is temporarily unavailable.
- 450: the mailbox is temporarily unavailable (often graylisting).
- 452: insufficient storage (mailbox full).
- 451: local error in processing, try again.
The classification trap: Some 5xx codes are not true permanent failures. A 550 that says "message rejected due to content" or "temporarily deferred" is a policy block, not a dead address. Suppressing those addresses permanently removes valid recipients. Always combine the SMTP code, the enhanced status code, and pattern matching on the diagnostic text to distinguish dead addresses from policy blocks.
Robust Classification Logic
A reliable classifier uses a decision hierarchy:
- Read the enhanced status code first. 5.1.x codes almost always mean a bad address (hard). 4.x.x codes mean temporary (soft).
- Fall back to the SMTP code. 5xx is generally hard, 4xx is generally soft.
- Apply known exceptions. Maintain a list of 5xx codes and diagnostic patterns that are actually policy blocks (reputation, content, rate limiting) rather than dead addresses, and treat those as soft or as a separate "blocked" category that does not trigger permanent suppression.
Stage 4: Acting on the Classification
Hard Bounce Handling
Hard bounces trigger immediate, permanent suppression. Add the address to your suppression list so it is excluded from all future sends. Do this before the next send to that address, which in practice means processing bounces continuously rather than in periodic batches.
The suppression should be permanent and global across all your campaigns. A common mistake is suppressing an address from one campaign but not others, so the same dead address bounces again from a different send. Suppression must be at the account level.
Soft Bounce Handling
Soft bounces get a retry budget. The standard pattern is to retry a soft-bouncing address a limited number of times across subsequent sends, then escalate to suppression if it keeps soft bouncing.
A typical soft bounce policy:
- Track consecutive soft bounces per address.
- Continue sending to addresses with fewer than the threshold (commonly 3-5 consecutive soft bounces).
- When an address exceeds the threshold of consecutive soft bounces with no successful delivery in between, escalate it to suppression. Persistent soft bounces usually indicate a permanently abandoned mailbox even though each individual bounce was technically temporary.
- Reset the counter on any successful delivery, so an address that soft bounces occasionally but mostly delivers is not suppressed.
Handle complaints (spam reports) in the same pipeline as bounces, but treat them more aggressively. A complaint should trigger immediate permanent suppression with zero retries, because a recipient who marked you as spam never wants your mail again, and continuing to send to them generates more complaints that directly damage your complaint rate. Complaints arrive through feedback loops and through the same SNS or webhook channels as bounces.
Architecture Patterns
Real-Time Processing
The strongest pattern processes each bounce as it arrives. A webhook or SNS notification triggers a function that parses, classifies, and suppresses in a single execution, typically within seconds of the bounce. This guarantees a bounced address is suppressed before your next send, which is the entire goal.
For AWS SES, a clean implementation is an SNS topic that triggers a Lambda function. The Lambda parses the SES bounce payload, classifies it, and writes to a suppression table (DynamoDB or your application database). The whole flow runs in well under a second per bounce and scales automatically.
Queue-Buffered Processing
At very high volume, buffering bounces through a queue (SQS, RabbitMQ, Kafka) decouples capture from processing. Bounces land in the queue immediately, and workers drain the queue at a controlled rate. This handles bounce spikes (a send to a bad segment can generate thousands of bounces in seconds) without overwhelming your processing layer.
Idempotency Is Essential
Bounce notifications can arrive more than once. SNS guarantees at-least-once delivery, webhooks may retry on timeout, and DSN messages can be duplicated. Your suppression logic must be idempotent: suppressing an already-suppressed address is a no-op, not an error. Use the recipient address as a natural idempotency key.
Monitoring Your Bounce Pipeline
A bounce pipeline that silently fails is worse than no pipeline, because you believe you are protected when you are not. Monitor:
- Bounce processing lag. Time between bounce arrival and suppression. Should be seconds, not hours.
- Suppression list growth. A sudden spike indicates a bad list import or a sending problem.
- Classification distribution. Track the ratio of hard to soft bounces over time. A shift toward hard bounces indicates list quality degradation.
- Repeat bounces. The number of addresses that bounced more than once. This should be near zero if suppression is working. Any meaningful number means addresses are slipping through suppression.
- Overall bounce rate. Track against the 2% warning line using your Sender Reputation monitoring.
Common Bounce Handling Mistakes
- Classifying on message text instead of codes. Diagnostic text varies between providers; codes are standardized. Always classify on codes.
- Suppressing policy blocks as dead addresses. A 550 content rejection is not a dead mailbox. Distinguish these or you will permanently lose valid recipients.
- Batch processing instead of real-time. If you process bounces nightly but send hourly, you will repeatedly mail addresses that already bounced that day.
- Per-campaign suppression instead of account-wide. A suppressed address must be suppressed everywhere, not just in the campaign where it bounced.
- Ignoring complaints. Complaints are more damaging than bounces and require the same automated handling with immediate suppression.
Frequently Asked Questions
A hard bounce is a permanent delivery failure, indicated by a 5xx SMTP code, usually meaning the address does not exist. A soft bounce is a temporary failure, indicated by a 4xx code, such as a full mailbox or a server being temporarily unavailable. Hard bounces should trigger immediate suppression; soft bounces should be retried a few times before escalating.
Immediately, before your next send to that address. The most damaging bounce behavior is repeatedly mailing an address that already hard bounced, which signals to mailbox providers that you do not maintain your list. Real-time bounce processing that suppresses within seconds of the bounce is the standard, because batch processing risks sending again before suppression takes effect.
A common policy is 3 to 5 consecutive soft bounces with no successful delivery in between before escalating to suppression. Reset the counter whenever a delivery succeeds, so an address that mostly delivers but occasionally soft bounces is not suppressed. Persistent soft bounces usually indicate a permanently abandoned mailbox even though each individual failure was technically temporary.
Most full-featured ESPs handle bounce suppression automatically within their platform. However, if you send through a raw infrastructure provider like Amazon SES, or if you maintain your own list and import it across systems, you must build bounce handling yourself. Amazon SES in particular requires you to process bounce and complaint notifications or risk account suspension.
Complaints should be handled in the same pipeline but more aggressively. A spam complaint means the recipient never wants your mail again, so it should trigger immediate permanent suppression with zero retries. Complaints arrive through feedback loops and the same notification channels as bounces, and they damage your complaint rate directly, which is one of the most heavily weighted reputation metrics.