How to clean a phone list before an SMS campaign
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:
- 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.
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.
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