Documentation-based guidance. Product testing is pending.
Warm Contacts
Workflow guide · Updated 5 October 2026

Prevent Duplicate Pipedrive Records from Form Submissions

The same person can send two legitimate enquiries. The same enquiry can also be delivered twice. Treat those as different cases before adding a search-by-email step.

Evidence status. This page defines a process and the results to check. We have not run these cases through a live Make → Pipedrive integration. The downloads contain synthetic inputs and blank result records, not a tested Make blueprint.

Give the person and the enquiry different keys.

A person can ask about two projects. If you use the person’s identity as the enquiry key, the second legitimate request may disappear. If you create a new person for every delivered event, repeated webhooks can create duplicate contacts.

Define a contact-matching rule appropriate to your data. Separately, preserve a stable submission identifier from the form or its delivery system. Generate that identifier once at submission time, not afresh on every retry. An ambiguous match needs a visible review path.

QuestionIdentifierExample result
Who is asking?Contact identity under your matching ruleP-001 can have multiple enquiries.
Which enquiry is this?Stable source + submission keyE-001 delivered ten times is still one enquiry.
Which attempt is running?Execution or attempt identifierSeveral attempts may point to the same final CRM records.

Prevent duplicate Pipedrive contacts with Make: define the match first.

Email is a useful candidate lookup, not a universal identity guarantee. Decide how to handle missing email, changed addresses, shared agency inboxes and multiple matching people. Normalise values under a documented rule; do not silently collapse distinct people or overwrite established details. Route ambiguous matches to review.

Use an exact search under that policy, verify the candidate fields, then reuse the confirmed person ID. Treat a new submission ID as a possible new enquiry even when the person already exists. Searching for that person does not prove that the enquiry has already been processed.

Pipedrive’s Merge Duplicates documentation describes possible duplicate contacts. Merging contacts is different from ensuring that one webhook submission produces only one intended set of writes.

Pipedrive’s duplicate rules for imports describe that import process. They do not establish that your API or Make scenario prevents duplicate deliveries. Test the route you actually use.

Give the enquiry key a searchable home in the original destination write. Use a dedicated text deal field, then verify that exact field on any returned search candidate. Keep the selected service and contact key with the event record so a changed payload can be detected. The step-by-step test route names the required decisions and destination checks.

Identify what repeated.

A repeated delivery and a new request need different outcomes. Start with the event key, the relevant payload, and evidence of any completed writes.

What can you establish?
Proposed next check · no observed result

Keep the cause open.

Preserve the delivery evidence and compare the event key, payload and destination records. Do not treat an unexplained duplicate as a passed test.

This selector explains a decision rule. It does not inspect records or update the result log.

EXAMPLE 01Same submission, another delivery

Input: E-001 arrives again with the same relevant payload for P-001.

Expected: Return or reconcile the existing result. Do not add an unintended second enquiry. Confirm the destination before marking the event complete.

Synthetic example · Not run
EXAMPLE 02Same person, a different enquiry

Input: P-001 submits E-002 after E-001.

Expected: A valid new request may need another enquiry record. Apply the documented contact-matching rule without merging two separate requests.

Synthetic example · Not run
EXAMPLE 03A retry after part of the work succeeded

Input: The person was created, but the next write or its acknowledgement failed.

Expected: Inspect the recorded IDs and actual destination. Resume only the unresolved work, or retain a named review task.

Synthetic example · Not run

Keep the result with the event.

Before building modules, define a small record for each enquiry: submission key, a stable fingerprint of its relevant content, processing state, resulting person/deal/activity IDs, attempt history and any unresolved issue. Use the state to decide what can happen next.

StateMeaningNext action
ReceivedThe input has been accepted for processing.Validate it and claim the event safely.
ProcessingOne execution owns the next step.Do not let another execution repeat its writes blindly.
CompleteThe required destination IDs and next action are confirmed.Return the existing result for an identical replay.
ReviewThe identity, payload or write outcome is unresolved.Reconcile it; keep it visible until resolved.
ReceivedProcessingCompletedReview / retry

The normal path is received → processing → completed. If a key, match or write is unresolved, processing moves to review. Reconcile it before a deliberate retry returns to processing.

