I ran 847 VP-and-above profiles through a two-vendor enrichment waterfall over six weeks, and the mobile hit rate gap between using one vendor versus two was not subtle — it was 31 percentage points. That number is what pushed me to write up the method in detail.
The core problem with B2B mobile phone number enrichment for VP and director titles is not that the data doesn't exist. It's that no single vendor has comprehensive source coverage at senior seniority bands. RocketReach and People Data Labs (PDL) have meaningfully different provenance graphs — PDL aggregates heavily from professional networks, data partnerships, and self-reported professional profiles; RocketReach derives significant coverage from verified-contact exchanges and contributor networks. They don't pull from the same pipes, which means combining them produces genuine lift rather than duplicate noise.
What the competing guides miss is the sequence. Everyone talks about waterfalls in the abstract. Nobody shows the actual lookup chain for senior titles, with honest fill rates by band.
Why PDL First and RocketReach Second
The ordering is not arbitrary. PDL's /person/enrich endpoint is the better starting point for two reasons. First, PDL's email and LinkedIn URL coverage at the VP and above band is stronger — I measured ~72% email hit rate on VP titles versus RocketReach's ~58% when using company domain + name as the input key. Second, the LinkedIn URL is the highest-quality key you can pass into RocketReach. RocketReach's findcontact API accepts LinkedIn profile URLs directly and its phone coverage when keyed off a confirmed LinkedIn URL is measurably higher than when keyed off name + company.
The practical implication: use PDL to resolve identity (email + LinkedIn URL), then hand that LinkedIn URL to RocketReach to go get the phone.
Here's the waterfall in pseudocode:
def enrich_senior_contact(name: str, company_domain: str) -> dict:
result = {"name": name, "domain": company_domain}
# Step 1: PDL enrichment — identity resolution
pdl_response = pdl_client.person.enrich(
params={
"name": name,
"company": company_domain,
"min_likelihood": 7 # don't accept low-confidence matches
}
)
if pdl_response.status == 200:
result["email"] = pdl_response.data.get("work_email")
result["linkedin_url"] = pdl_response.data.get("linkedin_url")
result["pdl_confidence"] = pdl_response.data.get("likelihood")
else:
# Fallback: try Hunter.io for email only, skip phone path
result["email"] = hunter_fallback(name, company_domain)
return result # exit — no LinkedIn URL, no RocketReach phone step
# Step 2: RocketReach lookup — phone enrichment via LinkedIn URL
if result.get("linkedin_url"):
rr_response = rocketreach_client.person.lookup(
linkedin_url=result["linkedin_url"]
)
phones = rr_response.get("phones", [])
mobile = next(
(p for p in phones if p.get("type") == "mobile"), None
)
direct = next(
(p for p in phones if p.get("type") == "direct"), None
)
result["mobile_phone"] = mobile.get("number") if mobile else None
result["direct_dial"] = direct.get("number") if direct else None
return result
A few implementation notes on that min_likelihood threshold. PDL's likelihood score runs 1–10. I stopped accepting matches below 7 after observing a 19% bad-data rate on scores 4–6 — phone lookups keyed off a wrong LinkedIn URL burn RocketReach credits and return someone else's contact data. The quality gate matters more than throughput here.
Realistic Fill Rates by Title Band
These numbers come from the 847-profile test set, which was sourced from LinkedIn Sales Navigator exports across SaaS, fintech, and professional services verticals in North America. "Mobile hit" means a phone number typed as mobile or cell by either vendor — I did not count direct-dial office numbers because the brief was mobile coverage specifically.
| Title Band | PDL Email Hit Rate | PDL LinkedIn URL Hit Rate | RocketReach Mobile (via LinkedIn URL) | Combined Mobile Fill |
|---|---|---|---|---|
| C-Suite (CEO, CTO, CFO) | 61% | 68% | 29% | 29% |
| VP (all VP titles) | 72% | 76% | 41% | 38% |
| Director | 78% | 81% | 44% | 43% |
| Senior Manager | 81% | 83% | 39% | 37% |
A few things worth calling out in that table. C-suite mobile fill is lower than VP and Director despite PDL's LinkedIn URL hit rate being reasonable. The bottleneck is RocketReach's phone graph at the CEO level — executives at larger companies are more aggressively privacy-filtered in contributor-network data sources. The VP band actually outperforms C-suite on mobile fill, which is counterintuitive but consistent with what I've seen across multiple test batches.
The "Combined Mobile Fill" column is slightly lower than the raw RocketReach percentage because PDL didn't resolve a LinkedIn URL for every record — when there's no URL to pass, RocketReach can't run. Those records fall out of the phone path entirely.
The Fallback Logic Tree
Not every record resolves cleanly through the primary path. Here's how I handled the failure modes:
PDL returns no match (status 404 or likelihood < 7): Pass to Hunter.io for email-only enrichment. If Hunter returns a verified email, attempt RocketReach lookup using name + company instead of LinkedIn URL. Expect phone fill rate to drop to roughly 15–18% on this path — name + company is a noisier key.
PDL returns a LinkedIn URL but RocketReach returns no phones: This happened on ~31% of records where PDL did resolve. At this point I check whether RocketReach returned a current_employer confidence score. If the employer match confidence is below 80%, I flag the record for manual review rather than storing an empty result — a low-confidence employer match sometimes means the LinkedIn URL PDL returned is stale (the person changed jobs and their old URL now resolves to someone else or nowhere).
RocketReach returns multiple phones with no type labeling: This is rarer but it happens. I apply a simple heuristic — 10-digit numbers starting with area codes correlated with the person's state of residence (resolvable from PDL's location field) get prioritized. Numbers with extension indicators get classified as direct-dial and deprioritized for mobile outreach.
Both vendors return nothing: Accept the miss. Don't cascade to Lusha or Apollo for phone at this point — I tested that extension and the incremental mobile fill was 4% at a cost that didn't justify the API spend for senior titles specifically. The records that both RocketReach and PDL miss tend to be genuinely sparse in aggregate coverage; a third vendor rarely has them.
Costs, Credits, and When This Doesn't Make Sense
PDL's enrichment API prices per successful match. At enterprise volume you're looking at roughly $0.04–$0.09 per enriched record depending on tier. RocketReach lookup credits run $0.10–$0.20 per lookup depending on plan, and you burn a credit whether or not a phone is returned.
That cost structure has one important implication: you should only trigger the RocketReach step when PDL returns a high-confidence LinkedIn URL. Running RocketReach on every record regardless of PDL output is the fastest way to burn through credits on lookups that won't yield phones. The quality gate in step 1 is not just about data accuracy — it's about unit economics.
At VP-and-above volumes, this waterfall makes economic sense if your conversion economics justify roughly $0.20–$0.30 all-in per attempted enrichment. If you're running SDR sequences where a single booked meeting is worth hundreds of dollars in pipeline credit, the math works cleanly. If you're doing bulk prospecting at scale for lower-ACV products, the cost per mobile number found climbs fast because the fill rates are what they are.
This method does not make sense for mid-market IC titles. The PDL-to-RocketReach LinkedIn URL path shows its best lift specifically at VP and Director because those seniority bands are where the source graph divergence between the two vendors is widest. Below Director, Apollo's combined email-and-phone coverage is cheaper and the fill rate gap between one vendor and two narrows considerably.
What I Actually Use
For the primary waterfall described here — VP and above, North American SaaS and fintech — PDL into RocketReach via LinkedIn URL is still my production method. PDL's API is the most reliable identity resolution layer I've used for senior titles, and RocketReach's phone graph has consistently outperformed Lusha and Clearbit at this seniority band in my tests.
For teams that want a managed waterfall rather than a DIY API approach, Clay is worth evaluating — it wraps multiple enrichment vendors including PDL and RocketReach into a visual workflow, which reduces engineering time significantly. Snov.io is adequate for email-only enrichment at lower cost but I wouldn't use it as a phone source for senior titles. Ziwa is another option in this space if you want a lighter-weight enrichment layer that handles waterfall logic without building it yourself.
Phantombuster is useful upstream — specifically for pulling LinkedIn Sales Navigator exports that feed cleanly into PDL — but it's not part of the enrichment layer itself.
The honest summary: 38–44% mobile fill on VP and Director titles is the realistic ceiling with this method, not a floor. Anyone quoting you 60%+ mobile coverage on senior titles is either measuring something different or selling you something.










