Why does your Zapier zap keep creating duplicate contacts in HubSpot?
Usually because the zap sends HubSpot something it cannot match. HubSpot deduplicates contacts by email address, so duplicates appear when the email is missing, formatted differently, or a different address for the same person. The fix is to control what the zap sends and to look up before you create.
Duplicate contacts look like a small annoyance until they start costing money. Two records for one buyer means two owners, two email streams, and a sales rep who calls a lead that a colleague already spoke to yesterday. Reporting suffers too, because every funnel number is inflated by people who exist twice.
I build and maintain Zapier and HubSpot automations, including the HubSpot setup behind Kismet Health. This is the checklist I use when a client tells me their CRM is filling up with copies of the same people.
How does HubSpot decide whether a contact already exists?
HubSpot uses the Email property. According to HubSpot's knowledge base, when a new contact is added, HubSpot looks for a matching value in the Email property. If the email matches an existing contact, HubSpot treats it as the same person. If the email is different or empty, HubSpot has nothing to match on.
That one rule explains most duplicate problems. HubSpot is not guessing based on names, phone numbers, or company. It relies on the email. So the question is never "why did HubSpot miss this?" The question is "what email did the zap send, and was it the same one already on file?"
Companies follow a different rule. HubSpot deduplicates companies on the primary value of the Company domain name property. There is an important exception, which I cover below, and it catches many Zapier setups.
Which Zapier action should you use to avoid duplicates?
Use an action that matches before it writes. Zapier's HubSpot integration lists a Create or Update Contact action that creates a new contact or updates an existing one based on email address. It also offers Find or Create Contact. Both are safer defaults than a plain Create Contact step.
Plain Create Contact is the action I see behind most duplicate problems. It does exactly what the name says, every time the zap runs. If the source app fires twice, or a person fills out two forms, the zap tries to create twice.
Create or Update Contact changes the behavior. When the email already exists, the zap updates that record instead of trying to add another. That also means you need to think about which fields an update is allowed to change, because a careless update can overwrite good data with blank or worse data.
Find or Create Contact is useful when you need the contact record for a later step, like associating a deal. The zap searches first, and only creates if nothing is found. Either way, the principle is the same: match first, write second.
What makes the same person arrive with a different email?
People use more than one address. A buyer downloads a guide with a personal email, then books a demo with a work email. A colleague forwards your form to someone else at the same company. HubSpot sees two different emails and correctly creates two contacts, because nothing tells it they are one person.
This kind of duplicate is not a Zapier bug. It is a data reality, and no automation fully solves it. What you can do is reduce it and catch it.
To reduce it, ask for a work email on high intent forms like demo requests, and say so in the field label. To catch it, run a regular review of likely duplicates, matching on name plus company domain. When you merge, be careful with records that automations depend on. I wrote about that process in how to merge duplicate CRM contacts without breaking automations.
How should a zap clean an email before sending it?
Normalize the email before any HubSpot step. Trim spaces, convert it to lowercase, and stop the zap if the value is empty or clearly not an email. Zapier's Formatter Text action includes Trim whitespace and Lowercase transforms for the cleanup. Clean input prevents most accidental mismatches.
Messy input is common. Form tools, spreadsheets, and enrichment sources can all pass along stray spaces or mixed capitalization. Whether or not a given tool treats those as the same address, I do not want my automation to depend on that. Cleaning the value first removes the question entirely.
The empty case deserves special attention. A zap that runs without an email gives HubSpot nothing to deduplicate on. Depending on the action, that run either fails or creates a record you cannot match later. I prefer to stop the run and alert someone. My approach to blank values is in what an automation should do when a field is empty.
Why do duplicate companies appear even when contacts look fine?
Because companies follow different rules when an integration creates them. HubSpot's knowledge base states that companies created through the API are not deduplicated by the Company domain name property, and that this includes installed third-party sync apps. If your zap creates companies, assume HubSpot will not catch domain duplicates for you.
Zapier connects to HubSpot as an app, so I treat any company it creates as integration-created and I do not rely on domain deduplication. Instead, the zap searches for a company by domain first, and only creates one when the search returns nothing.
The domain itself needs cleaning too. Strip the protocol, remove "www", and drop any path, so that a value pasted as a full URL becomes a plain domain. Otherwise your search looks for one string while the CRM stores another, and you get a duplicate anyway.
This matters more than it seems. Duplicate companies split activity history, confuse ownership, and break account-level reporting. A sales leader looking at one company record may not see half of the engagement because it sits on a twin.
How can you tell which zap is creating the duplicates?
Compare the duplicates against your automation run logs. Note when each duplicate record was created and what its email value looked like, then look for zap runs at those same times. Check your vendor docs for exactly what each run log stores. Lining the two up usually points to one zap quickly.
I start with a handful of recent duplicates. For each pair, I note when each record was created and what the email values looked like. Then I open the run history of every zap that writes contacts and look for runs at those times. The pattern usually jumps out: one zap with a plain create step, or one source sending messy emails.
Once you find it, fix the zap before you clean up old records. Cleaning first only gives the broken zap a fresh, tidy CRM to fill with copies again.
Is it ever right to let Zapier create contacts without a lookup?
Rarely. The only case I accept is a source that, by design, only ever sends brand new people with verified emails, and even then a Create or Update action costs nothing extra. For anything touching a live sales pipeline, I would always choose an action that matches on email first.
The temptation to use plain create comes from speed. It is the first action people see, and it works the first time they test it. Problems only show up weeks later, after hundreds of runs, when the duplicates are already spread across lists, workflows, and reports.
That is why I review the action choice on every zap I inherit. Changing one step is quick. Cleaning a CRM that has filled with copies over several months takes far longer.
What should you do next?
Open every zap that writes to HubSpot contacts or companies. Replace plain create steps with Create or Update Contact or a find-first pattern, add email cleanup and an empty check, and search companies by clean domain before creating. Then trace your recent duplicates to confirm the source is fixed before cleaning up.
If your form connects to HubSpot through Zapier, my Webflow contact form to HubSpot tutorial shows a full setup you can compare against yours.
If your CRM is already full of copies and you are not sure which automation is responsible, reach out. I am happy to look at your zaps and your HubSpot data with you and tell you honestly what is causing it and what I would change first. Let's chat.
Get found, cited and the back office automated
Let's make your site the source AI engines quote and wire up the systems behind it.
Read more blogs
Let's get your website found and cited by AI
Tell me what you're working on, whether AI search is skipping your product, your back office is buried in manual work, or you need a build that does both.