Sales Infrastructure

Validating AI Enrichment Output Before It Reaches Reps

AI enrichment columns never return blank. They return something plausible. This is the validation system that stops a made-up answer reaching a rep.

In shortTreat every AI enrichment output as an unverified claim. Gate the input with a pre-check, require a constrained value, a reason, a confidence and a source, sample the column against a written accuracy bar before launch, route low-confidence answers to review instead of rep-facing fields, and monitor the unknown rate weekly.

Oriol SerraSep 14, 2026 · 8 min read

For years, bad data announced itself. You ran a provider waterfall, and when nobody had the email, the cell was empty. Empty is honest. Empty is a coverage number you can report, a row you can send to a different provider, a gap you can price before you spend anything on it.

Then everyone put AI research columns in the table, and the empty cell disappeared.

An AI column does not return null. It returns a sentence. Ask it whether a company sells into manufacturing and it will answer in the same confident tone whether it read that on their homepage or inferred it from the company name. Ask it who runs operations and it will give you a name. The two outputs are visually identical, they sit in the same column your scoring model reads, and they get merged into line one of a cold email by the same sequence.

That is the whole shift, and almost nobody has adjusted for it. Waterfall providers fail loudly. AI columns fail quietly. Quiet failures are the expensive kind, because nothing in your dashboard goes red.

Treat an AI answer the way you treat an unverified email

We already have a rule for providers. Some of them return names and LinkedIn URLs and not much else, so we treat their emails and phones as unverified for non-US ICPs until something independent confirms them. Nobody argues with that rule. It is not an insult to the vendor. It is a statement about what the field actually is: a claim, not a fact.

Give every AI column the same status. An AI output is a claim with a confidence nobody has measured. It stays unverified until a deterministic check, a cited source, or a human says otherwise.

Everything below is how you enforce that without turning your table into a manual review job.

Step 1: Gate the input before you worry about the output

Most AI columns that return garbage were fed garbage. The model was asked to read a website that did not load, research a company with almost no public footprint, or classify a row where the source fields had not finished normalizing yet.

So the first control is not a prompt. It is a pre-check that runs above the AI column and decides which rows are even eligible to be researched.

In our deduplication workflow this is a literal step: normalization settles, then a Company Quality Pre-Check gate runs, and only then do the tiered lookups fire. The same shape works for enrichment. Before the AI column runs, check that the domain resolves, the site returns content, and the identity fields you are matching on are populated and normalized. Rows that fail the pre-check do not go to the model. They go to a held file.

There is a second, less obvious version of this. When we score accounts on public signals, we gate on index coverage first, because a poorly indexed company returns a false zero and zero reads as a strong signal. Same trap, different column. If you do not know whether the source had anything to say, you cannot interpret what the model said about it.

Step 2: Write a schema that is allowed to refuse

A prompt that demands an answer for every row will get one for every row, including the rows where no answer exists. You built the hallucination into the request.

Our standing rule on the qualification gate is blunt: unknown is not no. A guessed no silently deletes real buyers, and a guessed yes quietly buys you an enrichment bill. So the output contract has four parts, and all four are mandatory.

A constrained value. One of a fixed set, not free prose. Yes, no, unknown. Or a controlled vocabulary, the way we handle job function and seniority: a frozen list of allowed values, never an open field.

A one-line reason. In the model's own words, why it answered that way. This is what makes a sample reviewable in seconds instead of minutes.

A confidence value. Most teams already capture this. Almost nobody gates on it, which makes it decoration.

A source. The URL the answer came from, or the quote it was based on. We only mark a propensity signal as yes when there is a verifiable public source behind it, otherwise it is unknown, never no. An AI column should meet the same bar. No citation, no claim.

The source requirement does more work than the confidence score. A model that has to name where it read something will return unknown far more often, which is exactly the behaviour you are paying for.

Step 3: Sample the column before you run the table

Everyone knows to test a prompt on a few rows. Almost nobody defines what passing looks like, which means the test is theatre.

