Bounce code reference

Email bounce codes: 19 categories, four answers.

When an email bounces, tinyRelay sends a BOUNCED webhook event with a numeric bounceCategory. The 19 categories come down to four answers: stop sending, retry later, investigate, or keep sending.

BOUNCE DECODERpick a bounceCategory
"eventType": "BOUNCED",
"subType": "HARD_BOUNCED",
"bounceCategory": "10"
10
Bad email address
Hard bounceStop sending

Stop sending to this address and add it to your own suppression list. Ask the user for a corrected address.

Full entry for 10 →
"eventType": "BOUNCED",
"subType": "SOFT_BOUNCED",
"bounceCategory": "22"
22
Mailbox full
Temporary failureRetry later

The recipient's mailbox or quota is full. Retry later.

Full entry for 22 →
"eventType": "BOUNCED",
"subType": "SOFT_BOUNCED",
"bounceCategory": "29"
29
Unable to connect
Temporary failureRetry later

Retry later. Many 29s at one domain point at the domain.

Full entry for 29 →
"eventType": "BOUNCED",
"subType": "SOFT_BOUNCED",
"bounceCategory": "51"
51
Known spammer
Mail blockInvestigate

Not specific to this message: it concerns the sending server itself. Send the bounceDescription to support.

Full entry for 51 →
"eventType": "BOUNCED",
"subType": "SOFT_BOUNCED",
"bounceCategory": "55"
55
SPF/DKIM/DMARC
Mail blockInvestigate

Check your SPF, DKIM and DMARC records, then resolve the complaint named in bounceDescription.

Full entry for 55 →
"eventType": "BOUNCED",
// subType: not documented for this category
"bounceCategory": "60"
60
Auto-reply
Not a bounceKeep sending

Generated by an auto-responder, such as a vacation reply. Do not suppress. Keep sending.

Full entry for 60 →

Six of the 19 categories · source: the tinyRelay bounce categories docs

Hard vs soft bounce

Two fields answer two different questions.

The event's subType says whether to keep sending: HARD_BOUNCED or SOFT_BOUNCED. The bounceCategory says why. Use subType when that is all you need, and the category when you need the reason.

HARD_BOUNCED

Delivery to this address should not be attempted again. The docs ask you to add it to your own suppression list.

SOFT_BOUNCED

The address may well be valid. A retry is reasonable, though repeated soft bounces to one address or domain are worth acting on.

Bounce categories in the docs →
BOUNCED event · the three bounce fieldsCopy
{
  "eventType": "BOUNCED",
  "subType": "SOFT_BOUNCED",
  "receiver": "ann@example.com",
  "metadata": { "order_id": "SO-1001" },
  // the numeric category from this page
  "bounceCategory": "22",
  // the receiving server's raw diagnostic text (dsn_diag)
  "bounceDescription": "…",
  // the receiving server's DSN status code (dsn_status)
  "bounceStatus": "…"
}

Trimmed payload; values illustrative. Every field is in the webhook reference.

All 19 bounce categories

Bounce categories, searchable.

Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.
10

Bad email address

Hard bounceHARD_BOUNCED

Delivery to this address should no longer be attempted. Usually it means the mailbox does not exist.

What to do · Stop sending. Stop sending to this address and add it to your own suppression list. Ask the user for a corrected address.
90

Unsubscribe

Hard bounceHARD_BOUNCED

The recipient asked to be removed from the mailing list. Not a delivery failure, but treat it as final.

What to do · Stop sending. Stop sending to this address. Treat it as final.
20

General

Temporary failureSOFT_BOUNCED

A possibly temporary delivery failure. The address may or may not be valid; often an ambiguous response, such as a mailbox being inactive or unavailable.

What to do · Retry later. Retry later. If the same address keeps returning 20, stop and check it.
21

DNS failure

Temporary failureSOFT_BOUNCED

A DNS lookup failed, either on the sending side or at a later relay server.

What to do · Retry later. Retry later.
22

Mailbox full

Temporary failureSOFT_BOUNCED

The recipient's mailbox or quota is full.

What to do · Retry later. Retry later.
23

Message too large

Temporary failureSOFT_BOUNCED

The destination server rejected the message because of its size.

What to do · Retry later. Make the message smaller before you resend it; the same message will be rejected again.
24

Missing MX record

Temporary failureSOFT_BOUNCED

The destination domain has no MX record.

What to do · Retry later. Retry later, and check the domain for typos.
29

Unable to connect

Temporary failureSOFT_BOUNCED

