Email list cleaning: a checklist to run before every campaign
Email list cleaning checklist: dedupe, remove bad syntax, verify live, split catch-all, unknown, role and disposable results, and know when to re-clean.
BounceOwl team7 min read
Email list cleaning means removing or separating addresses that will bounce, never be read, or hurt your sender reputation before you send. A practical routine is: back up the list, normalize and dedupe it, drop bad syntax and suppressed contacts, verify every address live, then split the results into valid, invalid, catch-all, unknown, role and disposable segments and send only what you trust. Repeat it before any campaign that uses a list more than a few weeks old.
Here is the checklist we would run on a list before a campaign, step by step.
Before you start: keep the original
Export the list exactly as it is and save a copy you never edit. Cleaning removes rows, and you will want to compare before and after, or recover a contact you dropped by mistake. Work on a copy named for the campaign, for example q4-harborlane-outreach-clean.csv.
Step 1: normalize the addresses
Lists built from forms, exports and spreadsheets collect formatting noise. Fix it first so the later steps compare like with like:
- Trim spaces before and after each address.
- Remove trailing punctuation such as commas, semicolons and closing brackets.
- Split cells that hold two addresses into separate rows, or keep only the first.
- Lowercase the domain part.
Maya.Chen@LumenForge.IOandmaya.chen@lumenforge.ioreach the same inbox.
Step 2: remove duplicates
Dedupe on the address, ignoring case. Duplicates waste verification credits and, worse, send the same person the same email twice, which is a fast way to earn a spam complaint. If duplicates carry different data in other columns, such as two job titles, decide which row wins before you delete the other.
Step 3: remove bad syntax
Drop addresses that are clearly broken: no @, no domain, spaces inside, two dots in a row, or a missing top-level domain like jon.reyes@harborlane. Keep the rule loose; plus signs and hyphens are valid. Also scan for typo domains such as gmial.com or hotmial.com and correct them only if you are sure what the person meant.
Step 4: apply your suppression list
Remove anyone who unsubscribed, complained, or hard bounced in the past. This step is easy to forget when a list comes from a new import, and it is the one that matters most legally and for your reputation. Verification won't catch these: an unsubscribed address is often a perfectly valid mailbox.
Step 5: verify every address live
Now check what remains against the recipients' mail servers. A live check confirms the domain receives mail, asks the server whether the exact mailbox exists, and tests whether the domain accepts every address. If you are not sure what a verifier actually does, our guide on how to verify an email address walks through each layer.
Check the age of any existing results. A verdict from three months ago is not a verdict for today; people leave jobs and mailboxes get shut down. If the list was verified recently, you may only need to recheck the older rows.
Step 6: split the results into segments
Don't reduce the output to send or don't send. Each result type needs a different decision:
| Segment | What it means | What to do |
|---|---|---|
| Valid | The mailbox exists and accepts mail | Send |
| Invalid | Rejected, disabled, full, no mail server, or bad syntax | Remove and add to suppression |
| Catch-all | The domain accepts every address, so the check can't tell | Separate, smaller batch, or a deeper catch-all check first |
| Unknown | The server gave no clear answer: timeout, block or greylisting | Hold back and verify again later |
| Role address | info@, sales@, support@ and similar shared inboxes | Keep for inbound or partner mail; usually skip for cold outreach |
| Disposable | A throwaway inbox service | Remove from marketing and sales lists |
| Free provider | A personal email service rather than a company domain | Fine for consumer lists; check fit for B2B campaigns |
Catch-all deserves extra care, because these addresses look valid and some bounce after the server has accepted them. Our explainer on catch-all emails has a sending policy you can copy.
Step 7: send in stages and watch bounces
Start with the valid segment, and send it in batches rather than all at once. Look at the bounce rate of the first batch before you continue. A widely used rule of thumb is to keep hard bounces under 2 percent of sends, and lower is better, especially for cold outreach. If a batch goes clearly above that, stop and look at what bounced before sending more.
Read the bounce messages. If they say the recipient doesn't exist, your data is the problem. If they mention policy, authentication or reputation, the problem is your sending setup, and cleaning the list again won't help. We cover the difference in why verified emails bounce.
Step 8: feed the results back
- Add every hard bounce and every invalid result to your suppression list.
- Store the verification date next to each contact in your CRM.
- Note which source produced the most invalid addresses, and fix or drop that source.
How often to re-clean
There is no single right interval, but a few triggers are reliable:
- Before any campaign that uses addresses last verified more than a few weeks ago.
- After every import from a new source, such as an event list, a purchased list or a data provider.
- When your bounce rate starts to rise on a list that used to be clean.
- On a regular schedule for large CRMs, since B2B contacts change jobs and companies change mail providers.
For signup forms and CRM syncs, verifying at the point of entry with an API keeps the list cleaner between full passes. The email verification API guide shows how.
The checklist in short
- Save an untouched copy.
- Normalize: trim, remove stray punctuation, lowercase domains.
- Dedupe, ignoring case.
- Remove bad syntax and fix obvious typo domains.
- Apply your suppression list.
- Verify every address live, and recheck old results.
- Split into valid, invalid, catch-all, unknown, role, disposable and free provider.
- Send valid first, in batches, and watch bounces.
- Feed bounces and invalid results back into suppression.
Clean a list with BounceOwl
Bulk email verification in BounceOwl covers steps 2, 5 and 6 for you. Upload a CSV, TXT or XLSX file up to 50 MB and 500,000 rows. The email column is found automatically, duplicates are checked and charged once, and you see the cost before anything runs. Results download as CSV with your original columns plus verdict, reason, mail server, provider, catch-all, role and disposable columns, and you can filter by verdict.
Unknown results, invalid syntax and domains with no mail server are free. Single addresses can go through the email verifier, and the pricing page lists the credit packs. If you get stuck, the help center has answers to common questions.
Check a list before you send it.
Live checks with evidence. Unknown results are free, and credits never expire.
Start with 100 free creditsKeep reading
7 min read
How to verify an email address (without sending one)
How to verify an email address step by step: check syntax, look up MX records, ask the mail server over SMTP and test for catch-all, all without sending mail.
BounceOwl team
6 min read
What is a catch-all email, and should you send to one?
What a catch-all email domain is, why accept-all servers make verification unreliable, how a made-up address test detects them and how to send to them safely.
BounceOwl team
7 min read
Why do verified emails bounce? Six causes and how to fix them
Why verified emails still bounce: stale results, catch-all domains, security gateways, full mailboxes and greylisting, plus practical steps to cut bounces.
BounceOwl team