A hard bounce belongs to the contact, not the sending mailbox
If Mailbox A receives a permanent 5.x.x failure for `alex@example.com`, the useful state is “do not send to this address again,” not “Mailbox A had one bounce.” Without a shared suppression layer, Mailbox B can contact the same dead address in another sequence and generate a second preventable failure. Normalize the recipient key and store permanent suppression centrally so every worker, campaign, and mailbox consults the same fact.
Classify permanent and transient failures before suppressing
Not every failed delivery should become permanent suppression. Enhanced status codes and provider text help distinguish address failures from temporary rate, resource, or policy conditions. A 5.1.x-style invalid-recipient result is very different from a 4.x.x deferral that may succeed later. Preserve the raw SMTP response alongside the classification. If your system is unsure, hold the address for review instead of either retrying aggressively or permanently deleting it with no evidence.
Apply suppression immediately at ingest
When a bounce arrives, write the normalized address, reason, source message, timestamp, and classification in one atomic state transition where practical. Then cancel future scheduled jobs for that recipient. Waiting for a nightly sync leaves a window where another mailbox can send before the central CRM catches up. Small senders benefit from making negative state fast: bounces and meaningful replies should travel through the system quicker than the next outbound job.
Check again at send time
Import-time suppression is necessary but insufficient because recipient state can change after a sequence is scheduled. A job created Monday for a Thursday follow-up must re-read suppression immediately before execution. This protects against hard bounces, replies, and manual opt-outs that arrived in the interim. A final state check is cheap compared with the cost of preventable duplicate mail and makes queue retries safer because the recipient record remains the authority.
Keep suppression separate from CRM ownership
One salesperson changing an opportunity stage should not accidentally reactivate an address that infrastructure marked permanently undeliverable. Store suppression as a dedicated delivery state with clear override rules and audit history. If an operator decides a bounce was misclassified, require a deliberate unsuppress action with evidence rather than letting a CSV import overwrite it. This prevents business workflow updates from weakening deliverability controls silently.
Propagate suppression across domains or identities carefully
The safest automatic key is usually the normalized email address itself. Do not automatically suppress every person at the same company because one mailbox failed, and do not assume two different addresses are the same human without a reliable contact identity model. You can link records for review, but keep the technical permanent-failure fact precise. Over-broad suppression wastes valid leads; under-broad suppression repeats known failures.
Audit prevented sends as a positive metric
Track how many outbound jobs were cancelled because the address was already permanently suppressed. That number is evidence the system is learning. Also track any case where a suppressed address was nevertheless sent; that is a state-consistency defect worthy of investigation. A strong suppression layer turns past failures into future protection, which is more valuable than merely reporting a lower bounce percentage on the campaign that happened to discover them.
Parse the failure before writing irreversible suppression
Not every failed delivery is a hard bounce. RFC 5321 separates transient 4yz replies from permanent 5yz replies, and RFC 3463 adds enhanced status codes that help identify address, mailbox and policy failures. Store the SMTP class, enhanced status code and provider text before updating suppression. A clear 5.1.x nonexistent-recipient response belongs in global hard-bounce suppression. A 4.2.x mailbox-full or 4.7.x temporary policy deferral should not be converted into a permanent bad-address label without additional evidence. The classification step matters because an over-aggressive suppressor destroys valid contacts, while an under-aggressive one repeatedly sends to addresses the receiver has already declared permanently invalid.
Make suppression the first shared dependency of every sender
If several mailboxes, domains or campaigns can reach the same contact, the suppression store must sit upstream of all of them. Ingest the permanent failure once, normalize the address, and make every queue check that state before claiming a send. Do the same when importing a new CSV: join against suppression before the rows enter campaign state. This design turns a hard bounce into a durable system fact rather than a local note attached to one mailbox. It also gives you a measurable hygiene metric: how many attempted sends were prevented because a prior permanent failure was already known. Those prevented sends are reputation protection, not lost volume.
Preserve the provider evidence with the suppression record
A suppression row should include more than the email address and a boolean. Store the timestamp, sending mailbox or domain, receiving provider if known, SMTP reply class, enhanced status code and a short normalized reason. This allows later review to distinguish “mailbox does not exist” from “policy rejection” or “authentication failure” that should not have been classified as a recipient hard bounce. When an address is blocked globally, the original evidence makes the decision explainable and helps repair classifier mistakes without searching old mail logs. The record becomes both a safety control and a debugging artifact.
Require an explicit override instead of silent reactivation
If someone believes a suppressed address is valid again, do not let a fresh CSV overwrite the suppression. Require an explicit override with a reason, timestamp and the evidence used to justify reactivation, such as a corrected address supplied directly by the contact. The original failure record should remain attached. This prevents accidental resurrection when old lead files are re-imported and makes exceptional cases visible. A global suppression system is valuable precisely because ordinary campaign operations cannot casually undo it.
Field checklist
- Normalize addresses before writing or reading suppression state.
- Classify permanent 5.x.x failures separately from transient 4.x.x conditions.
- Persist reason, raw response, source message, and timestamp.
- Cancel scheduled future sends immediately after permanent suppression.
- Re-check suppression at send time from every mailbox and campaign.
- Require an explicit audited override to reactivate a permanently suppressed address.
Primary sources
Standards and provider policies can change. These links are the reference points used for this field note.
- RFC 3463 — Enhanced Mail System Status CodesIETF / RFC Editor — 2.x.x, 4.x.x and 5.x.x delivery status code classes.
- Email sender guidelinesGoogle Gmail Help — Authentication, TLS, DNS, spam-rate and bulk-sender requirements.
- RFC 5321 — Simple Mail Transfer ProtocolIETF / RFC Editor — SMTP reply classes, retry semantics, envelopes and mail transport behavior.
- SMTP Error CodesYahoo Sender Hub — Yahoo guidance for temporary deferrals, permanent errors, unknown recipients and traffic-pattern problems.
