Open app
Case study

Giving an AI-first revenue team a CRM it could actually trust

A mid-market B2B SaaS company — roughly 300 people, HubSpot as the system of record — wanted its agents to score, route, and reach out automatically. The blocker wasn't the agents. It was the data underneath them. This is an anonymized, representative engagement; the numbers below reflect a typical portal of this size.

96krecords governed across companies, contacts, and deals
−87%duplicate company records after the first month of merges
66→94%industry fill rate on the Enterprise segment
4→1spellings of “United States” — locked by taxonomy

The starting point

Ten years of CRM history, three acquisitions, and two migrations had left the portal in a familiar state: the same account existed two or three times under different domains, “country” had four spellings of the United States, two different properties tracked employee count, and the industry field was 66% populated on the segment that mattered most. Every quarterly review started with a week of spreadsheet reconciliation — and the new AI SDR pilot was quietly skipping accounts whose fields it couldn't parse.

Week one: connect and see

The team connected HubSpot read-only through OAuth. The first full sync mirrored ~96,000 records overnight, and the Insights page ranked what it found: 214 duplicate company pairs matching on domain and name, two overlapping employee-count fields with 98% agreement, and taxonomy drift across country and industry.

  • No writes happened. Every proposed fix sat in the approval queue with its evidence attached.
  • The RevOps lead defined “Enterprise customer” as an explicit segment — the first time the definition existed anywhere outside a dashboard filter.

Weeks two to four: approve, then automate

Merges went first: the team set a winner policy (most complete record wins, history preserved) and worked through the duplicate clusters in the queue. The redundant employee-count field was consolidated — Grunda repointed the workflows, lists, and forms that referenced it before archiving it, so nothing downstream broke. Country and industry were locked as taxonomies, and the variant values normalized in bulk.

Fixes the team had approved a few times became standing rules: new “USA” variants normalize automatically after every sync, and blank industries on active customers are filled by enrichment providers, with the source logged as provenance on every value.

“The queue changed the politics of cleanup. Nobody had to trust a script — every merge showed its evidence, someone approved it, and the CRM never changed behind our backs.”

Head of Revenue Operations (anonymized)

The payoff: agents on the governed view

With the mirror clean and the taxonomies locked, the team pointed its agents at Grunda's MCP server and its internal tools at the governed REST API instead of raw HubSpot properties. The AI SDR stopped skipping accounts — the fields it read were canonical, normalized, and carried quality metadata, so it could tell a confident answer from a gap.

  • Quarterly reporting reconciliation dropped from a week to a morning.
  • “How many Enterprise customers in the US?” became one query with one answer.
  • The industry fill rate on the Enterprise segment is enforced at 95% — when it slips, a finding appears before anyone notices downstream.

Why it stuck

The cleanup didn't regress because it was never a one-time project. Incremental syncs and deletion webhooks keep the mirror current, standing rules run after every sync, and drift shows up as findings — ranked, with evidence, waiting for a thirty-second approval rather than a quarter-end crisis.

Your portal next

See what Grunda finds in your CRM

Every portal's mess is different. Book a demo and we'll run the same first-week analysis on your own data — duplicates, drift, gaps, and all.

See pricing