HomeBlog › Missing Contact Details
Data Quality

Half Your Prospect List Has No Contact Details

By the TaskBlink team · Updated September 8, 2026

You bought or built a list of ten thousand businesses. The campaign has been running for three weeks. The reply rate looks respectable, the messages read well, nobody is complaining — and the number of conversations on your calendar is a fraction of what the arithmetic said it would be. So you go looking for the leak, and somewhere in that search you open the file and notice that a large share of the rows have an empty phone column.

The natural next thought is that the data is bad and you should buy better data. That is half right, and the half that is wrong is the expensive half. Because the thing that makes missing contact details so destructive is not that they are missing. It is that they are missing silently — they never produce an error, never appear in a report, and never cost you a single point of any percentage you are tracking. A prospect list with a coverage problem does not look like a broken campaign. It looks like a campaign that is working fine and is somehow too small.

This article is about that specific failure: what a blank contact field actually does to a live outbound campaign, why it makes you misdiagnose everything else, how to measure it in about twenty minutes, and the point at which no amount of data spending will fix it because the number you are looking for does not exist anywhere.

A blank field is not a bounce, and that is the whole problem

The email world solved one version of this years ago, and solved it well. Everybody now agrees that a reply rate should be calculated against delivered messages rather than attempted ones — sends minus hard bounces — because counting undeliverable addresses in the denominator flatters your numbers and makes campaigns incomparable. That correction is standard, it is published everywhere, and it is correct.

It also does nothing whatsoever for the problem in front of you. The delivered-versus-sent fix removes records that were attempted and failed. A record with an empty phone field is never attempted. It produces no send, so it is not in "sent." It produces no bounce, so it is not in "bounced." Your platform quietly drops it during list ingestion, often with a line in an import log nobody reads again, and from that moment on it is invisible to every rate on your dashboard.

Follow that through and you get the perverse result at the centre of this whole problem. Missing contact data makes your campaign metrics look better, not worse. A dead number drags your numbers down where you can see it: it fails loudly, it lands in a failure bucket, you subtract it. A blank field removes itself from the calculation entirely and leaves behind a smaller, cleaner set of records that were all reachable by definition. Your reply rate is computed against the survivors. Of course it looks healthy. It is a rate measured on the subset of your list that had a number.

So you are looking at a dashboard that is telling you the truth about a population you did not intend to message, and staying silent about the one you did.

What actually fails is volume, and volume failures get misdiagnosed

If the rate metrics are fine, the thing that gives way is the absolute count: fewer conversations, fewer booked calls, a pipeline that is the right shape and the wrong size. And absolute counts are the metrics people are least likely to blame on data, because they have an obvious and much more available explanation — not enough volume.

That is what makes this expensive. The misdiagnosis is not random; it runs in a predictable order, and each step costs a cycle:

What you seeWhat you concludeWhat it actually is
Good reply rate, too few repliesThe copy is fine, we just need more sendsThe send set is a fraction of the list
More contacts bought, same resultThis source is exhausted, try another vendorSame segment, same coverage rate, same share of blanks
Third source, same resultThe channel does not work for our marketThe channel was never tested at the volume you thought
Campaign pausedOutbound does not work for usOne measurement, never taken, would have redirected all of it

Every row in that table is a reasonable inference from the evidence available. Nobody in that sequence is being stupid. They are reasoning correctly from a dashboard that has been quietly filtered, and the filter is the one variable the dashboard does not report. This is also why the problem survives vendor changes: switching suppliers changes the logo on the invoice, and if you keep asking for the same segment you will very often get back a list with the same structural gaps, because the gaps are a property of the segment at least as much as of the supplier.

Count the two numbers your platform will not show you

The measurement is not difficult and it does not require any tooling you do not already have. It requires you to stop treating the row count as the list.

Pick a channel — and pick one, because this number is different for each. Then, for the records you intend to message, count how many carry a usable identifier for that channel. Not a phone column that is non-empty; a number of the right type that a message can actually arrive on. Call the row count R and the share that clears that bar c. Your real list is R × c, and everything downstream compounds against that number rather than against R.

Two things fall out of writing it this way. The first is that the ceiling on your campaign is R × c × (whatever share reply) × (whatever share book), and copy, timing, offer and follow-up cadence all live in those last two terms. None of them touch the first two. If R × c is half of what you assumed, a perfect rewrite gets you halfway to a target you already believed was conservative.

The second is that c is a number you can only get by looking, and it is worth looking per segment as well as per channel. Run the same count across the industries or regions inside your list separately. A single blended coverage figure hides the thing you most want to know, which is that the gaps are almost certainly not spread evenly.

