A CRM-to-marketplace deduplication design should use stable source IDs and normalized identifiers to find candidate matches, then apply explicit rules for identity, account structure, ownership, and listing eligibility. A match should not automatically overwrite a record, transfer ownership, reopen a sold lead, or merge two people. Preserve source-system lineage, historical states, and review evidence for every high-impact decision.
1. Separate four questions
| Question | Example | Decision |
|---|---|---|
| Same identity? | Two contact rows share a normalized email. | Match, possible match, or distinct person. |
| Same organization? | Two companies share a domain but represent subsidiaries. | One account, parent/child, or unrelated. |
| Existing ownership? | The buyer has an active opportunity for the person or company. | Conflict, permitted overlap, or manual review. |
| Listing eligibility? | The seller record was previously sold, suppressed, or won. | Block, warn, revalidate, or permit under a versioned rule. |
Combining the questions into one duplicate flag creates false merges and hidden conflicts. The marketplace needs a state decision even when the CRM considers two rows one contact.
2. Establish canonical IDs and lineage
Store the marketplace record ID, seller organization ID, source-system name, source portal/account ID, source object type, and source record ID. Keep those identifiers stable through ordinary field updates. Normalize email and domains for matching, but retain the attributed original value and timestamp.
HubSpot’s current deduplication guidance describes automatic contact matching by email, company matching by domain, and use of Record ID or custom unique-value properties. Its import guidance explains that unique identifiers support updates, deduplication, and association. Those are CRM behaviors; marketplace ownership and eligibility still require separate rules.
3. Normalize cautiously
Normalize case and surrounding whitespace for email; parse domains consistently; store phone values in a documented international format when enough context exists. Do not silently remove plus aliases, rewrite a corporate alias, infer a country code, or collapse consumer-email households without a tested business rule. Keep the raw value available for audit and correction.
A shared company domain can describe a parent, subsidiary, franchise, agency client, or multiple operating units. A shared phone may be a switchboard. A name plus company is a weak candidate signal. Use confidence bands and human review when a wrong merge would affect access, price, suppression, or an individual.
4. Make field ownership explicit
For each synchronized field, define the system of record, permitted writers, conflict rule, null handling, and terminal states. A CRM re-sync must not overwrite marketplace transaction status, buyer ownership, dispute state, or a suppression flag merely because an older source record says “listed.”
Use immutable events for reservation, purchase, reveal, dispute, refund, sale, and terminal outcomes. Use the HubSpot marketplace sync checklist to test field direction, ordering, retries, and recovery.
5. Block duplicate listing before purchase
At listing time, compare seller-scoped source ID, normalized contact identifier, company identifier, prior marketplace states, suppression, and relevant transaction history. At reservation or purchase, rerun the conditions that can change. Use an atomic eligibility decision where the product supports it so two concurrent requests cannot purchase the same eligible record.
Distinguish exact duplicate, likely duplicate, prior sale, buyer-owned conflict, and seller-owned historical record. Each category needs a documented action and visible reason. A warning that operators routinely ignore is not a control.
When deduplication changes the eligible cohort or accepted-lead count, recalculate the break-even cost per lead instead of leaving the buying threshold anchored to the larger raw import.
6. Run a privacy-preserving buyer conflict check
Before revealing identity, the marketplace may need to determine whether the authorized buyer already owns the same contact or account. Design the minimum comparison result needed: conflict/no conflict/uncertain, applicable rule, and evidence time. Avoid revealing other customers, unrelated CRM data, or the buyer’s complete dataset to the seller.
Connect the result to the versioned buyer acceptance criteria. A buyer should not be able to redefine an ownership window only after seeing the lead.
7. Merge by policy, not convenience
Before merging, choose the survivor, field-level precedence, association handling, activity history, consent and suppression state, marketplace references, redirect mapping, and rollback evidence. Never discard the losing source IDs. Record who approved the merge and why.
Some records should be linked rather than merged: parent and subsidiary companies, a person with two legitimate roles, or duplicated imports whose conflicting qualification histories must remain attributable. If the record is under dispute, preserve both states in the dispute evidence packet until review closes.
8. Test edge cases and reconciliation
- Same email with different source owners and incompatible names.
- Different contacts at companies sharing a parent domain.
- Secondary email, recycled address, alias, and missing email.
- Previously sold, refunded, suppressed, corrected, and won records.
- Out-of-order webhook, replayed event, retry after partial failure.
- Two concurrent listings or purchases for the same eligible identity.
- Merge, unmerge or rollback, and nightly reconciliation mismatch.
Reconciliation should report orphaned IDs, impossible state transitions, multiple active owners, repeated terminal events, and source/marketplace field drift. It should not “repair” high-impact conflicts without a reviewable rule.
Sources and next step
Primary CRM references: HubSpot’s deduplicate records, import identifiers, and property validation guidance. Recheck subscription, object, and feature-specific behavior before implementation.
Attach field source and match time to the lead freshness SLA, then measure downstream states with the attribution ladder.