# Soft Bounce vs Hard Bounce Email: Infrastructure Guide

URL: https://notificationharbor.com/journal/soft-bounce-vs-hard-bounce-email
Type: blog
Locale: en
Published: 2026-09-22
Updated: 2026-09-22

---

> Understanding soft bounce vs hard bounce in email is foundational for any team running email at scale. SMTP codes 4xx and 5xx determine whether to retry or suppress.

Soft bounce vs hard bounce email delivery failures reduce to one SMTP digit: 4xx means "try again later," 5xx means "this address is gone." Send to a full inbox and get a 4xx; the stack retries. Send to a nonexistent address and the remote server returns a 5xx; your suppression list should update in the same minute. Getting that classification wrong erodes domain reputation faster than most other operational mistakes.

## SMTP Codes Are the Only Classification That Matters

Every email delivery failure reports a three-digit SMTP response code. The first digit is the one your bounce processor should branch on.

4xx codes indicate a transient condition: the receiving server accepted the connection, evaluated the message, and decided it cannot deliver right now. 5xx codes indicate a permanent condition: the receiving server is telling you to stop trying this address entirely.

That branching logic is infrastructure-grade. Your application should not need to read the human-readable diagnostic text to decide whether to suppress; the first digit makes that call.

The second and third digits add specificity. A 452 tells you the mailbox is full. A 550 tells you the address does not exist. A 421 tells you the server is temporarily unavailable. Most bounce classifiers map these sub-codes to internal event types, but the 4/5 split remains the primary branch. If your pipeline treats all 4xx as retryable and all 5xx as terminal, you will cover roughly 95% of production cases correctly.

## What Causes a Soft Bounce -- and How Long to Retry

The most common 4xx scenarios a production email pipeline encounters, in rough order of frequency:

**Full mailbox (452)**: The recipient's quota is exhausted. Most ESPs retry for 24 to 72 hours before converting to a hard failure. This code is over-represented on consumer inboxes; B2B addresses rarely produce it in isolation.

**Greylisting (451)**: The receiving MTA temporarily defers unknown senders as a spam precaution. A retry 10 to 30 minutes later usually succeeds. This is a normal part of the first-send handshake on a new domain or IP, not a sign of list quality problems on its own.

**Server temporarily unavailable (421)**: The remote server is down, rate-limiting, or overloaded. Retry with exponential backoff. Most servers recover within a few hours; if this persists across multiple days for the same domain, the domain itself may be in trouble.

**Message too large (552/554 soft variant)**: The email exceeds the server's size limit for this mailbox. Retrying without reducing payload size will always fail; route this to a separate handling queue and alert the sender.

