Blog
Productivity

How to deduplicate before, during and after a CRM migration

9
min read
Records moving from one database to another through merge, filter and protect steps

Table of contents

Talk to sales
Try for free
View as Markdown

TL;DR

  • A migration moves legacy data from one or more sources into a new, mostly empty CRM.
  • Sources can be CRMs, spreadsheets or both, and each one brings its own duplicates.
  • Before the first import, pick the field that identifies each record, like email or domain.
  • If new duplicates appear after go-live, merge them automatically as they come in.
  • Dedupely cleans every source, from CRMs to spreadsheets, before, during and after the migration.

A CRM migration brings records from systems that never checked each other into one database. Duplicates in each source move too, and new ones form wherever the same customer exists on both sides. The safest order is to clean each source first, agree on the field that identifies each record, and check again once the data lands. If you've already migrated and the new CRM is full of duplicates, you can still fix it with a few extra precautions. In this post, you'll see why migrations create duplicates, what to do at each stage, and how to merge two CRMs after an acquisition.

Why CRM migrations create duplicates

Every migration is different, but a few situations come up in most of the ones I've seen:

  • Two systems that never checked each other: a customer in both the old CRM and the new one arrives twice, once from each side.
  • Different IDs: every system has its own record IDs, so the old ID means nothing to the new CRM. Without a shared key, the import can't tell two records belong to one customer.
  • Field mapping: an email in a secondary field, a phone in another format, or a split company name stops matching once mapped.
  • Imports without an identifying field: rows with no email, domain or ID usually become new records instead of updating existing ones.
  • Duplicates already in the source: whatever the old CRM held, the new one inherits.

Built-in deduplication also behaves differently on bulk loads. In one CRM, duplicate rules show no alert on imports and API loads, and matching rows just aren't saved, so check what was rejected after each load. In another, import rows with no email, domain or record ID become new records, and companies created through the API aren't checked by domain.

As of October 2026, from Salesforce Help: Duplicate rules and HubSpot's knowledge base: Deduplication of records.

Clean the data before you move it

Cleaning in the old system is easier than cleaning in the new one. Nothing in the new CRM depends on those records yet, and no workflows, sequences or reports run on them.

Deduplicate each source on its own first

Clean inside each system before you compare them. If a customer appears three times in the old CRM and twice in the new one, merge each side first. Then you're matching one record against one.

Then match the two systems against each other

Export both systems and match them on the fields you trust most. Email for people and website domain for companies are common starting points. Phone, name with company, and address help when those are missing.

Merge the matches you're most certain of first. Review near matches, such as the same name at the same company with a different email, before deciding.

29% of teams had relied on manual merges or cleaning spreadsheets before imports.

Source: Dedupely call research

Decide which value wins

When the same customer exists in both systems, each record holds part of the truth. Decide per field which wins: the newest value, the most complete one, or the one from the system you trust there.

Owner, lifecycle stage and email opt-out deserve the most attention. A wrong owner starts a commission dispute, and a lost opt-out means emailing someone who asked you to stop.

Leave behind what you don't need

Test records, bounced contacts and companies with no activity in years don't have to move. Every record you leave behind is one fewer to match. Keep an archive export in case someone asks for them later.

Agree on the field that identifies each record

Before the first import, agree on the field that says "this is the same record" for each object. Your imports, integrations and forms should all use it.

Object Common field Watch out for
People (HubSpot Contacts, Salesforce Contacts and Leads, Pipedrive People) Email Shared inboxes such as info@ or sales@, and people with both a personal and a work email
Companies (HubSpot Companies, Salesforce Accounts, Pipedrive Organizations) Website domain Country domains for one company, and subsidiaries or branches that share a domain
Deals and opportunities The old system's record ID, kept in a field Deals linked to people or companies that were merged during the cleanup

Carry the old system's record ID into a field on every migrated record, whatever the object. It's your link back to the source once the record has a new ID. It also lets a second import update records instead of creating new ones.

Keep duplicates out during the move

Most duplicates that form during a migration come from the same record arriving more than once. These principles help:

  • Load a test batch first, then look for duplicates in the new CRM before loading the rest.
  • Import in order: companies before people, and people before deals, so each record links to one that already exists.
  • Keep a list of the forms, syncs and integrations that write to the new CRM during the cutover.
  • Run every import on the field you agreed on, so a second pass updates records.
  • Avoid two-way syncs between the old and new CRM unless you've decided which side owns each field.

Merging two CRMs after an acquisition

Bringing two companies' CRMs together adds problems a single migration doesn't have. Both sides hold real, active records for the same customers, often with different owners and different histories.

  • Decide which system is the source of truth for each object, or for each field.
  • Agree on ownership before merging, including which rep keeps an account both teams worked.
  • Keep regional offices and subsidiaries apart when they share a name or a domain. A broad match on name can merge them into one record.
  • Map the two sets of stages, picklist values and naming conventions before you match.

