Platform

Conversion deduplication

Every conversion becomes one clean event, passes the checks once, and then goes only to the platforms you choose. The same order or lead is sent once per ad platform, however many tools report it.

What it is

Deduplication is how DataCops makes sure a single real sale or lead is counted once by each ad platform. It works in three layers: a repeated delivery of the same message is dropped on arrival, the same order is sent only once per platform, and the same lead email is sent only once in a short window. Every duplicate is logged with a reason, so you can see it was caught.

Why duplicates happen

One purchase can be reported many times. The thank-you page fires in the browser. Shopify sends the paid order from its servers, and webhooks are often delivered twice. A Zapier step retries after a timeout. A customer reloads the confirmation page. Without a check, each of those becomes its own conversion, your ad platform reports more sales than you made, and its bidding learns from numbers that are not real.

One clean event

A conversion can come from the pixel, a LeadCops form, a Shopify order, a mapped custom event, a CSV upload, or a call to the API. Whatever the source, every conversion goes through one door in DataCops. There it becomes one clean event: one event name, one time, one stable ID, the person's matched details and ad click, and the fraud verdict.

Only after that single version exists does anything decide where the event goes, so every platform gets the same version of it.

The three duplicate checks

CheckKeyWindowApplies to
Repeat deliverymessageId per site48 hoursConversions API, Shopify, Zapier and other inbound sources
One saleOrder ID per ad platform400 daysPurchase events with an order ID
One leadHashed email per ad platform30 minutesLead events with an email

The first check runs as an event arrives. A second post with the same messageId is answered with duplicate_delivery_skipped and goes no further. Shopify orders use a fixed ID per order, so Shopify's own repeat webhooks are caught here.

One sale, one conversion

The second and third checks live in the sale ledger. It runs after every other check, right before the send, and it is kept per ad platform: Meta, Google Ads, TikTok, LinkedIn, Microsoft Ads, Reddit, Pinterest and X.

  • Purchase. The first report of an order claims it for each platform. Any later report of the same order ID, from any source, is skipped as duplicate_sale.
  • Lead. A website form and a CRM contact for the same person within 30 minutes count as one lead. The repeat is skipped as duplicate_lead.
  • Failed sends release the claim. If a platform rejects the send, the claim is let go so a retry can still deliver.
  • Your CRM keeps everything. HubSpot, Klaviyo, Brevo, ActiveCampaign and webhooks are your own systems, so they receive every stage. The ledger is for ad platforms only.

Events without an ID, or event types other than Purchase and Lead, are not claimed in the ledger. They still get the repeat-delivery check and the platform's own duplicate check.

Browser and server, counted once

If you keep a browser pixel next to DataCops, the platform can receive the same event from both. DataCops sends its event ID with each server event, and for Meta that ID is what matches the browser event, so Meta counts the pair as one. Ads Warmup uploads use a daily key per person and event, so sending the same list twice in a day does nothing new. HighLevel uses a sale window you set per location, from 1 to 365 days, 30 by default.

Send your own ID

When you post conversions yourself, always send a messageId, and an order_id for purchases. A retry with the same values within 48 hours is dropped on arrival, and a purchase with the same order_id is still sent only once per platform after that.

cURL
curl -X POST https://api.joindatacops.com/api/v1/conversions/zapier \
  -H "x-dc-key: dcp_your_private_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "event": "Purchase",
    "messageId": "order-1001",
    "properties": { "value": 49.0, "currency": "USD", "order_id": "1001" }
  }'

Posting this twice within 48 hours returns "message": "duplicate_delivery_skipped" for the second call. Full field list: Send conversions.

Checks before routing

Duplicate checks are one part of a fixed order. For each event, DataCops checks:

  1. Your account is active.
  2. Consent. For EU, UK and Swiss visitors, nothing goes to an ad platform without an opt-in. Anywhere, an explicit reject stops it.
  3. Your flow for this event is not stopped, and any rule or hold you set on it.
  4. Per platform: routing on for this event, your send rule, page views only if you allowed them, not paused, Real people only if you switched it on, and not in watch-only mode.
  5. The sale ledger, then the send.

You choose the destinations per event. You might send Purchase to Google Ads and Meta, and Lead to LinkedIn only. Each platform is sent on its own, so one slow platform never holds up the others. Real people only is off by default; see Real people only.

Hold a lead until it qualifies

Because delivery is server-side, DataCops can hold a lead and send it only once it is confirmed. HubSpot is checked every five minutes against the field you choose, or your system calls the release API. The lead then goes to your ad platforms with its original ad click. Held leads expire after 14 days. Release is claimed first, so a lead is never released twice. See Qualification gate.

See it in the delivery report

Every event that is not sent gets a written reason: duplicate sale, duplicate lead, not mapped, consent rejected, held, and more. The delivery report shows them per platform, so a lower count on Meta than in your store has an answer you can read.

Was this page helpful?