Score your CRM company data and fill the gaps in batches
See exactly which company fields are missing across your CRM, then fill them in batches you approve field by field before anything gets saved.
Build me an enrichment coverage workbench for our HubSpot company database, so our ops team can see on one screen how complete our company data actually is and then fix the gaps in controlled batches. It is an app we open and work in, not something that runs on a schedule.
The landing view is a coverage dashboard. Load companies with the HubSpot Search Companies operation, paging through results and requesting the properties we score: name, domain, industry, numberofemployees, annualrevenue, country, linkedin_company_page, plus hubspot_owner_id and lastmodifieddate. Score field coverage across the five fields we care about (industry, employee count, revenue band, country, LinkedIn URL) and show three things: an overall completeness percentage across all scored fields, a per field gap breakdown with the count and percentage of records missing each field, and a sortable table of the worst records (fewest filled fields first) with a column per scored field marked filled or blank. Resolve owner names with the HubSpot List Owners operation and let me group and filter the table by owner. Add filters for owner, industry, lifecycle stage, and missing a specific field. HubSpot search caps out at 10,000 results, so state the scanned scope plainly in the UI and let me narrow it with filters rather than implying the whole database was covered.
From the table I select rows and hit Enrich. Route the selection automatically. For records that have a usable domain, send up to 50 domains per request to the CompanyEnrich Batch Enrich Companies (Sync) operation and fold the results straight into the review queue. For larger selections use CompanyEnrich Create Bulk Enrichment Job (Async), which takes up to 10,000 domains and returns a job id immediately. Persist that job id and render a real job progress state (queued, running, completed, failed) driven by CompanyEnrich Get Bulk Enrichment Job Status on a refresh interval, never a blocking spinner that holds the whole screen hostage. When the job reports completed, fetch the results from the signed results url it returns and merge them into the same review queue. For records that have a company name but no usable domain, fall back to the CompanyEnrich Enrich Company by Properties operation one record at a time.
Nothing is written to HubSpot until I approve it. After enrichment, open a review screen with one row per company and, inside it, a side by side diff of current value versus proposed value for each scored field, with a tick box per field. Blanks only is the default: fields whose current value is empty come pre ticked, and fields that already hold a value are shown for comparison but left unticked and disabled. There is an explicit overwrite mode toggle, off by default, that unlocks the already filled fields; when it is on, make that unmistakable in the UI and record it against the run. Give me select all and clear controls per record and per field column, so I can approve a whole column of missing industries in one pass.
CompanyEnrich returns revenue and employee counts as enum range strings such as "1m-10m" and "51-200". Treat them as strings everywhere and do not parse them into numbers. Keep an editable mapping table in the app that maps each CompanyEnrich range string onto the exact value our HubSpot property expects, show the mapped value in the diff, and flag any range that has no mapping instead of guessing at one.
When I approve, apply the changes with the HubSpot Update Company operation, sending only the fields I ticked for that company, and show per record success or failure with the actual error message when one fails. Every applied change is appended to an audit log spreadsheet using the Google Sheets Append Values operation, one row per field changed: timestamp, company id, company name, domain, field name, previous value, new value, enrichment source (sync batch, async job, or properties fallback), job id where relevant, whether overwrite mode was on, and who approved it.
Surface every record CompanyEnrich could not match in its own Unmatched tab, with the reason (no usable domain, no match returned, or the name lookup came back empty), so the team can work them manually instead of watching them silently disappear. Let me mark an unmatched record as handled, and let me push the unmatched list to its own tab in the audit spreadsheet with the same append operation.
Persist run history so the team can revisit past hygiene passes: each run stores who started it, when, how many records were selected, which route was used, the job id, and counts of proposed, applied, skipped, and unmatched. Save the audit spreadsheet id, the scored field list, and the range mapping table as app settings. Default landing page is the dashboard, with tabs for Review, Unmatched, and Run history.
The people using this are ops managers running a quarterly data hygiene pass, so favour density and clarity over decoration: real counts and percentages next to every bar, sortable columns, a persistent count of how many records are selected and what the enrichment will cost in credits, and a confirm step before anything writes back to HubSpot.
What does this prompt do?
- Scores every company in your CRM on the fields you actually care about (industry, employee count, revenue band, country, LinkedIn page) and shows one overall completeness number plus a gap breakdown for each field.
- Ranks the worst records and groups them by owner, so each person can see the gaps on the accounts they are responsible for.
- Fills gaps in controlled batches: pick the records, look up fresh company data, and review a side by side comparison of what you have now versus what is proposed.
- Saves only the fields you tick, never touches a field that already has a value unless you deliberately turn overwrite on, logs every applied change to a spreadsheet, and keeps a separate list of records that could not be matched so nobody loses them.
What do I need to use this?
- A HubSpot account with companies in it and permission to edit company records
- A CompanyEnrich account for the company data lookups
- A Google account and a spreadsheet to hold the audit log
- A short list of the company fields your team treats as required
How can I customize it?
- Change which fields count toward the completeness score, and how they are weighted in the worst records ranking
- Set the batch size where the app switches from an instant lookup to a background job you can walk away from
- Point the audit log at a different spreadsheet or tab, and filter the worklist by owner, industry, or lifecycle stage
FAQs
Will this overwrite data my team already entered?
How many companies can I fix at once?
What happens to companies that cannot be matched?
Does it work for companies that have no website on record?
Do I need a paid HubSpot plan?
How often should we run this?
Related templates
Stop buying stale lists. Reps run a saved search, work the results like an inbox, and only the accounts they approve ever reach your CRM.
Pick a date, a starting point and a radius, then build a sequenced day of customer visits that lands straight on your calendar.
One screen where reps filter for companies that fit, see who is actually reachable at each account, and save only the addresses that verify.
Drag creators through Sourced to Wrapped on a board grouped by campaign, with audience stats on every card and a one-click brief for each creator.
Pick a repricing rule, send an assistant out to check competitor pages, then approve the new prices that clear your margin floor.
See the projected bounce rate for any outbound send before it goes out, and keep the launch button locked until the list is clean enough to be safe.
Stop guessing how complete your CRM really is.
Build your own coverage workbench and clear the gaps in batches your team approves, with every change on the record.