HomeGuidesMeta counting purchases twice?

Meta counting purchases twice? Fix Pixel and Conversions API deduplication

Last updated 3 November 2026

Almost every account I open for the first time has the same problem: Ads Manager shows more purchases than the store actually made. It isn’t fraud and it usually isn’t a bug. It’s two systems doing their job correctly, with nothing telling Meta they’re describing the same order.

Why this happens

Most Shopify stores send the Purchase event to Meta two ways at once. The browser Pixel fires when the order confirmation page loads in the customer’s browser. The Conversions API (CAPI) fires separately, from Shopify’s servers, for the same order. Both are good practice on their own — the server call survives ad blockers and Safari’s tracking limits, and the browser call captures signals the server doesn’t have.

The problem is that Meta only merges the two into one purchase if they carry a matching event_id and, ideally, the same event_name. If the browser Pixel is sending its own ID and the server call is sending a different one — or no ID at all — Meta has no way to know they’re the same sale. It counts both. Your Ads Manager purchase count and revenue climb above what Shopify actually processed, your cost per purchase looks artificially good, and if you’re optimizing campaigns on that number, you’re optimizing on a number that doesn’t exist.

How to check it in Events Manager

Open Events Manager and select the dataset connected to your ad account.

  • Overview tab. Look at the Purchase row for the last 7 days and compare the count against your actual Shopify order count for the same window. If Meta’s number is noticeably higher, that’s your first signal.
  • Deduplication. Click into the Purchase event and look at the breakdown by source — browser versus server. Events Manager will show you how many events came in from each, and whether they were matched into one. A low match rate between browser and server purchases is the direct evidence of the problem.
  • Test events. Open the Test Events tool, place a real or draft order, and watch what comes in live. If deduplication is broken, you’ll see two separate Purchase events land for the one order instead of a single event flagged as deduplicated.

How to fix it on Shopify

If you’re on Shopify, the fix is almost always in the official Facebook & Instagram channel app, not in custom code.

  • Open the Facebook & Instagram app, go to its data sharing settings, and set it to Maximum. This lets Shopify send order data server-side through the Conversions API using IDs that match what the app’s own Pixel snippet sends in the browser, so Meta can line the two up automatically.
  • Make sure the app is your only source of Purchase events. A second source is the usual cause once Maximum data sharing is already on. Check for an old theme snippet with a hardcoded fbq('track','Purchase') call on the order status page, a checkout extension someone installed, a Google Tag Manager container also firing a Facebook pixel tag, or a different "Facebook Pixel" app left active from before you installed the official one. Any of these will fire a Purchase event with its own ID, outside the app’s matching system, and you’re back to double counting.
  • If you do need the browser Pixel to fire from Google Tag Manager for some other reason, don’t also let the Facebook & Instagram app fire a browser-side Purchase. Pick one source for the browser event and let the app handle the server side, rather than running two independent browser-and-server pairs at once.

Confirm with one test order

Once you’ve made the change, place one test order (a $1 product or a draft order you refund afterwards works fine) and watch Test Events as it comes in. You should see one Purchase event, marked as deduplicated if both the browser and server sent it, not two separate events. Give it a day for the Overview numbers to settle, then compare the Purchase count for that day against your real Shopify orders — they should match.

If you would rather have someone check it for you, the $150 audit covers this.