RevOps HQ
← BACK TO CASE STUDIES
CASE STUDY9/21/2026

HubSpot Duplicate Management Case Study: Reconciling Identifiers Across Three Systems at an Automotive Services Network

A field service integration had minted duplicate companies, contacts, deals and departments in HubSpot. Deduplicating them was the smaller half of the job. The larger half was deciding which of three systems owned the identity of each object type.

CLIENT: Radius Wheel Restoration

Running Automotive on HubSpot, or thinking about it?

Schedule a consultation

GET WEEKLY REVOPS INSIGHTS

No spam. Unsubscribe anytime.

Summary

Radius Wheel Restoration repairs and refinishes alloy wheels for dealerships, collision centres and fleets, dispatching technicians to customer sites across a network of locations.

It runs three systems that each hold a version of the same commercial reality. An enterprise resource planning system carries financials and the customer master. A field service platform carries work orders, technicians and the service departments jobs are dispatched to. HubSpot carries the commercial relationship.

A prior integration between the field service platform and HubSpot had produced duplicate records across four object types: companies, contacts, deals and a custom department object. Deduplicating those records was the visible work and the smaller half of the engagement.

The larger half was that a duplicate is an identity problem rather than a data-entry problem. Three systems had each minted their own identifier for the same real-world thing, and nothing declared which system was authoritative for which object type. Until that was decided, every merge was a guess about which record should survive.

Client details are pseudonymised at the client's request. Figures are as measured.

Background: three systems, three identifiers, no arbiter

The pattern here is specific and common in field service businesses running an enterprise system alongside a dispatch platform.

A dealership exists as a customer in the enterprise system with a customer number. It exists in the dispatch platform as an account with its own identifier, because the dispatch platform created it when the first job was booked. It exists in HubSpot as a company, created by the integration, with a HubSpot identifier assigned at creation.

None of those three identifiers knows about the other two unless something writes them onto each other. Where that writing is incomplete, partial or conditional, a second sync creates a second record rather than updating the first, because the integration has no reliable way to recognise what it has already created.

Batini, Cappiello, Francalanci and Maurino (2009) separate data-quality work into assessment and improvement as distinct phases requiring distinct techniques, and the distinction matters here more than usual. The improvement phase is a merge operation, which is destructive and irreversible. Running it before the assessment phase has established survivorship rules destroys the wrong records.

Pre-engagement audit

The diagnosis phase was scoped at six hours and produced four things before any record was changed.

Object types carrying duplicates: four. Companies, contacts, deals, and a custom department object representing the service departments jobs are dispatched to.

Cross-system identifiers per record: three. An enterprise system identifier, a dispatch platform identifier, and the HubSpot identifier, each of which had to be present and correct on the record that survived a merge.

Root cause: a defect in the migration and synchronisation logic between the dispatch platform and HubSpot, rather than user behaviour. That distinction determines the remedy: user-created duplicates are prevented by training and validation, and integration-created duplicates recur on the next sync no matter how thoroughly they are cleaned.

Survivorship rules: none existed. The question of which system holds the canonical record was answerable per object type and had never been asked.

Redman (1998) frames poor data quality as a cost borne continuously and recognised rarely, and duplicate records are its most legible form: every report grouped by company over-counts, every contact list double-sends, and no single event makes either visible.

The build

Phase one: deciding who owns identity, per object type

The decision that governed everything else is that survivorship is set per object type rather than globally.

A single rule saying that the enterprise system always wins would be simple and wrong. The enterprise system is authoritative about a customer's legal entity, billing address and account status. It knows nothing useful about a service department, which exists because a dispatcher created it to route a technician. HubSpot is authoritative about a commercial relationship and about nothing financial.

Each object type was therefore assigned a canonical system, and the merge direction follows from that assignment rather than from which record happens to be older or more complete.

Reinartz, Krafft and Hoyer (2004) treat customer relationship management as a set of processes rather than a system, and the per-object rule is that treatment applied to identity. The process that creates a service department is dispatch. The process that creates a customer is finance. A survivorship rule that ignores which process authored a record is a rule about storage rather than about the business.

What each of three systems authoritatively knows about each object typeA grid of four object types against three systems. For a company, the enterprise system holds the legal entity, billing and account status, the dispatch platform holds the site a technician was sent to, and the CRM holds the commercial relationship. For a contact, the enterprise system holds billing and remittance contacts, the dispatch platform holds whoever booked and signed for the job, and the CRM holds whoever is being sold to. For a deal, the enterprise system holds invoiced value, the dispatch platform holds nothing, and the CRM holds stage, owner and forecast. For a department, the enterprise system holds nothing, the dispatch platform creates the record in order to route work, and the CRM holds only what the integration gave it. The final column, which system is canonical for each row, is left open: the client designates it per object type before any merge runs, and the assignment is not the same on every row. A single global survivorship rule would be correct on some rows and destructive on others.SURVIVORSHIP IS DECIDED PER OBJECT TYPE, NOT ONCEEach cell is what that system authoritatively holds about that object. A dash means it holds nothing useful.The right-hand column is a decision the client makes before any merge runs. It is left open here because the scope of work records the rule and not the answers.ENTERPRISE SYSTEMDISPATCH PLATFORMHUBSPOTCANONICALCompanyLegal entity, billing, account statusThe site a technician was sent toThe commercial relationshipclient designates,this row onlyContactBilling and remittance contactsWho booked and signed for the jobWho is being sold toclient designates,this row onlyDealInvoiced valueStage, owner, forecastclient designates,this row onlyDepartmentCreated by dispatch to route workInherited from the integrationclient designates,this row onlyA global rule would be correct on one row and destructive on another.A merge resolves conflicting values to the surviving record. Choosing the wrong survivor discards the values the business relies on for that object.
What each system knows about each object type, and why survivorship is decided one row at a time.
Four object types, three systems, and which one is authoritative for each

