12 Guide

AI lead enrichment that actually works

I built a pipeline that turns a company running ads into a named human with contact details. It worked. It also produced 200 contacts I had to throw away, and that part is the useful lesson.

Lead enrichment turns a thin record into a contactable human. The hard part is not the enrichment, it is the identifier you feed it: almost no service accepts a company name, so the real first job is finding a domain. And whatever comes back needs validating in code, because roughly 44% of my results were attached to the wrong employer and looked exactly like the good ones.

The problem this solves

I had a list of companies I knew were spending money on ads, which is a good definition of a qualified prospect. What I did not have was a person to talk to at any of them.

That gap is where most prospecting stalls, and it stalls for a reason that surprises people the first time.

The domain problem

Most ad-library leads have no website in the ad. And essentially no people-enrichment service will accept a company without a domain — pass a company name and you get nothing, or worse, you get a different company with a similar name.

So the pipeline has a stage before the stage everyone talks about. You have to resolve a domain first.

The unlock was the advertiser’s public page profile. One lookup per company returns the website, an email, a phone number, a category, and the social links. That got a usable domain for 196 of 210 leads. It also returned contact details directly, which meant a chunk of the list did not need enrichment at all.

Two practical notes: that lookup is slow, several seconds each, so parallelise it or a couple of hundred companies takes an afternoon. And the social handle it returns must be verified against a stable identifier you already hold, because a name-based match will confidently return a different business with a similar name. That check caught a genuine mismatch in my run.

The pipeline

StageInputOutputWatch for
1. ResolveAdvertiser pageDomain, email, phone, socialsSlow; parallelise
2. Verify identityCandidate socialConfirmed handleMatch on stable id, not name
3. EnrichDomainNamed contactsName input always fails
4. ValidateContactsContacts you can trustNon-negotiable

Stage four is the one people skip, and it is the one that decides whether the whole thing was worth doing.

Why 44% came back wrong

Not because the tooling was broken. It resolved exactly what it was given. The failures came from handing it identifiers that did not uniquely identify the target, and there are two distinct shapes.

Platform collision. Small businesses often list a link-in-bio, a social profile, a form builder, or a video channel as their website. Hand that to an enrichment service and it resolves the platform and returns the platform’s employees. A lead whose site was a Linktree came back with Linktree staff. Sixty contacts in my run were real people at real technology companies and entirely useless.

Brand collision. A small local agency sharing a domain pattern with a large national organisation of the same name returned the national body’s executives. No automated signal that anything was wrong.

The full breakdown, including the blocklist bug that silently deletes legitimate companies, is in the write-up of that measurement.

The validation rule

One check, applied in code, before anything reaches a CRM:

Keep a contact only if its own domain equals the company domain, or its most recent employer matches the company name.

It is unsophisticated and it removed almost all the bad records. It works because the failure always has the same shape: the person is real, but the link between that person and your company was inferred rather than observed.

Do it in the pipeline. Manual review does not survive 450 rows, and the records that slip through are indistinguishable from good ones.

Practical notes that cost me time

  • Strip platform domains before enriching, not after. If the only URL you have is a link-in-bio, you do not have a domain. Treat the lead as unresolved rather than pretending otherwise.
  • Filters can return nothing rather than something. Asking for senior titles at a five-person business returns an empty set, because there is no VP of anything. Retry the same domain with no filters before concluding there are no contacts.
  • Do not request paid data points by default. Email lookups cost per record. Requesting them on a 450-row run is expensive for data you may discard at validation.
  • Enrichment calls take about ten seconds. Two hundred sequential calls is impractical. Parallelise.
  • Sanity-check magnitude. Asked for decision-makers at a small agency and got a Fortune 500 C-suite? That is a bug report, not a finding.

Where AI helps and where it does not

Helps: normalising messy company names, categorising businesses by what they actually sell rather than what their category field says, and drafting the first line of outreach from a real detail on the site.

Does not help: deciding whether a contact is really at that company. That is a deterministic check against two fields, and a model asked to judge it will produce a confident opinion where you wanted a comparison. Use code for the things code is good at.

What good output looks like

My run ended at 254 validated people across 100 companies, with LinkedIn coverage on all of them, plus a large majority carrying company emails and a good share with phone numbers. That is a workable list.

It came from roughly 450 raw contacts. The 44% you discard is not waste, it is the cost of the 56% being trustworthy. A pipeline that returns 450 contacts and skips validation has not done more work, it has just moved the failure downstream to whoever sends the emails.

FAQ

What is lead enrichment?

Turning a thin record into a contactable one: a named decision-maker, a verified email, a role. The step between having a list and being able to use it.

Why do enrichment tools need a domain?

A domain is unique; a company name is not. Most services reject names outright, so finding a domain is usually the real first job.

How accurate is the data?

Plan for double-digit error. Mine was ~44% wrong-employer, and bad records look exactly like good ones.

Should I email everything it returns?

No. Unvalidated enrichment reaching a sending tool is how you burn a sending domain.

Related: the full error measurement and how to build the company list in the first place.