Deduptio

How to prevent duplicates in Attio

The short answer

Every duplicate was written by something. There are six things that write records into an Attio workspace, and each one has its own fix — a mapped unique attribute, a paused sync, an assert instead of a create. Close them in order of volume: imports first, email sync second. Prevention keeps the number from growing; it never reduces it.

Prevention is a write-path problem, not a data problem

The usual instinct is to treat duplicates as a mess to be tidied, run a cleanup, and be surprised when the backlog is back in a quarter. It comes back because the cleanup did not touch the thing that created it. A duplicate is not a defect in your data; it is the output of a write path that had no way to recognise the record already existed.

So the useful question is not "how do I stop duplicates" but "what writes records into this workspace, and which of those writes can tell an existing record from a new one". In practice there are six, and they are not equally dangerous.

Write pathWhy it duplicatesThe fix
CSV importNo unique attribute mapped, so Attio has nothing to match rows againstMap email or domain as the unique attribute before importing
Email & calendar syncCreates people and companies from message participants, unconditionallyScope it, and pause it during imports and migrations
Forms and lead captureA personal address arrives where the workspace holds a work addressSearch before create; treat a form as a lead, not as a person record
Integrations and automationsA create step that runs on every triggerCreate-or-update on a unique attribute, or a search step first
Your own API writesCalling create when you meant "make sure this exists"Assert with a matching attribute
PeopleSomeone types a name rather than searching for itConvention and a fast scan loop — there is no technical fix

1. Imports: map the unique attribute

A single unmapped import is the largest duplicate event most workspaces ever have, because it duplicates an entire object in one action rather than one record at a time. Attio will match rows against existing records if you tell it what to match on; give it nothing and every row becomes a new record.

Map email address for people and domain for companies, and do it before the import runs rather than discovering it afterwards. Full detail, including what to do when the import has already landed, is in duplicates from a CSV import.

2. Email sync: the one that runs while you are not looking

Attio can create person and company records from inbound mail. That is a feature — it is most of why the activity history is worth having — but it is also a write path with no judgement: anyone who emails anyone becomes a record, whether or not a record for them already exists under a different address.

Two habits keep it from being a problem:

3. Forms and inbound lead capture

A form is a write path that lets a stranger choose the identifier. Someone who exists in your workspace as rachel@acme.com signs up with a personal address, and exact matching on email — the strongest signal a person record has — has nothing to match. This is not preventable by configuration; it is preventable by design:

More on why people duplicate specifically, and which secondary signals hold when email moves, is in find duplicate people in Attio.

4. Integrations and automations

Zapier, Make, an enrichment tool, a sequencer — anything with a "create record in Attio" action will happily create a second one on every trigger. Both Zapier and Make expose create-or-update actions against Attio, and enrichment platforms such as Clay upsert on a unique attribute rather than creating blindly. Use them, and audit the automations you set up before you knew to.

The important caveat: this governs only the records flowing through that automation. It has no effect on imports, on email sync, or on the human typing into Attio. See Zapier and Make dedupe and Clay for where each line actually falls.

5. Your own API writes: assert, do not create

If you write into Attio from a script, a webhook or a backend service, the highest-value single change is to stop calling create. Asserting with a matching attribute updates the record already holding that email or domain, or creates one if nothing matches — and it does so atomically, so two concurrent writes cannot both conclude the record does not exist yet. The endpoints, the costs and what the API will not do for you are in Attio duplicate detection with the API.

6. People

The one with no technical fix. Someone in a hurry types "Acme", does not see the existing "Acme Ltd", and creates it. Two teammates add the same account within a week. The realistic answer is not a policy nobody reads: it is making the duplicate visible quickly enough that whoever created it is still around to say which record is right.

What unique attributes cannot do

Everything above is exact matching, and it is worth being clear about where exact matching stops:

What prevention cannot do

This is the part worth saying plainly, because a workspace that has just fixed all six write paths still has exactly as many duplicates as it did yesterday. Prevention governs future writes. It does not merge anything, it does not look backwards, and asserting on email will never join two records that already exist under two different emails.

The realistic model is a floor and a rate. Prevention lowers the rate at which new duplicates arrive. A cleanup pass lowers the floor. You need both, and doing the cleanup first without the prevention is how a workspace ends up being cleaned twice.

The order to do this in

  1. Fix imports first. Highest volume per incident, and the fix is one mapping in a dialog you are already in.
  2. Scope email sync, and pause it before any migration or bulk load.
  3. Audit every automation with a create-record step and switch it to create-or-update.
  4. Assert in your own code, everywhere records are written.
  5. Then clean up what is already there — and only then, because a cleanup run before step 2 gets re-dirtied by the sync you had not paused.
  6. Put a recurring scan on it, so the ones that get through the six paths surface in days rather than at the next audit.

Where Deduptio fits

Deduptio is not prevention, and it would be dishonest to sell it as such: it does not sit in front of Attio's write path and it cannot block a record being created. What it does is make the gap between a duplicate arriving and someone seeing it small enough that prevention gaps stop compounding.

Automation is a Pro feature; the details are in the automation documentation, and rule design is in rules and scanning.

Find out what got through

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