Event deduplication: how one conversion stays one conversion
Updated
Short answer: when the browser and your server both report a conversion, the ad platform needs a way to tell it is one conversion. You give both copies the same event name and the same event ID, and the platform keeps one.
Why it matters
Without a shared ID, a platform can count one sale twice. Reports look better than they are, cost per conversion looks lower than it is, and the platform’s delivery learns from conversions that never happened. Sending from both sides is only useful if the copies merge.
How it works
// Browser: the fourth argument of Meta's fbq
fbq("track", "Purchase", { value: 149, currency: "EUR" }, { eventID: "ORD-1001" });
// Server: the same event in the Conversions API
{ "event_name": "Purchase", "event_id": "ORD-1001", ... } The rules differ a little per platform:
| Platform | Matches on | Window | Which copy is kept |
|---|---|---|---|
| Meta | event_name and event_id (eventID in the pixel) | 48 hours | The first |
| TikTok | Event name and event_id, for the same pixel | 48 hours | The first; a close second copy can add missing data to it |
| ChatGPT Ads | Pixel, event and ID | Not published | The first |
Sources: Meta, TikTok, our ChatGPT Ads guide. Platforms change these rules, so check their pages if the window matters to you.
What usually breaks it
- A new ID on each side. The browser and the server each generate their own, so nothing matches. The ID has to be created once and shared.
- Different event names.
Leadin the pixel andleadorSubmitFormon the server are different events to Meta. - The ID in the wrong place. In Meta’s pixel it belongs in the fourth argument, not among the event’s parameters.
- Two installs on one page. A plugin and a tag manager each fire their own event with their own ID, and both are real to the platform.
- A new ID on refresh. A thank-you page that generates a fresh ID counts the same order again when it reloads. For purchases, use the order ID.
How to check yours
Open the platform’s own test tool, Test Events in Meta’s Events Manager or its counterpart in TikTok’s, and fire one conversion. You should see a browser copy and a server copy with one ID, and the platform marks one as deduplicated.
Platforms don’t report which pairs they merged in general, so no outside tool can show a true merge count, and that includes ours. The Pixelary dashboard shows what was sent as a pair: browser and server, with one ID.
How Pixelary does it
The script creates one ID per event, passes it to each pixel and sends it with the server copy, using each platform’s own event name. You pass your own ID only when you have a better one, such as an order ID. Two copies, one event ID has the details.