Lead lists · 2026
How to clean a lead list before you dial it
Last updated September 3, 2026
Every new caller does the same thing: buys or scrapes a list, imports it, and starts dialing within the hour. Then a fifth of the session goes to numbers that were never going to work, two prospects get called twice, and one of them was on a suppression list. None of that is a skill problem. It is forty minutes of spreadsheet work that did not happen. Here is the forty minutes, with the actual arithmetic on what it is worth — including the part where the money saved is small and the time saved is not.
The short answer
Six passes, in this order: drop rows with no phone; normalise every number to E.164; deduplicate on the normalised number; split and trim the name and company fields; subtract your suppression lists; optionally validate the survivors. On a typical raw 5,000-row list that removes around 22% and saves roughly 750 pointless dials, which is about 7.5 working days at 100 dials a day. The minutes you save are worth single-digit dollars. The days are the point.
What a bad row actually costs
Start with how telephony bills, because most articles on this topic get it wrong in a way that inflates their own numbers. Carriers bill connected talk time, rounded up to the next whole minute, per call. So a number that rings out costs you nothing at all. A disconnected number that hits an intercept recording may cost nothing or may cost a minute depending on how the carrier answers it. And a wrong number whose voicemail picks up bills a full minute even though you hang up during the greeting. That last case is the expensive one, and it is the one a dead list produces most.
Now the categories. A blank phone cell never becomes a dial — it becomes an import error. A duplicate number behaves exactly like a good row: full dial, full voicemail, full billed minute, plus the chance of calling one person twice in an afternoon. A suppressed row does the same and carries the only genuine legal exposure on the list. A disconnected number mostly fails fast. Priced out on a 5,000-row list:
| What you remove | Rows | Would it have dialed? | Why it matters |
|---|---|---|---|
| Blank or unparseable phone | 350 | No | Never becomes a dial; it becomes an import error at the worst moment. |
| Duplicate numbers (after normalising) | 300 | Yes | Dials exactly like a good row. Also the fastest way to call one person twice. |
| Suppressed: DNC or already contacted | 200 | Yes | Dials like a good row and carries the only real legal risk on this list. |
| Disconnected or unassigned on lookup | 250 | Yes | Mostly an intercept tone; a share of them still bill a minute. |
| Total removed | 1,100 | 750 dials | 22% of the list; 3,900 rows left to call |
Those 750 dials that would have happened cost about 530 billed minutes — 455 from the duplicates and suppressed rows dialing at a normal 55% voicemail and 12% connect mix, plus roughly 75 from the dead numbers that answer with something. At Twilio's ~$0.014/min that is $7. Which is nothing.
Say that plainly, because the pages ranking above this one will not: cleaning your list to save telephony money is not worth your time. Cleaning it to save dialing time absolutely is. 750 dials is about 7.5 full days of a rep working at 100 dials a day. It is also more than the entire 500-call monthly allowance on our own free plan, and considerably more than one month of a metered seat elsewhere. Time and allowance, not minutes.
E.164, and country codes done properly
E.164 is the ITU standard every telephony API expects: +, country code, national number, and nothing else. Maximum fifteen digits. +14155551234. +442079460000. +61291234567. The two rules people get wrong:
- The trunk zero is dropped. A UK number written
020 7946 0000becomes+442079460000— the country code replaces the leading 0, it does not sit in front of it. The same applies in Germany, France, Australia and most of the world.+4402079460000is a broken number, and it is the single most common mistake on non-US lists. - North America has no trunk code. A US or Canadian number is
+1plus the ten digits exactly as written. There is no zero to drop, which is why people who learned on US lists then break every UK number they touch.
Store the result in a column formatted as plain text. If the column is number-formatted, the spreadsheet reads the leading plus as arithmetic and silently destroys the value. And keep the raw original column — when a number fails to parse you want to see what it originally said, not a blank. The Google Sheets guide has a copy-paste formula that does the whole column and flags anything it cannot resolve rather than guessing.
Two artefacts to kill on the way through: extensions glued to the end (+14155551234x204 is not E.164 — put the extension in its own column) and numbers that have been through Excel, which turns a phone column into floats like 2069792347.0 or, past eleven digits, scientific notation like 2.069792347E9. Both are recoverable, but only if the importer knows to look; ours does, because a 60,000-row import in September 2026 arrived with 21,528 numbers in exactly that state.
Deduplicate by number, never by name
Order matters: normalise, then dedupe. Before normalising, (415) 555-1234 and 415.555.1234 are two different strings and the same human being. After normalising, exact string match works and a plain COUNTIF finds every repeat.
Do not dedupe on names. Bob against Robert, a married name against a maiden name, a trailing space, an accented character stored two different ways — and, going the other way, two genuinely different people who happen to share a name at the same company. Do not dedupe on company either unless you have decided you only want one contact per account, which is a targeting decision rather than a hygiene one.
One subtlety worth the extra minute: dedupe across lists, not just within one. The duplicate that burns you is not two rows in today's file — you will spot that — it is the row in today's file that you already called from last quarter's file. Keep a master table of every number your team has ever dialed and check new imports against it. In a dialer that owns your call history this happens automatically; in a spreadsheet it is a COUNTIF against another tab.
Fields: split, trim, standardise
| Field | Rule | Looks like |
|---|---|---|
| Phone | E.164, plain text, one number per row | +14155551234 |
| First name | Split from full name, trimmed, no titles | Jennifer |
| Last name | Split, kept for the CRM not the opener | Alvarez-Ruiz |
| Company | Trimmed, suffixes normalised or stripped consistently | Northwind Freight |
| State / timezone | Needed to respect calling hours, not optional for consumer calling | AZ |
| Source | Where the row came from and when | Apollo, 2026-08-14 |
The first-name split is the one that shows up on the call. A single Name column gives you openers that read "Hi Jennifer Alvarez-Ruiz" or, worse, "Hi Dr. Jennifer Alvarez-Ruiz Jr." Strip titles and suffixes, take the first token, and put the rest somewhere else. Trim everything — a trailing space is invisible in a cell and breaks every exact match you will ever run against that column. And normalise company suffixes one way or the other: either every row has Inc. or none does, because half-and-half means your account matching finds nothing.
Keep a state or timezone column even if you think you will not need it. Calling hours are enforced in the contact's local time, not yours, and an area code is a poor proxy now that people keep their mobile number across three moves.
Suppression: already-contacted and do-not-call
Two different lists, both subtracted before import. The internal one is everyone who has asked you not to call, everyone who has already been contacted in this campaign, current customers who should not get a cold pitch, and competitors. This is not optional even for B2B: an internal do-not-call request must be honoured regardless of what registry the number is or is not on, and it is the requirement most small teams have never heard of.
The external one is the registry. For US consumer calling, the National Do Not Call Registry costs $82 per area code for fiscal year 2026 with the first five area codes free, capped at $22,626 for national coverage — the FTC has published an increase to $85 per area code and $23,425 nationwide from 1 October 2026 (FTC announcements, checked September 2026). Canada's National DNCL is free to register with but charged to subscribe to. Pure B2B calls are often exempt, but "often" is doing real work in that sentence — sole traders, home-based businesses and mobile numbers blur the line. The full breakdown of who must scrub, and the calling-hour rules that apply either way, is in do you have to scrub the DNC list before cold calling.
Mechanically: keep suppression as its own table of E.164 numbers, subtract with a lookup, and move suppressed rows to a separate tab rather than deleting them. A dialer with a built-in suppression list does this at dial time as well, which catches the case where someone opts out mid-campaign and the number is still sitting in an already-imported list.
Validation lookups: what they do and what they cost
There are three different things sold under the word "validation", and only one of them tells you a human is on the other end.
- Format validation checks the number could exist in its country's numbering plan. Offline, instant, free — this is what the E.164 formula above is doing.
- Line type / carrier lookup queries the number portability databases and tells you the current carrier and whether it is mobile, landline, fixed VoIP, non-fixed VoIP or toll-free. Twilio Lookup charges $0.008 per number for Line Type Intelligence and $0.01 for US caller-name; basic formatting and validation is free (Twilio Lookup pricing, checked September 2026).
- HLR lookup queries the mobile network's Home Location Register and can report that a handset is actually registered and reachable — the closest thing to proof the line is alive. Sold by specialist vendors, typically a fraction of a cent to a cent per number depending on volume. It only works on mobiles.
Now the arithmetic nobody publishes, on the same 5,000-row list:
| Line item | Working | Cost |
|---|---|---|
| Line-type lookups on the whole list | 5,000 × $0.008 | −$40 |
| Billed minutes those lookups save | 530 min × ~$0.014/min | +$7 |
| Rep time those lookups save | 750 dials ÷ 100 a day | +7.5 days |
| Net, in money alone | Validation loses on telephony every time | −$33 |
So validation does not pay for itself in telephony, ever, and any vendor page claiming otherwise is comparing against retail per-minute rates nobody with their own Twilio account pays. Buy lookups for the two things they are genuinely good at: splitting mobiles from landlines so you can treat them differently, and pruning obviously dead rows out of a rep's day. If the list is small, skip it and let the dialing tell you.
Mobile versus landline, and how fast a list rots
Line type changes three things. In the US it changes the compliance question — calls to mobiles get stricter TCPA treatment than calls to landlines, which is why consumer callers segment on it before doing anything else. It changes the deliverability question, because carrier spam labelling is a mobile phenomenon: the "Spam Likely" banner appears on handsets, not desk phones (see fixing a flagged number). And it changes who picks up: a mobile follows the person, a direct dial rings a desk that may have been empty since 2020.
On decay, be sceptical of the numbers you will find. Published B2B data-decay figures range from about 22% a year to over 70%, and the largest ones come from companies selling re-verification services, which is not a neutral source. The parts that are not contested: roughly 15 to 20% of professionals change jobs in a year, and office direct dials go stale faster than mobiles. The usable rule is behavioural rather than statistical — re-verify anything older than six months before a serious campaign, and treat a list over a year old as research material rather than a call list. If your own connect rate on a list falls by half from where it started, the list has decayed regardless of what any vendor benchmark says.
The pre-import checklist
- One row per phone number. No two numbers in one cell, no one row per company.
- Delete every row above the header. Header in row 1, no merged title cells.
- Add a plain-text E.164 helper column; flag anything that will not parse instead of guessing.
- Filter out blank and flagged numbers into a separate tab.
- Deduplicate on the E.164 column, within this list and against everything you have called before.
- Split names, trim every text column, standardise company suffixes.
- Subtract your internal do-not-call list and your already-contacted list.
- Scrub against the relevant registry if you are calling consumers.
- Optionally run line-type lookups and split mobiles from landlines.
- Export as CSV, UTF-8, current sheet only. Import. Check the row count matches what you expected.
Step ten catches more problems than the other nine. If you exported 3,900 rows and the dialer says 3,412, something ate 488 of them and you want to know what before you start calling.
A dialer that does half of this for you
Import maps your columns automatically, normalises numbers to E.164 on the way in, un-mangles Excel-damaged phone columns, and checks every dial against your suppression list. Free for one person up to 500 leads and 500 calls a month, on your own Twilio at wholesale.
Import a clean listQuestions people actually ask
What is E.164 format and why do dialers want it?
E.164 is the international numbering standard: a plus sign, the country code, then the national number, with no spaces, brackets, dashes or leading trunk zero. +14155551234 for the US, +442079460000 for London, +61291234567 for Sydney. Dialers want it because it is unambiguous. A ten-digit string could be a US number or a truncated one; 020 7946 0000 is a London number only if the tool already assumed the UK. In E.164 there is nothing to assume, so nothing to get wrong, and exact string comparison works — which is what makes deduplication and suppression matching reliable.
Should I deduplicate a lead list by name or by phone number?
By phone number, and only after you have normalised the column to E.164. Names are unreliable keys: Bob and Robert, married-name changes, trailing whitespace, and two genuinely different people at the same company. The phone number is what actually rings, so it is the only key that matches how the prospect experiences your list. Normalise first, because (415) 555-1234 and 415.555.1234 are different strings to a spreadsheet and the same dial to a human. Then flag rather than delete, so you can see how many rows you lost and to what.
Does a bad phone number in a lead list actually cost money?
A little money and a lot of time. Carriers bill connected talk time rounded up to the next whole minute, so an unanswered ring costs nothing, but a wrong-number voicemail bills a full minute even if you hang up in ten seconds. On a 5,000-row list, the roughly 750 dead, duplicate and suppressed rows that still get dialed cost about 530 billed minutes, which at wholesale Twilio rates is single-digit dollars. The real cost is that those 750 dials are around 7.5 days of a rep working at 100 dials a day, and on a capped plan they burn allowance you paid for.
How much does phone number validation cost?
Twilio Lookup charges nothing for basic formatting and validation, $0.008 per number for Line Type Intelligence (mobile, landline, fixed and non-fixed VoIP, toll-free) and $0.01 per number for US caller-name lookup, checked September 2026. Reassigned-number risk is separate and starts around $0.02 per query at low volume. HLR lookups from specialist vendors query the mobile network register itself and can tell you a handset is live, usually at a few tenths of a cent to a cent per number. Validating 5,000 numbers for line type therefore costs about $40 — more than the minutes it saves, so buy it for the routing and segmentation, not to save money on telephony.
Why does it matter whether a number is a mobile or a landline?
Three reasons. In the US, calls to a mobile fall under stricter TCPA treatment than calls to a landline, particularly for anything automated or for consumer calls, so line type changes the compliance question. Mobiles are far more likely to carry a carrier spam label that the person sees before they answer, which makes caller reputation and dial pacing matter more. And practically, a mobile reaches the person and a landline reaches a desk that may no longer be occupied — the post-2020 shift to remote work invalidated a very large share of office direct dials. Segment by line type and dial the two groups differently.
How fast does a lead list go stale?
Faster than the list feels, and slower than data vendors claim. Published figures range from roughly 22% a year to over 70%, and the highest numbers come from companies selling re-verification, so treat them with suspicion. The uncontroversial parts: something like 15 to 20% of professionals change jobs each year, and office direct dials decay faster than mobiles because the desk changes even when the person does not. Practical rule: re-verify anything older than six months before a serious campaign, and treat a list older than a year as a research starting point rather than a call list.
What should I remove from a lead list before importing it?
In order: rows with no phone number, rows whose number cannot be parsed into E.164, duplicate numbers, anyone on your internal do-not-call list, anyone your team already contacted in the current campaign, and — for consumer calling in the US — anything matching the National Do Not Call Registry unless an exemption applies. Optionally, numbers a validation lookup reports as unassigned. Keep the removed rows in a separate tab rather than deleting them, so that a suppression mistake is recoverable and you can see what your source actually sold you.