LeadlistVerifier

How to Clean a 100,000-Email List the Right Way

Jeremy Dixon, Founder of Elevate Clients Inc.9 min read

In short

Deduplicate first, then verify the whole file, then split the results into segments you treat differently. At published pack pricing, 100,000 addresses costs $360, and the work that decides the outcome is what you do with the ambiguous segment.

A hundred thousand addresses is the point where casual habits stop working. At a thousand you can eyeball the file. At a hundred thousand the decisions you make about process compound into real money and a real deliverability outcome, and the mistakes are expensive in both directions: careless cleaning burns your sending domain, and over-aggressive cleaning quietly deletes leads you paid to acquire.

Why large lists rot

Decay is continuous and invisible. Nothing about a stale file looks different from a fresh one, which is why lists are usually verified in a panic after a campaign rather than before it.

People move. Every departure turns a working address into either a hard bounce or, at larger organisations, a forwarding alias that reaches an administrator instead of your intended recipient. The second is worse, because it looks like success.

Sources vary in quality. A 100,000-address list is rarely one purchase. It is usually several, accumulated over time, and the worst source in the pile sets the bounce rate for everything. Pattern-generated addresses in particular are guesses wearing the costume of data.

Role addresses accumulate. Generic mailboxes like info@ and support@ are usually real, so they never bounce and never get cleaned out. They also engage poorly and attract filtering, which means they degrade campaign performance without showing up in the metric people use to detect list problems.

What cleaning at scale involves

Four operations, in this order. The order matters, because two of them reduce what you pay for the third.

  1. Deduplicate. Lowercase everything and compare. Duplicates across source files are charged as separate addresses, so this is a direct saving before anything else happens.
  2. Normalise format. Strip whitespace, remove the display names that arrive as Sarah Chen <sarah@company.com>, and drop rows that are obviously not addresses. Malformed rows cost credits to be told they are malformed.
  3. Verify. The expensive step, and the one that produces the information. Everything before it is preparation and everything after it is bookkeeping.
  4. Segment. Split the results by verdict and treat each group differently. A single cleaned list is the wrong output, because the file contains at least three populations that warrant different decisions.

Deduplication is less obvious than it looks

A naive exact-match dedup on a large multi-source file misses a surprising amount. Three cases account for most of it.

Case. The local part of an address is technically case-sensitive under the specification, and in practice essentially no provider treats it that way. Lowercase everything before comparing, or you will pay twice for the same person.

Plus addressing. Many providers route sarah+newsletter@company.com to sarah@company.com. Whether to collapse these depends on your purpose: for deduplication before verification it usually saves money, but the tagged form is what the person gave you and may be what your suppression records hold.

The same person at two domains. A company that migrated domains often accepts both, so the file contains two live addresses reaching one inbox. Exact matching cannot detect this, and it is not worth solving programmatically. Note it as a reason your usable-contact count will be slightly below your deliverable count.

What it costs

Published pack pricing at the volumes relevant to a list this size:

PackPricePer address
25,000$120$0.0048
50,000$220$0.0044
100,000$360$0.0036
250,000$675$0.0027

So the headline number for this exercise is $360, or $0.0036 per address. Two practical notes. Deduplicating first genuinely reduces this, because you buy credits for rows rather than for people. And credits do not expire, so if your list is 110,000 addresses it is worth comparing a 250,000 pack against a 100,000 pack plus a top-up, since the larger pack may cost less per address overall and the remainder keeps. Full rates are on the pricing page.

What the results will probably look like

The following applies our published rates to a hypothetical 100,000-address B2B list. It is arithmetic rather than a measured campaign, and your file will differ, but the shape is consistent enough to plan around.

Roughly 25 to 30 percent of addresses on a typical B2B list sit on catch-all domains. Taking the lower end, that is about 25,000 addresses a standard verification pass cannot settle, leaving about 75,000 resolved cleanly in both directions.

A second pass returns a definitive verdict on roughly 72 percent of that catch-all segment, which is about 18,000 addresses moving from a status to an answer. That is 18 percent of the entire file, and it is the difference between a cleaned list of 75,000 usable rows and one of about 93,000.

Framed as money, the 18,000 recovered addresses cost you nothing additional, because the second pass runs inside the same verification. Framed as the alternative, deleting the catch-all segment wholesale would discard 25,000 addresses of which roughly 18,000 were fine, on a file that cost you both acquisition and verification. Catch-all domains covers why that segment behaves this way.

The walkthrough

  1. Export everything to one CSV. Combine your sources. Keep whatever metadata you have alongside the address, since you will want to join the results back to it later. Column order does not matter and the email column is detected automatically.
  2. Deduplicate on the lowercased address. Do this in a spreadsheet or a two-line script before uploading, not after. Every duplicate removed here is a credit not spent.
  3. Apply your suppression list. Remove anything that previously hard bounced or unsubscribed. Paying to re-verify known dead addresses is the most avoidable line item in this process, and on a file assembled from several sources the overlap with past campaigns is usually larger than anyone expects.
  4. Run a sample of a few hundred first. Read the catch-all share and the deliverable share. This tells you what to expect and occasionally tells you the file is not worth cleaning at all, which is worth knowing for a few dollars.
  5. Upload the full file. Up to a million rows per file. You see the exact credit cost before anything runs, and progress updates live while it does.
  6. Export by segment rather than as one file. Filtered exports let you pull deliverable, risky and undeliverable separately, which is what makes the next section actionable. Join each export back to your original metadata on the address column before loading anything into a sending tool, so the segmentation survives into the campaign rather than living only in a download.

