It depends on the size of the gap, but a difference is normal and usually not a bug. Facebook Ads Manager and Shopify count different things: Meta credits itself for purchases it influenced (including view-through and modeled conversions), while Shopify counts only completed orders on the last click. A gap of roughly a fifth to a third is expected; a gap near 2x usually means a tracking misconfiguration, not real inflation.

If you have ever exported both reports side by side, you know the feeling. Meta says 78 purchases; Shopify says 100 orders — or the reverse. Neither number is lying to you. They are answering two different questions.

This guide walks the exact mechanism, with a worked example you can map onto your own store. It is part of a larger series on reconciling your ecommerce data across the platforms you actually run.

First, is the gap even a problem?

Most of the time, no. The platforms track people in fundamentally different ways, so the numbers will never match to the unit.

A useful rule of thumb from the field: a gap of about 20–35% between Meta-reported purchases and Shopify orders is normal on the default attribution window, and the excess is mostly view-through plus modeled conversions (Vaizle; TrackBee). If your gap sits in that band, you likely have nothing to fix — you have two tools doing their jobs.

The number to worry about is a store where Meta reports purchases at roughly double Shopify's order count. That almost always points to a Pixel-and-Conversions-API deduplication problem, which we cover below.

The two families of causes

Every mismatch falls into one of two buckets. Knowing which one you are looking at tells you whether to fix it or just understand it.

  • Methodology gaps — the systems measure the same reality on purpose using different rules. You cannot "fix" these; better plumbing does nothing. You just interpret them correctly.
  • Tracking gaps — data is genuinely lost in transit. Better setup (server-side events, consent handling) narrows these.

Methodology gap 1: last-click vs. attribution window

Shopify's default attribution is last non-direct click. The order is credited, in full, to whatever channel the customer clicked right before buying.

Meta uses an attribution window instead. Its current default is 7-day click plus 1-day view, meaning it claims a purchase if the buyer clicked the ad in the prior seven days or merely saw it in the prior day (Foreplay; Jon Loomer). Those two rules credit different sets of orders. They were never going to agree.

Methodology gap 2: view-through conversions

This is the single biggest inflator. With the 1-day view half of that window, Meta takes credit for a purchase made within a day of seeing an ad the buyer never clicked.

Shopify has no concept of a view. It records a checkout. So every view-through conversion is a purchase Meta counts and Shopify files under a different source entirely.

Methodology gap 3: modeled conversions and click-date reporting

When Meta cannot observe a conversion directly — an iOS opt-out, a blocked pixel — it estimates one statistically and reports the estimate. Shopify never models; it reports only real orders.

Meta also reports a conversion on the click date, not the purchase date. A click Monday that converts Thursday lands on Monday in Meta and Thursday in Shopify. This alone breaks any single-day comparison, so always compare on trailing 7–14 day windows.

Tracking gap: blocked pixels and lost tail events

Ad blockers, Safari and Firefox tracking prevention, and cookie-consent declines all stop the browser Pixel from firing while Shopify still records the sale server-side. Field estimates put affected traffic at roughly 10–25% of users (Audiense/Elevar).

Then there is the closed tab: the buyer leaves before the thank-you page loads, so the purchase event never sends. This is why purchase events show the largest client-side gap of any event. Here Meta undercounts — the opposite direction from view-through. If your two effects roughly cancel, you can even see numbers that look close by accident.

A worked example you can map onto your store

Numbers below are illustrative — plug in your own. The relationships are exact.

Say you run a print-on-demand store for a week and 100 real orders come in. Say your average order is a $40 product subtotal, plus $5 shipping and $4 tax, for $49 total. Of those 100 buyers:

  • 55 clicked a Meta ad within 7 days before buying.
  • 15 only saw a Meta ad (no click) within 1 day before buying.
  • 10 clicked a Google ad last.
  • 20 arrived via organic search or direct.
  • 8 later request a refund.

What Meta reports (~78 purchases):

  • 55 click-through + 15 view-through = 70 by window.
  • +8 modeled conversions recovering buyers it could not observe.
  • Reported on the click date, so about 12 land in the prior week.
  • No refunds subtracted. Revenue passed at subtotal only: 78 × $40 ≈ $3,120.

What Shopify reports (100 orders):

Last non-direct click sends about 55 to Facebook, 10 to Google, and 35 to search/direct/other. The 15 view-through buyers clicked nothing, so Shopify does not credit them to Facebook at all. After the 8 refunds at $49, total sales fall from $4,900 to about $4,508.

