Skip to content

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.

Updated 1 October 20268 min readTypeGuide

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:

  1. It is the only format that deduplicates reliably.
  2. 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

  1. Normalise phone numbers to E.164 using the account’s country as the default
  2. Deduplicate on a stable key — domain or normalised number, not company name
  3. Filter against the client’s DNC list
  4. Reject or flag rows missing the minimum required fields
  5. Report errors per row, not as a count
  6. Record the source on each lead so supplier quality is measurable
  7. 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.

Book a walkthrough

Put every client on one floor

A walkthrough on your own roster, clients and commission model — from an imported list to a sent invoice. Judged on your operation, not a demo dataset.

EU-hosted · eu-central-1 · integrates the CRM, calendar and telephony you already run