Most email tools tell you that a send bounced. Leed can tell you which message to which person failed, and why, because every message goes out with a return address unique to that one recipient and that one send. When a receiving mail server rejects a message, its failure notice comes back to that address, and Leed knows exactly which row to write it on.
Bounce handling runs on every send on every plan. There is nothing to switch on.
How a bounce reaches Leed
The address a recipient sees is no-reply@ your public site domain. The address the mail system replies to is different: a per-recipient return path of the form bouncer+{batch}={contact}@b.leed.ai. A mail worker reads everything that arrives there, unpicks the batch and contact from the address, classifies the failure, and writes the result.
You never see that address and never need to configure it. It exists so a failure notice is attributable rather than anonymous — which is the difference between “12 bounces” and “these twelve people, and these three addresses are now dead”.
The three classes
Leed sorts every failure into one of three classes, and the class is what matters — the codes below are only how Leed arrives at it.
| Class | What it means | Effect |
|---|---|---|
| Hard | The address is permanently unusable: it does not exist, the mailbox is gone, the receiving system refuses mail from you outright. | The contact is flagged and skipped by every future send, forever. |
| Soft | Something temporary went wrong: the server was busy, the mailbox was full, the message was too large. | Recorded on that send only. The address stays mailable and is tried again next time. |
| Spam | The recipient’s provider reported the message as spam. | Treated as an unsubscribe, not a bounce — the address is permanently suppressed. |
How a failure is classified
Leed reads the SMTP status code out of the bounce message — a three-digit basic code such as 550, optionally followed by an enhanced code such as 5.7.1 — and looks both up in the tables further down. If either is recognized, that decides the class.
If no recognized code is present, three fallbacks are applied in order:
- The sender address contains
complaints. Treated as a spam complaint. - The message body mentions a suppression list. Treated as a hard failure — the receiving system is refusing this address on purpose. Leed matches the token literally, and the token as shipped is misspelled, so this fallback fires on the misspelled form.
- The message is an auto-responder. Out-of-office and vacation replies are identified from their headers (
x-autorespond,auto-submitted, or aprecedenceofauto_reply) and ignored entirely — nothing is recorded, no flag is set, and the contact is unaffected. This is why a colleague’s holiday reply does not cost you a contact.
Anything still unclassified is recorded as code 000, an unknown soft failure. Nothing is silently discarded.
flowchart TD
A[Bounce message arrives on the return path] --> B{Recognised SMTP code in the body?}
B -- Yes --> C[Look up the basic and enhanced codes]
C --> D{Class}
B -- No --> E{Sender address mentions complaints?}
E -- Yes --> S
E -- No --> F{Body mentions a suppression list?}
F -- Yes --> H
F -- No --> G{Auto-responder headers?}
G -- Yes --> I[Ignored — nothing recorded]
G -- No --> J[Code 000, Unknown]
J --> SOFT
D -- hard --> H[Hard]
D -- soft --> SOFT[Soft]
D -- spam --> S[Spam]
H --> H1[Flag the contact with the date and code]
H --> H2[Mark the send bounced]
H1 --> H3[Skipped by every future send]
SOFT --> S1[Mark the send bounced]
S1 --> S2[Address stays mailable]
S --> P1[Mark the send unsubscribed]
S --> P2[Write an opt-out, reason spam_complaint]
P2 --> P3[Address permanently suppressed]
What each class does to the contact
Hard
The contact record is stamped with the bounce date and the code that caused it, and the send’s recipient row is marked bounced. From then on that contact is dropped twice over: once when a batch fans out, and again as the individual message is built. They stay in their contact groups and stay visible in Engage — they are simply never mailed again.
Soft
Only the send’s recipient row is marked bounced. Nothing is written to the contact. Your next blast tries the address again, which is the right behavior for a full mailbox or a busy server — but it also means a chronically failing address keeps consuming allotment and keeps depressing your rates without ever being suppressed.
Spam
The recipient row is marked unsubscribed, and an opt-out record is written against the contact carrying the reason spam_complaint. The suppression is permanent in practice: the newest opt record wins, and nothing in the CMS writes a newer one. The one thing that can — a later form fill on your own site — is covered in unsubscribes and opt-outs.
| Class | Recipient row | Contact record | Future sends | Where it shows in Sent Emails |
|---|---|---|---|---|
| Hard | bounced | hard-bounce flag, date and code | dropped at fan-out and again per message | Bounces |
| Soft | bounced | unchanged | tried again | Bounces |
| Spam | unsubscribed | an opt-out record, reason spam_complaint | dropped as an opt-out | Unsubscribes |
Reading the numbers
The Bounces column in Sent Emails counts recipients whose delivery failed for any reason other than a complaint — hard and soft together, undifferentiated. Complaints sit in the Unsubscribes column beside genuine unsubscribes, also undifferentiated. Neither column separates the two things inside it, so both numbers are directional rather than diagnostic.
They still tell you different things, and confusing them leads to the wrong fix:
- Bounces rising points at the list. Imported data going stale, addresses guessed rather than collected, a domain that has stopped accepting mail. The remedy is list hygiene.
- Unsubscribes rising on a list that used to be quiet points at the content or the cadence. The remedy is fewer, better-targeted sends — not a cleaner list.
A send with high bounces and low unsubscribes was mailed to the wrong addresses. A send with low bounces and high unsubscribes reached the right addresses with the wrong message.
SMTP codes Leed understands
The basic three-digit code carries the classification on its own; the enhanced code refines it. Either being recognized is enough, and a hard classification from either code flags the contact.
| Code | Description | Class |
|---|---|---|
000 | Unknown | Soft |
421 | Service not available | Soft |
450 | Mailbox unavailable | Soft |
451 | Error in processing | Soft |
452 | Insufficient system storage | Soft |
500 | Address does not exist | Hard |
510 | Other address status | Hard |
520 | Unable to route | Hard |
530 | Mail system status | Hard |
540 | Network routing status | Hard |
550 | Mailbox protocol status | Hard |
560 | Other or undefined media error | Hard |
570 | Message content or media status | Hard |
580 | Policy status | Hard |
700 | Complaint | Spam |
000 and 700 are Leed’s own: 000 is what an unclassifiable failure becomes, and 700 is what the complaint fallback assigns. Neither ever arrives from a mail server.
Every enhanced status code Leed recognizes
| Code | Description | Class |
|---|---|---|
5.0.0 | Address does not exist | Hard |
5.1.0 | Other address status | Hard |
5.1.1 | Bad destination mailbox address | Hard |
5.1.2 | Bad destination system address | Hard |
5.1.3 | Bad destination mailbox address syntax | Hard |
5.1.4 | Destination mailbox address ambiguous | Hard |
5.1.5 | Destination mailbox address valid | Hard |
5.1.6 | Mailbox has moved | Hard |
5.1.7 | Bad sender’s mailbox address syntax | Hard |
5.1.8 | Bad sender’s system address | Hard |
5.2.0 | Other or undefined mailbox status | Hard |
5.2.1 | Mailbox disabled, not accepting messages | Hard |
5.2.2 | Mailbox full | Hard |
5.2.3 | Message length exceeds administrative limit | Hard |
5.3.0 | Other or undefined mail system status | Hard |
5.3.1 | Mail system full | Hard |
5.3.2 | System not accepting network messages | Hard |
5.3.3 | System not capable of selected features | Hard |
5.3.4 | Message too big for system | Hard |
5.4.0 | Other or undefined network or routing status | Hard |
5.4.1 | No answer from host | Hard |
5.4.2 | Bad connection | Hard |
5.4.3 | Routing server failure | Hard |
5.4.4 | Unable to route | Hard |
5.4.5 | Network congestion | Hard |
5.4.6 | Routing loop detected | Hard |
5.4.7 | Delivery time expired | Hard |
5.5.0 | Other or undefined protocol status | Hard |
5.5.1 | Invalid command | Hard |
5.5.2 | Syntax error | Hard |
5.5.3 | Too many recipients | Hard |
5.5.4 | Invalid command arguments | Hard |
5.5.5 | Wrong protocol version | Hard |
5.6.0 | Other or undefined media error | Hard |
5.6.1 | Media not supported | Hard |
5.6.2 | Conversion required and prohibited | Hard |
5.6.3 | Conversion required but not supported | Hard |
5.6.4 | Conversion with loss performed | Hard |
5.6.5 | Conversion failed | Hard |
5.7.0 | Other or undefined security status | Hard |
5.7.1 | Delivery not authorized, message refused | Hard |
5.7.2 | Mailing list expansion prohibited | Hard |
5.7.3 | Security conversion required but not possible | Hard |
5.7.4 | Security features not supported | Hard |
5.7.5 | Cryptographic failure | Hard |
5.7.6 | Cryptographic algorithm not supported | Hard |
5.7.7 | Message integrity failure | Hard |
7.0.0 | Message Suppression Response | Hard |
7.0.1 | Complaint | Spam |
Every enhanced code Leed knows in the 5.x.x range is classified hard, so an enhanced code that is recognized at all is decisive. A code outside these tables is not treated as an error in itself — it simply fails to classify, and the message drops through to the fallback chain above.
| Signal, when no code is recognized | Classified as | Note |
|---|---|---|
complaints appears in the sender address | Spam | recorded as basic 700 with enhanced 7.0.1 |
| The body mentions a suppression list | Hard | recorded as basic 530 with enhanced 7.0.0 |
| Auto-responder headers are present | nothing | the message is ignored; no flag, no record |
| Anything else | Soft | recorded as 000, Unknown |
Your side of deliverability
Leed sends as no-reply@ your public site domain. That is the whole point — mail from you looks like mail from you — and it means the records at your DNS provider, not anything inside the CMS, decide whether receiving servers trust it.
What Leed sets up for you. When your site’s domain is provisioned, Leed asks its sending provider to verify the domain and receives three DKIM records to publish. If you connect your domain through the guided flow, those records are published alongside your site’s own records automatically, together with the mail records the sending provider needs. If you manage DNS by hand, you publish them yourself. Domains and DNS covers both routes.
What is yours. SPF and DMARC are policies about your whole domain, not just about Leed, so they stay with you. If you already publish a DMARC policy, check that mail sent through Leed aligns with it before your first large send — a p=reject policy and an unaligned sender is the one configuration error that turns a good list into a wall of rejections.
What Leed does not offer. There is no sender-domain picker in the CMS: you send from your public site domain and nowhere else. There is no dedicated sending IP, no warm-up schedule, no per-send throttle, and no way to import a suppression list. If your program needs any of those, it needs a dedicated sending platform.
The hard-bounce flag itself is visible on each contact’s record in contacts, which is the fastest way to check why a specific person stopped receiving your email. There is no bounce-specific screen in the CMS; the numbers live on the send, and the flag lives on the contact.