This is an editorial state model, not a promise about a particular Make module. The chosen storage and processing mechanism must support the ownership rule you need. Verify its behaviour with two concurrent deliveries.

Make the processed-event record durable.

Use persistent storage shared by every writer of this route. Scope the key with the form or source plus its submission ID so two sources cannot accidentally reuse the same key. Keep a fingerprint of the relevant payload, per-step status and confirmed destination IDs. A repeated key with different content belongs in review rather than being skipped as an identical replay.

  1. Validate and claim. Establish the event key and acquire ownership using a mechanism whose uniqueness or locking behaviour you have verified.
  2. Write and record progress. Save the person, enquiry and activity IDs as each step is confirmed. Put the enquiry reference in a destination field that you can retrieve and verify.
  3. Complete deliberately. Mark the event complete only after the intended records and next action are confirmed. An identical replay then returns the existing outcome.
  4. Retain and reconcile. Choose a retention period covering the source’s retry and replay window. Define how stale processing claims are reviewed and released; a timeout must not automatically authorise another create.

A separate “does this key exist?” check followed by an insert is not an atomic claim. A Make data store or external database is a storage choice; its name alone does not prove the protection you need. Test the configured mechanism. If you cannot establish exclusive ownership, serialise the single writer or keep uncertain events in a controlled review queue.

CRM writes and the event log can fail independently. If the CRM write succeeds but its ID never reaches the log, the retry must reconcile the destination first. The webhook queue and short-lived execution history are not a substitute for your durable outcome record.

A search can be correct and still race.

Two runs can both search, find no matching record, and then both create one. Make documents parallel processing for instant webhooks. Its Process data in order setting makes a scenario wait for the previous execution before starting the next.

Coordinate both identities when needed. Claiming E-001 and E-002 independently can stop a replay of either event, but two valid enquiries from the same new person may still race during contact creation. Protect the contact-matching/create step across writers too, or reconcile it under an explicit review policy.

That setting can help within the configured scenario. It does not by itself prove uniqueness across other scenarios, manual actions or retries after an uncertain write. If several writers exist, use a documented shared coordination mechanism or a reviewed manual exception path. Do not claim atomic protection until you have verified it.

The Make webhook documentation is the source for its processing modes. The acceptance cases below are our proposed checks.

A timeout does not tell you whether the write happened.

Suppose Pipedrive creates the deal, but the connection fails before your scenario receives or stores the ID. Repeating the create step could add another deal. First reconcile the destination using the stable reference and the evidence available for that attempt.

If you cannot establish the result, preserve a visible review state instead of calling the handoff complete. Record who will resolve it and how. A manually resolved case is acceptable when it is explicit; a silently lost enquiry is not.

Make’s incomplete executions and Retry error handler support recovery. Incomplete executions are disabled by default; enable Store incomplete executions in Scenario settings (incomplete-execution documentation checked 4 October and rechecked 5 October 2026). Their configuration does not establish your business-level duplicate rule. Check the stored failure, the resumed step and the final CRM records together.

Check recovery scheduling separately. Make documents automatic retry for several temporary errors; it can start again at the failing module. A failed acknowledgement after a successful create must not lead to another blind create. For the controlled test, configure the Retry handler with automatic completion off and verify the observed fault behaviour. Reconcile the destination before any manual resume. Automatic retry documentation.

Nine cases to run before launch.

Use a test pipeline and synthetic records. Start each case from its specified baseline. This kit assumes one deal and one next activity per new enquiry; if your business uses leads instead, adapt the expected result explicitly before testing.