We could not connect to the remote server. Many of these for one domain usually means the domain is not working, or is blocking your mail server.

What to do · Retry later. Retry later. Many 29s at one domain point at the domain.
40

General bounce

Temporary failureSOFT_BOUNCED

Positively identified as a bounce, but no more specific category could be determined.

What to do · Retry later. Retry later, and read bounceDescription for the receiving server's reason.
70

Transient bounce

Temporary failureSOFT_BOUNCED

A temporary delay in message transmission.

What to do · Retry later. Retry later.
50

General (mail block)

Mail blockSOFT_BOUNCED

Rejected for a reason no more specific mail-block category covers.

What to do · Investigate. Read bounceDescription. Retrying unchanged rarely helps.
51

Known spammer

Mail blockSOFT_BOUNCED

The remote server considers the sender a spammer. Not specific to this message: it concerns the sending server itself, often because of a public or private block list.

What to do · Investigate. Send the bounceDescription to support.
52

Spam detected

Mail blockSOFT_BOUNCED

The remote server classified this message's content as spam.

What to do · Investigate. Review the content and the links in this email before sending it again.
53

Attachment detected

Mail blockSOFT_BOUNCED

Rejected because of one or more attachments.

What to do · Investigate. Remove the attachment and link to the file instead.
54

Relay denied

Mail blockSOFT_BOUNCED

The remote server refused to act as a relay for the message.

What to do · Investigate. Check the recipient address and domain, and read bounceDescription.
55

SPF/DKIM/DMARC

Mail blockSOFT_BOUNCED

Refused on authentication policy. Resolving the specific complaint in bounceDescription usually improves deliverability.

What to do · Investigate. Check your SPF, DKIM and DMARC records, then resolve the complaint named in bounceDescription.
59

Unable to connect

Mail blockSOFT_BOUNCED

We could not connect to the remote server, much like code 29.

What to do · Investigate. Look at the destination domain rather than the address.
0

Non-bounce

Not a bouncesubType not documented

The bounce processor received a message it could not classify as a bounce or as any other non-bounce code.

What to do · Keep sending. Do not suppress. Keep sending.
60

Auto-reply

Not a bouncesubType not documented

Generated by an auto-responder, such as a vacation reply.

What to do · Keep sending. Do not suppress. Keep sending.

No bounce code matches that search. Try a number such as 22, or a word such as block.

Bounce handling

Bounce handling in a dozen lines.

Verify the webhook signature first, then branch on the category: suppress on 10 and 90, never on 0 or 60, send mail blocks to a person, and retry the rest.

0 · 60 not a delivery failurereturn
10 · 90 hard bouncesuppress
50–55 · 59 mail blockreview
the rest temporary failureretryLater
bounce-handler.js · illustrativeCopy
const STOP = new Set(["10", "90"]);
const NOT_BOUNCES = new Set(["0", "60"]);
const BLOCKS = new Set(["50", "51", "52", "53", "54", "55", "59"]);

function handleBounce(event) {
  const cat = event.bounceCategory;
  if (NOT_BOUNCES.has(cat)) return;                // not a delivery failure
  if (STOP.has(cat)) return suppress(event.receiver); // hard bounce
  if (BLOCKS.has(cat)) return review(event);        // read bounceDescription
  return retryLater(event);                           // temporary failure
}
FAQ

Bounce code questions.

See bounces in context on the password reset emails page.

What is the difference between a hard and a soft bounce?

A hard bounce means you should stop sending to the address. A soft bounce is a temporary failure or a block, and the address may well be valid. tinyRelay puts HARD_BOUNCED or SOFT_BOUNCED in the event's subType.

19. Two are hard bounces (10 and 90), eight are temporary failures (20, 21, 22, 23, 24, 29, 40 and 70), seven are mail blocks (50 to 55 and 59), and two are not bounces at all (0 and 60).

No. Category 0 is a message that could not be classified as a bounce, and 60 is an auto-reply such as a vacation message. Neither is a delivery failure, so keep sending.

In bounceDescription, which carries the raw diagnostic text the receiving server returned, and bounceStatus, which carries its DSN status code. Both arrive on the BOUNCED event next to bounceCategory.

Category 55 means the receiving server refused the message on SPF, DKIM or DMARC policy. Check your domain's records, then resolve the specific complaint named in bounceDescription. Fixing it usually improves deliverability.

Get started

Send transactional email with a service that reports back.

SMTP relay or REST API, standalone or alongside tinyEmail. Tell us what you send and our team sets you up.