- A duplicate purchase event is one order that an ad platform counts as two or more purchases.
- The usual causes are a browser pixel and a server event without a shared event id, and two tools that send the same pixel.
- Meta, TikTok, Snapchat, Pinterest and Reddit each keep one copy when the browser and server events carry matching ids and arrive within the platform's time window.
- When Meta, Google and TikTok all claim the same sale, no event was sent twice: that is overlapping attribution, and deduplication cannot fix it.
- Compare the purchase count from each source with your store orders: a single source with more purchases than orders means a second sender.
Duplicate purchase events happen when an ad platform counts one order as two or more purchases. The usual causes are a browser pixel and a server event that do not share an event id, and two tools that send the same pixel. The result is inflated conversions, a ROAS that looks better than it is, and bidding that learns from sales that never happened.
This guide explains the causes, the difference between duplicates inside one platform and several platforms claiming the same sale, how deduplication works on Meta, TikTok, Snapchat, Pinterest and Reddit, and how to find and fix duplicates.
What counts as a duplicate purchase event?
Two different problems are both called double counting. They have different causes, and only one of them is a tracking error.
| Duplicate inside one platform | Several platforms claim one sale | |
|---|---|---|
| What happens | One platform counts the same order more than once | Several platforms each take credit for the same order |
| Example | Meta shows 2 purchases for one $80 order | Meta, Google and TikTok each report the same $80 order |
| Cause | Two events for one order without a shared event id | Each platform credits the sale by its own attribution rules |
| Fixed by deduplication | Yes | No |
| What to do | One sender per pixel and one event id per order | Compare with your store orders and use one attribution model |
Why purchases are counted twice
A browser pixel and a server event without a shared id
Many stores send each purchase twice on purpose: once from the browser pixel and once from a server through a conversions API. That is a good setup, because the server copy arrives when the browser copy is blocked. But the platform can only merge the two copies when they carry the same event id and the same event name. If the browser uses a random id and the server uses the order number, the platform sees two different purchases.
Two tools that send the same pixel
This cause is common and easy to miss, especially after a move to a new tracking tool. A store installs a tracking app but keeps the platform's own sales channel app, a Google Tag Manager tag or pixel code in the theme. Each tool sends its own Purchase with its own ids. Deduplication inside each tool works, but the platform still receives two unrelated purchases.
The same event sent again
A purchase tag on the order confirmation page can fire again when the shopper reloads or revisits the page. A server can also send an order twice, for example once when it is created and again when it is paid. Build the event id from the order id, so that a repeat carries the same id as the first copy and the platform can recognize it.
How does deduplication work?
Deduplication is how a platform keeps one copy of an event that it received more than once. The rule is similar on the platforms in this guide: the copies must carry the same id, usually together with the same event name, and they must arrive within a time window. The platform then keeps one copy and drops the rest.
browser Purchase event_id=order-1042Browser pixel in checkoutserver Purchase event_id=order-1042Conversions API, same name and id: merged with the firstbrowser Purchase event_id=7c1e9a40A second app on the same pixel, with its own id: counted againTwo practical rules follow from this. Create the id once, from something that both the browser and the server know, such as the order id. And use exactly the same event name on both sides, as the platform defines it, for example Purchase on Meta.
Deduplication rules per platform
The details differ by platform. This table summarizes each platform's official documentation in October 2026.
| Platform | Browser field | Server field | Window | Notes |
|---|---|---|---|---|
| Meta | eventID | event_id | 48 hours | The event name must match too. A fallback with fbp or external_id only works when the browser event arrives first. |
| TikTok | event_id | event_id | 48 hours | The event name must match too. TikTok keeps the first event it receives. |
| Snapchat | client_dedup_id, and transaction_id for purchases | event_id, and order_id for purchases | 48 hours, or 30 days for the purchase order id | The event name must match too. The client_dedup_id pair takes priority. |
event_id | event_id | 48 hours | Send the same event name from both sources. Pinterest keeps the first event it receives. | |
conversionId | conversion_id | 2 days | Same event type, and the same name for custom events. Runs every hour and can take up to 24 hours to show. |
In ROASaurus, the browser pixels for Meta, TikTok, Snapchat, Pinterest and Reddit send the same event id as the server events, so those platforms deduplicate. For Snapchat, the pixel also sends the order id as transaction_id, which matches the order_id in the server purchase. For Pinterest, the Tag and the API use matching event names. X, Microsoft Advertising and Taboola receive server events only, so there is nothing to merge. If you send events yourself, the guide to the Meta Conversions API shows where the event id goes in the pixel and in the API call.
Several platforms claiming one sale is not a duplicate event
Now the second problem. A shopper watches a TikTok video, clicks a Google Shopping ad two days later and buys after a Meta retargeting ad. Each platform has its own record of a click or a view, and each one reports the sale. No event was sent twice, so no deduplication setting changes this.
Adding up platform revenue therefore always overstates what your ads earned. To judge channels against each other, use your own order data and one attribution model for all channels. Our guide to why Ads Manager and Shopify disagree goes deeper. In ROASaurus attribution, the credit for each order adds up to one order across all channels.
How to find duplicate purchase events
- Compare each source with your orders
Take one full day. Count the Purchase events that each source sent that day, before deduplication: the browser pixel and the server events. Some events tools show this split by connection method, and your server-side tracking tool has its own log of what it sent. Compare each number with the number of orders your store took that day.
- Read the deduplication reports
Some platforms report the duplicates they removed. Reddit, for example, keeps a log of deduplicated events for seven days, and Pinterest shows deduplication per event in Ads Manager.
- Place one test order
Open the test events view of the platform and place one order. You should see one browser and one server Purchase with the same event id. A third Purchase, or two different ids, shows the cause.
- List every tool that can send the pixel
Check sales channel apps, tag manager containers, theme code and older tracking apps. A browser extension such as Meta Ads Data Advisor, formerly Meta Pixel Helper, shows which pixel events fire on a page.
The first step is the fastest check. A source with one sender sends at most one purchase per order. The browser count is usually lower than your orders, because of ad blockers and declined consent. So a single source with more purchases than orders points to a second sender or to repeated events:
| Source (example store, one day) | Purchases | Store orders | Ratio | What it suggests |
|---|---|---|---|---|
| Meta, browser | 186 | 120 | 1.55 | More purchases than orders: two tools fire the browser pixel |
| Meta, server | 119 | 120 | 0.99 | Normal: one server sender |
| TikTok, server | 241 | 120 | 2.01 | Every order twice: two apps send the Events API |
How to fix duplicate purchase events
- Keep one sender per pixel. Choose one tool for each pixel and switch that pixel off everywhere else: sales channel apps, tag manager tags and theme code. On Shopify, remove the same pixel from the data sharing settings of the Facebook & Instagram channel, because every data sharing level still sends the browser pixel. Check the TikTok app in the same way.
- Use one event id per order. Build the id from the order id and send it with both the browser event and the server event.
- Use the same event name. The browser and the server must name the event in the same way, exactly as the platform defines it.
- Send within the window. A server event that arrives days later is not merged. On Meta, TikTok and Pinterest the window is 48 hours, on Reddit two days.
- Test again after every change. Repeat the test order, and compare the counts again the next day.
How ROASaurus avoids duplicate purchase events
ROASaurus sends each purchase from the store's order data and gives the browser copy and the server copy the same event id, built from the order id. On Shopify, the server event comes from the paid-order webhook, so a reload of the thank-you page does not create a new server event. The Event log lists every server delivery per platform, with the request and the platform's response, so you can see what was sent for each order. The guide to server-side tracking on Shopify shows the full flow.
If a platform still shows more purchases than orders, another tool sends the same pixel. Prevent double counting lists where to look, and server-side tracking explains which events ROASaurus sends to each platform.
Sources
- Meta: Handling Duplicate Pixel and Conversions API Events
- TikTok Ads Manager: About Event Deduplication
- Snap for Developers: Deduplication
- Pinterest Developers: Track conversion events in the API
- Reddit Ads Help: Event Deduplication