Why it happens
The tracking script does not load. Ad blockers and privacy browsers keep lists of known tracking scripts and addresses. When a shopper uses one, the script that would report the purchase to Meta or Google is blocked before it runs. The shopper sees nothing different, pays, and lands on the order confirmation. Your platforms get no purchase.
Cookies live for a short time. Safari limits how long a script can keep its cookies, and it can shorten the life of identifiers that tie a visit to an ad click. A shopper who clicks your ad, thinks about it for several days and buys later may arrive as a new visitor. The purchase can still be reported, but without the link to the ad that started it, so it appears as direct or is left out of campaign results.
Some shoppers leave before the report is sent. A browser sends the purchase from the confirmation page. A shopper who closes the tab, loses the connection or is sent to a payment provider and does not return in time leaves no report.
These three causes do not have the same size on every store. The share depends on your audience and on how many of your shoppers use a phone, Safari or a blocker. The only way to know is to count your own orders against what the browsers reported.
Consent adds to the gap. A shopper who declines cookies should not be tracked for that purpose, so a purchase can be missing from Meta or GA4 for that reason too and not only because of a blocker. This is expected.
Check it yourself
- 1Pick the last 7 full days. In Shopify admin, open Orders, filter by the Online Store sales channel and by payment status Paid, and count the orders. Leave out draft orders and subscription renewals.
- 2In Meta Events Manager, open Data sources, select your pixel, and open the Overview tab. Read the Purchase count for the same days.
- 3In GA4, open Reports, then Monetization, then Ecommerce purchases, and read the purchases for the same days. Use the same time zone in each tool. In GA4 Admin, open the property's details.
- 4Subtract each platform's count from your Shopify count. A gap is the first sign that some purchases are not reported.
- 5In Shopify admin, open Analytics > Reports and open the report Sessions by device type. Note the share of mobile devices.
- 6In Events Manager, open the Purchase event and check where purchases come from: browser, server or both. If every purchase comes from the browser alone, a blocker or a short cookie removes it with no second path.
- 7Open Meta Events Manager, Test events tab, and place a test order on your store from an iPhone in Safari and from a desktop browser with a blocker on. Compare what arrives. A purchase that shows from one and not the other points at the browser.
- 8Read the result. A large gap with a high mobile share points to the browser. A small gap suggests the cause is elsewhere, for example how the connection is set up.
How a server sends the purchases Safari blocks covers this case.
FAQ
Does this only affect iPhones?
No. Safari on a Mac, other privacy browsers and extensions that block trackers cause the same thing on other devices. Phones are named because many stores get most of their orders from them.
Can I fix it by changing my theme?
A script that loads in the theme can still be blocked, so editing the theme does not remove the cause. What helps is a purchase report that does not depend on the shopper's browser, sent from a server after the order is paid.
Is a gap a sign that my store is broken?
Not by itself. Some gap is normal. Look at its size over a full week and compare it with your mobile share.
Does Shopify's own connection to Meta avoid this?
Not necessarily. How much it sends from a server depends on how it is set up. Check the Purchase event's source in Events Manager rather than assuming.