How do you stop the same lead from being created twice by two forms?
Pick one matching key, usually the email address normalized to lowercase, and make every form submission look up that key before creating anything. If a match exists, update the existing record and log the new submission against it. If not, create one record. Then route the lead once, based on the merged record.
Duplicate leads are a common problem in small GTM stacks. A buyer downloads a guide on Monday through one form, then requests a demo on Thursday through another. If each form writes to the CRM separately, you end up with two records, two owners, two sequences, and a confused buyer who gets emails from both.
This article is how I design form automations so that two or more forms feed one clean record per person. It works whether your forms live on Webflow, connect through Zapier, Make, or n8n, or write directly into HubSpot.
Why do duplicate leads happen with multiple forms?
Duplicates happen when each form has its own path into the CRM and each path creates a record without checking first. Small differences make it worse: one form collects work email, the other personal email, or one capitalizes the address differently. To the system, those look like different people.
The problem grows quietly as you add forms. A newsletter signup, a content download, a demo request, a pricing calculator, and an event registration can all be built at different times by different people, each with its own automation. Nobody designed them to share one record.
Duplicates cost more than a messy CRM. They split engagement history, so lead scoring underrates the buyer. They trigger competing sequences. And they confuse attribution, because the demo request looks like a brand new lead with no history.
What should you use as the matching key?
Use the email address as the primary key for people, normalized before matching: trimmed of spaces and converted to lowercase. For companies, use the website domain, also normalized. Avoid matching on names, which vary too much, and avoid phone numbers as a primary key, since they are often missing or formatted differently.
Some CRMs already match on email. HubSpot's help article on deduplication says that when a new contact is added, HubSpot looks for a matching value in the Email property. It also describes form submissions with a matching email being added to the existing contact. If both forms write through HubSpot's own form handling, much of the matching may already be handled, so confirm it in HubSpot's docs for your setup.
The trouble starts when forms write through other paths, such as a Zapier step or a custom integration that creates contacts directly. Check how each path creates records, and do not assume every path behaves like a native form.
How should the automation look up existing records?
Before any create step, add a search step that looks for a record with the normalized email. If one is found, branch to an update path. If none is found, branch to a create path. This "find or create" pattern is the core of every reliable form integration, whatever tool you build it in.
Most automation tools offer a search action for common CRMs, and some combine search and create into one step. Either works, as long as the search runs before the create, and as long as the search uses the same normalized value you will store.
Normalize inside the automation, not just in the form. Add a small formatting step that lowercases and trims the email before the search. Forms change, and you do not want deduplication to depend on every form being configured perfectly.
What should be updated when a match is found?
Update only the fields the new submission should own, and never overwrite fields that should stay fixed. A new demo request should update the latest form submitted and the latest message. It should not overwrite the original lead source, the first campaign, or an owner already assigned by sales.
Write this as a field rule before you build: for each field, decide whether a new submission overwrites it, fills it only if empty, or never touches it. First touch fields are fill only if empty. Last touch fields overwrite. Owner and lifecycle stage are usually never touched by forms at all.
When two systems both write to the same field, decide which one owns it. I covered that question in which tool should own a field in a two-way sync. The same ownership thinking keeps form updates from fighting with sales updates.
How do you keep each submission's history?
Log every submission as its own activity or note on the single contact record, with the form name, date, page URL, and key answers. That way you keep one record per person while still seeing that they downloaded a guide on Monday and requested a demo on Thursday. History lives on the record, not in duplicates.
Many CRMs show native form submissions on the contact timeline, so check how yours behaves. For forms that come through an automation, add a step that creates a note or a custom activity with the submission details. Keep the format consistent so reps can scan it quickly.
This history is what makes lead scoring and routing smarter. A contact with three submissions in a week is a warmer lead than one with a single download, and your scoring can only see that if the submissions land on the same record.
How should routing work after deduplication?
Route based on the merged record, not the individual submission. If the contact already has an owner, notify that owner of the new submission instead of assigning someone new. If the contact has no owner and the new submission is a high intent form like a demo request, route it as a new hot lead.
The common mistake is running routing on every form submission. That can reassign a lead that a rep is already working, which frustrates the rep and confuses the buyer. A simple check, "does this contact have an owner?", prevents most of that.
Also check active sequences. If the contact is already in a nurture sequence and then requests a demo, the nurture should pause. Otherwise, the buyer receives a "here is another helpful guide" email right after asking to talk to sales.
What about duplicates that already exist?
Clean them up once, carefully, then let the new design prevent future ones. Export contacts, group by normalized email, review groups with more than one record, and merge them in the CRM. Before merging, check which automations reference the records, because merges can affect workflows and integrations.
Merging is not risk free. Records may be enrolled in different workflows, linked to different deals, or synced to other tools. The safe process is to review each group, pick the primary record, and merge in small batches while watching for side effects. I wrote about the details in merging duplicate CRM contacts without breaking automations.
Companies need the same treatment, matched on domain. If your enrichment tools also create company records, duplicates can come from there too. The company side is covered in deduplicating companies across Clay, Apollo, and HubSpot.
How do you test the deduplication before launch?
Submit both forms with the same email in different cases, with extra spaces, and in both orders. Check that one contact exists, that both submissions appear in its history, that first touch fields kept the first value, and that routing fired only once. Then test a brand new email to confirm creation still works.
Add one more test: a personal email on one form and a work email on the other. That will create two records by design, since the keys differ. Decide in advance whether that is acceptable, or whether you will ask for work email only on high intent forms to reduce the problem.
Write the test cases down and rerun them whenever someone edits a form or its automation. Deduplication breaks quietly, usually when a new form is added without the find or create step.
What should you do next?
List every form that creates leads in your CRM and how each one writes records. Add a normalized email lookup before any create step, set field rules for overwrite versus fill only if empty, log submissions as activities, and route based on the merged record. Test with mixed case and spacing before you ship.
My view is that one clean record per buyer is the foundation of every GTM system that works. Scoring, routing, attribution, and personalization all assume it. Fixing deduplication at the form layer is a small build with a large payoff, and it is far cheaper than cleaning up duplicates forever.
If you want help auditing your forms and building find or create logic into your automations, reach out through pravinkumar.co. I build websites and the automations behind them for lead generation, and clean lead data is where that work begins.
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.