CRM deduplication guide · Salesforce + HubSpot

Dedupe your CRM once.
Keep it clean for good.Matching rules, merge logic and account matching for Salesforce and HubSpot, from post-merger cleanups to integrations that keep making duplicates.

A merge is only as good as the rule that picked each surviving value. Set those rules first, and stop the leaks before you touch the backlog.

  • Field-by-field survivorship, so opt-outs and billing links survive the merge
  • A duplicate-cost calculator whose output pastes straight into a business case
DW

Dana Whitfield

Northwind Logistics · post-merger org

Toggle to see the same person before and after a rules-based merge.

41records for one person
31owners working her
At riskKepther email opt-out
  • RecordsOrg A contact Org B lead HubSpot contact AE prospectOrg A contact Master: open opportunity, oldest record
  • Emaildana@northwind.com d.whitfield@northwindlogistics.comdana@northwind.com Rule: most recent engagement; other kept as secondary
  • AccountNorthwind Logistics Northwind Logistics Inc northwind.com (auto-created)Northwind Logistics Rule: account with billing history wins
  • Email opt outFalse True FalseTrue Rule: most restrictive wins
  • LifecycleLead MQL CustomerCustomer Rule: furthest stage
A default merge keeps the master's values. Here the master says "not opted out," so she gets the next nurture email.
One owner, opt-out kept, nothing lost. The three losing records were exported with their MasterRecordId before the merge.
Why this breaks

You turned it off. It's still happening.Every record enters through a door, and each door checks a different key. Some don't check at all.

Duplicates aren't a cleanup problem.
They're a creation-path problem you clean up after.

HubSpot formsDedupes

Key: contact email

An existing email updates that contact. Personal emails and typos still create new people.

HubSpot importsPartial

Key: email, domain or Record ID

Rows with no matching key create new records. Re-running a file without Record IDs doubles them.

API and installed sync appsNo domain check

Key: none for companies

Per HubSpot, companies created through the API, including third-party apps, aren't deduplicated by domain.

HubSpot auto-create companiesPartial

Key: contact email domain

One company per unique domain. Subdomains such as info.acme.com get their own company.

Salesforce API and Data LoaderPartial

Key: your matching rules

Integrations can save through alerts with allowSave, and exempted integration users skip rules entirely.

Salesforce UI entryDedupes

Key: your matching rules

Duplicate rules alert or block. Quick Create and lead conversion skip them unless configured.

01

The leak is upstream of the tool you fixed

"I turned off company creation in the sequencing tool and it's still happening."

HubSpot's own "Create and associate companies with contacts" setting, imports and other apps keep creating companies. HubSpot advises against that setting when the Salesforce integration is on.

02

A merger doubles every customer overnight

"A few hundred thousand records across Leads, Contacts and Accounts."

Two orgs, two owners, two spellings. Native Salesforce merge handles three records at a time, with no bulk field rules.

03

The domain is the wrong key for this customer

"In Salesforce they all collapse into one account."

Independent agents and franchisees share a brand and email domain. Domain-only matching merges customers that should be linked in a hierarchy.

04

Merges destroy data you can't get back

"How do Pardot opt-outs and prospect records behave when we merge?"

HubSpot can't unmerge and drops the losing record's conflicting values. In Salesforce, consent flags and finance-linked accounts break if the master's values win by default.

05

Nobody has priced the cost, so cleanup loses the budget fight

"Budget is a bit challenging right now, so I'm gathering stories for a business case."

Duplicates cost contact-tier fees, enrichment credits, rep hours and misrouted leads every month. Without those numbers in a model, dedupe stays a someday project. The calculator in section 7 runs them.

What good looks like

Measure duplicates like a pipeline metric.Know the platform limits first, then hold each object to a duplicate rate, a false-positive rate and a source report.

76%of organizations say less than half of their CRM data is accurate and completeValidity, State of CRM Data Management 2025
62%report losing revenue directly to poor CRM data, up from 37% a year earlierValidity 2026 and 2025 reports
3records per native Salesforce merge: one master plus twoSalesforce merge, incl. Apex
250combined merges before a HubSpot record can't be merged againHubSpot KB, 2026

Benchmarks: weak, acceptable, strong

