How to dedupe CRM contacts

First, use what your CRM ships with: Salesforce duplicate rules and HubSpot's Manage duplicates both catch obvious pairs. For the backlog they miss, the workflow that works is export → clean → re-import: export contacts to CSV, dedupe on the email column with the contacts tool (in your browser, nothing uploaded), and re-import. Name variants email misses are a job for the API's fuzzy matching.

Start with the CRM's own tools

Salesforce has duplicate and matching rules (Setup → Duplicate Rules) that warn or block on create. Those are good for stopping new duplicates, less useful for the thousands already in there. HubSpot's Manage duplicates suggests likely pairs to merge one at a time. Run these first; what's left is the long tail of formatting variants they don't catch.

The export → clean → re-import workflow

  1. Export your contacts to CSV (Salesforce: a Contacts report → Export; HubSpot: Contacts → Export). Include email, first/last name, and whatever you'll need to re-import. Record IDs make the round trip safer.
  2. Dedupe in the contacts tool: select the email column, run it, and check the removed count. For name variants ("Smith, Jane" vs "jane smith" vs "Jane Smyth") run a second pass through the API's fuzzy matching with the threshold at 0.88.
  3. Re-import the cleaned CSV, using your CRM's update-existing/dedupe-by-ID option so the import itself doesn't recreate what you removed.

Ground rules

Keep the exported CSV as your backup until the re-import is verified. The first occurrence is always kept and rows are only removed, never merged. If you need field-level merging, do that in the CRM afterwards on the (much shorter) remaining list. The email pass is processed locally with no CRM integration, so no third party sees your contact data, which is usually the blocker with connected dedupe services. The fuzzy pass is the documented exception: it runs server-side through the API (pairwise comparison froze browser tabs), handles up to 50,000 rows per request, and nothing sent to it is stored.

FAQ

Frequently asked questions

How do I dedupe existing contacts in Salesforce or HubSpot?

Native duplicate rules mostly catch new records at entry; for the backlog, the reliable workflow is export → clean → re-import: export contacts to CSV, dedupe on the email column, and re-import the cleaned file. Name variants that email misses are what the API's fuzzy matching is for.

What fuzzy threshold should I use for contact names?

Start at 0.88. The 0.85 to 0.92 band works for names: lower catches more variants but risks merging different people, and 1.00 means exact-after-normalization. Always review the removed count before re-importing.

Will my contact data be uploaded to your server?

Not by the browser tool: normalization, matching, and the cleaned CSV all happen locally, and no CRM integration or OAuth access is requested. The optional fuzzy pass is different, deliberately: it goes through the API, so you are choosing to send those rows over HTTPS, and nothing you send is stored.

How big a list can the fuzzy matcher handle?

Up to 50,000 rows per API request, the same ceiling as the paid plans' per-request cap. It no longer runs in the browser, where the pairwise comparison froze the tab. Exact-match dedupe in the browser handles hundreds of thousands of rows without breaking a sweat.

Last updated