Email bounce rate: hard bounce vs soft bounce explained
A bounce is a message the recipient's server refused to deliver. Sending platforms split bounces into hard and soft, and that split decides whether you drop the address or wait.
A bounce reaches you one of two ways. Most often the server rejects the message during the SMTP session and never accepts it. Sometimes it accepts the message and fails to deliver it later, and then the sender gets a separate report, a delivery status notification (DSN). Its Action field says delayed when the server is still trying and failed when it has given up. A "Delivery delayed" notice is not a bounce yet.
What is a hard bounce
A hard bounce is a 5xx reply. RFC 5321 treats these as permanent: the client should not repeat the same request. When a report says "hard bounced", the receiving server said no, and sending again will not change its mind.
Where hard bounces come from
- The mailbox is gone. Someone left the company, the account was deleted, or the address was mistyped at signup (gmial.com for gmail.com). The server answers
550 5.1.1. - The domain is gone or takes no mail. If a domain publishes a null MX (RFC 7505), the sending server can refuse right away with
556 5.1.10and never queue the message at all. - The address is malformed: a space, two @ signs, forbidden characters. The reply is
553. - The mailbox is permanently disabled (
5.2.1).
Remove an address after its first hard bounce. Mailbox providers and sending services both expect it. Yahoo says a message that gets a 5xx error should not be retried and that list managers need a policy for removing such addresses. The Amazon SES FAQ says to remove bounced addresses and stop sending to them immediately.
5.7.1 is permanent too, but it means a filter or policy refused the message, and 5.3.4 means it was too large. The mailbox is alive in both cases, so deleting it fixes nothing. Look at your own side instead: the blocklists, your SPF, DKIM and DMARC setup, the size of your attachments.
What is a soft bounce
A soft bounce is a 4xx reply. The address most likely exists, but the server cannot take the message right now. RFC 5321 files a reply as transient if the identical request could succeed when repeated.
Why a server asks you to wait
- The mailbox is full (
452, the second code4.2.2). Once the owner clears space, mail gets through. - The receiving server is overloaded or down for maintenance (
421). - Greylisting: an unfamiliar sender gets a temporary error on the first try, usually 450 or 451, and is accepted on the retry.
- You exceeded a rate limit and the server wants you to slow down.
- The mailbox is temporarily blocked by server policy, a case RFC 5321 names in its description of
450.
A temporary error does not lose the message. The sending server queues it and tries again. RFC 5321 says the retry interval should generally be at least 30 minutes and that the sender should keep trying for at least four to five days before giving up. If nothing works by then, a DSN with failed goes back, and the soft bounce shows up as a hard one. Sending platforms usually run a shorter retry window of their own.
If an address bounces once, leave it on the list. If it bounces campaign after campaign, a counter decides. Mailchimp, for example, allows seven soft bounces for a contact with no activity and up to fifteen for one who has engaged before, then treats the address as a hard bounce and cleans it.
Hard bounce vs soft bounce
| Hard bounce | Soft bounce | |
|---|---|---|
| Reply class | 5xx | 4xx |
| Resending | Will not help | The server retries on its own |
| What to do with the address | Suppress at once | Count repeats, suppress after a streak |
| Typical codes | 550 5.1.1, 553, 556 5.1.10 | 421, 450, 451, 452 4.2.2 |
| When the address is not at fault | 5.7.1, 5.3.4 | Almost always |
SMTP error codes: reading a bounce
A server reply carries two codes. The three-digit one comes from RFC 5321. The second, shaped like 5.1.1, is an enhanced status code from RFC 3463 and narrows down the cause. This is how Gmail answers mail for a mailbox that does not exist:
550-5.1.1 The email account that you tried to reach does not exist.Basic reply codes
| Code | Meaning per RFC | Failure |
|---|---|---|
| 421 | Service not available, closing the channel | temporary |
| 450 | Mailbox unavailable: busy or temporarily blocked for policy reasons | temporary |
| 451 | Local error in processing | temporary |
| 452 | Insufficient system storage, or too many recipients | temporary |
| 550 | Mailbox unavailable: not found, no access, or rejected for policy reasons | permanent |
| 551 | User not local | permanent |
| 552 | Exceeded storage allocation | permanent, with a caveat |
| 553 | Mailbox name not allowed, e.g. bad syntax | permanent |
| 554 | Transaction failed | permanent |
| 556 | Domain does not accept mail | permanent |
The 552 caveat is in RFC 5321 itself. The old standard wrongly assigned 552 to "too many recipients", so clients are told to treat that 552 as temporary; the correct code is 452. And 550 covers more than a missing mailbox, since policy rejections use it too. Decide by the second code and the reply text, not by the first digit alone.
Enhanced codes worth telling apart
| 5.1.1 | No such mailbox. The textbook hard bounce: remove the address. |
| 5.1.2 | The domain does not exist or cannot accept mail. |
| 5.1.10 | The domain publishes a null MX and has declared it takes no mail. |
| 4.2.1 / 5.2.1 | The mailbox exists but is disabled. The first digit tells you whether for good or for now. |
| 4.2.2 | Mailbox full. RFC 3463 calls this a persistent transient failure. |
| 5.3.4 | The message is over the size limit. Permanent, yet the address is fine: send a smaller message. |
| 4.4.7 / 5.4.7 | Delivery time expired after the retries ran out. |
| 5.7.1 | Delivery not authorized. A filter or policy refused the message, so the problem is the sender. |
Some reports mention an "error 571". The standard does not define such a code, but some servers send it; read it as 5.7.1.
Bounce rate: formula and what is acceptable
Bounce rate is the number of bounces divided by the number of messages sent, times 100. Send 2,000 messages, get 30 back, and the rate is 1.5%.
bounce rate = bounces ÷ sent × 100%Platforms do not all count the same way. Amazon SES counts only hard bounces, and only to domains you have not verified; a full mailbox or a blocked IP does not enter its bounce rate. It also measures over a "representative volume" of your mail rather than a fixed period. Numbers from different services are not directly comparable.
So what counts as acceptable? There is no single answer. Mailbox providers do not publish their bounce limits, and Mailchimp explains that the limits vary and that spammers should not get the details. The most concrete public numbers come from Amazon SES:
- keep the bounce rate below 2%;
- at 5% or more, the account is placed under review;
- at 10% or more, sending may be paused until the issue is fixed.
Those figures work as a benchmark elsewhere too. For transactional mail the bar is lower: a real person just typed the address, so a noticeable share of bounces means the signup form does not check it.
A message the provider files as spam is not a bounce and never shows up in the bounce rate. If bounces are rare but almost nobody opens, find out why your emails go to spam.
Why bounces hurt your reputation
Amazon SES notes that mailbox providers and anti-spam organizations use high bounce rates to spot senders with bad practices, and that the result can be mail landing in the spam folder instead of the inbox. A sender who keeps mailing addresses that do not exist clearly does not know where the list came from.
The second risk is quieter. Some spam traps are converted from addresses that once worked, then sat unused and bounced for a long time. Mail to such a trap arrives without any bounce, yet hitting it shows that hard bounces were never removed.
How to handle bounces after a campaign
- Export the bounces and split them by code: 5xx and 4xx.
- Put addresses with 5.1.1, 5.1.2, 5.1.10 and 553 on the suppression list for good.
- Do not blindly delete 5.7.1 and 5.3.4. Check which provider they came from and fix the reputation or the message size.
- Keep a per-address counter for 4xx. A streak across several campaigns means the mailbox is abandoned.
- Calculate the campaign's bounce rate and compare it with earlier sends.
The suppression list has to cover every channel. A common mistake is keeping it inside the marketing platform while transactional mail leaves through your own server. The address is suppressed for campaigns and still gets receipts, bounces pile up, and the reports never show why.
An "I'm on vacation" reply is, under RFC 3834, an ordinary message marked Auto-Submitted: auto-replied. Count such replies apart from bounces or they will skew your numbers.
How to reduce your bounce rate
- Validate the list before sending. A validator finds dead mailboxes and domains without mail before they turn into hard bounces. The uChecker report sorts addresses into valid, invalid and unknown, with a reason for every rejected one.
- Check the address right in the signup form. Amazon SES also suggests asking people to type it twice.
- Use double opt-in: a confirmation email never reaches a typo.
- Do not buy or rent lists. It is the first item on the Amazon SES list.
- Mail an old list you have not used in a while in small batches, and only after checking it.
Sources
- RFC 5321: 4yz and 5yz reply classes
- RFC 5321: reply codes in numeric order
- RFC 5321: the 552 too-many-recipients code
- RFC 5321: sending and retry strategy
- RFC 3463: enhanced mail system status codes
- RFC 3464: the DSN Action field
- RFC 7504: the 556 reply code
- RFC 7505: null MX and 556 5.1.10
- RFC 3834: the Auto-Submitted header
- Amazon SES: sending review process FAQs
- Mailchimp: soft vs. hard bounces
- Mailchimp: about bounces
- Yahoo Sender Hub: SMTP error codes
Check your list in uChecker before your next campaign. The first 100 checks are free.
Mark Avrilov · Author
Published Updated