A twenty-minute version. Take a thousand rows at random from the list you are about to run, not the first thousand — files are frequently sorted in ways that correlate with completeness. Count usable identifiers per channel. Then compare that share against what you assumed when you sized the campaign. If you never wrote down what you assumed, that is the actual finding, and it is worth more than the count.

The gap is usually not random — it is telling you about the segment

It is tempting to read a low coverage rate as a grade on your data vendor. Sometimes it is. More often it is a fact about the kind of business you decided to target, and reading it as a supplier failure means you will keep paying to solve it in the one place it cannot be solved.

Contact data exists because somebody published it, or because it was observable somewhere and got collected. Where that never happened, no database holds it. A few structural reasons a business genuinely has no direct number associated with a person:

Notice what these have in common: they are all upstream of any vendor. It is also why one campaign design can behave completely differently across two verticals in the same book of business: the owner-operator trades that most agency and local-service outreach is aimed at tend to front their own line, and gatekept professional firms are built not to, so the difference shows up in the file long before it shows up in your results. Two segments sourced from the same supplier on the same day can come back with wildly different coverage, and when they do, the supplier is not the variable. This is the same reason line type carries real signal about who is holding a phone — a point worth understanding properly if you are trying to reach a named decision-maker rather than a business.

See what your pool actually looks like

A free 15-minute demo: the real businesses in your niche we can reach, the actual messages, and the profit math — built on numbers validated as working cells before anything sends. At least 3 booked appointments in your first 30 days or you don't pay.

Book your demo →

Where enrichment helps, and where it cannot

The standard answer to a coverage gap is to chain data providers together and query them in sequence until something comes back. As a mechanism this genuinely works, and for a large share of business records it is the right move: the number does exist, your first source just did not hold it, and a second or third will.

What that approach cannot do is manufacture a number that was never published. Chained against records in the categories above, thirty providers return thirty misses and thirty charges, and because most of these tools price per successful match, the failure mode is not usually a big bill — it is a long stretch of effort that produces a fill rate that never moves and a conclusion you draw far too late.

There is a cheap test that tells you which situation you are in, and almost nobody runs it, because the material explaining enrichment is mostly written by the people selling it. Take a sample of the segment and enrich it with one source. Record the fill rate. Add a second source, then a third, then a fourth, recording the fill rate after each. If it climbs meaningfully with each addition, the data exists and you are simply buying access to more of it. If the first source gets you most of the way to a number that then barely moves no matter what you add, you have found the ceiling of what exists, not the ceiling of what you have bought, and every further dollar is buying the same misses from a different vendor.

The other trap here is subtler. Appending contact details to records is a way of making a list you already chose look more complete, and it does nothing about whether those were the right records. If you are paying to append numbers to businesses that were never really in your segment, you are funding a more expensive version of the same mistake. The correction lives one layer up: fix what gets sourced in the first place. Sourcing against live business signals rather than a static export — the approach TaskBlink uses, finding businesses from real-time data and Google Business Profile signals and validating that every number is a real working cell before anything is sent — changes what lands in the file, which is a different intervention from cleaning the file afterwards. The distinction between those two is the same one that separates a purchased list from freshly sourced data, and it is worth being clear about which problem you are solving.

Channel-match instead of appending

Here is the move that gets skipped, and it is usually the cheapest one available.

A record that has an email address and no mobile number is not a broken record. It is an email record. The reflex when a field is blank is to buy the missing field so that every row fits the channel you picked at the start, but the channel was a decision you made before you knew what the data looked like, and it is much easier to revisit than the data is to buy.

So split the file by what it actually contains rather than treating blanks as a defect to be purchased away. In practice that produces three groups: records reachable by text, records reachable only by email, and records with neither, which are not prospects yet and should stop being counted as though they were. Each group gets the channel it can actually be reached on and its own expectations, because those groups will not perform alike and averaging them together reproduces the exact measurement problem this article started with. It also changes what "more volume" means — the honest question stops being how many rows you can buy and becomes how much of the pool you can reach at all, which is the same denominator that should have been driving the budget for the campaign from the beginning.

When the honest answer is a different segment

Sometimes you run the sample, you run the enrichment test, you split by channel, and the conclusion is that this segment cannot be reached at the volume your model needs. That is a real outcome and it deserves to be said plainly, because essentially nobody in the data business will say it to you: their product is the other answer.

At that point you have three choices and only three. Reach these businesses on a channel where they are contactable, which usually means accepting a slower and more expensive motion. Widen the definition of the segment until the reachable pool is large enough, which is a targeting decision with real consequences for fit. Or pick a different segment. What you cannot do is keep buying the same list shape and expect the coverage rate to change, and a surprising amount of outbound spending is exactly that, repeated until somebody concludes the channel is broken.