The rules were documented and signed off before a single record was merged. Pipino, Lee and Wang (2002) argue that data-quality assessment must combine objective measurement with subjective judgement, because a metric cannot establish whether a shortfall matters to anyone. Which system owns a department is exactly that kind of judgement, and it belongs to the client rather than to the implementer.

Phase two: the merge, and what a merge destroys

Deduplication ran across the four object types in twelve hours, in descending order of blast radius: companies first, then contacts, then deals, then departments.

Merging in HubSpot preserves associations and resolves conflicting property values to the primary record. The secondary record's differing values are gone. In a business whose customer history is its commercial asset, an unreviewed bulk merge is a data-loss event with a friendly interface, and the controls used were correspondingly unglamorous: a confirmed export point before any merge, staged execution reviewed with the client before running at scale, and an explicit instruction to pause and re-estimate if the duplicate volume proved materially larger than what was observable at diagnosis.

Each surviving record was then written with all three identifiers, which is the step that converts a cleanup into a reconciliation.

Redman (1998) puts the cost of poor data quality on the operating account rather than on a hygiene line, and the three-identifier write is what moves it back. A deduplicated record with one identifier is correct in one system and orphaned in the other two, which is a cheaper form of the same problem rather than a solution to it.

How a partial identifier write makes a duplicate, and what the survivor carriesTwo company records exist for one dealership. The first, created by an early sync, carries the enterprise system identifier and the CRM identifier, and its dispatch platform identifier is empty. The second, created by a later sync, carries the dispatch identifier and the CRM identifier, and its enterprise identifier is empty. Because neither record carries the full set, the integration cannot match an incoming record against what it has already created, so it creates another one. The identifier values shown are placeholders; the pattern of which are present and which are empty is the diagnosed mechanism. Below, the surviving record carries all three identifiers, which is what converts a deduplication into a reconciliation. Beside it, the fix to the synchronisation logic is what stops the pattern above from recurring on the next sync.ONE DEALERSHIP, TWO RECORDS — NEITHER CARRIES THE FULL SETIdentifier values are placeholders. Which ones are empty is the diagnosed mechanism.Company record Acreated by the first syncenterprise idvalue presentdispatch idEMPTYCRM idvalue presentCompany record Bcreated by a later syncenterprise idEMPTYdispatch idvalue presentCRM idvalue presentno match possible between themmerge, survivorship rule appliedSurviving recordone dealership, one recordenterprise idvalue presentdispatch idvalue presentCRM idvalue presentFix to the sync logicTwo hours of a twenty-hour engagement,and the only part with a permanent effect.Without it, the upper band returnson the next sync.A deduplicated record carrying one identifier is correct in one system and orphaned in two.Validation traces a sample across all three systems, because nothing inside one system can detect an identifier pointing at the wrong customer in another.
The duplicate-creation mechanism and its remedy. Writing all three identifiers onto the survivor is what makes the record recognisable to the next sync.
Two records for one dealership, and the single survivor carrying all three system identifiers

Phase three: fixing the thing that made them

Two hours of the engagement went to the synchronisation logic itself.

That allocation looks small against twelve hours of cleanup and is the only part of the work with a permanent effect. A cleanup without a source fix produces a portal that is correct on the day of handoff and degrades from the next sync onward, and the client pays for the same engagement again within a year.

Phase four: proving it across three systems

Validation sampled records and traced each one across all three systems, confirming that the identifiers reconcile end to end rather than confirming that HubSpot looks tidy.

A record can be perfectly deduplicated inside HubSpot and still carry an enterprise identifier belonging to a different customer. Nothing inside HubSpot can detect that. Only a check that leaves the system and comes back can.

Associations were spot-checked after the merges to confirm that the company, contact, deal and department relationships survived intact, because the association graph is what a merge is most likely to damage silently.

Outcomes

Object types deduplicated: 4. Companies, contacts, deals and departments.

Cross-system identifiers reconciled on each surviving record: 3. Enterprise system, dispatch platform and HubSpot.

Survivorship rules defined: from 0 to one per object type, signed off before execution rather than inferred during it.

Root cause: from unknown to identified and fixed at source. The defect in the synchronisation logic was corrected so the duplicates do not recur.