MetricWeakAcceptableStrong
Duplicate rate per object (records in an open duplicate set ÷ total)>10%3–10%<3%
New duplicates per 1,000 records created per month>5010–50<10, each traced to a source
False-positive rate in the merge-review sample>5%1–5%<1% before any auto-merge
CRM data accurate and complete<50% (76% of orgs)50–80%>80%
Team time spent fixing and reconciling data6+ hrs/week (nearly a third of teams)2–5 hrs/week<2 hrs/week, mostly queue review
Lead-to-account match accuracy (business email leads)<70%70–90%>90% (vendor-reported ceiling: 95%)
Opt-outs preserved through mergesAny lossSpot-checked100%, reconciled against a pre-merge export

Sources: Validity, The State of CRM Data Management in 2025 (n=602) and 2026 (n=500, Aug 2026); LeanData, Lead-to-Account Matching reference (Jun 2026, vendor-reported 95% match accuracy); HubSpot Knowledge Base, Merge records (2026); Salesforce merge limits via RizeX Labs and Brian Hong (2026). Duplicate-rate, new-duplicate and false-positive bands are JayOh practitioner targets, not published studies.

The step-by-step playbook

Ten steps from duplicate backlog to clean by default.Leaks first, rules second, merges third. Every step names the object, setting or field it touches.

  1. 01

    Find and close every creation path before you merge

    What

    List every system and setting that creates leads, contacts, accounts or companies.

    Why it matters

    Merging while leaks run resets the clock. You also can't tell new duplicates from old ones.

    • HubSpot: on 50 recent duplicate pairs, read Record source and Record source detail 1 to see which app, import or form created each one.
    • Check Settings → Data Management → Objects → Companies → Automation → Create and associate companies with contacts. Turn it off if the Salesforce integration is connected; otherwise exclude shared domains (up to 1,000).
    • Sequencing tools such as Lemlist: keep "Create companies independently" off and make Company domain a mandatory property.
    • Salesforce: report new records by CreatedById and LeadSource for 90 days, and list integration users that send allowSave or skip duplicate rules. Connector settings: our HubSpot-Salesforce integration guide.
    Symptom in HubSpotLikely causeFix
    New companies with only a domain and no ownerAuto-create from contact email domainTurn off the setting, or exclude the domain
    acme.com and mail.acme.com as two companiesSubdomains count as separate domainsNormalize to the root domain; merge; add secondary domains
    Same domain, two companies, record source "Integration"API-created companies skip domain dedupeMake the app search by domain before create, or stop it creating companies
    Duplicates appear after every list uploadImports without Record ID or domainRequire a Record ID column for updates
  2. 02

    Snapshot everything, then normalize the match keys

    What

    A full export, plus stored, normalized copies of the fields you'll match on.

    Why it matters

    The export is your only undo. Raw values like "www.Acme.com/" never match "acme.com."

    • Export Leads, Contacts, Accounts and Opportunities with IDs, owners, HasOptedOutOfEmail and Account Engagement fields; in HubSpot, include Record IDs.
    • Build stored fields with a before-save Flow, not formulas: Email_Normalized__c, Website_Domain__c (no protocol, www. or path), Phone_E164__c, Name_Normalized__c (no Inc, LLC, Ltd).
    • HubSpot: one clean primary Company domain name; alternates go to secondary domains.
  3. 03

    Write matching rules in three confidence tiers

    What

    Rules per object that separate certain matches from probable and possible ones.

    Why it matters

    One broad fuzzy rule either misses duplicates or flags thousands of false positives you then have to review.

    Tier A: certainEmail exact. Or Website_Domain + Country + normalized name.Merge in bulk
    Tier B: probableFirst Name fuzzy + Last Name fuzzy + Phone or Account.Merge after sample review
    Tier C: possibleCompany fuzzy + Postal Code, nothing else.Steward queue only
    • Salesforce Matching Rules: up to 5 active per object. Fuzzy methods (Jaro-Winkler, Metaphone 3, Acronym, Syllable Alignment) run only on standard fields; custom fields match exactly, which is why step 2 normalizes them. Leave "Match blank fields" off and exclude info@-style emails.
    • Duplicate Rules: up to 5 active per object, each using up to 3 matching rules. Add a Lead rule with a second matching rule against Contacts. Start with Allow + Alert + Report, which writes Duplicate Record Sets and Items.
    • HubSpot: the default tool uses fixed properties. Data Hub Professional and Enterprise add custom duplicate rules (2 per object, up to 9 properties).
  4. 04

    Decide what survives, field by field, and get it signed

    What

    A written survivorship spec: which record is master and which value wins for each field.

    Why it matters

    Default merges keep the master's value and discard the other. In HubSpot that discard is permanent.

    • Master order: has finance transactions, then open opportunities, then most related records, then oldest created date.
    • Field rules: system of record wins for billing fields. Contact data takes the most recent non-blank value, firmographics the most complete. Consent takes the most restrictive value: Email Opt Out, Do Not Email and Do Not Call are true if any record is true.
    • Business owners sign before any merge: sales for ownership, finance for billing, marketing for consent.
    • HubSpot merge rules (beta, Data Hub) encode master selection: up to 5 ordered criteria and 20 property overrides. Full spec in section 8.
  5. 05

    Pick the engine that can handle your volume

    What

    Native tools for prevention, plus a tool or Apex batch for the backlog.

    Why it matters

    At three records per merge, a few hundred thousand records is not a click-through job.

    ToolWhere it runsMatchingBest atWatch for
    Plauti Deduplicate (formerly Duplicate Check)Native managed package; optional cloud processing for big jobsRules: weighted fields, thresholdsReal-time prevention, scheduled batch jobs, Flow actions, cross-objectRules need tuning; no merge undo; quote-based, unlimited seats
    DemandTools (Validity)Web app (Elements) plus full editionRules and scenarios, exact to fuzzyMass merge with field-level survivorship; power usersLearning curve; seat-based pricing
    DataGroomrWeb app outside the orgPre-trained machine learningMessy data with no clean key; 14-day undoReview ML suggestions; from $1,195/yr, record-based
    CloudingoConnected app with indexingRules, fuzzy and exactScheduled scans, import dedupe, undoStandard $2,500/yr, Professional $6,000/yr; unlimited users
    LeanDataNative managed packageLead-to-account match, filters and tiebreakersMatching and routing new leads to the right accountA router, not a bulk merge tool
    • Four tests: does data leave the org, can it merge all three objects with field rules, can it skip flagged records, and does it log every merge. Native-only: batch Apex calling Database.merge over your Duplicate Record Sets.

    Pricing from vendor and comparison pages (DataGroomr, Apr 2026; Plauti, Jan 2026). Confirm quotes directly.

  6. 06

    Pilot on known pairs before you merge for real

    What

    Run the rules and survivorship spec on a labeled sample in a full sandbox.

    Why it matters

    False positives are permanent once merged. The pilot sets your auto-merge threshold.

    • Pull about 200 known pairs, grouped by why they match (email, name variant, domain, phone, system-created), plus a few hundred random Tier B and C matches.
    • Business owners mark each "same" or "different." Nothing auto-merges above 1% false positives.
    • Test every entry point in the sandbox: forms, imports, each integration user, lead conversion.
  7. 07

    Ring-fence billing accounts and consent records

    What

    Separate merge paths for finance-linked accounts and for any cluster with an opt-out.

    Why it matters

    These are the merges that break the books or re-subscribe someone who unsubscribed.

    • Certinia: accounts with transactions take three steps. The Accounting Merge Accounts tab validates the master plus up to two (same trading currency, documents and payment proposals Complete, not intercompany). Then the Salesforce merge (Classic). Then "Update Balances for Merged Accounts." Keep them out of the bulk tool.
    • Account Engagement (Pardot): confirm "Automatically delete or merge prospects if the corresponding records in Salesforce are deleted or merged" (on by default with AMPSEA). Prospects key on CRM ID: the losing prospect is deleted, the survivor updated.
    • Before merging, set the master's Email Opt Out to true if any record in the cluster is opted out, and check Opted Out sync behavior (default since Nov 15, 2023: "Use Account Engagement's value").
    • AMPSEA's global opt-out covers prospects with the same email, not duplicates with different emails. Reconcile against a pre-merge export.

    Gotcha: merging in Account Engagement does not merge or delete the Salesforce records. Always merge on the Salesforce side and let the connector follow.

  8. 08

    Merge in dependency order: accounts, contacts, leads

    What

    Accounts first, then contacts, then leads, one tier at a time.

    Why it matters

    Contacts, opportunities and cases re-parent to the master account. Merging contacts first can leave them on the losing account.

    • Tier A, check, then Tier B, batched at master plus two. Losers sit in the Recycle Bin for 15 days with MasterRecordId set; export them daily as your audit trail.
    • Leads that match a contact: convert into the existing contact instead of keeping both.
    • HubSpot: bulk merge needs Data Hub Professional (30,000 pairs) or Enterprise (100,000). Keep every survivor well under 250 merges, and wait 30 minutes for activity sync before spot checks.
    • Post-merger, run this inside the post-acquisition consolidation plan.
  9. 09

    Link shared-domain locations in a hierarchy, don't merge them

    What

    A parent account for the brand and a child account per independently operated location.

    Why it matters

    When agents share a brand domain, the domain identifies the brand, not the customer. Matching needs a location key.

    Parent account · Kestrel Insurance (brand, kestrel.com)Domain-only matches land here
    Kestrel · R. Ortiz AgencyLocation_Key__c AG-20417Owner: SMB territory East
    Kestrel · Lakeside AgencyLocation_Key__c AG-31108Owner: SMB territory Central
    Kestrel · Unassigned queueSignup with no location keySteward resolves within 2 days
    • Store Location_Key__c (agent code, store ID, or normalized address plus phone) as an external ID on child accounts, and capture it at signup.
    • Match order: location key, then domain plus postal code or phone, then domain only, which goes to the parent with a "needs location" task.
    • LeanData: in the Lead-to-Account Match node, add a Filter comparing the account's Location_Key__c to the lead's, use LOGIC or SOQL tiebreakers instead of fuzzy name, and the Match to Parent edge for leftovers.
    • HubSpot: when several companies share a domain, auto-association picks one for you. Exclude the brand domain and associate by location key in a workflow.
    • Keep keyed child accounts out of domain-based duplicate rules. Only the leftover queue stays manual.
  10. 10

    Keep it from coming back with a weekly queue

    What

    Prevention rules, scheduled scans and a named owner for the queue.

    Why it matters

    Without an owner and a metric, duplicate rates drift back within a quarter.

    • Move rules from Report to Alert; Block only manual account creation once false positives are under 1%. Integration users stay on Report, and a nightly job sweeps what they create.
    • Report Duplicate Record Sets by object and creation source, assigned to a data steward weekly. HubSpot rescans at least daily.
    • Dashboard duplicate rate, new duplicates by source, false positives and time to merge, reviewed monthly. More checks in our data cleanup methodology.