Set the acceptance bar in writing before you run it.

  1. Test rows first. Three to five rows, hand-checked against the actual source. This catches prompt bugs before they become a full-table bill.
  2. Then a sample with a number attached. We validate merges against a ten percent sample and we compare closed-won records against Stripe with a two percent variance threshold. Borrow the discipline. Pull ten percent of the AI column's output, or a hundred rows, whichever is smaller, and check each one against the cited source.
  3. Decide in advance what a failed sample triggers. Below your bar, the column does not ship. It gets re-prompted and re-sampled, or it gets deleted. A column that fails its sample and ships anyway is worse than no column, because now the wrong answers carry your team's credibility.
  4. Never rule on the ambiguous ones. When we normalized job titles on an industrial build, nine contacts titled exactly "Manager" were held back for individual validation rather than filed by rule, and one title, "Workshop Manager", went to review instead of being guessed. That is not perfectionism. It is the difference between a taxonomy and a mess with confident labels on it.

Record the accuracy rate. It is the only number that tells you whether the column is improving or rotting, and almost no team has it.

Step 4: An AI column never writes on its own

This is the control that saves you. In our dedupe workflow, the tiers that are resolved deterministically merge automatically. The tiers that depend on AI validation go to human review, and writes stay button-triggered. Never auto-run. Records flagged for manual review get cleared by a named reviewer before the run closes.

Wire the same thing into enrichment.

High confidence plus a cited source writes to a staging property, not to the field reps read. Anything below the confidence bar, or with no source, goes to a review queue. Not a default value, and never a guessed one.

The write into the CRM stays behind the gates you already run. Nothing reaches HubSpot without a verified email. Nothing reaches a sequence without passing the suppression join.

And put a deterministic post-check underneath the AI. Our merge runs finish with a collision pass on domain, then strict name, then loose name, specifically to catch what the earlier logic missed. An enrichment table deserves the same: plain guardrail columns like size_valid, title_valid and region_valid catching the obvious errors the model waved through.

AI handles the fuzzy cases. Deterministic columns catch the obvious ones. Neither is allowed to be the only thing standing between a model's guess and a rep's mouth.

Step 5: Put the column on the health check

Pipelines break silently. We lost a month of data once because a webhook between the sending tool and Clay was deleted and nothing complained. That is why we run weekly automated health checks that map the core data points and flag breaks for review.

A degraded AI column looks exactly like a working one. The website changed its layout, the model started reading a cookie banner instead of a services page, and the column keeps returning confident values at the same fill rate. Add three things to the weekly check: the unknown rate, the average confidence, and the share of rows with no source. If the unknown rate drops sharply, that is not improvement. That is your model getting less honest.

What this actually costs you

Run the numbers in the order the credits get spent. Qualification is the cheapest column in the table. Enrichment is the most expensive. In one internal provider test, a single-provider run with no waterfall cost 227 credits for twenty-five accounts, while an ordered stop-on-first-hit waterfall came in around five to fifteen credits per company. That gap is the prize for getting sequencing right.

A wrong AI qualification destroys it from both sides. A false yes pays full enrichment price on rows you were never going to sell to. A false no deletes real buyers and you never find out. And note that AI columns usually run on your own model key rather than platform credits, which means the spend does not even show up in the place you are watching.

Then there is the cost nobody puts in a spreadsheet. A rep opens a call with a fact your table invented. That is one relationship, one referral and one renewal, and it is charged to your credibility, not your budget.

What good looks like

Every AI column has a pre-check above it and guardrail columns below it. Every output carries a value, a reason, a confidence and a source. Unknown is a permitted answer and its rate is monitored. A sample accuracy rate exists, is written down, and has a threshold that can stop a launch. No AI output writes to a rep-facing field without passing a gate or a reviewer.

We build this into enrichment engines as part of the Data Enrichment and List Building module, and it is one of the first things we look for in a GTM Maturity and Revenue Leak Assessment, because bad enrichment is not a data problem. It is a prevention problem wearing a cleanup problem's clothes.

If your AI columns have a fill rate but no accuracy rate, you do not have an enrichment system. You have a very fast opinion generator wired directly to your pipeline.