All posts

Why Your CRM Keeps Creating Duplicate Leads From Forms, Imports and Enrichment

··4 min read

Duplicates appear because each way into the CRM matches records differently. In HubSpot, contacts are matched on email, so the same person with a personal address on a form and a work address from an enrichment tool becomes two records. Companies created by the API or a sync app aren't matched on domain at all. The fix is a fixed matching order applied before records are created, plus a review queue for anything uncertain.

An r/gtmengineering post asked how teams handle duplicates when leads come from forms, imports and other sources: email match, several fields, or manual review. Here's what HubSpot's own docs say (pages updated September and October 2026), and the order that works across sources.

How HubSpot matches records

From HubSpot's deduplication of records article (updated 2 October 2026):

Entry path Contacts Companies
Created manually Blocked if the email already exists Not covered in that article
Form submission Matching email updates the existing contact n/a
CSV import Matching email updates mapped properties; record ID can be used Matched by primary and secondary domain, or a custom unique property
API and sync apps Email is unique across contacts Not deduplicated by domain; sync apps may use their own rules

And what isn't deduplicated: contacts without an email (or another unique identifier) are imported as new records on each row, and companies without a domain are too.

The five gaps that create duplicates

  1. Different addresses for the same person. A webinar signup with a Gmail, an enrichment tool with the work address, an old address from a previous job. Email matching sees three people. Our guide to finding duplicates with different emails covers matching those by name and company.
  2. Unnormalised emails. Jane.Doe@Acme.com with a trailing space, or a Gmail address with dots and +tags. Lower-case and trim everything. For Gmail, dots and plus duplicates explains which variants are the same inbox.
  3. API-created companies. If a sync or enrichment tool creates companies, HubSpot doesn't stop it creating acme.com twice. The tool has to search by domain before creating.
  4. Leads with no email. Phone-only or LinkedIn-only leads from a data tool import as new rows every time. Give them a unique property (LinkedIn URL works) and import against it.
  5. Ambiguous matches on import. If several existing contacts already share an email with an imported row, HubSpot says "you'll receive an import error and that contact won't be imported". That's a sign the duplicates are already there.

One more trap from the same article: secondary emails. A form submission, or an import with both a secondary email and a record ID column, can replace the contact's primary email. If you import with a secondary email column, leave out the record ID column so the primary isn't overwritten.

A matching order that works across sources

Apply this in your intake step (a workflow, Zapier, Make, Clay or your own code) before anything is created:

  1. Normalise the email. Trim, lower-case, strip mailto:, and split cells with two addresses.
  2. Verify it. An invalid address shouldn't create a record at all, and a typo like gmial.com creates a duplicate of a real person. Run the check before the match, not after.
  3. Match on email. Exact match on the normalised address updates the existing record.
  4. Match on a stable ID. CRM record ID when you're re-importing your own export, otherwise a LinkedIn profile URL or the source tool's person ID, stored in a unique property.
  5. Flag, don't merge, on fuzzy matches. Same first and last name plus the same company domain goes to a review list. Two people called Chris Lee at a 5,000-person company are common.
  6. Pick a winner per field, not per record. For example, the form wins for consent fields, the enrichment tool wins for title and the newest verified email wins for the email. Our guide to merging lead lists shows how to set source priority in a spreadsheet first.

Cleaning up the duplicates you already have

HubSpot's Manage duplicates tool is under More > Data Management > Data Quality, on the Manage Duplicates tab (article updated 5 September 2026). Before you merge in bulk:

  • Merges are permanent. HubSpot: "it is not possible to unmerge them."
  • The secondary record's email is kept as a secondary email on the merged contact. If that address is dead, remove it after the merge, or future form fills can bring it back.
  • There's a cap. Records involved in a combined 250 or more merges can't be merged again.
  • Verify the surviving email. If the merged record keeps the older address, sends bounce. Check the primary email of each merged contact before the next campaign.

Where SimpleVerifier fits

Verification is step 2 of the matching order: it stops invalid and mistyped addresses becoming records, and it tells you which of two addresses on a duplicate pair still works. Export the contacts, check them in bulk on the verify page, and use the duplicate contact finder to spot pairs before you import. For HubSpot directly, the HubSpot integration writes valid, risky or invalid to an sv_status property you can filter on. The first 100 checks are free with a Google sign-in. Pro is $39 a month with the first 100,000 checks a month at full speed, then slower, never cut off, and one-time packs of 10,000 checks for $15 never expire. See pricing.

Common questions

How does HubSpot prevent duplicate contacts?

It uses the email address. Manually creating a contact with an email that already exists is blocked, a form submission with a matching email updates the existing contact, and an import updates matching contacts' mapped properties. Contacts without an email, or without another unique identifier in an import, are created as new records.

Why does HubSpot create duplicate companies?

HubSpot matches companies by primary and secondary domain during imports, but its documentation says companies created through the API, including by installed third-party sync apps, aren't deduplicated by the Company domain name property. If an enrichment or sync tool creates companies, it needs to search for the domain first.

Should I auto-merge duplicate leads?

Only on exact identifiers such as the same normalised email or the same CRM record ID. Name and company matches are often different people, and HubSpot says merges can't be undone, so send those to a review queue.

What's the best field to match leads on?

A normalised email address first, then a stable external ID such as the CRM record ID or a LinkedIn profile URL, then name plus company domain for review only. Email alone misses the same person at a personal and a work address.

Check your list before you send

Real mailbox checks over SMTP, and nothing is sent to the address. Sign in with Google and your first 100 email checks are free, no card. Plans for bigger lists are on the pricing page.