Best practices

Twelve rules from dedupes that stuck.The highlighted three prevent the merges you can't take back.

  • 01

    Fix the source before the backlog. Close each creation path, confirm it's closed, then merge.

  • 02

    Consent is most-restrictive-wins. Opt-outs carry to the master no matter which record wins otherwise.

  • 03

    Finance owns billing-linked accounts. Certinia accounts with transactions follow the accounting merge path, never the bulk tool.

  • 04

    Normalize into stored fields. Formula fields can't drive every matching rule; Flow-maintained fields can.

  • 05

    Auto-merge only Tier A. Exact keys merge in bulk; fuzzy matches get a sample review first.

  • 06

    Merge accounts, then contacts, then leads. Related records follow the master account.

  • 07

    Pilot on 200 labeled pairs. Set thresholds from measured false positives, not vendor defaults.

  • 08

    Export losers every day. MasterRecordId plus a pre-merge export is your only real undo.

  • 09

    One creator per object per system. If two tools can create companies, you'll get two companies.

  • 10

    Roll out Report, then Alert, then Block. Block only manual entry; never block an integration user.

  • 11

    Exclude shared and personal domains. gmail.com and a franchise brand domain both identify nobody.

  • 12

    Report new duplicates by source monthly. A rising source is a broken integration, not a cleanup task.

