Phonelint
SMS

How to clean a phone list before an SMS campaign

Published 2026-09-10 · Updated 2026-09-12 · Phonelint

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:

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 thisWhat breaks
Deduplicate before normalisingThe same number in three formats survives as three rows, and the same person is messaged three times
Remove landlines before normalisingLine 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 filteringYou pay per row for duplicates, malformed rows and unallocated numbers, which is where most of the bill goes
Apply suppression before deduplicationA 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.

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:

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

  1. Normalise to E.164
  2. Deduplicate
  3. Drop unallocated blocks
  4. Remove landlines
  5. Segment VoIP
  6. Enrich the survivors, if needed
  7. 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