Fill the Gaps
Outcome: empty fields completed from enrichment, populated fields left alone, every filled value carrying a source flag, and a measured completeness improvement.
- Surface
- Sync GTM app and MCP server
- Level
- Intermediate
- Uses
- enrich_organization · enrich_person · find_work_email · verify_email
- Credits
- ~2 per record, depending on gaps
- Prerequisite
- Lesson 03's deduped, mapped table
The fill-only rule
Fill what is empty. Do not touch what is populated.
This is the rule that makes CRM enrichment safe to run, and it is worth being strict about on the first pass. A populated field may be wrong, but it may also be a human’s deliberate correction — and overwriting one of those destroys trust in the whole pipeline faster than any amount of bad data.
Lesson 06 handles the harder case: updating fields that are populated but stale. That comes after this loop has proven itself.
Enrich in cost order
Free first
Anything derivable from what you already have. Domain from an email, seniority from a title, country from an address. Formula columns, no credits.
Cheap company-level next
enrich_organization fills headcount, industry, country, founded date, funding, LinkedIn URL in one call. Run it on accounts missing any of them.
Person-level after
Current title and company from profile enrichment. Cheaper than contact data and often the more important fix.
Contact data last
find_work_email then verify_email, only on contacts genuinely missing a usable address.
Each step reduces the input to the next: a contact whose company turns out to be out of ICP does not need an email lookup.
Only enrich what is missing
A conditional column per field, not a blanket run.
run_company_enrich = industry IS NULL OR employee_count IS NULL OR country IS NULL
run_email_lookup = email IS NULL OR email_status = "invalid"
run_profile_enrich = title IS NULL OR last_verified > 6 monthsA blanket re-enrichment of every record is the most common way this project becomes expensive. On a 5,000-record slice with three enrichment columns, running unconditionally costs several times what a gap-filling run costs — and most of the results are values you already had.
Flag every filled value
Two columns per repaired field, always.
| Column | Values |
|---|---|
industry | the value |
industry_source | crm / enriched / inferred |
industry_filled_date | when |
Three reasons: scoring can weight enriched values differently, you can measure the fill’s accuracy later, and anyone looking at the record can tell a human entry from a machine one.
Never write an inferred value back without its flag. A CRM that mixes observed and inferred data without distinction stops being a system of record.
Measure the fill
Completeness before and after, per field:
| Field | Before | After | Filled |
|---|---|---|---|
| Industry | 61% | 94% | 33% |
| Employee count | 44% | 91% | 47% |
| Verified email | 52% | 78% | 26% |
| Current title | 70% | 89% | 19% |
Then the number that matters more: of the fields you filled, how many were on records anyone will actually use? Filling industry on 4,000 dormant records is a worse outcome than filling verified email on 200 open opportunities.
Do this now
Build the free derivations first
Domain from email, seniority from title, country from address.
Measure completeness per field
Before you spend anything.
Add conditional enrichment columns
One condition per field group.
Run company enrichment on gaps only
Run person enrichment on gaps only
Run contact lookup last, on genuine gaps
Verify every found address
Add source and date flags per filled field
Measure completeness again
And compute the fill rate.
Check your work
- No populated field was overwritten
- Every enrichment column runs conditionally
- Free derivations ran before any paid enrichment
- Every filled value has a source flag and a date
- You have before and after completeness figures
Where this breaks
Filling a field with a low-confidence value is worse than leaving it empty. An empty industry field is visibly missing and someone will look it up; a wrong one is invisible and will be used in segmentation, routing and reporting for years. Where the enrichment returns something uncertain, leave the field empty and record the attempt — the gap is more honest than the guess.
Further automation
Once gap-filling is proven, the natural extension is filling gaps at creation time rather than in batches: a new record triggers enrichment immediately, so it is never incomplete in the first place. That is the same mechanism as Automated Inbound, pointed at CRM records instead of form fills.
Next lesson
05 — Score and segment, tiering the repaired records by fit and recency.
Reference for this lesson: enrich_organization, enrich_person, find_work_email, How enrichment works.