Lead list hygiene for outbound teams
What goes wrong with prospect lists — duplicates, unnormalised phone numbers, dead numbers, collisions and silent depletion — and the import-time controls that stop each one.
List quality sets the ceiling on everything downstream. A rep on a clean, well-targeted list and the same rep on a scraped one will produce wildly different numbers, and no amount of coaching closes that gap. Yet list hygiene is usually treated as a one-off cleanup task rather than a standing control.
The useful framing: hygiene problems should be caught at import, because every control that depends on a rep remembering is not a control.
Problem one: the same company, three times
A CSV from two sources, or the same source twice, and now one prospect appears as three rows. Reps work all three. The prospect notices.
Deduplication needs a key, and choosing it is the real work. Company name is unreliable (Oy vs Oy Ab vs abbreviations). Domain is better. Phone number is good once normalised — which is the next problem.
Problem two: phone numbers in five formats
The same Finnish mobile can arrive as 040 123 4567, 0401234567, +358 40 123 4567, 358401234567 or +358-40-123-4567. Five strings, one number, and no deduplication will catch them because none of them match.
Normalise to E.164 at import — +358401234567, plus sign, country code, subscriber number, no punctuation. Two reasons:
- It is the only format that deduplicates reliably.
- Telephony APIs generally require it, so normalising late means failed calls rather than clean data.
Normalisation needs a default country to resolve national-format numbers, which should come from the account’s configured country rather than being guessed per row.
Problem three: numbers that were never going to work
Some proportion of any list is dead — disconnected, wrong, switchboards that go nowhere. The mistake is treating this as a vague sense that “the data is rough” instead of as data.
Make phone quality a tracked property that is recomputed as call outcomes accumulate, and record where each number came from. Two payoffs: you can stop reps burning hours on a list that is 40% dead, and you can tell which supplier’s data is actually worth paying for. The second one tends to save more money than the first.
Problem four: suppression that relies on memory
Every client has companies you must not contact — their existing customers, live negotiations, competitors, and anyone who has objected to being contacted. That last group is a GDPR obligation, not a courtesy.
A per-client do-not-call list has to be enforced at import, filtering rows out before they reach a rep. A suppression list a rep is supposed to check against is a suppression list that will be missed on a busy afternoon. And because it is per-client, it cannot live as one global register.
Problem five: two reps, one company
On a shared list, collisions are a certainty rather than a risk. The fix is a reservation: an expiring claim pinning a lead to the rep working it.
The expiry is the design detail people get wrong. A permanent assignment turns a shared list into a graveyard of leads one rep touched once and will never revisit. An expiring hold, with a background job releasing stale claims, keeps the list circulating.
Problem six: the list quietly runs out
The most expensive problem, because nothing errors. A rep working a depleted list produces nothing, activity numbers simply drift down, and it can be a week before anyone asks why.
Depletion alerting per list is unglamorous and pays for itself immediately. Remaining workable list is also a far better leading indicator of next week’s output than this week’s dial count.
Problem seven: errors you cannot see
Import a file with problems and you need to know which rows failed and why. A summary count (“1,240 imported, 83 failed”) is not actionable; a truncated error list is worse, because it implies you have seen everything.
Per-row error reporting matters more than it sounds, because the usual cause of a failed batch is one systematic formatting issue affecting hundreds of rows — fixable in seconds once you can see it.
A standing import checklist
- Normalise phone numbers to E.164 using the account’s country as the default
- Deduplicate on a stable key — domain or normalised number, not company name
- Filter against the client’s DNC list
- Reject or flag rows missing the minimum required fields
- Report errors per row, not as a count
- Record the source on each lead so supplier quality is measurable
- Set a depletion threshold on the list and alert on it
What this buys you
Not a dramatic uplift — a removed ceiling. Clean lists do not make a mediocre rep good. Dirty lists make a good rep look mediocre, and then you coach the wrong problem.