Skip to content

TroubleshootingMeta

Meta Reports More Purchases Than Shopify: Diagnosis

Meta Ads Manager shows more purchases than Shopify has orders. Diagnose duplicate Pixel and CAPI events, double-fired Purchase events, and counting rules.

Published
Reviewed

Diagnosis

  1. Platform Meta
  2. Usual cause One order reaches Meta more than once: Pixel and Conversions API without a shared event_id, two pixels, or a Purchase event that re-fires.
  3. Causes, ranked 6
  4. How to diagnose it 8
Go to the checks

First answer free, within one working day. Describe your case

Sounds familiar?

The symptom

Symptom report Meta

Meta Ads Manager reports more purchases than Shopify recorded orders for the same period. The extra count is usually not new customers — it is the same orders counted more than once, or events that fired with no order behind them.

Shopify’s order list records money actually taken; Meta’s count records conversion events it received. The work is finding which events have no single real order behind them.

Two ledgers of the same period: the platform's column taller than the store's, the excess outlined
Tick what you see

Tick the lines that match your store.

Describe my case

The short version

Direct answer

Meta counts conversion events; Shopify counts orders. Meta reports more purchases when one order is sent to Meta more than once — usually a Pixel and Conversions API pair without a shared event_id, two pixel installs firing at once, or a Purchase event that re-fires when the confirmation page is reloaded.

A smaller share of the gap is counting rules: click-date crediting, view-through conversions with no click, test and cancelled orders that were never removed, and currency differences that describe the same orders in different units.

Where to look

Causes, ranked

Ranked from the causes that produce the clearest duplication to those that only change how the same orders are counted. Each has a distinct signal, so one pass through Events Manager, the browser, and a Shopify export narrows the list.

Meta reports too many purchases6 causes

  1. Pixel and CAPI without a shared event_id

    Meta merges a browser event and a server event only when event_name and event_id match exactly. If each side generates its own identifier, Meta sees two purchases while both legs look correct in isolation.
  2. Two pixel installs

    A theme pixel plus an app’s pixel, two apps both managing Meta, or a Customer Events custom pixel alongside theme code. If both fire Purchase, Meta receives two events even when they share a pixel ID, because the events are distinct.
  3. Purchase fired on page reload

    If Purchase is tied to page load, every visit to the thank-you or order-status page re-fires it: a refresh, a customer returning through the confirmation email, an upsell step that re-renders the page. It has to fire once per order.
  4. Attribution window and view-through

    Meta credits purchases to the ad-click date and can count view-through conversions — an impression that converts later with no click. Shopify has no equivalent record, so Meta’s count includes orders Shopify attributes elsewhere.
  5. Test, cancelled, and refunded orders

    A Purchase event is counted when it fires; test checkouts, cancelled orders, and incomplete payment attempts stay in the count unless a corrective signal is sent back.
  6. Currency and value mismatches

    This moves the value line more than the count. If Meta receives the order value in a presentment currency while Shopify totals the store currency, the period totals diverge even for the same orders. A missing value parameter has a similar effect.

8 steps

How to diagnose it

Three surfaces, in order: Events Manager for what Meta received, the browser for what the page sent, and a Shopify order export for what happened. The order-level comparison comes last.

  1. Fix the period first. In Shopify Admin → Orders, filter to an older week or month where any attribution window has settled, and note the order count, total sales, and store currency.
  2. Check dedup status. In Events Manager → Data Sources, select the dataset, open Overview, and read the Purchase row. Where browser plus server exceeds the deduplicated total, both legs are being counted. Column labels vary by version.
  3. Watch one purchase in Test Events. Open Events Manager → Test Events and trigger a test purchase. A correct setup shows browser and server matched into one purchase; two rows for one order is duplication. Note any event_id warning.
  4. Check the browser install. With Meta Pixel Helper open, complete a test checkout. It lists every pixel that fired and what each one sent. Then filter the Network tab to facebook.com/tr and count the Purchase requests one order produces. Two requests, or two pixel IDs, confirms a double install.
  5. Reload the confirmation page. If a new Purchase request fires on reload, or when you revisit the order-status page, the event is tied to page load rather than to the order. Repeat through any post-purchase upsell step.
  6. Inventory the installs. In Settings → Customer events, note registered custom pixels; in Settings → Apps and sales channels, list which apps manage Meta; search the theme for pixel code. Anything appearing twice can double-fire.
  7. Check attribution. In Ads Manager, review the campaign’s attribution setting. A view-through conversion is credited to an impression, but the purchase behind it is a real Shopify order — the same order Shopify attributes to another channel or to none.
  8. Reconcile order by order. Export Shopify orders with ID, date, total, and currency, and pull Meta’s event-level Purchase data with event ID and value. Match each Meta purchase to one order: two events for one order is duplication; an event with no order is a test, cancelled, or never-completed order; a matched order with a different value is a currency difference.

