I got handed a Tier 1 account — a 3,800-person logistics software company — with one contact in the CRM: a VP of IT who'd downloaded a whitepaper 11 months ago. Six weeks to close. The first thing I did wasn't email that VP.
I ran an enrichment workflow to build the full buying committee before touching anyone. It took about 90 minutes to set up the first time and surfaced seven stakeholders I'd never have found by browsing LinkedIn manually. Here's the exact workflow.
Why title filtering leaves you single-threaded
Most AEs build account contact lists the same way: search by company domain, filter for "VP" or "Director" in the relevant function, export, sequence. That approach only captures the obvious roles.
In a real enterprise deal — anything above $80K ACV — the buying committee typically runs 6–10 people (Gartner) across at least three departments. The people who kill deals aren't always the ones with VP in their title. In my experience, it's the Operations Manager who owns the integration, the Finance Analyst who builds the ROI model, or the Legal lead who triggers the procurement hold. Deals with three or more engaged stakeholders close at 2.4x the rate of single-threaded opportunities (Landbase, 2025). Title filtering finds your champion. It leaves the rest of the committee invisible.
The 6 personas that show up in every enterprise deal
Before touching any API, I map the committee by persona rather than title. These six roles reliably appear in software deals above $60K:
| Persona | Typical titles to target | Why they matter |
|---|---|---|
| Champion | Manager/Director (functional) | Drives internal advocacy |
| Executive Sponsor | CXO, EVP, SVP | Signs off or kills |
| Financial Approver | VP Finance, CFO, Controller | Holds budget gate |
| Technical Buyer | IT Director, Engineering Lead, Architect | Owns integration risk |
| Ops/Process Owner | Head of Operations, Business Systems Mgr | Controls rollout scope |
| Legal/Procurement | VP Legal, Procurement Director | Triggers procurement hold |
This isn't academic framework. These are the six people who appeared in every one of my last nine enterprise closes. Naming them before touching the APIs means I can write precise queries rather than dumping everything with "Director" in the title into a sequence.
Step 1 — Pull the account shell with PDL
People Data Labs is the only API I've found that returns reliable company-level signals without requiring a LinkedIn URL as input. You give it a domain; it gives back a structured record including headcount by department, industry classification, and verified employee signals.
The /company/enrich endpoint is the entry point:
GET https://api.peopledatalabs.com/v5/company/enrich
?website=acmelogistics.com
&pretty=true
The response includes employee_count, inferred_revenue, linkedin_url, and affiliated_profiles on higher-tier plans. Even without org-chart access, the company record returns the id and linkedin_url that feed into the person search in the next step.
One calibration note: PDL's company enrichment accuracy on mid-market accounts (500–5,000 employees) is solid — I validated ~85% of domains correctly resolved in a batch of 200 accounts. Below 100 employees, coverage degrades noticeably.
Step 2 — Build the persona contact list with Apollo People Search
With the account domain in hand, I hit Apollo.io's /people/search endpoint with six separate queries — one per persona. Apollo's API supports person_titles[] and person_seniorities[] as independent filters:
POST https://api.apollo.io/api/v1/mixed_people/search
{
"q_organization_domains_list": ["acmelogistics.com"],
"person_titles": ["VP Finance", "Controller", "Head of Finance", "CFO"],
"person_seniorities": ["vp", "director", "manager"],
"per_page": 10
}
I run this once per persona block, swapping in the title list from the table above. Apollo returns name, title, linkedin_url, email (with a verified/likely/unavailable status flag), and phone_numbers where available.
From running this across ~500 accounts: Apollo's verified email status held up about 78% of the time when cross-checked against ZeroBounce validation. Direct dials showed up for roughly 35% of VP-level contacts. For person_titles, use broad terms — "controller" returns "Senior Controller" and "Controller, NA Region" automatically.
The full loop is six API calls per account. At Apollo's standard rate limits, you can process around 60–70 accounts before hitting throttling.
Step 3 — Fill gaps with PDL Person Search
Apollo is strong on US contacts and fast-growth tech companies. It has real gaps in European mid-market, traditional industry verticals (manufacturing, logistics, legal), and non-English name variants.
For any persona slot where Apollo returns no verified contact, I fall back to PDL's /person/search endpoint, which uses Elasticsearch-style DSL and normalizes titles across companies:
POST https://api.peopledatalabs.com/v2/person/search
{
"query": {
"bool": {
"must": [
{ "term": { "job_company_website": "acmelogistics.com" } },
{ "terms": { "job_title_role": ["finance", "legal", "operations"] } },
{ "terms": { "job_title_levels": ["director", "vp"] } }
]
}
}
}
The job_title_role and job_title_levels fields normalize across companies — so "Head of Finance" and "Finance Director EMEA" both resolve under the same bucket. I validated PDL's mobile numbers on a 120-person test set: ~55% were live, ~20% were stale, ~25% unavailable. That's not clean data, but it's faster than cold LinkedIn research on every account.
Enriching the shortlist before sequencing
At this point I typically have 12–20 raw contacts across the six persona slots. Before sequencing anyone, I run three cleanup passes:
- Email validation — send through ZeroBounce or NeverBounce. Drop anything that bounces or flags as risky. I tested both head-to-head on a 2,000-address list; results were close enough that I use whichever I have credits on.
-
Deduplication — PDL and Apollo overlap ~40% on the same account. Match on
linkedin_url, not name+title (too many false positives on common names). - Recency scoring — PDL timestamps employment records. Anyone with a job start date in the last 6 months is a lower-confidence target; they may not have budget influence yet.
After cleanup I'm usually left with 7–9 contacts covering at least four of the six persona slots.
Stitching the workflow in Clay
Clay is where I tie this together instead of writing orchestration code. I tried building the same workflow in n8n and raw Python — both work, but Clay's waterfall enrichment and native CRM sync cut the maintenance overhead significantly.
The table structure in Clay:
| Column | Source |
|---|---|
| Company domain | Input |
| PDL company ID |
PDL /company/enrich
|
| Contact name |
Apollo /people/search
|
| Persona tag | Mapped from title keywords |
| Email (verified) | ZeroBounce |
| Direct dial | Apollo / PDL fallback / Lusha third pass |
| LinkedIn URL | Apollo |
| Sequence name | Lookup from persona tag |
Clay's "Waterfall" feature runs Apollo first, PDL second, Lusha third — automatically, per column, without code. The persona-to-sequence column is a formula: IF persona = "Financial Approver" THEN "FIN-APPROVER-SEQ". That value syncs to HubSpot or Salesforce via Clay's native CRM integration, enrolling each contact in the right sequence on save.
PDL vs Apollo vs the field for committee-building
| Tool | Company lookup | Person search by title | Org-chart signals | Direct dials | Best for |
|---|---|---|---|---|---|
| PDL | Excellent | Strong (DSL) | Limited | ~55% hit rate | EU contacts, non-tech verticals |
| Apollo.io | Good | Strong (simple filter) | None native | ~35% hit rate | US tech, fast GTM |
| ZoomInfo | Excellent | Excellent | Org chart native | Best in class | Enterprise budgets ($15–30K+/yr) |
| Lusha | Good | Moderate | None | ~60% hit rate | Phone-first enrichment |
| Clearbit | Excellent | Good | None | Rare | Marketing/firmographic enrichment |
| RocketReach | Good | Good | None | Moderate | Budget alternative |
ZoomInfo has the best org-chart data — including reporting lines, not just titles — by a clear margin. The tradeoff is price: meaningful org-chart access starts around $15K–$30K/year. For teams on mid-market budgets, the PDL + Apollo combination delivers roughly 80% of the output at maybe 15% of the cost.
What I actually use
For the company shell I always start with PDL — their company endpoint is more consistent than Apollo's for mid-market domains where company name spelling is ambiguous.
For the persona search loop: Apollo as primary, PDL as fallback. Phone enrichment runs through Lusha as a third waterfall pass — their mobile hit rates have been meaningfully higher than either Apollo or PDL for EMEA contacts in my tests.
Clay handles orchestration. It's not cheap at scale but the waterfall logic and CRM sync eliminate enough manual work to justify the cost once you're processing 20+ accounts per week.
Email validation is split between ZeroBounce and NeverBounce depending on credit availability — I've found no material difference in accuracy between them.
For social-profile enrichment specifically — when I need to validate a contact's current role against their public LinkedIn or Twitter presence before a call — Ziwa has been faster than PDL's direct API for that lookup, particularly for non-US contacts where PDL's social coverage thins out. That's a supplementary step, not a replacement for the core API workflow.
The full pipeline, once configured in Clay, processes a six-persona committee map in about 4 minutes per account. I queue it the night before planned outreach. It's not perfect data — no enrichment API is — but it's repeatable, and repeatable beats manually thorough every time.
Top comments (0)