Common mistakes

Six dedupe mistakes and what they cost.Each one is reversible on paper and expensive in practice.

Letting the master's opt-out win

The default merge keeps the master's Email Opt Out, even if a losing record had opted out.

CostEmails to people who unsubscribed: CAN-SPAM and GDPR exposure and spam complaints.

Bulk-merging before closing the leak

The backlog clears, the integration keeps creating, and the count climbs back.

CostPaying for the cleanup twice, and a team that stops trusting the next one.

Domain-only matching on franchises

Every location under one brand domain collapses into one account.

CostWrong owner, wrong territory, and customers' usage and billing mixed together.

Standard merge on Certinia accounts

Skipping validation and the balance update after the merge.

CostLive balances stay wrong until updated, and a currency mismatch undermines accounting data.

Blocking duplicates for integration users

A Block rule returns DUPLICATES_DETECTED to the sync.

CostFailed syncs and leads that never arrive, which is worse than a duplicate.

Merging on fuzzy name alone

"J. Smith" at two companies becomes one person.

CostA permanent false merge: wrong history, wrong owner, and no unmerge in HubSpot.

Interactive calculator

Put a number on your duplicates.Four cost lines on real arithmetic, a payback period, and a summary you can paste into a business case.

Duplicate cost and payback calculator

Change any input; every output updates.

