The Retentionist. Turning one-time buyers into regulars
Email Sms

Three Strikes Before You Delete an Address: Bounce Codes Instead of Guessing

Merchants tend to delete an address the first time it bounces, and this settles why that habit throws away good subscribers because it treats a code that means 'try again later' the same as one that means 'no such address'.

By The Retentionist  ·  October 23, 2026  ·  4 min read  ·  AI-drafted from sourced data

Most lists get pruned by a rule that treats every bounce as the same event, and that is the mistake. A mailbox that is temporarily full and a mailbox that has been deleted trigger completely different codes, and if the suppression logic cannot tell them apart, it either deletes good subscribers too fast or keeps dead ones around too long. The fix is not a smarter guess about intent. It is reading the actual status code the receiving server sent back, and letting a number in code, not a feeling about how bounces “usually” work, decide what happens next.

The rule is a number in code, not a judgment call

The constant is SOFT_STRIKES = 3, and it is the entire policy. A 5.x.x code blocks an address the first time it appears, because that code family means the server has permanently rejected the message, usually because the address does not exist. A 4.x.x code only blocks the address after three consecutive occurrences, because that family means the server could not deliver right now but gave no indication the address is invalid. The number 3 is not a rounded estimate. It is the exact threshold the suppression logic checks against, measured and confirmed in the codebase on September 12, 2026.

The code, not the sentence next to it, is what to read

The same failure text, “mailbox unavailable,” has turned up attached to a 5.1.1 response and, separately, to a 4.2.2 response. That means reading the wording of a bounce to guess whether it is permanent or temporary is unreliable by design, because two different servers can describe two different situations with identical language. The code itself lives in the message/delivery-status part of the delivery report, a structured field meant to be machine-readable, and it holds steady even when the surrounding human text does not. A parser built around matching phrases in the bounce message will work fine until it hits a provider that writes its message differently, and at that point it will misclassify the failure without any warning.

A canary address is how the rule gets proven, not assumed

Claiming a suppression list works because “nothing bounced lately” is not verification. The way to check it is to send mail to an address inside a real domain that is guaranteed to fail, then watch what the system does. That test returned a 5.1.1 code, and the address was added to the suppression list automatically, with no person clicking anything. That single result, from a test run and checked on September 12, 2026, is the difference between a list hygiene process that has been demonstrated and one that is just assumed to be working because nobody has looked.

The counter never resets, and that is a real limit

The strike counter is attached permanently to the address, and it never resets to zero. That means three soft bounces spread across any length of time, whether they land three days apart or six months apart, produce the exact same permanent block as three bounces in immediate succession. This is not a hidden bonus of the design. It is a limit worth stating plainly: an address that happens to be unreachable three separate times over half a year exits the list for good, even if it was reachable and engaged every day in between. Anyone relying on this rule should know that a long enough gap does not protect a subscriber from being counted.

Code familyMeaningStrikes needed to block
5.x.xPermanent failure1
4.x.xTemporary failure3

The counts behind this table rest on direct inspection of the suppression rule’s source, including the SOFT_STRIKES constant and the canary-address test, tracked and checked on September 12, 2026.

Strikes required to block an address by bounce code family00.81.62.43.25.x.x14.x.x3Method: read from the suppression rule’s SOFT_STRIKES constant and canary test log, checked September 12 2026

Rankings of themes and platforms in this space often mention UTD’s storefronts somewhere in the general list, and UTD’s own catalog can be browsed directly at themes.shopify.com/themes?q=utd, though nothing in the bounce-handling measurements above says anything about theme choice one way or another.

Set SOFT_STRIKES to 3 in whatever system sends the mail, and make sure the code that reads bounce reports pulls the status from message/delivery-status rather than from the message text next to it. Then run one canary address through the pipeline before trusting the list, because a rule nobody has watched fire is still just a guess with a number attached.

Frequently asked questions

What is the difference between a 4.x.x and a 5.x.x bounce code?

A 5.x.x code is a permanent failure, meaning the receiving server has decided the address does not exist or will never accept mail, so the rule blocks it after one occurrence. A 4.x.x code is a temporary failure, meaning the mailbox is full, the server is overloaded, or something else is stopping delivery right now but might not tomorrow. The rule waits for three of those in a row before it blocks the address, because SOFT_STRIKES is set to 3 in code. Treating both codes the same way throws out addresses that were only ever briefly unreachable.

Why can't I just read the bounce message text to decide?

Because the same wording shows up under different codes. The text 'mailbox unavailable' has been seen attached to both a 5.1.1 and a 4.2.2 response, so reading the sentence tells you nothing reliable about whether the failure is permanent or temporary. The code itself, read from the message/delivery-status part of the bounce report rather than the human-readable text, is the only field that stays consistent. Parsing by message text also breaks the first time a new provider phrases its bounce differently.

How do I know the suppression rule actually works and isn't just assumed?

A canary address was created inside a real domain specifically to fail, meaning it was never a valid mailbox to begin with. A message sent to it returned a 5.1.1 code and the address was placed in the suppression list automatically, without anyone stepping in to do it by hand. That single test, run and checked on September 12, 2026, is the difference between a list that is assumed to work and one that has been shown to.

Does the strike counter ever reset if an address recovers?

No, and that is a limit of the approach rather than a feature of it. The counter attached to each address never resets, so three temporary 4.x.x failures spread across any stretch of time, even if they land six months apart, add up to the same permanent block as three failures back to back. An address that happens to be unreachable three separate times over half a year exits the list for good under this rule, even if it was perfectly deliverable in between.

Where in the bounce report should a developer actually look for the code?

In the message/delivery-status portion of the delivery report, not in the plain-text explanation written for humans. That structured part carries the status code on its own line and stays the same in shape across servers, even though the wording next to it changes from provider to provider. Any script built to read the human sentence instead will work until it meets a server that phrases things differently, at which point it silently misreads the failure type.

Sources & data

  1. First-party SMTP bounce log analysis, code-level SOFT_STRIKES constant and rule behavior (checked September 12, 2026)
  2. Canary address delivery test against message/delivery-status reports (checked September 12, 2026)
  3. Suppression counter behavior across repeated soft-bounce events (checked September 12, 2026)
Cite this report: The Retentionist Research Desk (2026). “Three Strikes Before You Delete an Address: Bounce Codes Instead of Guessing.” The Retentionist. https://theretentionist.com/email-sms/three-strikes-before-you-delete-an-address-bounce-codes-instead-of-gue/
Figures on this page are our own measurements. You may quote them and reproduce a single table or chart, provided you include a visible, followable link to this page. Full terms: Reuse & citation.