These are business decisions as much as data ones. Get sales leadership to agree on ownership before the first merge.

If you already migrated with duplicates

Teams often find the duplicates weeks after go-live, when reports count customers twice or two reps call the same person. The data can be fixed. The difference is that the new CRM is live now, so every merge touches running work.

Find what's still creating them

Look for a sync still running from the old system, an import repeated by mistake, or a form that skips the field you agreed on. Knowing these sources tells you which new records to watch.

You can clean while they keep running. Merge the backlog in stages, and merge new duplicates automatically as they come in.

Find them by where they came from

Migrated records usually share a creation date or an import batch. Searching on the old system's ID or the import date narrows the work to the records most likely to be duplicated.

Check what depends on record IDs

Merging can change record IDs. In one CRM, the merged record gets a new ID. In another, the surviving record keeps its ID and the others go to the Recycle Bin for 15 days.

Any integration, report or spreadsheet that stores IDs needs updating after a large merge.

As of October 2026, from HubSpot's knowledge base: Merge records, and Salesforce Help: Account merge considerations and Recycle Bin.

Merge in stages

Start with the duplicates you're surest of, such as the same email or the same old record ID. Keep the original values before each round, since merges in many CRMs can't be undone.

As of October 2026, from HubSpot's knowledge base: Merge records, and Pipedrive's support center: Merge duplicates.

How to clean a CRM migration with Dedupely

You can upload both systems' exports to Dedupely as spreadsheets with matching headers, find duplicates across them, and export one clean file to import. After the move, you build duplicate searches in the new CRM, set rules for which value wins and send unclear sets to review. New duplicates can be merged automatically as they come in, while your syncs and forms keep running (more in how to plan a CRM deduplication project in 3 phases). The How to Dedupe Before and After a CRM Migration playbook walks through each step.

Check your migration data for duplicates

Plan deduplication into the migration

Migration duplicates come from each source and from customers who exist on both sides, so deduplication deserves its own time in the plan. Clean sources and one agreed field for identifying each record do most of the work before the first import.

If the new CRM already holds duplicates, the same principles apply to live data. You find them by where they came from, check what depends on record IDs, and merge in stages while the sources keep running.

Frequently asked questions

Why does a CRM migration create duplicates?

Because the import can't always tell that two records are the same customer. The old and new systems use different IDs, fields map differently, and rows without an email or domain often become new records. Duplicates already in the old CRM move across too, and customers present in both systems arrive twice.

Should you deduplicate before or after a CRM migration?

Before, and then again after. Cleaning in the old system is safer because nothing in the new CRM depends on those records yet. Check again after the first test load and after go-live. That catches records imported twice or created by forms and syncs during the cutover.

How do you merge two CRMs without losing data?

Decide which system is the source of truth for each object or field. Then match the two systems on shared identifiers such as email and domain. For each field, agree on which value wins. Keep an export of the original values and the old record IDs before merging, because many CRM merges can't be undone.

Which field should identify each record when you migrate CRM data?

Email for people and website domain for companies are the most common choices. Also carry the old system's record ID into a field on every migrated record. It links each record back to its source and lets a second import update existing records instead of creating new ones.

How do you fix duplicates after a CRM migration?

Find what is still creating them, such as a running sync or a repeated import, and clean while they keep running. Search for duplicates by import date or old record ID, merge the most certain matches first, and review near matches. Update every integration and report that stores record IDs, since merging can change them.

Portrait of Gaby Salinas

Behind the article

Gaby Salinas

Marketing Assistant at Dedupely

Gaby Salinas came to CRM data from marketing and advertising, so she looks at duplicates from two sides: the match and merge logic behind them, and what they do to the people using the CRM, like the rep who calls a customer twice, the admin who gets blamed and the cleanup nobody wants to start.

As Marketing Assistant at Dedupely, she follows how RevOps teams, end users, consultants and technical teams actually work with their data: the records they stop trusting, the workarounds they build and the moment they finally decide to clean up. What she finds shapes most of what Dedupely publishes.

Connect with Gaby on LinkedIn

Contact us

We’d be happy to help you get this set up.

Write us a message

We probably know the answer to your question already

Email copied to your clipboard!

Book a Zoom

Whether you’re getting started or getting intense.
Get in touch!

Get started for free

20 free trial merges and as much free support as you need to get your duplicates under control.

"Superior deduping logic with excellent support - highly recommend for cleaning up messy HubSpot records."
M Weppner

M Weppner

Running CRM cleanup for clients? See the Partner Program

Skip to content