Engagement shape: 20 hours at 250 United States dollars an hour, divided six hours to diagnosis, twelve to execution, two to validation and handoff.

Records changed before the plan was approved: zero. Every merge and delete followed a documented, signed-off cleanup plan.

Systems checked during validation: 3. Confirmation that identifiers reconcile end to end, rather than that one system looks correct.

Lessons learned

A duplicate is a symptom, and the disease has a name. The underlying condition is that no system had been declared authoritative for any object type. Cleaning duplicates without answering that question produces a tidy portal and the same portal again in six months.

Survivorship belongs to the client and the rule belongs to the object. The implementer knows how a merge behaves. Only the business knows whether the dispatch platform or the enterprise system is right about what a service department is. Asking that question per object type takes an hour and prevents the class of error that cannot be undone.

Twelve hours of merging was made safe by six hours of not merging. The diagnosis phase produced no visible change and every control that made the execution phase reversible in principle and reviewed in practice.

The two hours on the sync defect are the only permanent part. Everything else is a one-time correction of a state the integration would otherwise reproduce. An engagement that had spent all twenty hours on cleanup would have delivered more visible progress and less value.

Validation has to leave the system. Wang and Strong (1996) define data quality by fitness for the consumer's use, and the consumer here is a dispatcher, a finance clerk and a salesperson looking at what each believes is the same customer. A check confined to one system cannot establish that they are.

Limits

Record counts are not published here. The engagement's deliverables include pre and post counts by object type. Those figures belong to the client and are not reproduced, so this document reports the structure of the work rather than its volume.

No business outcome is claimed. Deduplication removes a known source of error from reporting and from outbound communication. Whether any commercial measure improved as a result is not established here, and the engagement did not define a baseline against which it could be.

Historical backfill beyond the affected records was out of scope. Records not touched by the integration defect were left as they were, so the portal is consistent with respect to this defect rather than clean in general.

The source fix addresses one defect. It prevents recurrence of the duplicate-creation pattern that was diagnosed. It does not make the integration correct in every other respect, and no claim to that effect is made.

Ongoing hygiene was explicitly excluded. This was a bounded remediation, not a managed service. The controls that prevent a different class of duplicate arising through user behaviour were not part of it.

Three systems is the interesting number. Two systems with a single integration have one identity question. Three have three pairwise relationships, and the complexity of survivorship grows faster than the count of systems suggests.

Conclusion

The request that started this engagement was a request to remove duplicates.

The work that mattered was deciding, for four object types, which of three systems is telling the truth about what a record is. That decision had never been made, which is why the integration could not recognise its own output, and why every merge before the decision would have been a coin toss with a destructive outcome.

Batini and colleagues (2009) describe assessment and improvement as separate phases with separate techniques, and the proportions in this engagement make the case as well as the literature does: six hours deciding, twelve hours executing, two hours making sure it stays fixed, and none of it in the wrong order.

References

Batini, C., Cappiello, C., Francalanci, C., & Maurino, A. (2009). Methodologies for data quality assessment and improvement. ACM Computing Surveys, 41(3), 1–52. https://doi.org/10.1145/1541880.1541883

Pipino, L. L., Lee, Y. W., & Wang, R. Y. (2002). Data quality assessment. Communications of the ACM, 45(4), 211–218. https://doi.org/10.1145/505248.506010

Redman, T. C. (1998). The impact of poor data quality on the typical enterprise. Communications of the ACM, 41(2), 79–82. https://doi.org/10.1145/269012.269025

Reinartz, W., Krafft, M., & Hoyer, W. D. (2004). The customer relationship management process: Its measurement and impact on performance. Journal of Marketing Research, 41(3), 293–305. https://doi.org/10.1509/jmkr.41.3.293.35991

Wang, R. Y., & Strong, D. M. (1996). Beyond accuracy: What data quality means to data consumers. Journal of Management Information Systems, 12(4), 5–33. https://doi.org/10.1080/07421222.1996.11518099

Conflict of Interest Statement

RevOps HQ is a HubSpot Solutions Partner and was paid to perform the diagnosis, cleanup and source fix described here, on a time-and-materials basis at a stated hourly rate against a twenty-hour estimate. Phase structure and hour allocations come from the signed scope of work. Record volumes are the client's and are withheld. No business outcome is claimed.

Acknowledgments

The client designated the canonical system for each object type, which is the decision the entire cleanup depends on. The export point taken before execution was confirmed by the client's own administrators.

Schedule a consultation

Thirty minutes, no deck. We look at your portal and tell you what this would involve for a automotive business — including whether it is worth doing yet.

HubSpot services

Onboarding, implementation, integration, migration, administration and training, each scoped and priced before the work begins

WEEKLY PROGRAM

RevOps Office Hours

A recurring weekly RevOps operating program. Live support plus hands-on HubSpot implementation work.

$1,500/mo
Monthly Operating Program
  • 1 live Office Hours session per week
  • 4 hours of hands-on implementation work per month
  • Hours allocated against priorities agreed at the start of each period
  • Recurring monthly cadence