Guide · Make.com · HubSpot · Troubleshooting

Fix HubSpot "Contact already exists" (409) in Make

Short answer: HubSpot allows one contact per email address. A Create a Contact module that receives an email HubSpot already knows fails with a 409. Fix it in one of two ways:

By Flowpaja · Published

This guide contains an affiliate link, marked “affiliate link”.

Create a Contact failing with a 409 Contact already exists error, Search for Contacts on the email, and the fix: one contact per email with create or update
A 409 means HubSpot already has the email: update that contact instead of creating a new one.
Disclosure: everything in this guide works with plain Make.com and the apps it connects. At the end we mention our own Make templates and our Make scenario fix service on Fiverr. Module names, settings and limits were checked against Make's HubSpot CRM docs and HubSpot's merge records help in October 2026. Menus and limits change, so check them if something looks different.
  • Replace Create a Contact with HubSpot CRM › Create or Update a Contact. It matches on email and updates the existing contact instead of failing.
  • Or search first: Search for Contacts with the filter Email equal to the form email, then a router: no contact found → create, contact found → Update a Contact with the found ID.

If you already search first and still get 409s, the email is probably stored as an additional email on another contact, or two submissions arrived within seconds. Both cases are covered below.

The error texts you'll see

In the Make execution log, the HubSpot module turns red with one of these:

[409] Contact already exists. Error Messages: [A contact with email jamie@example.com already exists.]
Contact already exists. Existing ID: 2926551

The wording depends on which HubSpot API version the module calls. Newer HubSpot responses also carry the code CONTACT_EXISTS (category OBJECT_ALREADY_EXISTS; older responses said CONFLICT). All of them mean the same thing: the email in your create request already belongs to a contact. The Existing ID is that contact's record ID, so you can open it in HubSpot and see who it is.

A different red error, [400] Property values were not valid, is not a duplicate problem. It means a value (usually a dropdown answer) doesn't match the property's internal value. See Google Forms to HubSpot and Slack, Step 2.

Which fix fits your scenario

Your scenario doesUseHubSpot credits per lead
Save every lead as a contact, same steps for new and returning peopleCreate or Update a Contact1
Something different for new vs returning people (a "new lead" Slack alert, a deal only for new contacts)Search for Contacts → router → Create a Contact / Update a Contact2

Make's HubSpot CRM app has both options: Create or Update a Contact, Create a Contact, Update a Contact, Get a Contact, Search for Contacts and Merge Contacts.

Fix 1: Create or Update a Contact

  1. Open the red Create a Contact module, note its mappings, and replace it with HubSpot CRM › Create or Update a Contact.
  2. Map the email to HubSpot's standard Email property, cleaned first: {{lower(trim(1.email))}} (replace 1.email with your form's email field; in the editor you click the field rather than type it).
  3. Map the other properties as before. Leave a field empty if you don't want the form to overwrite it. Don't map the contact owner or lifecycle stage unless the form should really change them on every resubmission.
  4. Run once with an email that already exists in HubSpot. The run should go green, and the existing contact should show the new values.

Any module after it that needs the contact ID (a note, a deal association) can map the ID from this module's output.

Fix 2: Search first, then create or update

Use this when new and returning leads should be treated differently. It's the pattern Lead Router uses.

  1. Add HubSpot CRM › Search for Contacts before the create step. Filter: Email equal to {{lower(trim(1.email))}}, limit 1. Leave any free-text query empty: a free-text search can return a contact that only partly matches, and you'd update the wrong person.
  2. Check what the module does when nothing is found. If the route stops there, new leads never reach the next step. If the module offers an option to continue the route even when there are no results, turn it on.
  3. Add a Router with two routes:
    • New: filter contact ID from the search does not exist → Create a Contact.
    • Existing: filter contact ID exists → Update a Contact with that ID.
  4. Test three cases with fictional data: a brand-new email, an existing email, and the existing email in capitals with a trailing space. You should get one create, then two updates of the same contact.

Routers and filters don't use credits, so this costs one credit for the search plus one for the create or update.

Still getting 409 after a search?

CauseHow to spot itFix
The email is an additional email on another contact. Merged contacts keep the secondary contact's email as an additional email. A filter on Email checks the primary email only, so the search finds nothing and the create fails.The Existing ID in the error belongs to a contact with a different primary email.Open that contact and decide by hand. To make it automatic, use Create or Update a Contact on the New route too (Fix 1).
Two submissions with the same email within seconds. HubSpot's search may not have indexed the first contact yet, so the second run's search finds nothing.Two runs a few seconds apart, the second one red.For webhook triggers, turn on Process data in order in the scenario settings so runs don't overlap. Use Create or Update a Contact on the New route so a late duplicate updates instead of failing.
The search compared a different value. Spaces, capitals, or the email mapped to a custom "work email" property instead of the standard Email.The search input in the execution log shows spaces, capitals or an empty value.Search and write the same cleaned value: lower(trim(...)), always into the standard Email property.
The search used a free-text query.The search module has text in its query field.Clear it and use the Email equal to filter.

Duplicates without any error

HubSpot only blocks duplicates by email. Contacts created without an email, or with the email in a custom property, are never matched, so they pile up silently. Put a filter right after the trigger: email exists and contains @. Send everything else to a Slack alert instead of HubSpot.

If you clean up existing duplicates with Merge Contacts (in Make or in HubSpot), know that HubSpot merges can't be undone. The merged record keeps the secondary contact's email as an additional email, which is exactly the first cause in the table above.

Don't let the 409 stop the scenario

An unhandled error stops the run. A scenario with an instant trigger (a webhook, Typeform, Tally) is switched off after its first unhandled error. Right-click the HubSpot module → Add error handler, add Slack › Send a Message to an alerts channel with the error and the lead's email, then a Skip handler (Make's newer name for Ignore). The failed lead is skipped, not lost: the alert tells you which email to check. More in Make error handling: Resume, Ignore, Break, Rollback, Commit.

Skip the build

Lead Router ($19): Google Form → exact-email search in HubSpot → create or update → $10k+ budgets to #sales-hot, the rest to #leads, and failures alerted in #automation-alerts. One-time purchase, 30-day money-back guarantee.

No Make account yet? Create a free Make account (affiliate link). Flowpaja may earn a commission if you sign up through it, at no extra cost to you.

FAQ

Why does HubSpot say the contact exists when my search found nothing?
Usually because the email is an additional email on another contact (often after a merge), or because the first contact was created seconds ago and isn't searchable yet. The Existing ID in the error tells you which contact it is.
Is Create or Update a Contact safe for every form?
It's safe for the contact itself: the same email always lands on the same contact. It also overwrites every property you map, so map only fields the form should own.
Does letter case matter?
Clean the email with lower(trim()) before both the search and the write. Then the comparison and the stored value always match.
Can I just ignore the 409?
You can add a Skip handler, but then the returning lead's new answers never reach HubSpot. Fix 1 or Fix 2 updates the contact instead.

Tools we use for these builds: our tools page.

Still getting 409s?

Send the exported blueprint and the failed run's error text to our Make scenario fix service on Fiverr. No logins needed.

Stuck on an error in your own Make scenario? Make scenario fix / debugging on Fiverr, from $25: send the exported blueprint and a description of the error, no logins needed.

← All guides · All templates

Make, HubSpot, Google, Google Forms, Typeform, Tally, Webflow and Slack are trademarks of their owners. Flowpaja is independent and not affiliated with or endorsed by them. Menus, limits and prices change; check the providers' current help.