Your database

Run a Tier A report or HubSpot's duplicate tool to get a floor.

Contact tier and enrichment

Marketing contact price preset

Pro: 5,000 more contacts from $250/mo. Enterprise: 10,000 from $100/mo.

People and routing

Investment

Annual cost of your duplicates$213,960

36,000 duplicate records across four cost lines.

36,000duplicate records
3.2 mopayback on the one-time cleanup
$124,866net savings in year one

Where the money goes, per year

Rep timesearching, conflicts, wrong owner$138,000
Routing reworkleads hitting a duplicate account$54,000
Contact-tier feesduplicates billed as marketing contacts$12,960
Enrichmentcredits spent on duplicates$9,000
Business-case summary
Calculating…

Formulas: duplicates = records × rate. Contact tier = duplicates × billed share × price × 12. Enrichment = duplicates × cost per record. Rep time = reps × hours × 46 working weeks × hourly cost. Routing = leads × rate × minutes ÷ 60 × hourly cost × 12. Savings assume cleanup removes 85% of these costs, minus the yearly tool cost. Contact prices are HubSpot list add-on rates (Encharge, Oct 2026). Rep hours and fix minutes are your estimates; use your own time study.

Copyable templates

Copy the matching, survivorship and runbook specs.Three tables as tab-separated text, ready to paste into a sheet and walk through with your business owners.

Copies all three tables as tab-separated text.

AMatching rule spec

ObjectTierCriteriaMethodAction
Lead / ContactAEmail_Normalized__cExact; role emails excludedBulk merge (lead into contact: convert)
Lead / ContactBFirst Name + Last Name + (Phone_E164__c OR Account/Company)Fuzzy name, exact phoneMerge after sample review
AccountAWebsite_Domain__c + Billing Country + Name_Normalized__cExact; shared/franchise domains excludedBulk merge unless finance-linked
AccountBAccount Name + Billing Postal Code + PhoneFuzzy name, exact postal and phoneMerge after sample review
AccountCAccount Name + Billing StateFuzzySteward queue only
Account (multi-location)ALocation_Key__cExact external IDNever merge across keys; link to parent
HubSpot companyACompany domain name (root, primary)ExactBulk merge; add secondary domains

BSurvivorship spec: field-by-field winner rules

Field or decisionWinner ruleTiebreakerApprover
Master recordHas finance transactions > open opportunity > most related recordsOldest created dateRevOps + Finance
Email Opt Out / Opted OutTrue if any record is trueNone: most restrictive alwaysMarketing + Legal
Do Not Email, Do Not CallTrue if any record is trueNoneMarketing + Legal
EmailMost recent engagementBusiness domain over personalMarketing
OwnerOwner of the master accountOwner with open opportunitySales leadership
Billing address, payment terms, taxBilling system of recordFinance decides manuallyFinance
Phone, title, mailing addressMost recently updated non-blankMost complete recordRevOps
Industry, employees, revenueEnrichment source of recordMost complete recordRevOps
Lead Source / Original SourceOldest valueKeep both in a notes fieldMarketing
Lifecycle / Lead StatusFurthest stageMost recent changeMarketing + Sales

CDedupe runbook checklist

