Look up a number
Reference

UK number cleansing for CRM — 2026 playbook

How to cleanse a UK phone number list in your CRM: format normalisation, libphonenumber, carrier-aware deduplication, TPS suppression, and Ofcom-aware quality scoring.

4 min read
Managing Director, OmegaIT · OmegaIT · Published 11 May 2026 · Updated 14/05/2026
On this page

If you're a UK marketer, RevOps lead or sales ops engineer, your CRM is probably full of phone numbers that started life as 0203 9461234 and +44 20 7946 0000 and 02012345678 ext 123 and a thousand other shapes. This is the practical 2026 playbook for cleansing UK numbers — what 'cleansed' actually means, how to do it efficiently, and which third-party tools save you time vs cost you money.

Why cleanse?

Three concrete benefits:

  • Lower SMS / call costs — sending to invalid numbers wastes credits and triggers carrier complaints.
  • Higher deliverability — clean lists get better network reputation; spammy lists get throttled.
  • Compliance — UK PECR + GDPR fines for marketing without lawful basis or in breach of TPS reach 4% of global revenue.
  • Sales productivity — your SDR shouldn't be cold-dialling 0207-blah-blah-ext-3 from a 2019 trade-show export.

Step 1 — Normalise to E.164

E.164 is the single canonical format every downstream tool understands. It's +44 followed by the national digits with the leading 0 dropped. So 020 7946 0000 becomes +442079460000.

Normalising a column of UK numbers to E.164
import { parsePhoneNumberFromString } from "libphonenumber-js/min";

export function normaliseToE164(input: string): string | null {
  const cleaned = input.trim().replace(/\s+/g, "");
  const phone = parsePhoneNumberFromString(cleaned, "GB");
  return phone?.isValid() && phone.country === "GB" ? phone.number : null;
}

Run this across every phone column in your CRM export. Anything that returns null is either malformed or non-UK — quarantine, don't delete, in case there's a manual fix.

Step 2 — Drop syntactically-invalid numbers

After normalisation, anything still null is invalid. Common reasons:

  • Extension suffixes (...0000 ext 123) — strip the ext portion before parsing.
  • Bracketed alternatives (07700 900000 / 07700 900111) — split into separate rows.
  • Mistyped digits (10 digits where 11 expected, or vice versa).
  • Non-UK numbers in a UK column — re-classify into a country column.

Step 3 — Deduplicate

After E.164 normalisation, deduplication is a simple GROUP BY phone_e164. The interesting decision is merging the rest of the row when the same number appears against multiple contacts:

  1. If two contacts share the same E.164, prefer the one with the most recent activity timestamp.
  2. Preserve emails / first names from both rows in a merged_from field.
  3. If they differ on company, mark for human review — could be a switchboard number for two different employees, or a shared receptionist.

Step 4 — Classify by line type

Some campaigns target only mobile (SMS), some only landline (cold call). Use libphonenumber's getType():

Classifying line type
import { parsePhoneNumberFromString } from "libphonenumber-js/min";

export function classify(input: string) {
  const phone = parsePhoneNumberFromString(input, "GB");
  if (!phone?.isValid()) return "INVALID";
  return phone.getType() ?? "UNKNOWN";
  // possible values: 'MOBILE' | 'FIXED_LINE' | 'FIXED_LINE_OR_MOBILE'
  //                | 'TOLL_FREE' | 'PREMIUM_RATE' | 'SHARED_COST'
  //                | 'VOIP' | 'PERSONAL_NUMBER' | 'PAGER' | 'UAN' | ...
}

Step 5 — Suppress TPS-registered numbers

The Telephone Preference Service (TPS) is the UK's official cold-call opt-out register. Calling a TPS-registered number for marketing without lawful basis is a PECR breach. Two ways to suppress:

  • TPS Assured licence (~£1k/year + per-record fees) — official live API access.
  • Bulk file purchase — quarterly TPS file from a reseller. Cheaper for one-off cleanups.

