Company Deduplication

Status: On request. A Data Enhancement operation. Writes to the CRM.

Operating model

A configured pass, not a service. It runs when you scope it and run it. A scan can be run on its own to inventory the candidate groups, and nothing is merged that was not in the approved set.

What makes two companies candidates

Companies are grouped on normalised name together with normalised domain. Both values must be present: a record with a blank or placeholder domain is not grouped at all, because a shared blank is not evidence of anything. Requiring two corroborating values rather than one is what keeps a large portal from producing candidate groups that only look plausible.

The Salesforce Account ID conflict guard

Where the records in a candidate group carry two or more distinct Salesforce Account IDs, the whole group is skipped and the reason is recorded. Records that look like duplicates by name and domain can correspond to genuinely distinct accounts in the authoritative registry, and merging them would destroy a distinction the business relies on. The pass refuses rather than resolves.

To be precise about the mechanism: this reads a Salesforce Account ID property stored on the HubSpot record. The operation makes no call to Salesforce, holds no Salesforce credential, and is not an integration with it. In a portal that does not carry those identifiers, the guard has nothing to act on and the remaining rules apply unchanged.

Which record survives

Master selection is ordered and deterministic. A record carrying a full 18-character Salesforce Account ID wins outright. Failing that, a record carrying any Salesforce Account ID beats a record carrying none. Where neither applies, the earliest created record wins as the tiebreaker. The precedence is fixed in the pass, not decided per group.

Before and after a merge

A snapshot is taken before the pass runs and again after it completes, both retained outside the CRM, and every merge is recorded with both record identifiers.

A merge is not an undo-able operation. The platform combines two records into one and offers no call to separate them again. The safeguard is the snapshot, the skip rules and the approved scope.

Configurable and client-specific policy

Whether the Salesforce guard is meaningful depends on the environment: it only applies where those identifiers are present on HubSpot records. Grouping strictness and master precedence are configured before a pass runs, and the property set the pass reads is chosen for the portal it runs against.

Determinism

No part of this calls a language model. The same records and the same configuration produce the same groups and the same survivor every time.

Technology

Node.js 20HubSpot API v3Merge APIRun on request