PhaseCheckOwnerDone when
BeforeEvery creation path listed; one creator per objectRevOpsNew duplicates by source trending to zero
BeforeFull export of all objects, opt-out fields and IDs storedRevOpsFiles archived with date
BeforeSurvivorship spec signed by sales, finance and marketingRevOps leadWritten approval on file
BeforeCertinia-linked accounts and opted-out clusters flagged and excluded from bulk runsFinance + Marketing opsExclusion field populated
BeforePilot on ~200 labeled pairs in a full sandboxData stewardFalse positives <1% for auto-merge tier
DuringAccounts, then contacts, then leads; Tier A before Tier BRevOpsEach batch log reviewed
DuringLosers exported daily with MasterRecordIdRevOpsAudit file per batch
AfterOpted-out emails reconciled against the pre-merge exportMarketing opsZero opt-outs lost
AfterCertinia balances updated for every merged masterFinanceBalance update emails confirm success
AfterDuplicate rules moved Report > Alert > Block (UI only)Salesforce adminWeekly steward queue live
FAQ

What RevOps and marketing ops leaders ask first.Direct answers, current as of October 2026. Click a question to open it.

We have a few hundred thousand records after a merger. Plauti, DemandTools, DataGroomr or Cloudingo?

Start from constraints. Data can't leave the org: Plauti, which runs natively. Power users who want field-level survivorship: DemandTools. No clean match key: DataGroomr's machine learning. Tight budget with scheduled scans: Cloudingo. Whichever you pick, run the 200-pair pilot from step 6 on your own data before you sign.

How do Pardot (Account Engagement) opt-outs behave when we merge leads and contacts?

With "automatically delete or merge prospects" on (the AMPSEA default), a Salesforce merge deletes the losing prospect and updates the survivor. The survivor's opt-out is whatever the merged Salesforce record holds, so set Email Opt Out to true first if anyone in the cluster opted out, then reconcile against a pre-merge export.

Do we merge accounts that have Certinia transactions, or exclude them?

Merge them, but only through Certinia's three-step process: validate in the Merge Accounts tab, merge in Salesforce, then run Update Balances. Accounts in different trading currencies, with incomplete documents or payment proposals, or tied to a company (intercompany) fail validation. Leave those for finance to resolve by hand.

We turned off company creation in our sequencing tool and HubSpot still creates duplicate companies. Why?

Something else is creating them. Usually it's HubSpot's "Create and associate companies with contacts" setting, which makes a company per email domain and treats subdomains as separate. Next most likely: another integration (API-created companies skip domain dedupe) or imports without a domain. Record source detail 1 on the duplicates tells you which.

Independent agents share our customer's brand and email domain. How should the data model work?

Make the brand a parent account and each location a child account with a location key, such as an agent code, store ID or normalized address plus phone. Capture that key at signup and match on it first. Domain-only matches go to the parent and a steward queue, so the manual part shrinks to the leftovers.

Can we undo a merge?

Not in HubSpot: merges are permanent, and conflicting values from the losing record aren't stored. In Salesforce, merged records sit in the Recycle Bin for 15 days, but the merge itself can't be reversed cleanly. Your real undo is a pre-merge export plus a daily export of losers with their MasterRecordId.

How do we build a business case when budget is tight?

Price what duplicates already cost (contact-tier fees, enrichment, rep hours, misrouted leads), compare it to cleanup and tool cost, and show payback in months. The section 7 calculator writes the summary for you. Post-merger, we run dedupe inside a roughly 12-week add-on integration rather than as a separate project.

How JayOh does it

We fix the system that makes duplicates, then clear the backlog.A JayOh pod of RevOps architects, Salesforce and HubSpot developers and a data engineer runs dedupe in sprints, sources first and merges last.

01

Source audit before any merge

We trace every duplicate pair to the integration, import, form or setting that made it, and close those paths first.

02

Survivorship your business owners sign

Sales, finance and marketing approve the master and field rules in writing before a single record merges.

03

Finance and consent ring-fenced

Billing-linked accounts follow the accounting merge path. Opt-outs are carried over and reconciled after every batch.

04

Rules that respect hierarchies

Locations, brands and business units are linked rather than merged; real duplicates still merge.

05

A warehouse view across systems

When CRM, billing and ERP all hold customers, we map duplicate lineage in a warehouse such as Snowflake before deciding what merges.

06

A playbook you reuse per acquisition

For buy-and-build companies, dedupe becomes a standing capability that runs on every add-on, not a one-time project.

4→2Platforms consolidated post-merger in 90 days
300+Hours of data cleansing and migration in that consolidation
90%Reduction in data errors
75+CRM migrations delivered

Plan your dedupe before the first merge you can't undo.

We'll review your creation paths, matching rules and survivorship spec, and show you which leak to close first.

Get in touch