Matching rules
Decide what counts as a duplicate and what happens to it — built-in rules, your own rules, actions, and field clean-up.
Matching rules decide what counts as a duplicate. Find them at Settings → Matching rules, with separate rules for Companies and People. Everyone can see them; only workspace admins can change them.
A rule fires when all of its conditions hold. A pair of records is flagged as a duplicate when any enabled rule fires, and each rule decides what happens next: send the pair to review, auto-merge it, or rule it out. Every scan — and live monitoring — uses these rules.
Built-in rules
DeDupe ships with rules that work well for most workspaces:
| Companies | People |
|---|---|
Similar domain (acme.com vs acme.co) | Similar email |
| Similar company name ("Acme Inc" vs "Acme, Inc.") | Same phone number |
| Same LinkedIn profile | |
| Same Twitter handle | |
| Similar name | |
| Same name + company | |
| Same name + work email domain |
For each built-in rule you can:
- Switch it on or off.
- Set how strict it is. Similarity conditions have an at least N% similar slider; exact ones (phone, LinkedIn) must be identical.
- Weight its conditions, for rules with more than one — how much each counts toward the rule's score.
- Choose its action — see Rule actions.
- Reset it to the default.
Same name + work email domain ignores free email providers (Gmail, Outlook, Yahoo and so on): two different John Smiths who both use Gmail share nothing meaningful.
You can't change which fields a built-in rule compares, and new built-in rules reach your workspace automatically.
Custom rules
Add your own rules on the Custom rules tab. A custom rule is one or more conditions that must all hold, for example:
- Same LinkedIn profile and same phone number
- Similar name and same job title
- Similar company name and same location
For each condition, pick a field and an operator:
| Operator | Holds when | Example |
|---|---|---|
| matches | the two records' values match, by the comparison you pick | same LinkedIn profile |
| is different | both records have a value and they don't match | a different company |
| matches pattern | a value matches a pattern, on both / either / neither record | domain matches \.acme-group\.com$ on both |
| is empty | the field is empty on both / either / neither record | location is empty on either |
Comparisons only offer what can actually find duplicates (emails and domains are always compared by similarity, because Attio never lets two records share the exact same one). Patterns test the values as stored in Attio, before field clean-up, and ignore upper/lower case. Start from a blank rule or one of the suggested templates.
Your own Attio fields
Besides the built-in fields, conditions (and field clean-up and guardrails) can use your workspace's own Attio attributes, listed under Your Attio fields: a HubSpot or Salesforce ID, an account number, a region code. They compare as exactly the same or similar text. No re-sync is needed; DeDupe reads them from the records it already has.
Combining rules and conditions
- And — conditions inside one rule must all hold.
- Or — separate rules: a pair is flagged when any rule fires. To flag "same LinkedIn or same phone", make two rules.
- Not — set a condition to is different to require the two values to differ: similar name and a different job title. An "is different" condition only holds when both records have a value for that field, so a missing value never counts as different. Every rule needs at least one condition that matches — "is different", "matches pattern" and "is empty" narrow a rule down; they can't find duplicates on their own.
Rule actions
Every rule, built-in or custom, has an action:
- Send to review (the default).
- Auto-merge, at any confidence or only above a minimum — subscription only.
- Never flag it — pairs the rule matches are marked not a duplicate, even when other rules match them. For example, similar name and a different company → never flag it.
Preview on pending pairs shows what a rule would do to your queue before you save. Guardrails, limits and close calls live on the Automation tab. See Automate merges.
Field clean-up
Clean-up runs before any rule compares values, so it improves every rule at once. It changes only what's compared — the values in Attio, and what gets merged, stay exactly as they are.
| Clean-up | Example |
|---|---|
| Ignore part of a field | Middle names ("Jane Marie Doe" = "Jane Doe"), titles and suffixes ("Dr", "Jr"), company suffixes ("Inc", "LLC"), text in parentheses, or a phrase you type |
| Treat as the same | One group per line: Robert, Bob, Rob makes "Bob Smith" and "Robert Smith" compare as the same name |
| Normalise | Ignore upper/lower case, punctuation, extra spaces, or numbers |
| Find & replace (pattern) | A regular expression and what to replace it with — see below |
Clean-up applies to names, job titles, company locations, and your own Attio
fields. Domains and emails take find & replace and normalise, for
example turning acme-uk.com into acme.com before domains are compared.
Entries run in order, so you can chain them: expand abbreviations first, then
normalise.
Find & replace with a pattern
For anything the other options don't cover, write a
regular expression.
Matching ignores upper/lower case and replaces every match. Leave the
replacement empty to remove what matched, or use $1, $2 to keep the
parts in brackets. Use the Try it box to check a pattern against a sample
value before saving.
| Pattern | Replace with | Effect |
|---|---|---|
\s*-\s*(contractor|temp)$ | (empty) | "Jane Doe - Contractor" → "Jane Doe" |
\bsr\.?(\s|$) | Senior$1 | "Sr. Engineer" → "Senior Engineer" |
^(\w+), (\w+)$ | $2 $1 | "Doe, Jane" → "Jane Doe" |
-(uk|us|eu)\. (on domains) | . | "acme-uk.com" → "acme.com" |
A pattern runs against every record in every scan, so DeDupe only accepts
patterns that can't slow a scan to a crawl: no repeating a group that itself
repeats or has alternatives (like (a+)+ or (a|b)*), no back-references
(\1) and no look-aheads or look-behinds. Patterns can be up to 200
characters, and values longer than 256 characters are left as they are. The
same limits apply to pattern rules in false positives.
Scoring
Every matched pair gets a confidence score. The Scoring tab sets how much each signal counts toward it:
- Match score — how strongly the matching rule scored the pair.
- Rule reliability — how trustworthy that kind of match is (same phone beats similar name).
- Other fields agree — how many other fields the two records share.
- Data completeness — how complete and clean the records are.
The four weights must total 100% — the total turns green when they balance, and you can't save until it does. Rule actions ("auto-merge when confidence is at least N%"), the auto-merge catch-all and reviewer notifications all compare against this score. The same weights apply to companies and people. New weights apply to pairs found from then on; pairs already in the review queue keep their score. Only admins can change them.
When changes take effect
Saved rules apply to the next scan and to live monitoring straight away. Duplicates already in your review queue aren't re-checked automatically. To run your rules over them, use Automation → Apply to existing pairs.
Related
- To stop a specific pair from being flagged again, mark it Not a duplicate; you can review those in false positives.
- To see why a pair matched, open it in the review queue: the Why this matched panel lists every rule that fired and the values it compared.
- For how the confidence score is built, see confidence scores.