This is also why coverage belongs in your market sizing rather than in a post-mortem. If you are estimating how many businesses you can work through before you have to make one of those three choices, the count that matters is contactable records, not businesses that exist — which is the whole argument behind sizing a pool in records you can actually message, and the reason a pool can feel exhausted long before the category is. When a list starts feeling thin, it is worth separating that from the several other things people mean when they say they have run out of prospects.

Five questions to ask before you pay for a list

All of this is much cheaper to establish before purchase than after, and every one of these is answerable by a supplier who is being straight with you.

  1. What is the coverage rate for my exact segment, not your database average? A headline match rate across all industries tells you nothing about yours. The number you need is for your categories, in your geography.
  2. Coverage of what, specifically? "Phone number present" and "mobile number present" are different questions with very different answers, and only one of them is the one you are buying.
  3. Can I see a sample of a few hundred records from my segment first? If the answer is no, you are being asked to buy the coverage rate sight unseen, and that is the single number the whole purchase turns on.
  4. Am I paying per record or per usable record? The distinction sounds pedantic until you find you have paid for rows that were never reachable, and it is the cleanest way to see how confident the supplier really is.
  5. When were these collected, and what happens to the ones that go stale? Coverage and freshness are separate axes and a list can fail on either, so ask about both rather than assuming a good answer to one covers the other.

If you are running the outreach through somebody else, the same questions apply and one more joins them: ask what happens to a record they cannot reach. A vendor who counts unreachable records toward the volume they promised you is selling you rows; one who counts only what was actually contacted is selling you outreach. Which of those two you bought tends to become obvious about six weeks in, and it is a far better conversation to have first — alongside the related question of which filters you are applying and what each one costs you in pool.

The short version

A blank contact field does not announce itself. It never bounces, never errors, and never appears in any rate on your dashboard — it simply removes itself from the campaign and leaves your percentages looking fine while your volume comes up short. That mismatch is nearly always read as a copy problem, then a source problem, then a channel problem, and the cycle of fixes that follows can run for months without touching the actual constraint.

Measure it once, per channel and per segment, before you conclude anything else. If enrichment moves it, buy the enrichment. If it does not, you have learned something true about the market you chose, and that is worth considerably more than another list.

Skip the coverage problem entirely

We find the businesses that match your ideal customer using live business data, validate every number as a working cell, and run the outreach that books ready-to-buy prospects onto your calendar. See current pricing and the profit math on a free 15-minute call.

Book your demo →

Frequently asked questions

Why don't the contacts with no phone number show up in my campaign metrics?

Because they never entered the send. Every rate your platform reports is calculated on messages it actually attempted, and a record with a blank phone field produces no attempt: no send, no bounce, no failure code. It is filtered out silently before the campaign begins. That is why a coverage problem is invisible in exactly the place people look for problems. Your reply rate is computed against the records that had a number, so it can look perfectly healthy while the campaign reaches a fraction of the people you thought you had. The number that moves is total volume, and volume is the metric people are least likely to blame on data.

Is a missing phone number the same problem as a dead one?

No, and the difference decides what you should do about it. A dead number, whether disconnected, reassigned, or a landline where you needed a handset, is a record that failed on contact, and it shows up as a failure you can count and subtract. A missing number is a record that never got that far. Dead numbers are a freshness and validation problem; blank fields are a coverage problem, and the two have different fixes. Validation cleans what you already hold. Nothing about validation creates a number that was never in the record.

Will waterfall enrichment fix a list where half the records have no contact details?

Partly, and the honest answer depends on why the field is blank. Chaining several providers genuinely helps when the number exists somewhere and your first source simply did not hold it, which covers a large share of business data. It cannot help when no number was ever published, which is the case for a business fronted by an answering service, a location record that describes a place rather than a person, or an owner who has never attached a personal mobile to the business identity. Test it on a sample before you buy volume. If your first source fills a given share of the records and adding four more sources barely moves that share, you are near the ceiling of what exists rather than the ceiling of what you have paid for.

How do I work out how many contacts I actually have?

Pick the channel first, then count the records that carry a usable identifier for that channel, and treat that count rather than the row count as your list. If you hold R records and a share c of them carry a working mobile, your reachable pool for texting is R times c, and no change to your copy, your timing or your offer moves either term. Do this per channel rather than once overall, because the same list will have a different coverage rate for email than for mobile, and a record that is unreachable on one channel is often perfectly reachable on the other.