Skip to content
Browse documentation

Duplicates and de-duplication

When a repeated postback becomes a duplicate, an extra conversion or an update, and how to configure it.

Last updated 3 min read

On this page

Advertiser systems retry, pixels fire twice when a buyer reloads the thank-you page, and some platforms send every event more than once. TrackCrown removes duplicates before any money is counted or any partner postback fires.

The two de-duplication keys#

KeyApplies whenConfigured by
Click + eventThe conversion has a click and the event allows only one conversion per click.Offer → Tracking → One conversion per click; event → Allow multiple per click
Offer + order IDThe request carries txid (aliases adv_txid, order_id).Always on

A request that hits either key is not a new conversion. What happens next depends on whether it changes anything:

The repeat…ResultResponse
carries the same status and amountsStored as a duplicate row: rejected, reason duplicate, no postbacks, no caps{"ok":true,…,"status":"rejected","reason":"duplicate","duplicate":true}
is an S2S postback with a new status or new amountsThe original conversion is updated (Reversals){"ok":true,…,"updated":true}

Duplicates are kept so you can see every attempt (Reports → Conversions, filter status Rejected). They count in the Rejected report metric, never in Conversions, revenue or payout, and never fire postbacks. A duplicate can be rejected but never approved from the panel or the API.

One conversion per click#

One conversion per click (offer → Tracking tab, on by default) stores repeats for the same click and event as duplicates. Different events of the same click are separate conversions: a lead and a sale from one click both count.

To accept several conversions of one event per click — recurring deposits, renewals, multiple purchases:

  1. Open the offer → Events tab.
  2. Edit the event and turn on Allow multiple per click ("Every postback for the same click counts").
  3. Save.

Or turn One conversion per click off for the whole offer.

Extra conversions of such an event are stored with status reason multiple (they are normal conversions with their own status; multiple is a marker). If an extra conversion is rejected, the cause (for example cap_exceeded) is shown instead.

Order IDs#

The order ID is unique per offer: ORDER-1001 on offer A and ORDER-1001 on offer B are two conversions. Send it on every postback and pixel when the advertiser has one:

URL
https://trackcrown.com/pb?click_id={click_id}&amount={amount}&txid={order_id}&token=YOUR_TOKEN
HTML
<img src="https://trackcrown.com/px?offer_id=SHOP01&amp;amount=49.90&amp;txid=ORDER-1001" width="1" height="1" alt="">

The order ID is also how the advertiser later cancels or re-prices a conversion — see Reversals.

Pixels and duplicates#

Pixels cannot update conversions (they are unauthenticated). A pixel that repeats the click + event (on a one-per-click event) or the order ID is always stored as a duplicate, even with a different amount or status.

Concurrent requests#

The duplicate check runs before the conversion is stored, and unique database indexes are the final guard: when two identical postbacks arrive at the same moment, exactly one is stored as the conversion and the other becomes the duplicate (or the extra multiple conversion). Cap counters reserved for the losing request are released.

Duplicate clicks are different#

Duplicate clicks (the same visitor clicking twice) are handled on the click side by the offer's unique-click settings and do not affect conversion de-duplication. Unique clicks are the first click per offer, partner, IP and user agent within 24 hours (the Unique clicks report metric).

Checklist#

  • Repeat postbacks show duplicate in Reports → Postback log → Received? Expected: the advertiser retried.
  • A second legitimate sale from the same click became duplicate? Turn on Allow multiple per click on the event, and send distinct order IDs.
  • The advertiser sends a cancellation as a second postback? It is applied as an update only when it is an S2S postback with status=rejected (or new amounts) and matches by txid, conversion_id or click + event.
Something unclear or missing in this article?Tell us