- Home
- Growth Playbooks
- Data Enrichment Playbook
Data Enrichment Playbook
Enrichment is cheap per record and expensive in total, so the order matters: reuse what you already hold, pay for the company page, judge it, and only then spend on people and emails.
On this page
What it is and when to use it
Data enrichment adds what a record is missing: a company description, headcount and domain; a person's current title and profile; a verified work email. It is also where most bad lists come from, because each provider is confidently wrong in its own way.
We run the same method for every client. Each raw response is stored in full right beside the identifier it came from, so a teammate can open the cell and see exactly what the provider said, and nothing has to be bought twice.
Use this playbook when
- A list of accounts or people needs firmographics, a qualification verdict or verified emails before outreach or a CRM push.
- An event or partner list arrives with names and companies but no profiles.
- A CRM full of records that are stale, duplicated or missing the fields sales relies on.
Tools we use
Only tools we have run this playbook with, and what each one does in it.
- Apify: LinkedIn company pages, profiles and company employee lists
- Blitz: Company enrichment, domain to LinkedIn lookups and job search
- Prospeo: Person enrichment and verified emails; misses are free
- AI-Ark: Stored records first, then the async email finder
- ZeroBounce: Final validation of every accepted email
- Firecrawl: Homepage scrape, only when the description is not enough
- Claude Code: Batched subagents for qualification, with a final adversarial pass
- Supabase: Complete raw payloads stored in the cell, one table per piece of work
- HubSpot: The CRM the clean data is synced into
The steps
The order we work in. Each step feeds the next, and every result is written to the database as it happens.
Diagnose the source file
Before spending anything we look at how the file was made: sorting, group markers and empty columns tell you how far to trust it. Lists exported by AI tools often carry corrupted cells.
Reuse first
Check whether the company or person is already in any of our databases, matched on the LinkedIn URL. Reuse is free.
Enrich the company page
Pull the LinkedIn company page and store the complete raw payload, plus domain, description, industry and headcount in their own columns.
Judge from the description
Read the description and decide. If it is enough, stop. Only if it is too thin, scrape the homepage, clean it and judge again. The industry tag may be stored, but it never decides.
Stack independent gates
De-duplicate by domain, check that the domain resolves, confirm the LinkedIn page, check for acquisitions, remove competitors and apply a headcount floor. Excluded rows are marked with a reason, never deleted.
Find people company first
Pull people by company and title, then match names inside that pool. For very large companies, combine an employee search, a title index for the misses and a live profile check as the source of truth.
Run the email waterfall
Pilot 50, then Prospeo, AI-Ark and ZeroBounce, accepting only addresses whose domain matches the verified company domain. Every step is logged against the row.
Sync to the CRM without duplicates
Companies first, then a domain to id map, then contacts, then a duplicate audit.
What good output looks like
Measured on real lists:
On one 337-company list, the description was enough for 320 companies. Only 17 (5%) needed a homepage scrape.
214 of those companies were already in our data from earlier work, and 549 of 560 profile scrapes linked back to their rows (98%).
For an AI code-security company, the email waterfall turned 16,219 people into 12,894 verified emails, about 80%. Alias review upgraded 164 of 317 domain mismatches.
For an AI-security startup, 1,273 people across 97 organizations were pulled and stored for about $9 of scraping plus about 210 email-provider credits. Keeping recent leavers flagged rather than dropped rescued 46 people.
Sourcing contacts for accounts that had none: 10 companies gave 26 verified new contacts for about $0.24.
Common mistakes, and the fix
Each of these happened on a real run. The fix is now part of how we work.
Name-first searches returned namesakes.
- Cause
- Google does not index LinkedIn profile bodies, so the company term does nothing.
- Fix
- Go company first.
Matches looked verified, and an audit rejected most of them.
- Cause
- The gate scored plausibility: a rare surname and a good title.
- Fix
- Reject whenever the live employer contradicts the source row.
68% of "dead" domains were actually alive.
- Cause
- Liveness was tested with a single web request.
- Fix
- Test that the domain resolves in DNS instead.
Emails at people's previous employers.
- Cause
- No domain check.
- Fix
- Accept an email only when its domain matches the live, verified company domain.
Async email jobs hung.
- Cause
- No deadline.
- Fix
- Give every batch a deadline and a circuit breaker.
Senior people at big companies were missing.
- Cause
- People search returns a ranked sample, not a full roster.
- Fix
- Combine several indexes and verify against the live profile.
Empty results without an error.
- Cause
- The API was throttling silently.
- Fix
- Space calls out, retry, and assert that results are not empty when they should not be.
We paid to scrape profiles we already had.
- Cause
- Stored payloads were not checked first.
- Fix
- Always check the database before scraping.
Ten duplicate companies appeared in one CRM run.
- Cause
- The CRM auto-creates a company from a contact's email domain, and its search index lags.
- Fix
- Create companies first and keep an in-run index keyed on domain.
Questions people ask about data enrichment
What is data enrichment?
Data enrichment adds what a record is missing, such as a company description, headcount and domain, a person's current title, or a verified work email, by matching it against outside sources. We store each provider's complete raw response beside the identifier it came from, so nothing has to be bought twice.
What is an example of data enrichment?
A list of company names becomes a list of companies with their LinkedIn description, domain and headcount, and a verdict on whether each one fits, with a reason. On one 337-company list the description was enough for 320 of them; only 17 needed a homepage scrape.
What is waterfall enrichment?
Querying several providers in order and moving to the next only when the previous one finds nothing usable. Our email waterfall runs Prospeo, then AI-Ark, then optionally Blitz, and validates every accepted address with ZeroBounce. On one list it turned 16,219 people into 12,894 verified emails.
What is lead enrichment?
Enrichment applied to leads: filling in the person's current title, company and verified contact details so the lead can be qualified and routed. We resolve the person company first and reject any match where the live employer contradicts the source.
How much does B2B data enrichment cost?
Per record it is small; the total depends on how much you reuse. Our measured costs: about $0.0035 per LinkedIn company page, about $0.004 per profile and about $2.50 per 1,000 employee records. Sourcing contacts for 10 accounts that had none cost about $0.24. Reusing data you already hold costs nothing.
Want this playbook running on your market?
Tell us what you sell and who you sell to. We will show you how this playbook would run for you, and what we would check first.