Meta pixel duplicate purchase events on Shopify: how to find and fix them

Why Meta counts some Shopify purchases twice, how to confirm it in Events Manager in 10 minutes, and how to fix each cause without losing real conversions.

Shopify recorded 410 orders last week. Meta's Events Manager shows 690 purchases on the same pixel. Some of that gap can be attribution, but Events Manager counts purchase events, not attributed ones. When it shows far more purchases than your store took, Meta is counting some orders twice.

Duplicates inflate reported ROAS, make campaigns look better than they are and feed Meta's delivery system purchases that never happened. This guide shows how to confirm the problem, find which of five usual causes it is, and fix it without losing real conversions.

The signs of duplicate purchases

  • Events Manager purchases above Shopify orders. More than about 5% above Shopify online orders for the same week is a red flag.
  • A "potential duplicate events" warning in the Diagnostics tab of your dataset.
  • Average order value in Ads Manager well below Shopify's. The same revenue spread across extra purchases lowers it.
  • ROAS jumped after installing an app, without any change in Shopify revenue.

Don't confuse this with the normal gap between Meta's attributed revenue and Shopify. That gap comes from attribution windows and view-through conversions, and it is covered in why Meta revenue doesn't match Shopify. Duplicates are a tracking bug. Attribution is a measurement choice.

What duplicates cost you

Duplicate purchases look harmless because the numbers go up. They cause three real problems:

  • Budget decisions on inflated ROAS. A campaign at a reported 3.0 ROAS with a third of its purchases doubled is really closer to 2.0. Scaling it on the reported number can turn a profitable account into a losing one.
  • Worse optimization. Meta's delivery system learns from the purchases you send. Duplicates teach it that certain people buy twice as often as they do, which skews who it shows your ads to.
  • Wrong value bidding. If you use value optimization or a minimum ROAS bid strategy, doubled purchase values push Meta toward the wrong customers and make the target meaningless.

The longer duplicates run, the more of your account history is built on them. That makes it worth fixing quickly, even though reported results will drop when you do.

Confirm it in 10 minutes

  1. Compare counts. In Events Manager, open your dataset, then Overview, and note total Purchase events for the last 7 days. Compare with Shopify online store orders for the same days.
  2. Check the connection method. Click the Purchase row. Browser and Server both sending is expected. Look at the deduplication section to see whether Meta is matching them.
  3. List every sender. In Shopify, go to Settings, Customer events, and note every app pixel and custom pixel that sends to Meta. Then search your theme code for fbq( and connect.facebook.net, and check your GTM container for Meta tags.
  4. Place a test order. Open the Test events tab in Events Manager, place an order with a 100% discount code and watch what arrives. You want one browser Purchase and one server Purchase, marked as deduplicated. Anything more is your duplicate.

The 5 usual causes

1. The pixel is installed twice

The most common case. The Facebook and Instagram app sends the pixel, and an older install in the theme, a GTM tag or a custom pixel sends it again. Each one fires its own Purchase with its own ID.

2. Browser and server use different event IDs

The pixel comes from one tool and the Conversions API from another, for example the Facebook app in the browser and a tracking app on the server. Unless both use the same event ID for the same order, Meta can't tell they are the same purchase.

3. Two server-side sources

The Facebook app is set to its highest data sharing level, which already sends purchases through the Conversions API, and a tracking app such as Elevar or Littledata sends them through the Conversions API too. That's two server purchases per order.

4. Purchases fired on page views

Custom code that sends a Purchase whenever the order status page loads fires again every time the customer comes back to check their order. Purchases should fire on Shopify's checkout_completed event, not on a page view.

5. Upsell apps resending the order

Post-purchase upsell apps sometimes send their own Purchase. If it carries only the upsell amount, that's fine. If it resends the whole order, it's a duplicate.

How to fix each one

The rule is simple: one browser source and one server source per event, sharing one event ID.

CauseFix
Pixel installed twiceKeep one browser source. Remove theme code, old GTM tags and extra custom pixels.
Different event IDsLet one tool own both browser and server events, or configure both to use the same ID for each order.
Two server sourcesPick one Conversions API source. If a tracking app owns it, turn the Facebook app's data sharing down as the app's setup guide describes.
Page view purchasesTrigger purchases on checkout_completed only.
Upsell resendingConfigure the upsell app to send only the upsell value, or switch off its Meta tracking.

For most Shopify stores, the simplest clean setup is the Facebook and Instagram app alone, at its highest data sharing level, with nothing else sending to the same pixel. It handles both sides and deduplicates them. Stores that need more control use a tracking app or server-side GTM instead, and then the Facebook app should no longer send events. Our guide to server-side tracking on Shopify covers when that is worth it, and Elevar vs Littledata vs Stape compares the tools.

Not sure which source is doubling up?

Our free tracking check compares Meta's purchases with your Shopify orders, lists every source sending events to your pixel and tells you exactly what to remove. Read-only, within 3 business days.

Get a free tracking check

Keep it from coming back

  • Check the ratio weekly. Meta purchases divided by Shopify online orders. A sudden jump above 1.05 means something new is sending events.
  • Test after every app install. Many apps add a Meta pixel by default. Place a test order and watch Test events after installing anything that touches checkout or marketing.
  • Watch Event Match Quality too. Fixing duplicates is half the job. The other half is sending enough customer data with each purchase so Meta can match it to the right ad.

If you also see GA4 recording fewer purchases than Shopify, that is a separate problem with separate causes, covered in our GA4 missing purchases guide.

Common questions

How does Meta deduplicate pixel and Conversions API purchases?

Meta treats a browser event and a server event as the same purchase when both have the same event name and the same event ID. If the IDs differ, or one side sends no ID, Meta counts two purchases.

Is "Browser + Server" in Events Manager a problem?

No. It means purchases arrive from both the pixel and the Conversions API, which is the recommended setup. It only becomes a problem when the two are not deduplicated, which Events Manager shows in the event details and diagnostics.

Can a post-purchase upsell cause duplicate purchases?

It can. Some upsell apps send a second Purchase event for the upsell. That is correct if it carries only the upsell value, and a duplicate if it resends the full order. Test an order with an upsell and check what arrives.

Will fixing duplicates lower my ROAS in Ads Manager?

Yes, reported ROAS usually drops, because the inflated purchases disappear. Your real results do not change. Meta also optimizes better on accurate data, so the drop in reported numbers is worth it.

ServiceMeta Conversions API setup for ShopifyMeta Conversions API set up properly on Shopify: deduplicated with the pixel, high Event Match Quality, correct values and no duplicate purchases.See what's included

Freelance data and analytics engineer and founder of Good Numbers. Top Rated on Upwork. Specializes in GA4, Google Tag Manager, BigQuery, server-side tracking and Shopify attribution.