Either way, run your normalised list against TPS and flag matches. Don't delete — keep the contact, mark tps_registered=true, and route them to email-only sequences.

Step 6 — Optional in-service check

If your list is large and old, run a sample (or the whole thing) through a paid carrier-aware API to confirm in-service:

  • Twilio Lookup with Line Type Intelligence — confirms current carrier post-port.
  • Vonage Number Insight Advanced — adds reachability data.
  • MessageBird Lookup HLR — live HLR query, fastest for SMS-readiness.

See UK phone number validation API for the full comparison.

Quality scoring — what 'good' looks like

Score 0–10Meaning
10E.164, recently observed via inbound call/SMS, in service, not on TPS
7–9E.164, in-service via API, last activity < 12 months
4–6E.164, valid format, no in-service check, last activity 1–3 years
1–3E.164 format only, last activity > 3 years
0Invalid, TPS-suppressed, or marked DNC

Persist this score in the CRM and re-compute quarterly. Sales should default to working scores 7+; marketing email-only sequences for everything else.

GDPR + PECR compliance reminders

Organisations should screen their marketing call lists against the Telephone Preference Service no later than 28 days after the number was added. Calling a TPS-registered subscriber without consent is a breach of PECR Regulation 21.
ICO — Guidance on PECR Regulation 21 (live calls)
  1. Lawful basis for marketing calls/SMS to UK numbers is opt-in (with limited soft-opt-in exceptions for existing customers).
  2. TPS suppression is mandatory for cold sales calls.
  3. International transfers — if your validation API is non-UK, check it's in your DPA + has UK adequacy / SCCs.
  4. Right to erasure — when a contact requests deletion, also remove the phone hash from any vendor cache.

Bottom line

Cleansing a UK CRM phone list is a six-step pipeline: normalise → drop invalid → dedupe → classify → TPS-suppress → optionally in-service-check. The first four are free with libphonenumber-js. The last two cost money but pay for themselves in deliverability, compliance and SDR productivity.

Look up a UK number now

Free, no signup. See the Ofcom range holder + AI internet check.

Frequently asked questions

What does UK number cleansing involve?

Normalising every number to E.164 format, dropping syntactically-invalid entries with libphonenumber, deduplicating against the canonical E.164, classifying by line type (mobile vs landline), suppressing TPS-registered entries, and optionally a carrier-aware in-service check via a paid API.

How do I bulk-validate UK phone numbers in a CRM?

Run libphonenumber-js across the export to drop malformed entries, then sample-check survivors with a paid API like Twilio Lookup or MessageBird HLR to estimate currency. Daily/weekly batch is fine; you don't need real-time for CRM work.

Do I need to suppress TPS-registered numbers?

Yes for cold sales calls — calling a TPS-registered number without lawful basis is a UK PECR breach. The TPS Assured live API or a quarterly TPS file from a reseller are the standard suppression sources.

Can I cleanse my UK list using a free tool only?

Mostly. libphonenumber-js handles format normalisation, validation, deduplication and line-type classification — all free. The two paid layers are TPS suppression (free if you have an Assured licence already) and carrier-aware in-service checks.

Sources & references

  1. libphonenumber-js — JavaScript port
    @catamphetaminegithub.com/catamphetamine/libphonenumber-js
  2. Telephone Preference Service (TPS)
    DMA / TPSwww.tpsonline.org.uk
  3. Privacy and Electronic Communications Regulations (PECR)
    Information Commissioner's Officeico.org.uk/for-organisations/direct-marketing-and-privacy-and-electronic-communications/guide-to-pecr/
  4. Data Protection Act 2018 + UK GDPR overview
    Information Commissioner's Officeico.org.uk/for-organisations/uk-gdpr-guidance-and-resources/
  5. Twilio Lookup API — Line Type Intelligence
    Twiliowww.twilio.com/en-us/lookup