Proposed acceptance matrix. Observed records remain unrecorded until an external test is run.
Input / caseExpected outcomeObserved recordsStatus
D01 · One new enquiryThe assigned owner can see one enquiry and one next action. The event record points to the resulting IDs.Not recordedNot run
D02 · Ten deliveries of the same eventThe tenth delivery leaves the same final record IDs and counts as the first. It does not create another activity.Not recordedNot run
D03 · Two simultaneous deliveriesBoth deliveries are accounted for, but only one final set of records exists. A search-before-create diagram alone does not pass this case.Not recordedNot run
D04 · A new enquiry from an existing personThe person is reused, while the legitimate second enquiry and next action are preserved. Count totals include the seeded records.Not recordedNot run
D05 · The same key with different contentThe conflict is visible for review. It neither silently overwrites the first enquiry nor creates a second deal.Not recordedNot run
D06 · Failure after saving the personRecovery reuses the saved person and creates exactly one deal and activity. Keep the original failure and recovery evidence.Not recordedNot run
D07 · A write succeeded but its acknowledgement was lostNo second deal is created. A complete outcome requires one person, one deal and one verified next activity. A visible review outcome can contain zero or one activity and remains unresolved.Not recordedNot run
D08 · Missing contact identityThe unresolved request is retained for review without silently joining it to a person or creating an incomplete deal.Not recordedNot run
D09 · More than one contact matchesBoth seeded people remain. No deal or activity is created. The ambiguous request and its two candidate references remain visible for review.Not recordedNot run

Open a case for its baseline and procedure.

D01One new enquiry

Deliver one complete event with a stable submission key and a contact identity your matching rule accepts.

Baseline: 0 people, 0 deals, 0 activities.

Expected outcome: 1 people, 1 deals, 1 activities; complete

Pass condition to check: The assigned owner can see one enquiry and one next action. The event record points to the resulting IDs.

Observed result: Not recorded.

Not run
D02Ten deliveries of the same event

Deliver the D01 event ten times, one after another, using the same submission key and payload.

Baseline: 0 people, 0 deals, 0 activities.

Expected outcome: 1 people, 1 deals, 1 activities; complete

Pass condition to check: The tenth delivery leaves the same final record IDs and counts as the first. It does not create another activity.

Observed result: Not recorded.

Not run
D03Two simultaneous deliveries

Deliver two identical D01 events at the same time, then inspect both execution histories.

Baseline: 0 people, 0 deals, 0 activities.

Expected outcome: 1 people, 1 deals, 1 activities; complete

Pass condition to check: Both deliveries are accounted for, but only one final set of records exists. A search-before-create diagram alone does not pass this case.

Observed result: Not recorded.

Not run
D04A new enquiry from an existing person

Deliver a new submission key from the existing test person. This test suite deliberately treats a new enquiry as a separate deal and activity.

Baseline: 1 people, 1 deals, 1 activities.

Expected outcome: 1 people, 2 deals, 2 activities; complete

Pass condition to check: The person is reused, while the legitimate second enquiry and next action are preserved. Count totals include the seeded records.

Observed result: Not recorded.

Not run
D05The same key with different content

Seed the completed ENQ-101 enquiry for PERSON-101 with service consultation. Redeliver the same submission key with different-service. Compare the explicit payload fields before any update.

Baseline: 1 people, 1 deals, 1 activities.

Expected outcome: 1 people, 1 deals, 1 activities; review

Pass condition to check: The conflict is visible for review. It neither silently overwrites the first enquiry nor creates a second deal.

Observed result: Not recorded.

Not run
D06Failure after saving the person

After the person write, trigger a controlled validation failure in a separate test step before the deal write. Keep automatic completion off, retain the error, and reconcile the saved person before an explicit recovery attempt. This is not the lost-acknowledgement case.

Baseline: 0 people, 0 deals, 0 activities.

Expected outcome: 1 people, 1 deals, 1 activities; complete

Pass condition to check: Recovery reuses the saved person and creates exactly one deal and activity. Keep the original failure and recovery evidence.

Observed result: Not recorded.

Not run
D07A write succeeded but its acknowledgement was lost

Simulate a successful deal write followed by an interrupted acknowledgement before its ID is stored. Reconcile the destination before another create.

Baseline: 0 people, 0 deals, 0 activities.

Expected outcome: 1 people, 1 deal, 0 activities; review OR 1 people, 1 deal, 1 activities; review OR 1 people, 1 deal, 1 activities; complete

Pass condition to check: No second deal is created. A complete outcome requires one person, one deal and one verified next activity. A visible review outcome can contain zero or one activity and remains unresolved.

Observed result: Not recorded.

