How to Clean a Lead List Before Cold Emailing (Checklist)
A 7-step checklist for cleaning a lead list before cold outreach — including what to do with catch-alls, role addresses, and aged contacts. Copy and use it directly.
Sending to a dirty list is one of the fastest ways to damage your sender reputation permanently. A single campaign with 8–12% bounces can push your sending domain into spam folders for months — sometimes unrecoverably.
The fix isn’t complicated. It’s a repeatable process that most teams skip because it feels like friction before the “real work” starts. This checklist makes it concrete and fast.
Who This Is For
This checklist is for you if:
- You’re running cold outreach to a list you didn’t build yourself (scraped, purchased, or exported from a data provider)
- You have a list that’s been sitting for more than 30 days
- You’re onboarding a new sending domain and want to start clean
- Your bounce rate on recent campaigns was above 2%
This checklist is not for:
- Transactional email (password resets, receipts, notifications) — your list is opt-in and managed differently
- Email newsletters to subscribers who confirmed their signup — different hygiene rules apply
- Internal company email — you control the domain
Why List Cleaning Matters Before Cold Email Specifically
Cold email operates under stricter deliverability rules than any other email type. Your recipients didn’t ask to hear from you. ESPs know this. Gmail and Outlook know this.
This means:
- Your bounce threshold before you get flagged is lower (~2% vs. ~5% for marketing mail)
- Spam complaints matter more — even a low complaint rate from cold sends affects domain reputation
- Recovery from a damaged domain reputation is slow (weeks of low-volume warming, and you may never fully recover a flagged domain)
The asymmetry is real: it takes one bad campaign to damage a domain, and weeks of careful sends to recover it. Prevention is cheaper than recovery by an order of magnitude.
The 7-Step Pre-Send Checklist
Copy this into a new tab in your Sheet and work through it before every campaign:
[ ] Step 1: Remove syntax errors (regex pass)
[ ] Step 2: Deduplicate
[ ] Step 3: Remove role addresses
[ ] Step 4: Run live verification
[ ] Step 5: Segment or remove catch-alls
[ ] Step 6: Remove previous bounces and unsubscribes
[ ] Step 7: Cap daily send volume per domain
Here’s exactly what to do at each step.
Step 1: Remove Syntax Errors
What: Filter out addresses that are structurally invalid — missing @, broken domain format, spaces inside the address.
How (Google Sheets formula):
=REGEXMATCH(A2, "^[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}$")
Add this to a helper column, filter for FALSE, and delete those rows.
Why do this first: It removes obvious garbage before you spend verification credits on addresses that will fail immediately anyway. On a list from a data provider, expect 1–3% to fail this check.
Time: 2 minutes.
Step 2: Deduplicate
What: Remove rows with the same email address appearing more than once.
How: Google Sheets → Data → Data cleanup → Remove duplicates → select your email column.
Why this matters: Duplicate entries mean the same person gets the same cold email twice in the same campaign. This is a deliverability signal (looks automated) and a conversion problem (annoying your prospect before you’ve established a relationship).
Time: Under 1 minute.
Step 3: Remove Role Addresses
What: Filter and remove email addresses that go to a team inbox rather than an individual: info@, hello@, contact@, admin@, support@, sales@, noreply@, no-reply@, team@, marketing@.
How (Google Sheets formula to flag role addresses):
=OR(
LEFT(A2, FIND("@", A2) - 1) = "info",
LEFT(A2, FIND("@", A2) - 1) = "hello",
LEFT(A2, FIND("@", A2) - 1) = "contact",
LEFT(A2, FIND("@", A2) - 1) = "admin",
LEFT(A2, FIND("@", A2) - 1) = "support",
LEFT(A2, FIND("@", A2) - 1) = "sales",
LEFT(A2, FIND("@", A2) - 1) = "noreply",
LEFT(A2, FIND("@", A2) - 1) = "team"
)
Returns TRUE for role addresses. Filter and remove.
Why this matters: Role addresses rarely reach a single decision-maker. Cold emails to [email protected] get read by whoever monitors the inbox that week — often not the right person, often not read at all. They can also trigger spam complaints at higher rates because the person reviewing them often doesn’t recognize the sender.
Do this before running verification to avoid wasting credits on addresses you’ll exclude anyway.
Time: 5 minutes.
Step 4: Run Live Verification
What: Run an SMTP handshake on every remaining address to confirm the mailbox exists.
This is the most important step. Syntax validation (Step 1) catches formatting errors. Live verification catches the addresses that look fine but will bounce — non-existent mailboxes, deleted accounts, expired domains.
How:
Option A — If your list is in Google Sheets (recommended):
- Install the Smart Email Verifier Add-on from Google Workspace Marketplace
- Add your API key from NeverBounce, ZeroBounce, or MillionVerifier in the add-on sidebar
- Select your email column → click Verify
- Statuses appear in the adjacent column:
valid,invalid,catch-all,disposable,unknown
No CSV export. No manual reimport. The statuses sit right next to your contacts.
Option B — CSV upload workflow:
Export the email column as a CSV → upload to NeverBounce, ZeroBounce, or MillionVerifier → download results → VLOOKUP statuses back into your Sheet.
Time: Option A: 10 minutes. Option B: 30–60 minutes including the roundtrip.
After verification: Keep only valid rows for cold outreach at this stage. We’ll handle catch-all separately in Step 5.
Step 5: Segment or Remove Catch-Alls
What: A catch-all domain accepts all incoming mail regardless of whether the specific mailbox exists. Verification returns catch-all for these — meaning the domain is real and accepts mail, but you can’t confirm if the individual address does.
The decision:
| Scenario | What to do with catch-alls |
|---|---|
| Cold outreach to net-new prospects | Remove. You can’t confirm deliverability. |
| Warm outreach to people who’ve engaged before | Keep. Prior engagement indicates a real mailbox. |
| Re-engagement campaign to lapsed contacts | Keep if they opened/clicked previously, remove if unknown. |
Why the conservative rule for cold: On a cold list, catch-all addresses carry a meaningful bounce risk — industry estimates suggest 15–40% of catch-all addresses are not actually deliverable. Sending a large cold campaign to catch-alls can push your overall bounce rate above safe thresholds even if all your valid addresses deliver cleanly.
On a small cold list (< 100 contacts), the risk is manageable. On a large list (1,000+), the math gets dangerous.
How: Filter your verification results column for catch-all → move to a separate tab or delete.
Time: 2 minutes.
Step 6: Remove Previous Bounces and Unsubscribes
What: Before every campaign, cross-reference your current list against:
- Hard bounces from all previous campaigns (keep a running “do not contact” list)
- Unsubscribe requests from anyone who replied asking to be removed
Why this matters: Sending to a previous hard bounce is a signal of a poorly managed list. Sending to someone who asked to be removed is both a legal issue in many jurisdictions and a fast path to a spam complaint.
How: Keep a master “suppression list” tab in Sheets or in your CRM. Before each campaign, use a VLOOKUP or COUNTIF to flag any addresses in your current list that appear in the suppression list, then remove them.
=COUNTIF(Suppressions!$A:$A, A2) > 0
Returns TRUE if the address is in your suppression list. Filter those rows out.
Time: 5 minutes once you have the suppression list set up.
Step 7: Cap Daily Send Volume Per Domain
What: Limit how many emails you send per day from each sending domain, particularly for newer or recently warmed domains.
Why this matters: Even a perfectly clean list, sent too aggressively from a new domain, will trigger spam filters. Volume spikes look like machine behavior — because they are.
Safe starting ranges:
| Domain age / warmup stage | Max sends per day |
|---|---|
| New domain (< 30 days) | 20–50 |
| Warming domain (30–90 days) | 50–150 |
| Established domain (90+ days, positive reputation) | Up to 300–500 |
For a large campaign, spread sends across multiple days or multiple warmed domains rather than blasting a full list in one day.
Time: Planning step — build this into your campaign schedule.
Common Mistakes
Verifying too far in advance. If you verify a list today and send in 3 weeks, addresses verified as valid today may have changed. B2B email addresses have a meaningful monthly decay rate. Verify within 48 hours of your send date.
Treating catch-alls as valid. Providers can’t confirm the individual mailbox on catch-all domains. Sending to them as if they’re confirmed-valid addresses adds bounce risk proportional to how many you include.
Using the regex check as your only verification pass. Format validation catches formatting errors. It does not catch real-but-nonexistent mailboxes. These are different problems that require different tools.
Skipping the suppression list. The first time you skip it feels like it saves 5 minutes. The first time you accidentally re-email someone who complained about your previous message costs you significantly more.
Verifying once, never again. A list isn’t permanently clean. People leave jobs. Domains expire. Addresses get deactivated. Any segment you haven’t emailed in 60+ days needs a fresh verification pass before the next send.
How This Scales With Automation
The manual version of this checklist takes 15–30 minutes per campaign. With the right setup, it drops to under 5:
- Steps 1–3 can be automated with Sheets formulas triggered on data import (Apps Script or a simple IMPORTDATA refresh)
- Step 4 with the Smart Email Verifier Add-on takes ~10 minutes for 500 addresses, runs in the background while you prep the campaign copy
- Step 6 is fast once you maintain a clean suppression list tab (one source of truth, updated after each campaign)
- Step 7 is a scheduling discipline, not a manual step
Teams that build this into their campaign prep workflow as a non-negotiable step — not an optional extra — consistently maintain bounce rates under 1%. The investment is 15–30 minutes per campaign. The protection is a sending domain that stays healthy for years.
Ready to automate Step 4? Smart Email Verifier for Google Sheets — free to install, no credit card required →