So for one week of 100 real orders, you are staring at two "sales" numbers — 78 versus 100 — and both are internally correct. Meta is telling you how many orders its ads plausibly touched. Shopify is telling you how many orders happened.

The same structural split shows up in the adjacent reports: your Facebook Ads ROAS won't match Shopify for exactly these reasons, and Facebook Ads sessions won't match Shopify because session counting differs on top of conversion counting.

The one gap you should actually fix: broken dedup

If Meta shows roughly double your Shopify orders, you almost certainly have a deduplication problem — not real inflation.

Best practice is a redundant setup: send the same Purchase event from both the browser Pixel and server-side Conversions API, so blocked-browser events are recovered by the server. Meta then has to collapse the two copies into one. It does that by matching a shared event_id plus event_name, and it only deduplicates events received within 48 hours of each other, keeping the one received first (Meta for Developers).

If you send both copies without a shared event_id, Meta counts each order twice. The fix is to pass an identical event ID on both the Pixel and CAPI copy of every event. A correct redundant setup should not raise your conversion count — it should hold it steady while recovering blocked events. A jump right after you add CAPI is the tell.

Why "just set up CAPI" won't make them match

A common myth on vendor blogs is that server-side tracking reconciles the two numbers. It does not.

CAPI recovers lost events — the tracking-gap family. It does nothing about the methodology gaps: view-through, modeling, last-click versus window, click-date reporting. Even with flawless tracking, you are left with a structural gap in the 20%-plus range. The goal is not equality. It is a stable, explainable ratio.

This same logic governs why Meta Ads conversions won't match Shopify no matter how clean your pixel is, and it extends to any channel you reconcile by hand — including when you try to link Etsy sales with Shopify across two order systems.

The number both reports skip: profit

Here is the part neither Ads Manager nor Shopify Analytics shows you. Even once you accept the gap, both numbers are revenue numbers. Neither tells you whether the order made money.

Walk it through on that same $49 order. Say your Printify base cost is $12 and shipping is baked in. Shopify Payments takes its cut of the charge — on the Basic plan that is about 2.9% + 30¢ per transaction in the US, per ReportPundit, so about $1.72 here. Then allocate the ad spend: if you paid $8 in Meta cost to acquire that order, your per-order math is $49 − $12 − $1.72 − $8 = $27.28 left before overhead. That is the number that decides whether scaling the campaign helps or hurts — and it appears on none of the four sales reports.

This is the reconciliation problem worth solving: not making Meta equal Shopify, but knowing true per-order profit across the platforms feeding your store.

That is what PodVector is built for. It connects Shopify, Meta Ads, Google Ads, Printify, and Printful, then computes true per-order profit across all of them — so ad spend, product cost, and fees land on the same order. Victor, its AI operator, reads that live data and proposes moves, executing the approved ones on the Shopify side. Victor does not touch your ad account; he reads the ad data and hands you the decision. If you are tired of reconciling four numbers by hand, start with PodVector.

FAQs

Why does Facebook show more purchases than Shopify shows orders?

Because Meta credits itself for purchases it influenced, using a 7-day-click, 1-day-view window plus modeled conversions, while Shopify counts only completed orders on the last click (Foreplay). The view-through and modeled conversions are the extra purchases Meta shows.

What size gap between Meta and Shopify is normal?

A gap of about 20–35% on the default attribution window is considered normal, and the excess is mostly view-through and modeled conversions (Vaizle; TrackBee). If you are far outside that band — especially near double — investigate your setup.

Meta shows almost exactly twice my Shopify orders. What's wrong?

That pattern is the signature of a Pixel-and-CAPI deduplication failure. When both the browser and server send the same Purchase without a shared event_id, Meta counts it twice; it only merges copies that share an event ID and arrive within 48 hours (Meta for Developers). Add a matching event ID to both copies.

Will setting up the Conversions API make the numbers match?

No. CAPI recovers events lost to ad blockers and consent declines, which narrows the tracking-gap portion. It does nothing about the methodology gaps — view-through, modeling, last-click versus window — so a structural difference of roughly a fifth or more remains by design.

Do refunds explain part of the gap?

Yes. When an order is refunded, Shopify reduces its net and total sales, but Meta and GA4 generally keep the original conversion on the books. So after a refund wave, Shopify's numbers drop while the ad platform's stay high, widening the gap in that direction.

How should I compare the two reports fairly?

Compare on a trailing 7-to-14-day window, never a single day, because Meta reports on the click date and Shopify on the purchase date. Then treat Shopify's order count as the truth for how many sales happened, and Meta's number as its estimate of how many its ads influenced.