Signal and fix

Decision table

Use this once the diagnosis has narrowed to one or two causes. The signal column is what you saw; the fix is the change it points to.

CauseSignal you’ll seeFix
Pixel + CAPI without a shared event_idTwo Purchase rows in Test Events for one order; the browser and server event IDs differGenerate one event ID per order and pass the identical value to both legs
Two pixel installsPixel Helper lists Purchase twice, often from two pixel IDs; facebook.com/tr shows two requests for one orderKeep one system as the source of Purchase and remove the pixel call from the other
Purchase fires on reloadA new Purchase request on each visit to the confirmation or order-status pageFire once per order, guarded by the order identifier, not on page load
Attribution window and view-throughThe gap is structural; no duplicate order maps to it, and view-through credits appear in the campaign breakdownCompare only closed windows, and reconcile on click-through purchases
Test, cancelled, and refunded ordersMeta purchases with no matching Shopify order, clustered around test checkoutsExclude internal and test traffic, and send a corrective signal for orders that don’t stand
Currency or value mismatchCounts roughly reconcile but period value totals don’t; the event currency differs from the store currencySend value and currency consistently, and compare in the currency Shopify reports totals in

A note from Daniilbefore you decide

Should you fix it yourself or bring in help?

Most of the diagnosis is reachable from the admin panels: the Events Manager overview, Test Events, Shopify’s Customer events list, and the installed apps. Reading a facebook.com/tr request needs no code, and Meta Pixel Helper flags a double install in minutes.

What usually needs a developer is the fix rather than the finding. Threading one event identifier through a pixel and a server payload, moving Purchase from page load to once-per-order, or removing one of two overlapping systems without leaving a gap — each changes checkout-adjacent code and needs verification in Test Events.

A third case sits between the two: one system installed, and deduplication still failing. That is usually the identifier logic itself, which is what a Meta Conversions API engagement covers.

— Daniil

Next

If the self-check does not settle it.

The checks above find the cause in most stores. When two or more overlap, an order-level reconciliation is faster than another afternoon spent comparing dashboards.

Tracking Health Check

Price
USD 395
Access
Read-only
Timeline
verdict two working days after the kickoff

What the reconciliation shows for this symptom.

A Health Check reconciles this symptom order by order against your Shopify orders, so the cause is a fact from your own data, not a guess from a dashboard. Real numbers for this symptom are not published yet — ask for the sample report.

Request a Health Check · USD 395

Follow the order. Then compare the evidence.

  1. Real orderOrder ID, amount, currency
  2. Browser / server eventsConsent, event ID, delivery
  3. GA4 / advertising platformsReceived events and reporting
  4. Reconcile the recordsMatch IDs, time windows and definitions
A completed order and a reported conversion are different records. Check the path and compare like-for-like before treating a difference as missing data.

Questions

Questions this symptom raises

Why would Meta count a purchase that Shopify doesn't have at all?

Because Meta counts conversion events, and not every event it receives belongs to a completed order. A test checkout, an order that was later cancelled, or a payment attempt that never completed can all appear in Meta's count with no matching order record. The event fired; the order didn't.

Does cancelling or refunding an order remove it from Meta's count?

Not by itself. Meta counts the Purchase event when it fires, and changing the order in Shopify afterwards doesn't retroactively remove that count. The reporting adjusts only if a corrective signal is sent back to Meta — a refund or cancellation event from whichever system owns the integration. Whether that happens depends on your setup, so verify it rather than assume it.

Can two pixels on the same page cause double counting?

Yes. If a theme pixel and an app's pixel both fire Purchase for the same order, Meta receives two events. They don't even need different pixel IDs — two separate browser events on the same dataset still count twice. Meta's deduplication only pairs a browser event with its server (Conversions API) twin on a matching event name and event ID; it never merges two browser events.

How do I find the specific orders that were double-counted?

By reconciling order by order rather than comparing period totals. Export Shopify's orders with their IDs, dates, values, and currency, pull Meta's event-level Purchase data with the event ID and value, and match each Meta purchase to exactly one Shopify order. Two Meta events against one order is duplication; a Meta event with no order is a test, cancelled, or never-completed order.

Read more, or check a neighbouring symptom.

All symptoms
Daniil Maximkin

Hi, I’m Daniil.

I work with you from defining the problem to implementation and handover. You talk to the person who does the work. I work in English and Russian.

Tried it and still stuck?

Describe your task

The first answer is free, within one working day. Or write directly: next@taskfordaniel.com