![Email envelope deflecting off a metallic surface, representing a soft bounce event](https://fdzlnqpwsaniezitwiuw.supabase.co/storage/v1/object/public/cms-media/notificationharbor/2026-09/788605-image-inline1.webp)

Standard retry windows in production: first retry after 5 minutes, then 30 minutes, then 2 hours, then 6 hours, then 24 hours. After 5 days without successful delivery, the SMTP convention is to generate a non-delivery report (NDR) and return the message to the sender. Whether your ESP adheres to that 5-day window or cuts it shorter is worth verifying in your configuration.

One metric worth tracking: the ratio of soft bounces that resolve on first retry versus those that require more than three attempts. A healthy list will see most 452 and 421 codes resolve within two retries. High persistence across many retry cycles is a signal worth investigating at the segment level.

## The Three Hard Bounce Modes Your Pipeline Will See

5xx codes are not monolithic. The sub-codes tell you different things about what to do after suppressing.

**Non-existent address (550/551)**: The domain is valid but the local part does not map to a real mailbox. This is the most common hard bounce in consumer-facing products: signup typos, abandoned accounts, addresses that were valid six months ago and then deleted. Suppress immediately. There is no recovery path.

**Domain does not exist or accept mail (550/553/554)**: The MX record lookup failed, or the domain explicitly rejects all inbound mail. Suppress at the domain level, not just the address. Any other contacts on that domain are equally unreachable, and a domain-level query will surface them faster than waiting for each to bounce individually.

**Permanently blocked by policy (550/5.7.1)**: The receiving server has a policy-level block against your sending domain or IP. This is rarer but operationally more serious because it may affect a class of addresses across an entire organization. Cross-reference with your IP reputation logs before deciding whether to suppress just the triggering address or escalate to your deliverability team.

![Abstract network routing paths diverging, one path connected, one returning as a bounce](https://fdzlnqpwsaniezitwiuw.supabase.co/storage/v1/object/public/cms-media/notificationharbor/2026-09/6b5951-image-inline2.webp)

One nuance that causes bugs in production: some MTAs return 4xx codes for what are effectively permanent conditions. A domain that has expired and been parked may return 450 rather than 550 for weeks while the registrar slowly tears down the MX record. Your pipeline should treat any address returning a 4xx on five consecutive attempts across two weeks as a candidate for hard-bounce status, regardless of the SMTP prefix.

## When Soft Bounces Become Functionally Permanent

The clean category boundary between 4xx and 5xx does not hold under production conditions. Three patterns should trigger the same suppression logic as a hard bounce even when the code stays in the 4xx range.

First: **repeated full-mailbox bounces with zero prior engagement**. If an address has never opened, never clicked, and has bounced 452 five times in the past 30 days, the mailbox is almost certainly abandoned. Continuing to attempt delivery increases your bounce rate without any realistic chance of activation. Treat it as hard.

Second: **persistent greylisting with no resolution**. Greylisting resolves on retry for legitimate senders. If the same address consistently delays beyond 48 hours, you are either on a blocklist or sending to a spam trap. Neither case justifies continued attempts; the retry cycles compound the reputation damage.

Third: **4xx codes that appear only for your sending domain**. If other senders reach the same address successfully but your sends consistently get deferred, the problem is sender reputation, not mailbox state. Retrying more aggressively makes it worse.

The operational rule to encode: after three soft bounces with no resolution, move the address into a probationary suppression state. Stop sending lifecycle emails to it. Keep it eligible for critical transactional email (password reset, billing alert) until you have confirmed it is truly unreachable.

## Suppression Logic: Remove vs. Park vs. Retry

Not every bounce event warrants full removal from your contact store. The right call depends on the bounce type and the contact's prior engagement history.

**5xx hard bounce (any prior engagement)** -- Immediate suppression, no retries.

**4xx, first occurrence (active engagement)** -- Retry per schedule, no suppression.

**4xx, three or more occurrences (no prior engagement)** -- Probationary suppression.

**4xx, five or more occurrences (any engagement)** -- Treat as hard bounce.

**4xx full-mailbox only (high LTV or transactional)** -- Retry weekly for 30 days.

The distinction between "remove" and "park" matters in practice. A removed address drops from your contact store entirely. A parked address stays with a suppressed status: you can still query it, surface it in a health dashboard, and reactivate it if the contact opts back in through a new form submission. For high-value transactional flows, parking is the right call. For cold outreach lists, removal is cleaner.

One operational point worth enforcing in code: whichever action you take should be logged with the SMTP code and timestamp as the suppression reason. Suppression events without explicit reasons are nearly impossible to audit later when you want to understand why a cohort of addresses went dark between two campaigns.

## Bounce Rate Thresholds That Change ISP Behavior

The 2% total bounce rate figure that circulates as an industry benchmark is a floor, not a target. The actual thresholds that matter are more granular.

Gmail and Outlook report sender-level spam rates through Google Postmaster Tools and Microsoft SNDS respectively. Those dashboards do not directly expose your bounce rate, but the two signals correlate tightly. A sustained bounce rate above 2% almost always precedes a spam placement rate increase visible in those tools, typically with a 3 to 5 day lag.

Practical thresholds to monitor per sending domain:

- 
**Below 0.5%**: Normal range. No corrective action required.

- 
**0.5 to 1.5%**: Monitor closely. Investigate bounce reasons by segment; usually a few cohorts with degraded data quality.

- 
**1.5 to 2.5%**: Pause the campaign and investigate before resuming. Most ESPs begin automated rate-limiting in this range.

- 
**Above 2.5%**: Stop the send. Clean the affected segments before restarting. At this level, some ISPs have already started filtering messages to spam or deferring connections at the gateway.

![Engineer monitoring email delivery metrics on multiple screens in a server operations center](https://fdzlnqpwsaniezitwiuw.supabase.co/storage/v1/object/public/cms-media/notificationharbor/2026-09/bc5931-image-inline3.webp)

One operational detail that gets overlooked: bounce rates are calculated against attempted deliveries, not total list size. If you segment heavily and send only to engaged subscribers, your absolute bounce count drops but the calculated rate may not change proportionally. Track both absolute count and rate per send. Spikes in absolute count are often the earlier warning signal, especially after a list import or a re-engagement campaign.

## Reading Bounce Signals in Your Delivery Trace

Bounce events should appear in your delivery trace with the same fidelity as opens and clicks. If they do not, your observability setup has a gap.

At minimum, each bounce event should record: timestamp, SMTP response code, full diagnostic message from the remote server, sending IP, receiving domain, and contact ID. The receiving domain is frequently omitted and frequently needed. When a domain starts returning 550 5.7.1 across multiple contacts, you want to detect that pattern at the domain level before it damages your reputation score across the full sending domain.

With that data modeled correctly, three views cover most bounce monitoring needs: a daily bounce rate per sending domain, a soft-to-hard conversion rate per cohort (how many of today's 4xx events will still be bouncing in 10 days), and a domain-level bounce frequency table to catch organizational suppressions before they compound.

The goal is not a zero bounce rate. That is not achievable on a list that grows. The goal is a bounce processing pipeline that classifies accurately on the first SMTP response, suppresses at the right threshold, and surfaces the signals that indicate a systemic problem before it escalates into a deliverability incident.

## FAQ

### What is the difference between a soft bounce and a hard bounce in email?

A hard bounce is a permanent delivery failure indicated by a 5xx SMTP code: the address does not exist, the domain is gone, or the server has a permanent policy block. A soft bounce is a temporary failure indicated by a 4xx SMTP code: the inbox is full, the server is temporarily unavailable, or the message was rate-limited. Hard bounces require immediate suppression; soft bounces trigger retry logic.

### What SMTP codes indicate a soft bounce versus a hard bounce?

SMTP codes starting with 4 (4xx) indicate soft bounces: 421 (server temporarily unavailable), 450/451 (mailbox temporarily unavailable or greylisting), 452 (mailbox full). SMTP codes starting with 5 (5xx) indicate hard bounces: 550 (mailbox or domain does not exist), 551/553 (user not local), 554 (transaction failed permanently), 550/5.7.1 (policy block).

### How many times should I retry a soft bounce before suppressing the address?

The standard production retry schedule is: 5 minutes, 30 minutes, 2 hours, 6 hours, then 24 hours. After five days without successful delivery, treat the address as undeliverable. For addresses with no prior engagement, treat three consecutive soft bounces within 30 days as equivalent to a hard bounce and suppress proactively.

### Should I remove hard-bounced email addresses immediately?

Yes. Hard-bounced addresses should be suppressed immediately after the first 5xx response. Continuing to send to hard-bounced addresses damages your sender reputation and signals poor list hygiene to mailbox providers like Gmail and Outlook, which can result in increased spam filtering across your entire sending domain.

### What bounce rate will trigger ISP filtering or account suspension?

Below 0.5% is the normal operating range. Between 1.5% and 2.5%, most ESPs begin automated rate-limiting. Above 2.5%, some ISPs start filtering your messages to spam or deferring gateway connections. Monitor bounce rate per sending domain, not just globally, and track both absolute count and rate to catch spikes early.

### Can a soft bounce become a hard bounce over time?

Yes. Some MTAs return 4xx codes for effectively permanent conditions such as expired domains or abandoned inboxes that will never recover. An address that produces repeated 4xx codes with no successful delivery across five consecutive attempts over two weeks should be treated as a hard bounce by your suppression logic, regardless of the SMTP prefix.

### How do I detect a hard bounce in my email delivery trace?

Each bounce event in your delivery trace should record the SMTP response code, the full diagnostic message, the sending IP, the receiving domain, and the contact ID. A 5xx code in the SMTP response field is the primary hard bounce signal. Monitor at the receiving-domain level: a domain returning 5xx codes across multiple contacts warrants a domain-level suppression review, not just per-address action.