Deduptio

Duplicates after a HubSpot to Attio migration

The short answer

Turn off mailbox auto-creation before you import, load companies before contacts before deals, and map domain and email as the matching attributes. If the import has already run, do not re-import — clean the live records with an exact-match pass, then a reviewed fuzzy pass.

The four sources of duplicates in this migration

SourceWhat it looks like afterwardsPrevented by
Email sync creating records mid-importA person record created from an inbound email at 10:04 and the imported one at 10:06, differing only in which fields are filledDisabling mailbox auto-creation until the migration is finished
No unique attribute mappedEvery row created; the object roughly doubles on a re-runMapping domain and email in the import — see CSV import duplicates
HubSpot's own duplicatesTwo contacts for one person, faithfully reproduced in AttioCleaning in HubSpot first, or accepting one cleanup pass in Attio afterwards
Wrong load orderCompany records auto-created from contact associations, sitting next to the ones the company import createdCompanies, then contacts, then deals

How the objects map

HubSpot Contacts become Attio People, HubSpot Companies become Attio Companies, and associations carry across so people link to their companies. Deals map to Attio's Deals object. The important asymmetry is that CSV imports do not carry notes and tasks — those need a migration tool or the API — so immediately after the import your records have fields but not much history.

That changes how you pick a survivor. "Keep the record with the most activity" is the right rule in a mature workspace and the wrong one on migration day, when the record with activity is the one email sync created by accident and the record with the data is the one you imported. Prefer the imported record and let the activity move onto it.

If you have not imported yet

  1. Turn off mailbox auto-creation. This is the single highest-value step, and it is the one most people find out about afterwards.
  2. Dedupe in HubSpot first, or at least know what its duplicate count is. Whatever you leave behind arrives with you.
  3. Normalize the export. Lowercase and trim emails; strip protocol, www. and trailing slashes from domains.
  4. Load companies, then contacts, then deals, mapping domain and email as the unique attributes at each step.
  5. Import twenty rows first and look at the result before running the full file.
  6. Turn mailbox sync back on last, once the workspace already contains the people it is about to see in your inbox.

If the import has already happened

Re-importing will not help — Attio's importer creates and updates but never deletes. Clean the live records, in two passes:

  1. Exact pass. Same email for people, same domain for companies. This catches the email-sync collisions and the double-run rows, and it is safe to merge in bulk after a sample check.
  2. Reviewed pass.Fuzzy company name plus one exact signal; person name plus company or phone. These are HubSpot's inherited duplicates and the records that arrived without an identifier, and they need eyes on each group.

Do companies before people. Person matching gets better once the company records are unique, because "same name at the same company" only means something when the company is one record — the mechanics are in cross-object matching. Then do deals last, since they reference both.

Finish with the lists: merging records that shared a list leaves the survivor in it twice.

What to check when it is done

Scan the new workspace before anyone starts selling in it

Connect your Attio workspace, write one match rule, and run a scan. Scans are read-only — you see every group and the reason it matched before anything is merged.

Start a free Attio duplicate scan

Related