Phonelint
SMS

How to clean a phone list before an SMS campaign

Published 2026-09-08 · Phonelint

The cost of a bad SMS list is not just 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.

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.

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