How to clean a phone list before an SMS campaign
A bad SMS list costs more than the wasted send. Carriers watch delivery-failure rates per sender, and a list heavy with dead numbers and landlines pushes your failure rate up until throughput gets throttled or the sender ID gets flagged. You pay twice: once for the messages, and again in deliverability for the campaign after this one.
Cleaning is worth doing in a specific order, because each step makes the next one cheaper.
1. Deduplicate, but normalise first
Deduplicating raw strings barely works. These are one person:
(415) 555-2671 415-555-2671 +1 415 555 2671 14155552671
Four rows, four distinct strings, one handset. Normalise to E.164 before you dedupe and they collapse to a single record. Doing it the other way round is the single most common reason a "deduplicated" list still triple-messages people, which, beyond the cost, is the fastest way to earn a spam complaint.
2. Normalise to E.164
Covered in detail in the formatting guide, but the short version: strip
punctuation, convert 00 to +, resolve the country, drop
the trunk prefix for that country. Rows whose country you cannot establish get
set aside rather than guessed.
3. Drop numbers in unallocated blocks
Now the free money. Numbering authorities allocate ranges in blocks, the NANP in NPA-NXX blocks and thousands-blocks, other countries in their own structures. A number sitting outside any allocated block cannot ring, ever. Not "probably disconnected" — structurally impossible.
On a list that has been bought, scraped, form-filled or merged across acquisitions, this is routinely a double-digit percentage of rows. It is a purely local check: no API call, no per-number cost, no rate limit.
Typical culprits:
- Test data that leaked into production —
555numbers,+1 999…, sequential runs. - Typos: transposed digits, one digit short, one digit long.
- Deliberate junk from form fills —
1234567890is the number people type when they want the download but not the calls. - Numbers whose trunk prefix was never stripped, which land outside the plan as a result.
4. Remove landlines
A landline cannot receive an SMS. The message is accepted, billed, and
discarded. In most countries the numbering plan separates mobile and fixed ranges
explicitly, so this is another local check — +2348… is a Nigerian
mobile range, +2341… is Lagos fixed line, and the plan says so.
The NANP is the awkward exception: mobile and landline share the same
+1 NPA NXX space, so line type there comes from the block's
assignment record rather than from the number's shape, and ported numbers
are the known limitation, a number that moved carriers still reads as
its original assignment. Treat NANP line type as a strong first-pass signal and
verify the segments where being wrong is expensive.
5. Handle VoIP deliberately
VoIP is not automatically junk. Plenty of real people and most businesses use VoIP numbers. But VoIP ranges are also where disposable and virtual numbers live, and SMS delivery to them is inconsistent by provider.
Do not blanket-delete. Split VoIP into its own segment, send to it separately, and look at the delivery rate before deciding. For a consumer campaign it is usually worth suppressing; for B2B it usually is not.
6. Enrich only what survives
Now, and only now, is a paid live lookup worth running. You have gone from a raw list to a subset of well-formed, allocated, mobile numbers, and every step so far cost nothing per row.
Run the survivors through a live carrier lookup if you need current, ported-aware carrier data. On a list that started at 100,000 rows and came out at 60,000, you have just cut that bill by 40% for zero extra effort.
The general rule: never pay per lookup for a number a local check can
already rule out. Live APIs are for resolving ambiguity on numbers that
survived the free filters, not for discovering that +19999999999
is not real.
7. Apply your suppression lists
Opt-outs, complaints, hard failures from previous sends, and any regulatory do-not-contact list that applies to you. This step is last because it is the one with legal weight: it should sit closest to the send, applied to the final file, so nothing can be reintroduced by a later merge.
Keep the invalid numbers you removed in step 3 as their own suppression file too. The same bad rows come back every time someone re-exports the CRM, and a persistent list stops you re-cleaning the same junk each month.
Why the order is not arbitrary
Each step in the sequence assumes the previous one has run. Reordering them does not just make the clean less efficient, it makes specific steps wrong.
| If you do this | What breaks |
|---|---|
| Deduplicate before normalising | The same number in three formats survives as three rows, and the same person is messaged three times |
| Remove landlines before normalising | Line type cannot be determined from a number that is not yet in a canonical form, so the step silently does nothing for most rows |
| Enrich before filtering | You pay per row for duplicates, malformed rows and unallocated numbers, which is where most of the bill goes |
| Apply suppression before deduplication | A suppressed number written in a second format slips through, because the match is on a string that no longer agrees |
The third row is the expensive one and the most common. Enrichment is the only step with a per-row price attached, so it belongs last, after everything free has already reduced the set.
How long a clean stays clean
A cleaned list is a snapshot, and it decays in three different ways at three different speeds.
- Your own additions, fastest. Every new signup, import or merge arrives unvalidated, so a list that is added to weekly is partly dirty within a week.
- Numbers changing hands, steady and invisible. Around 35 million US numbers are disconnected and reassigned each year, which means a number that was a valid, consenting contact can become a stranger with no signal to you at all.
- Allocation data itself, slowest. New blocks are allocated and the plan shifts underneath you, so a number that read as unallocated last year may be live now.
The practical consequence is that "we cleaned the list" is not a state, it is a date. If cleaning is expensive, that date gets old, and the list quietly degrades between cleans. If cleaning costs nothing to repeat, the sensible cadence is simply before every send.
Reassignment specifically is worth naming as outside what any validation tool can tell you. It is tracked in the FCC's Reassigned Numbers Database, a separate subscription service, and no numbering-plan data substitutes for it. If your exposure is regulatory rather than deliverability, that is a different check with a different source.
8. Keep the removals, not only the survivors
The output of a clean is usually treated as one thing: the good rows. The rows you removed are worth more than they look, because next month the same junk comes back.
Lists are re-exported, merged and re-purchased. If all you keep is the clean result, every cycle re-cleans the same dead numbers from scratch and every cycle sends the same rows to a paid lookup. Keeping the removals as a suppression file turns a repeated cost into a one-time one, and it accumulates: the file gets better at protecting you the longer you keep it.
Worth keeping separately, because the reasons are not equivalent:
- Unallocated or malformed: permanent. A number outside any allocated block will not become valid later.
- Landline: durable but not permanent, because a number can be ported.
- Opted out: permanent and legally significant. This one should never be mixed in with technical removals, because it has to survive any change of tooling.
- Hard bounced at the gateway: evidence from delivery rather than from data, and the most valuable kind you have.
9. Measure the clean, then keep the measurement
A clean that reports only "done" leaves you unable to tell a good source from a bad one. Record the counts at each step, per source, every time.
What it buys you is specific. When one lead vendor's file loses 40% at the unallocated step and another loses 3%, you have a number to take to the first vendor, and a reason to buy more from the second. That comparison is impossible if the only thing you kept was the merged output.
It also catches tooling problems. A sudden jump in the malformed count usually means an export changed, not that the numbers got worse, and the sooner that is visible the less of it ends up in your database.
The order, condensed
- Normalise to E.164
- Deduplicate
- Drop unallocated blocks
- Remove landlines
- Segment VoIP
- Enrich the survivors, if needed
- Apply suppression, last
Steps 1 to 5 are free and local. Step 6 is the only one that costs per number, and by then the list is a fraction of its original size. Getting the order wrong is what makes phone validation expensive.
Common questions
What does it mean to scrub a phone list?
In common use it covers two different jobs that are worth separating. Technical scrubbing removes numbers that cannot be reached: duplicates, malformed rows, unallocated blocks, and landlines in an SMS context. Compliance scrubbing removes numbers you are not permitted to contact, such as those on a Do Not Call registry. A tool that does the first has not done the second, and the two use entirely different data sources.
How many numbers in a typical list are invalid?
It varies far too much to give a single figure honestly. A double-opted-in list from your own signup form may lose almost nothing. A merged or purchased list can lose more than half across deduplication, malformed rows and unallocated blocks combined. The useful move is to measure your own, per source, rather than to trust a percentage from an article.
Should I delete landline numbers from my list?
No, move them. A landline is a working number and a legitimate contact, it just cannot receive a text. Deleting it throws away a record that a voice campaign would use. Segment it out of the SMS audience and keep it.
Do I need to clean a list before every send?
Before every send is ideal, and whether it is realistic depends on whether cleaning costs you anything. With a per-row metered lookup, re-running is a fresh bill, so in practice it happens quarterly at best. With a local pass that costs nothing to repeat, there is no reason not to run it each time, which matters because a list that was accurate in January is measurably stale by June.
How do I get bulk phone numbers for a campaign?
Legitimately, from your own collection: signup forms, checkout, existing customer records, and opt-ins you can evidence. Purchased and scraped lists are where most of the invalid rows in this article come from, and they carry a consent problem that no amount of technical cleaning fixes. Cleaning a list makes it deliverable. It does not make it lawful to message.
Does cleaning a list help with deliverability beyond the bounces?
Yes, and this is usually the larger effect. Carriers score senders on delivery-failure patterns — the industry's own messaging principles and best practices set out what they expect of a sender — and a high proportion of undeliverable messages resembles spam traffic. The escalation runs from throughput throttling to filtering to a blocked sender ID. The cost of a dirty list is therefore not only the wasted sends in this campaign but the deliverability of the next one.
Is a Do Not Call scrubber the same as a phone validator?
No, and running one is not a substitute for the other. A validator answers whether a number can be reached: is it real, is it allocated, is it a mobile. A Do Not Call scrubber answers whether you are permitted to contact it, by checking federal and state registries that are maintained for that purpose and are not derivable from numbering-plan data. They use different sources, they fail in different ways, and a list needs both passes if you are calling rather than only texting.
Try it on a number right now
The free checker on the homepage runs the same engine the desktop app uses: validity, country, line type and carrier, one number at a time.
Check a number free