How to handle email bounces in cold outreach without damaging your domain
A hard bounce is permanent: the address does not exist or the domain refuses mail, so remove it and never retry. A soft bounce may be temporary: retry once, later, and remove the address if it repeats. Never resend a hard bounce, never bulk-retry after a bad import, and always remove addresses that complain or opt out.
The two bounce types, and why the difference matters
A hard bounce says the mailbox is gone or the domain will not accept mail for it. Retrying wastes volume and teaches receivers that your list is unmaintained. A soft bounce says the message could not be delivered right now: a full mailbox, a temporary refusal, a server that is down.
Mixing them is how a list rots. If you treat every bounce as temporary, the list fills with dead addresses. If you treat every bounce as permanent, you drop people who would have received the message a day later.
What one bad import costs
A single unverified import can produce hundreds of hard bounces in an hour. Receivers read that as a sender who does not know their own list, and the domain's reputation pays for it long after the import is forgotten.
Prevention is cheaper than repair: verify before sending, deduplicate first, and if you must send to an unknown list, send a small sample before the batch.
Rules that keep the list honest
Remove hard bounces permanently. Retry soft bounces once, days later, and remove them if they repeat. Stop the sequence on any reply, and never re-add an address that opted out, even if a later import contains it again.
Keep a suppression list separate from the campaign so that a new list import cannot quietly reintroduce an address that asked to stop.
That list is also the one place where a bounce reason should never decide anything on its own. A person who asked to stop stays suppressed even if their mailbox later becomes reachable again; reachability is not permission.
How bounce handling connects to the rest of the pipeline
Bounce handling is not a cleanup task at the end; it is part of deciding who you may contact again. The addresses you remove shape the next campaign, and the suppression list is what stops a well-meaning teammate from re-importing someone who asked to stop.
In a workspace, that means the suppression list must live outside any single campaign file. If it only exists in one campaign's export, the next import will not know about it, and the person who opted out will receive the message again. That single mistake causes more complaints than any subject line.
The practical rule is simple enough to teach a new teammate in a minute: verify before sending, remove hard bounces the day they arrive, retry a soft bounce once, and treat an opt-out as permanent regardless of what a later list says.
If you keep the suppression list in the workspace and check every import against it before the first send, the rest of the process becomes mechanical. That is what you want from a hygiene rule: something a person can follow on a busy afternoon without judgement calls about whether one particular address is worth the risk.
Bounce handling rules
| Event | Meaning | Action |
|---|---|---|
| Hard bounce | Address or domain refuses mail | Remove permanently, never retry |
| Soft bounce | Temporary failure | Retry once later, remove if repeated |
| Complaint or opt-out | The person does not want mail | Suppress immediately and permanently |
| Repeated soft bounce | The mailbox is not usable | Treat as hard, remove |
Before and after every batch
- Verify the addresses you are about to use
- Deduplicate by address, not by row
- Send a small sample when the list is new
- Read the bounce reasons rather than the count
- Remove hard bounces the same day
- Retry soft bounces once, then remove
- Keep the suppression list out of the campaign import
A worked example, hypothetical
A recruiter imports 1,200 addresses from an old spreadsheet and sends 300 in one batch. The bounce reason column shows 41 hard bounces, all on one mail domain that no longer exists, and nine soft bounces on full mailboxes.
The correct response is to remove the 41 permanently, retry the nine once in a few days, and verify the remaining 900 before sending to any of them. Resending the 41 would have produced the same result and damaged the domain further.
What this will not do
- A verifier cannot detect every dead mailbox; some servers accept mail for addresses that are never read.
- Suppression lists prevent your own mistakes, not someone else's resend from a different system.
- Bounce handling protects reputation; it does not make an unwanted offer acceptable.
Questions people ask about this
Should I send a second email to a hard bounce from a different address?
No. A hard bounce is a permanent result for that address. Sending from another mailbox does not make the address exist, and it risks damaging the second domain too.
How many bounces are too many?
There is no published threshold that applies everywhere. Treat any sudden spike as a signal to stop, investigate the list segment, and verify before continuing.
Can I reuse a bounced address later?
Only if you have evidence it now accepts mail, for example a fresh verification pass and a person who asked to hear from you. Otherwise leave it removed.
Does an opt-out count as a bounce?
No, but it matters more. A bounce is a delivery failure; an opt-out is a person telling you to stop. Suppress opt-outs permanently and across every list.
Where should the suppression list live?
Outside any single campaign: a workspace-level list that every import is checked against. If it lives inside one campaign export, the next import will not see it and will mail someone who opted out.