Score your CRM company data and fill the gaps in batches

By General Input

See exactly which company fields are missing across your CRM, then fill them in batches you approve field by field before anything gets saved.

Integrations

  • CompanyEnrich
  • HubSpot
  • Google Sheets

Type

App

Categories

  • Sales
  • Operations

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.

Related prompts

Explore more prompts
Call overdue Xero customers with an AI collections agentLocal listing health board for every location you manageLet support send one-off Loops emails without an engineerTurn Mailjet email clicks into ranked HubSpot follow-upsStop cold emails to anyone with a live deal in PipedriveiMessage campaign console with pre-flight checks and delivery boardA searchable RFP answer library your bid team drafts fromLinkedIn Ads budget pacing dashboard for every client accountSee which target accounts just started advertising on LinkedInFront desk appointment confirmation board for the next 3 days