Tracking

Duplicate purchase events: why sales are counted twice

Duplicate purchase events inflate conversions and ROAS. See the causes, how Meta, TikTok, Snapchat, Pinterest and Reddit deduplicate, and how to fix it.

·8 min read·By the ROASaurus team

Key takeaways
  • 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 platformSeveral platforms claim one sale
What happensOne platform counts the same order more than onceSeveral platforms each take credit for the same order
ExampleMeta shows 2 purchases for one $80 orderMeta, Google and TikTok each report the same $80 order
CauseTwo events for one order without a shared event idEach platform credits the sale by its own attribution rules
Fixed by deduplicationYesNo
What to doOne sender per pixel and one event id per orderCompare with your store orders and use one attribution model
Deduplication solves the first problem. The second one needs your own order data.

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 checkout
server Purchase event_id=order-1042Conversions API, same name and id: merged with the first
browser Purchase event_id=7c1e9a40A second app on the same pixel, with its own id: counted again
The first two events share an id and count as one purchase. The third has its own id, so the platform reports two purchases for order 1042.

Two 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.

PlatformBrowser fieldServer fieldWindowNotes
MetaeventIDevent_id48 hoursThe event name must match too. A fallback with fbp or external_id only works when the browser event arrives first.
TikTokevent_idevent_id48 hoursThe event name must match too. TikTok keeps the first event it receives.
Snapchatclient_dedup_id, and transaction_id for purchasesevent_id, and order_id for purchases48 hours, or 30 days for the purchase order idThe event name must match too. The client_dedup_id pair takes priority.
Pinterestevent_idevent_id48 hoursSend the same event name from both sources. Pinterest keeps the first event it receives.
RedditconversionIdconversion_id2 daysSame event type, and the same name for custom events. Runs every hour and can take up to 24 hours to show.
The common rule: the same event, the same id, within the window. The field names differ, so check each integration separately.

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.

Revenue claimed in one week (example store)
Meta
$7,400
Google Ads
$4,100
TikTok
$1,900
Sum of platform claims
$13,400
Store revenue
$10,000
The three platforms together claim $13,400 of a $10,000 week, 34% more than the store took. Each platform counted correctly by its own rules.

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

  1. 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.

  2. 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.

  3. 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.

  4. 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)PurchasesStore ordersRatioWhat it suggests
Meta, browser1861201.55More purchases than orders: two tools fire the browser pixel
Meta, server1191200.99Normal: one server sender
TikTok, server2411202.01Every order twice: two apps send the Events API
Counts per source, before deduplication. A ratio above 1.0 means that source sends some orders twice. A ratio near 2.0 means it sends almost every order twice.

How to fix duplicate purchase events

  1. 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.
  2. 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.
  3. Use the same event name. The browser and the server must name the event in the same way, exactly as the platform defines it.
  4. 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.
  5. 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

  1. Meta: Handling Duplicate Pixel and Conversions API Events
  2. TikTok Ads Manager: About Event Deduplication
  3. Snap for Developers: Deduplication
  4. Pinterest Developers: Track conversion events in the API
  5. Reddit Ads Help: Event Deduplication

In ROASaurus

Keep reading

TrackingAd blockers and tracking: what your store losesAd blockers stop tracking pixels, so ad platforms miss purchases. See which events are lost, why server-side events are not, and how to measure your gap.TrackingConsent Mode v2 and GDPR: what a webshop may sendConsent Mode v2 for webshops: the four Google consent signals, what EU law asks, and what server-side tracking may still send. General information only.TrackingSafari ITP and ad tracking: what still worksSafari ITP caps cookies set by scripts at 7 days, or 24 hours after some ad clicks. See what it does to attribution and which tracking still works.
FAQ

Questions, answered

Why does Meta show more purchases than my store has orders?

Usually because two tools send the same pixel with different event ids, or because the browser and server events do not share an id. Meta can only merge copies that have the same event name and the same event id.

How long does Meta wait to deduplicate events?

Meta deduplicates a browser event and a server event with the same event name and event id when they arrive within 48 hours of the first one.

Should I turn off the browser pixel to stop duplicates?

No. Give the browser event and the server event the same event id instead. The browser pixel adds signals such as cookies, and the server event arrives when the browser is blocked.

Can deduplication fix several platforms claiming the same sale?

No. That is overlapping attribution, not a duplicate event. Compare platform claims with your store orders, and use one attribution model to compare channels.

Does Pinterest deduplicate the tag and the Conversions API?

Yes, when both events carry the same event_id and event name and arrive within 48 hours. Pinterest keeps the first event it receives and removes the later copies. In ROASaurus, the Tag and the server send all five shopping events with matching ids and names.

Every sale, traced to the ad that earned it

Server-side tracking, profit and lifetime value in one app. 14-day free trial, no credit card.

Start your free trial →