What to do with each segment

Deliverable. Send. This is the segment the exercise was for, and on the arithmetic above it is the large majority of what survives.

Risky. Hold separately and decide deliberately. This group contains role addresses, disposable providers, and mailboxes resolved with lower confidence. The confidence score attached to each result is the useful input: high-scoring risky addresses behave far more like deliverable ones than the label suggests. Many teams mail this segment from a separate domain so a problem stays contained.

Undeliverable. Delete from the sending list and add to your suppression list permanently. The suppression step is the one people skip, and it is the reason cleaned lists get dirty again after the next merge.

Role and disposable addresses need their own decision

Both arrive flagged inside the risky segment and they warrant opposite treatment.

Role addresses like info@ and sales@ are usually live, so they will not bounce and cleaning will not remove them. Whether you want them is a targeting question rather than a data-quality one: they reach a shared inbox rather than a person, and they attract filtering. For cold outreach most teams exclude them. For support or partnership enquiries they may be exactly right.

Disposable addresses from throwaway providers are a different case. They were created to receive one message and be abandoned, so they may verify as deliverable today and be gone next month. On a purchased B2B list they are usually a signal that the source is worse than advertised, which is worth knowing beyond the individual rows.

Mistakes that cost real money at this size

  • Verifying before deduplicating. The most direct waste available. Every duplicate is a credit spent to be told something you already knew.
  • Skipping the suppression pass. Re-verifying addresses you already proved were dead costs money and then puts them back into a campaign, which costs considerably more.
  • Deleting the risky segment wholesale. It is the tempting simplification and it discards addresses that carry a confidence score precisely so you can make a graded decision.
  • Treating unknown as invalid. An unknown result means no verdict was obtainable, not that the mailbox is missing. Deleting these silently removes contacts nobody established were bad.
  • Cleaning once and considering it done. The file starts decaying the moment the run finishes, and a list cleaned last year is not a cleaned list.

Knowing whether it worked

The verification report tells you what the file contained. Whether the exercise succeeded shows up in the next campaign, in two numbers.

Hard bounce rate should drop to the low end of the convention and stay there across sends rather than for one send. If it improves and then drifts back, the usual cause is a merge that reintroduced old addresses rather than the cleaning failing.

Reply rate is the more interesting signal, because it moves for a different reason. Removing dead addresses raises it mechanically by shrinking the denominator. Recovering the catch-all segment raises it by adding real recipients who were previously excluded. If bounce rate falls while reply rate stays flat, you cleaned defensively and probably threw away more than you needed to.

When to do it again

The working convention is quarterly for lists you mail regularly, and before each campaign for cold outreach. Those intervals are conventions rather than measured thresholds, and the underlying logic is that decay is continuous while your visibility into it is not.

Re-verification is also cheaper than the first pass in practice, because you are re-checking a file you have already deduplicated and suppressed rather than a raw accumulation. If you are running a large list on a schedule, the ongoing cost is closer to a subscription in shape than the initial clean suggests, at a fraction of the amount. Reducing bounce rate covers where this sits among the other things that move the number, and the features page covers what the two passes actually do. A free account starts with 100 credits, which is enough to run the sample step before you buy anything.

Frequently asked questions

How much does it cost to clean a 100,000-email list?

At published pack pricing, 100,000 credits is $360, which works out to $0.0036 per address. Larger packs are cheaper per address and smaller ones dearer, so buying the pack that matches the list rather than topping up repeatedly is worth a few minutes of arithmetic. Credits never expire, so overbuying slightly costs nothing beyond the timing of the spend.

Should I deduplicate before or after verification?

Before, always. Duplicates are charged as separate addresses because the verifier has no way to know two rows are the same person, so removing them first is a direct saving. On a large list assembled from several sources, deduplication commonly removes a meaningful share before anything is spent.

Do I need to verify addresses that bounced last time?

No. Addresses that produced a hard bounce belong on a suppression list permanently and should never re-enter a file, let alone be paid for again. The most common cause of a bounce rate creeping back up is an old export appended to a clean list, quietly restoring addresses you already proved were dead.

How long does verifying 100,000 addresses take?

Bulk verification runs concurrently rather than sequentially, with 20 concurrent checks on the primary pass and 5 on the second. A 10,000-address list typically finishes in 10 to 15 minutes, and a 100,000-address list scales from there rather than taking ten times as long in wall-clock terms per address. Progress updates live while it runs.

Is it cheaper to verify in batches or all at once?

Per address, larger packs are cheaper, so one purchase covering the whole list beats several small ones. Operationally, though, run a sample first. A few hundred addresses tell you the shape of the list, including the catch-all share, before you commit the rest, and that information sometimes changes what you want to do with the file.

Try it on your own list.

100 free credits on signup, no card required. Or check a single address with the free verifier, no account needed.