Data integrity guide
How to prevent duplicate form submissions and contacts
Control double clicks, retries and repeat identities with a two-key duplicate model, deterministic write rules and an eight-case proof test.
Prevent duplicates at two separate layers. Give each submission a unique event key so a double click or retry is processed once, then use a documented identity key such as normalized email to link repeat submissions to the intended contact. Preserve every accepted submission as evidence, update only named contact fields, and never treat browser blocking as a substitute for server-side idempotency or contact matching.
A two-key submission-and-contact model, five-action duplicate decision matrix, explicit overwrite contract, worked repeat-identity example and reproducible eight-case proof test, checked against current HubSpot, involve.me and Fillout sources on September 21, 2026.
Key findings
- Submission idempotency is not contact deduplication: the first prevents one event from being processed twice, while the second links distinct accepted events to the intended person or organization.
- A repeat identity should preserve both submissions and apply explicit field-level write rules instead of silently replacing the earlier event or every current contact value.
- Browser controls and plan features can reduce repeated attempts, but server-side event keys, identity rules and downstream idempotency still need to be tested.
Submission idempotency is not contact deduplication
A duplicate submission is one event accepted or processed more than once, commonly after a double click, browser retry, timeout or webhook replay. A duplicate contact is a second contact record created for an identity that should have matched an existing one. These failures can happen together, but they need different controls.
Submission idempotency makes one event safe to retry. Contact deduplication decides whether distinct accepted events belong to the same identity. Preserve the event history even when several events link to one contact.
Do not delete a valid repeat inquiry merely because the email matches. The second submission may contain a new request, consent choice, qualification state or attribution event. Link it to the intended contact and retain its own immutable submission ID and time.
Two-key duplicate-control model
| Key | Scope | Example | Required behavior |
|---|---|---|---|
| Submission key | One attempt or business event | submission_id or idempotency_key | The same key can be retried but is processed once |
| Contact key | Person or organization | Normalized email, verified phone or CRM record ID | A match links a new event to the intended contact |
| Workflow event key | One downstream action | submission_id + action_name | A replay cannot create a second task, assignment or message |
Generate the submission key before the first mutable write and carry it through storage, CRM update, routing and follow-up. Normalize the chosen identity key before matching, but keep the respondent-provided value in the event record where policy allows. Never use a mutable display label, IP address or campaign parameter as the only identity key.
Five-action decision matrix
| Observed state | Event action | Contact action | Downstream action |
|---|---|---|---|
| New submission key; new identity | Accept one event | Create one contact | Run eligible workflow once |
| Same submission key replayed | Return prior result; do not insert | No second mutation | Do not repeat actions |
| New submission key; known identity | Accept a new event | Link and update named fields | Re-evaluate using current event |
| New submission key; ambiguous identity | Accept or quarantine by policy | Do not merge silently | Route to safe review or fallback |
| New identity key on an existing session | Accept the event | Apply the documented relink or conflict rule | Avoid exposing prior contact data |
Store a decision code such as new_contact, idempotent_replay, known_contact_update or identity_conflict. A reviewer should be able to explain why an event created, updated, linked or stopped.
Field-level write contract
Define the write rule for each contact property rather than applying one blanket overwrite setting. Immutable event facts such as the submission ID, submitted time, form version and consent statement version stay on the submission. Current contact properties may update only according to named rules.
| Field | Repeat-submission rule | Reason |
|---|---|---|
| Primary email | Normalize and match; change only through a verified conflict process | It may be the identity key |
| Name | Replace with a nonblank respondent-supplied value | Current preference may change |
| Company size or timing | Replace nonblank value and retain the event history | Qualification state can change |
| First-known source | Write once; never replace with blank | Preserves earliest observed acquisition |
| Latest submission source | Update from the accepted event | Describes the current interaction |
| Consent evidence | Append a versioned event; do not infer | Later choices need their own evidence |
Blank values should preserve trustworthy current data unless the form provides an explicit clear action. A repeat submission must not turn a known value into an empty string simply because a conditional field was not displayed.
Worked repeat-identity example
A buyer submits a consultation form with alex@example.com, company size 20 and a six-month timeline. The server stores submission sub_101, creates one contact and enrolls it in standard nurture. A slow connection causes the browser to retry with the same submission key. The server returns the recorded result and does not create a second event, contact or sequence enrollment.
Three weeks later, the buyer submits again with a new event key, company size 60 and a 30-day timeline. The system stores sub_205, links it to the same contact, updates only the named current-state fields and retains sub_101. Qualification and routing are evaluated from the new event. This is a repeat identity, not an event duplicate.
Current product boundaries
As checked September 21, 2026, HubSpot documents that contacts are automatically deduplicated by email. If a contact already exists with the same email address, the new contact information will be added to the existing contact. HubSpot also documents an important boundary: unique-value custom properties can deduplicate imports, but are not supported as form deduplication keys; default email, company domain or record ID behavior applies in the documented form paths.
The current involve.me pricing table lists limiting multiple submissions from the same user on Grow and above, and duplicate-phone prevention on Grow and above. Fillout's pricing table lists preventing duplicate submissions on Business. These are useful product controls, but a feature label does not prove server-side event idempotency, contact identity rules or downstream workflow deduplication. Apply the same proof test to the selected plan and published route.
This guide is product-neutral. A native CRM, connected CRM or custom database can implement the contract; the evidence is the saved event, contact link, decision code and replay-safe action—not the vendor category.
Eight-case duplicate-control proof test
- Double click:send the same submission key twice and confirm one event and one downstream action.
- Timeout retry:retry after the client receives no response and confirm the prior result is returned safely.
- Webhook replay:re-deliver the accepted event and confirm no second contact mutation, task or message.
- New identity:submit a unique normalized identity and confirm one new contact linked to one event.
- Known identity:submit a new event for the same identity and confirm the event is preserved while named fields update.
- Blank repeat field:omit a conditional value and confirm it follows the explicit preserve-or-clear rule.
- Case and whitespace:vary the identity representation and confirm documented normalization without over-merging.
- Ambiguous conflict:create a deliberate mismatch and confirm the system stops or routes for review instead of merging silently.
Every accepted event has one immutable key and one explainable contact link; retries create no duplicate side effects; repeat identities retain their event history; conflicts fail safely; and field updates match the written contract.
Use fictional, non-sensitive records and repeat the affected cases after changing the form, identity key, CRM mapping, webhook destination, workflow trigger or retry policy. The 24-case form testing checklist covers the wider release path.
Evidence and limitations
A two-key submission-and-contact model, five-action duplicate decision matrix, explicit overwrite contract, worked repeat-identity example and reproducible eight-case proof test, checked against current HubSpot, involve.me and Fillout sources on September 21, 2026.
- This is an implementation framework, not a universal identity standard, fraud-control system or legal opinion.
- Email, phone, cookie and CRM record matching can each produce false joins or missed matches; select identity keys according to the form's purpose and data sensitivity.
- Plan access, repeat-submission controls, form-to-contact behavior and overwrite rules vary by product and account configuration. Re-run the proof test in the intended workspace.
Sources and verification
Current product and plan claims use the primary sources below. Internal methodology links describe the publication's own frameworks and should not be read as vendor documentation.
- HubSpot, Deduplicate records
- involve.me pricing and plan features
- Fillout pricing and plan features
- CRM-ready form data model
- Progressive profiling field plan
- Form testing checklist
- The Form Review testing methodology
Last materially verified .