TL;DR
- Verify every list before import, including "verified" exports from Apollo and other lead databases.
- Keep deliverable, drop undeliverable, and put catch-alls in their own campaign or set them aside.
- Aim for under 2% bounces. Re-verify lists older than about 30 days and before late sequence steps.
Why verify before you send
Sending platforms brake hard when bounces climb. Instantly pauses a campaign above 5% after 200 sends, Outreach locks a mailbox for 24 hours, and lemlist alerts at 10%. By the time a brake trips, the damage to your domain is already done. Most platforms recommend staying at or under 2%, and Smartlead reports a median of about 1.5% across its senders (see our bounce rate benchmarks).
Lead data doesn't stay accurate. People change jobs, companies change domains, and a "verified" badge in a lead tool means verified at some point in the past. Catch-all domains make it worse, because their mail servers accept every address at first and bounce later. Verification is the cheap step that stands between a stale list and a burned domain.
The workflow, step by step
- Export the leads as a CSV. From Apollo, Clay, a lead vendor, a scrape, or the sending tool itself. Keep all your columns; you'll want them back.
- Upload the file to MailExchange. CSV, TXT or a pasted list. Duplicates are removed and refunded.
- Read the results. Every row gets one of four states, with a reason (below).
- Split the file. Deliverable goes to your main campaign. Catch-alls go to a separate, slower campaign, or get skipped on new domains. Undeliverable is removed.
- Import the clean file into your sequencer. You can leave its built-in verifier off, since you've already paid for verification once.
- Re-verify on a schedule. Lists older than about 30 days, and leads waiting for later steps of a long sequence, should be checked again.
What each result means
| State | What it covers | What to do in cold email |
|---|---|---|
| Deliverable | The mailbox server confirmed the address | Send |
| Risky: catch-all | The domain accepts every address, so the mailbox can't be confirmed | Separate campaign, established inboxes, lower volume, or skip |
| Risky: role | info@, sales@, support@ and similar shared inboxes | Usually leave out of cold campaigns |
| Risky: disposable | Throwaway inbox providers | Remove |
| Undeliverable | Rejected mailbox, invalid domain or invalid syntax | Remove |
| Unknown | The server didn't give a definite answer | Retry later. The credit is refunded |
We get there with six checks: syntax, DNS and MX records, risk lists, an SMTP mailbox check, a catch-all test and a final verdict. We never send an email to the address. More in how verification works.
What to do with catch-alls
Catch-alls are the hardest part of any B2B list. In Hunter's published test (checked 2026-10-17), accept-all addresses bounced 27% of the time versus 1% for valid ones. Don't let them share a campaign with your deliverable leads, where they can push the whole campaign's bounce rate up. Full playbook: should you send to catch-all emails?
Workflows for each tool
The steps above work everywhere. These pages cover the details for each platform: where to export, what its built-in verifier costs, and its bounce rules.
- Sending tools: Instantly, Smartlead, lemlist, Woodpecker, Reply.io, Saleshandy
- Lead sources: Apollo, Clay
- CRM and marketing: HubSpot, Mailchimp
- Automation: Zapier
Automating it
If leads arrive from a script, Clay table or enrichment pipeline, call the API before the lead is pushed into a campaign, and only pass on deliverable results. Bulk jobs take up to 100,000 addresses per call and can POST to a callback URL when they finish.
What it costs
Pay as you go from $29 for 5,000 checks ($0.0058 each) down to $1,699 for 1 million ($0.0017 each). Credits never expire, and unknowns and duplicates are refunded. See pricing, or compare your sequencer's built-in verifier with the cost calculator.