Not run
D08Missing contact identity

Submit an event without a contact identity. Preserve the unresolved event without creating CRM records.

Baseline: 0 people, 0 deals, 0 activities.

Expected outcome: 0 people, 0 deals, 0 activities; review

Pass condition to check: The unresolved request is retained for review without silently joining it to a person or creating an incomplete deal.

Observed result: Not recorded.

Not run
D09More than one contact matches

Seed two test people that both match the selected contact rule for PERSON-SHARED. Submit a new enquiry. The scenario must retain it for review without choosing a person arbitrarily.

Baseline: 2 people, 0 deals, 0 activities.

Expected outcome: 2 people, 0 deals, 0 activities; review

Pass condition to check: Both seeded people remain. No deal or activity is created. The ambiguous request and its two candidate references remain visible for review.

Observed result: Not recorded.

Not run

Keep failed and unfinished runs in the report.

A successful module indicator is not the full result. Save the resulting IDs and counts, mapped fields, owner, next activity and recovery evidence. A case in “review” remains unresolved; it does not become a passed live handoff because no new error appears.

Use the test kit.

The input pack defines the cases and expected outcomes. The result template starts with every case marked not_run. Replace symbolic IDs with your own test references and keep personal data out of anything you publish.

These are test specifications. They do not connect to an account, create CRM records or certify an integration.

To prepare or send the synthetic events, use the Node test sender with the test-runner instructions. Its default creates a dry-run plan. D02 sends ten deliveries of one event; D03 sends two overlapping requests. Live delivery requires an explicitly confirmed test endpoint and baseline. An HTTP acknowledgement does not pass a CRM acceptance case.

Check the record before reviewing the evidence

Does your result log hold together?

Check a JSON result log for missing cases, contradictory outcomes and incomplete record references. The file stays in this browser tab.

Use the supplied template. Keep customer data out of the file. The checker cannot verify that a referenced external run took place.

Result-log conventions

Keep untouched files as blank_run_log. Use in_progress_run_log while recording cases and completed_run_log when every case has a recorded outcome. A consistent completed log still needs an evidence review.

Use typed internal references such as person:101, deal:201 and activity:301. Include the final observed records, including seeded records in D04. Quarantined exceptions do not become completed handoffs. Credits can be non-negative measured values; do not invent them.

Recover deliberately.

  • Inspect the event key, relevant payload and confirmed destination IDs.
  • Check whether the uncertain write already reached the destination.
  • Name the owner of each unresolved case and record the recovery action.
  • Resume only when the next write has a defined expected outcome.
  • Inspect final records and follow-up visibility before accepting the result.

Count recovery work in your plan.

Once the route passes, measure the credits for each path and its extra attempts. Use the Make credit estimator to turn those observations into a monthly planning estimate.

If the process is still being designed, return to the form-to-Pipedrive guide. A stable manual handoff may be a better current choice than an unverified automation.

Version notes: check the fields you actually map.

Make’s Pipedrive documentation records API v1/v2 changes. Its stated v1-module deadline was 31 July 2026; for an older scenario, check the current module version and guidance rather than relying on a saved screenshot or blueprint.

  • Some related records now return IDs. Retrieve the related record when you need its fields.
  • Custom fields are grouped under custom_fields; check the mapped paths and value types.
  • Use the documented underlying custom-field code. Renaming a display label does not necessarily break that mapping.
  • Check the current search options and confirm an exact candidate match. The field names used by a custom API call may differ from the module interface.

Record the form payload contract, module version, field codes and acceptance date with your route. Re-run relevant cases after changes. These are documentation notes, not a claim that every rename breaks a workflow. Make’s Pipedrive documentation, checked 4 October and rechecked 5 October 2026.

Still choosing the route? Use the Pipedrive Web Forms vs Make comparison to decide whether the existing form and record requirements call for a connector.

Sources and method

Import and Retry-handler references were checked 3 October 2026. Pipedrive module and incomplete-execution guidance was checked 4 October and rechecked 5 October 2026; webhook and contact-merge guidance was checked 5 October 2026. The state model and cases are original implementation guidance. They do not report measured duplicate prevention or a successful product test.