Why form submissions create duplicates in Attio, and how to stop them
Last checked September 25, 2026 · Deduptio is our product. Every claim about another tool comes from its public site or documentation and is linked in place — tell us if something is out of date.
A form is the one write path where a stranger chooses the identifier. Make every form update on email instead of creating, build companies from the email's domain rather than a typed name, and do not let a form create deals directly. Then clean up the pairs already there on name plus a second signal, and make sure each survivor keeps every address so the next submission lands on it.
Three routes from a form into Attio
“The form” is rarely one thing. A demo request on the website, a newsletter sign-up, an event registration and a partner application usually reach Attio by different routes, and each route has its own answer to the question that matters: what happens when the person already exists?
| Route | Default when the person exists | What to set |
|---|---|---|
| Fillout's Attio integration | Creates a new record | Turn on Update if record already exists? under Mappings and pick email addresses as the matching attribute |
| The Forms app for Attio | Updates, matching on email or domain — if the form has one of those fields | Always include an email (or domain) field; without one, every submission creates |
| Zapier, Make, Relay or n8n from Webflow, Typeform, Tally, Google Forms | Whatever the step does — a create step creates, every time it runs | Use the create-or-update action, keyed on email |
| Your own webhook or backend | Whatever you call — create is create | Assert the person on email_addresses; assert the company on domain |
One detail changes how to read the table. Email addresses are unique in Attio, so a plain create with an address that already exists does not make a duplicate — it is rejected. In an automation that usually means a failed run and a lead that never arrived, which is arguably worse. Either way the fix is the same: update on match, create only on no match. The API side of that is in duplicate detection with the API, and where Zapier and Make dedupe stops is in Deduptio vs Zapier or Make.
Why email matching still lets duplicates through
Once every form updates on email, the exact-duplicate case is closed. What is left is the case exact matching cannot see: the same human submitting under an address the workspace does not hold.
| Pattern | Example |
|---|---|
| Personal instead of work | Sales has rachel@acme.com; Rachel downloads the ebook as rachel.k@gmail.com |
| Typos | rachel@acme.co, rachel@gmial.com — forms are where typed addresses enter a CRM |
| Plus-addressing | rachel+webinar@acme.com, used deliberately by people who filter their mail by sender |
| A second form months later | The newsletter sign-up from 2024 and the demo request from a new job in 2026 |
None of these can be fixed by the form tool's matching setting, because the email is genuinely different. Two design choices reduce them: ask for a work email on high-intent forms such as demo requests, where the question costs little, and validate the domain on the form itself so gmial.com never reaches Attio. The rest is cleanup.
What forms do to companies
The quieter damage is on the Companies object. A form with a “Company” text box and an integration that links the person to a company will, on each submission, either find a company or create one — and the only thing it can find one by is the domain. A company created from a typed name has no domain, so the next person from the same company who types “ACME Inc” instead of “Acme” creates another.
- Derive the company from the email domain, not from the text box. Attio already links people to companies by email domain; let the work address do it, and keep the typed name as a plain text attribute on the person if you want it.
- Do not create a company for a free-mail address. A Gmail submission has no company to derive, and a company created from its typed name is almost always a future duplicate.
- Keep the typed name out of the company's name attribute. Once the company exists with a domain, a submission that overwrites its name with whatever someone typed makes the record worse, not better.
The companies these forms have already created — domainless, named three ways — are the case fuzzy matching company names exists for.
Deals and custom objects from forms
A demo-request form that creates a deal on every submission produces a duplicate deal every time a prospect submits twice — and prospects do, because nobody answered the first one fast enough. Deals have no email or domain to match on, so no form tool can update one instead of creating it, and Attio cannot merge deals at all.
Let the form create or update the person, and create the deal as a separate step that first checks whether the company already has an open deal. If you want every submission recorded, add the person to a list of inbound requests instead; a list entry is cheap to triage and does not put a phantom opportunity into the forecast. What to do with the duplicate deals already in the pipeline is in duplicate deals in Attio.
Cleaning up what forms have already created
The pairs forms leave behind differ on email by definition, so exact email matching will not find them. Match on name plus a second signal:
- Name plus company. Rachel Kim at Acme twice, one record from sales and one from the form. The highest-yield rule for form duplicates, provided the company link is right — which is why the company cleanup comes first.
- Name plus phone number. If the form asked for a phone, it is often the one identifier the person typed the same way twice.
- Name plus LinkedIn URL, once enrichment has filled it in on both records. Effectively an exact match that survives any change of address.
- Name alone, with one record from a form and nearly empty. A candidate, not a verdict. Review these; never merge them automatically.
When you merge, keep the record sales has worked — owner, deals, lists, notes — and check that the form's address ended up on the survivor. A form matching on email will then find the survivor the next time Rachel submits from Gmail, instead of creating her a third time. The signals and the false positives to avoid are covered in finding duplicate people in Attio.
A routine that keeps forms clean
- List every form that writes into Attio and the route it takes. Most workspaces find one they had forgotten.
- Switch each one to update on email; include an email field on every form.
- Build companies from the email domain, and never from a free-mail submission.
- Route deal creation through a check for an existing open deal.
- Scan weekly on name plus company, so a duplicate surfaces while the rep still remembers which Rachel they spoke to.
Where Deduptio fits
Deduptio does not sit in front of your forms and cannot stop a submission creating a record; that is the form tool's setting. What it does is find what got through. A people rule keyed on name with company, phone or LinkedIn alongside it — using ANY or ALL — finds the pairs described above, and because every value of a multi-value attribute is keyed, a person's second address is matched rather than ignored. Fuzzy name matching, on paid plans, catches “Acme” and “ACME Inc” on the company side.
Scheduled scans, a Pro feature, run daily or weekly and email only when they find new groups. Rule design is in rules and scanning.
Find the people your forms created twice
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 scanRelated
- How to prevent duplicates in Attio — forms next to the five other write paths.
- Duplicates from Attio email sync · Duplicates from a CSV import
- Finding duplicate people · Finding duplicate companies
- The full guide · All guides