Skip to main content
โ† Back to Blog

August 14, 2026

Deduplicating HubSpot Without Destroying Your Attribution

Merging duplicates overwrites original source and first-touch data if you let it. The merge rules we set before touching a single record.

By Ian Phillips, Founder & CEO, Phillips Data Solutions

Deduplication looks like a data-hygiene job and turns into an attribution problem the moment you press merge. HubSpot picks a surviving record, and unless you've decided in advance which fields survive with it, the original source, first-touch campaign, and create date of one of your two records are gone.

That data is what your reporting is built on. This is the sequence we use to avoid trading duplicates for a broken funnel report.

Why the default merge is the wrong default

When HubSpot merges two contacts, the primary record wins most conflicts and the secondary's activity is folded in. Reasonable behavior, wrong outcome for two specific field classes:

  • Original source and first-touch attribution. The correct value is almost always the older record's. Default behavior may hand you the newer one, which is the form fill that created the duplicate in the first place โ€” so every merged contact starts looking like it came from whatever channel generated the duplicate.
  • Create date. Lose the earlier one and your cohort and time-to-close reporting shifts.

Meanwhile the opposite rule applies to engagement fields. Last activity date, lifecycle stage, and owner should come from whichever record is more recent, because that's the live relationship.

So one blanket rule can't be right. You need two, applied per field class.

The rules we write down before touching anything

Written and approved by whoever owns the reporting, not decided mid-merge:

  1. Oldest record wins for original source, first-touch campaign, create date, and any original-attribution property.
  2. Newest activity wins for lifecycle stage, last contacted, owner, and engagement scores.
  3. Non-empty beats empty, always, for firmographics and contact detail.
  4. Longest-standing email is the primary identifier, with the other kept as a secondary email so inbound replies still match.
  5. Anything ambiguous doesn't auto-merge. It goes to a review list.

Rule 5 is the one that saves you. Most dedupe disasters are a confidence threshold set too loose.

Companies before contacts

Merge companies first. Contacts inherit the surviving company association, so doing it the other way round means re-associating the same contacts twice and generating a second wave of activity noise.

The fuzzy-match cases that matter

Exact-match dedupe finds the easy ones. The duplicates that actually distort reporting are:

  • Acme Corp vs Acme Corporation vs ACME
  • Same domain, different capitalization on the email local part
  • A form fill that created a new record because the email had a trailing space
  • Personal-email versions of the same human alongside their work address

Domain is the strongest company signal; for contacts, normalized email is stronger than name. Name-only matching on companies will merge two genuinely different firms with similar names, which is unrecoverable in practice.

Snapshot first, always

Before any merge runs: export the affected records with every attribution field included, and keep it. HubSpot's un-merge window is limited and doesn't cover everything. A CSV in cloud storage costs nothing and is the only real undo.

We also log every merge with both source record IDs, so "why does this contact say it came from paid search" is answerable in a minute rather than a guess.

Then close the door behind you

A one-time cleanup decays. Duplicates come from the same three places every time:

  • Forms that don't match on email because of case or whitespace โ€” normalize on the way in.
  • Imports without a dedupe key โ€” never import without one.
  • Integrations creating records rather than updating them, usually because the matching field isn't set.

Fixing intake is what makes the cleanup hold. Otherwise you're booking the same project again next year.

The order, in one list

  1. Profile the damage: duplicate rate per object, and which fields are at risk.
  2. Write the merge rules, get them approved.
  3. Export a full snapshot including attribution fields.
  4. Merge companies, review queue for anything below threshold.
  5. Merge contacts, same threshold discipline.
  6. Normalize intake so it doesn't recur.
  7. Re-run the profile and compare against step 1.

Step 7 is how you prove it worked. Without a before number, "the CRM is cleaner" is an opinion.

We ran this at scale on a database of 300,000+ contacts and 90,000+ companies โ€” the case study has the shape of it, and the HubSpot data cleanup page covers what a cleanup engagement includes.

If you want to know how bad yours actually is, pull a duplicate report and a field-coverage export โ€” about ten minutes of work โ€” and bring them to a discovery call.

Free checklist

CRM Data Cleanup Checklist

The exact sequence we use to take a CRM from dirty to trustworthy โ€” dedupe, standardize, enrich, and keep it clean automatically.

Instant access โ€” no spam, unsubscribe anytime.

Get a free CRM data quality assessment

Weโ€™ll profile your CRM for duplicates, dead records, and missing fields โ€” and show you what clean data is worth in pipeline terms.

Book My Free Data Assessment