Analytics engineering · 10 min read
Attribution for Shopify brands after iOS privacy changes
What App Tracking Transparency and browser cookie limits changed, how Meta CAPI and Google enhanced conversions help, and how to use MER, nCAC and geo holdouts.
For years, a Shopify brand could open Ads Manager, read a return on ad spend and roughly believe it. That stopped being true around 2021, and it hasn’t come back. The good news is that the replacement isn’t more complicated tooling — it’s a different division of labor between ad platforms, your own data and a few well-designed tests.
What actually changed for ecommerce attribution?
Two separate shifts reduced how much ad platforms can see.
App Tracking Transparency (ATT) on iOS. Since iOS 14.5, apps must request permission through Apple’s ATTrackingManager before tracking users across apps and websites owned by other companies, or accessing the device’s advertising identifier. If the user doesn’t authorize tracking, the identifier comes back as all zeros. For Shopify brands, the practical effect is that a large share of people who see an ad in the Instagram or Facebook iOS app and then buy on your store can no longer be linked by the platform in the old, deterministic way.
Browser limits on cookies and tracking parameters. Safari blocks third-party cookies by default and, per WebKit, deletes all of a site’s script-writable storage after seven days of Safari use without user interaction on that site. Safari’s Private Browsing also strips identifying tracking parameters from URLs during navigation, as Apple described at WWDC 2023. Consent banners and ad blockers remove further signal.
Together, these mean every platform sees a smaller, different slice of your conversions, then fills the gaps with modeling. The numbers in Ads Manager and Google Ads are still useful, but they are estimates — and each platform estimates generously for itself.
Why does platform ROAS no longer add up?
Add up the purchases Meta, Google, TikTok and your email tool each claim, and the total usually exceeds the orders in Shopify. Each platform counts conversions it can connect to its own touchpoints, using its own window and its own modeling. No platform knows about the others’ touches, so the same order is claimed several times.
That makes platform ROAS useful for one job — comparing campaigns, ad sets and creatives within a platform — and unreliable for another: deciding how to split budget between platforms. Use it for the first, and stop using it for the second.
What do Meta CAPI and Google enhanced conversions fix?
They recover some of the lost signal by sending conversions from a server and by using hashed first-party data for matching.
Meta Conversions API
The Conversions API sends events from your server or platform directly to Meta, rather than relying only on the browser pixel. On Shopify, the Facebook & Instagram channel offers three customer data-sharing levels. Standard uses only the Meta pixel, which browser ad blockers can stop. Enhanced and Maximum add the Conversions API for server-to-server data and share customer details such as name, email address and phone number to match users on Meta’s network. Your privacy policy and consent setup need to reflect that.
When both the pixel and the Conversions API send the same purchase, Meta must deduplicate them. Its rules: the pixel’s eventID must match the server event’s event_id, the event names must match, and the events must arrive within 48 hours of the first one with that ID. If you build a custom server-side setup instead of using Shopify’s channel, this is the first thing to test — undeduplicated events inflate reported conversions.
Google enhanced conversions
Enhanced conversions for web sends hashed first-party data, such as the email address entered at checkout, alongside the conversion. Google hashes it with SHA-256 and uses it to match the conversion to a signed-in Google account that interacted with your ad. It can be set up with the Google tag, Google Tag Manager or the Google Ads API. Check whether your Shopify integration supports it before building it yourself.
What server-side tracking does not fix
Server-side events improve match rates and resilience to blockers. They do not:
- Override consent. If a visitor declines marketing consent, you should not send their data to ad platforms from the server either.
- Stop platforms from over-claiming. Better matching can make each platform’s self-reported numbers look better, not more comparable.
- Tell you what would have happened without the ad. That needs an experiment.
Which blended metrics should Shopify brands run on?
Blended metrics use Shopify revenue and total spend, so they can’t double count and don’t depend on any platform’s model.
| Metric | Formula | What it answers |
|---|---|---|
| MER (marketing efficiency ratio) | Total revenue ÷ total marketing spend | Is marketing, as a whole, paying for itself? |
| nCAC (new-customer acquisition cost) | Acquisition spend ÷ new customers | What does one new customer cost us? |
| New-customer revenue share | First-order revenue ÷ total revenue | Is growth coming from new or existing customers? |
| First-order margin vs nCAC | Contribution margin of a first order ÷ nCAC | Is the first purchase profitable on its own? |
| Payback period | Months until cumulative margin per customer ≥ nCAC | How long is cash tied up in each new customer? |
A few rules make these trustworthy:
- Use the same period and time zone for revenue and spend.
- Define “new customer” from Shopify orders — a customer’s first order — not from a platform’s “new visitor” flag.
- Read MER and nCAC together. MER can rise while you stop acquiring customers, because repeat buyers keep revenue up. nCAC shows whether growth is getting more expensive.
- Look at trends across weeks, not individual days.
Payback needs a cohort table: cumulative margin per customer by month since first order. Our Shopify to BigQuery guide includes the SQL, and the CAC payback calculator gives a quick estimate.
How do you run a simple incrementality test?
Attribution says which touchpoints were near a sale. Incrementality asks whether the sale would have happened anyway. The simplest test for a Shopify brand is a geo holdout.
Google researchers described the method in “Measuring Ad Effectiveness Using Geo Experiments” (Vaver and Koehler, 2011): non-overlapping geographic regions are randomly assigned to control or treatment, and each region gets its assigned condition through geo-targeted advertising. Meta’s open-source GeoLift package implements a related approach.
A practical version:
- Choose the question. For example: “What happens to total Shopify revenue if we pause Meta prospecting?”
- Split regions. Use states, DMAs or postcode areas with enough orders each. Group them into matched sets with similar historical sales, then randomly assign each set to holdout or control.
- Check pre-period fit. Holdout and control regions should have tracked each other closely over the previous few months. If they didn’t, re-match.
- Run the test. Pause or reduce the channel in holdout regions only, for long enough to cover your typical time from first click to purchase. Change nothing else.
- Measure in Shopify, using shipping-address region, not platform conversions.
- Compare. The incremental revenue is the gap between holdout regions and what they would have done based on control regions. Divide by the spend you withheld to get incremental ROAS.
Watch for contamination: national email sends, influencer posts or a sale during the test affect all regions but not always equally. Write down everything that happens during the test window.
What should a small Shopify brand actually do?
Not every brand needs experiments. A reasonable order of work:
- Fix the basics. One purchase event per order, a reliable transaction ID, and GA4 roughly reconciled with Shopify — see why GA4 and Shopify never show the same revenue.
- Turn on server-side conversions through Shopify’s own channels for Meta and Google, respecting consent.
- Build a weekly MER and nCAC report from Shopify orders and platform spend.
- Use platform reports only inside each platform to choose campaigns and creatives.
- Run a geo holdout when a single channel takes a large share of the budget and you can afford to pause it in some regions for several weeks.
Small brands with low order volume will struggle to detect effects in a geo test; for them, a clean blended view and disciplined within-platform optimization usually do more than an underpowered experiment.
When is it worth bringing in help?
When budget decisions are being made from numbers that don’t agree, the fastest fix is usually a shared, Shopify-based measurement layer plus one well-designed holdout test — the kind of attribution and tracking work Asabisoft does as part of its GA4 and server-side tracking service.
Key takeaways
- Platform-reported conversions are now partial and modeled; use them to optimize within a platform, not to compare platforms.
- Turn on server-side conversions — Meta Conversions API and Google enhanced conversions — and make sure browser and server events are deduplicated.
- Run the business on blended metrics from Shopify: MER (revenue ÷ total ad spend) and nCAC (ad spend ÷ new customers).
- Answer 'is this channel actually working?' with a holdout test, such as pausing spend in a set of regions, not with attribution reports.
- Small brands should start with clean data and blended metrics; incrementality tests come once spend is large enough to move revenue measurably.
FAQ
Did iOS 14.5 break Facebook ads attribution?
It reduced what Meta can observe. App Tracking Transparency requires apps to ask permission before tracking people across other companies' apps and websites, and when users decline, the advertising identifier is returned as zeros. Meta still reports conversions, but more of them are modeled and fewer are directly observed, so reports are less complete than before.
What is MER in ecommerce?
MER, or marketing efficiency ratio, is total revenue divided by total marketing spend over the same period. Because it uses Shopify revenue and all spend, it doesn't depend on any platform's attribution and can't double count.
What is nCAC?
New-customer acquisition cost: total acquisition spend divided by the number of first-time customers in the same period. It separates the cost of growth from revenue that existing customers would have generated anyway.
Do I need server-side tracking on Shopify?
For Meta, Shopify's Facebook & Instagram channel already offers Conversions API through its Enhanced and Maximum data-sharing settings, so most stores can turn it on without custom work. Custom server-side setups make sense when you need control over which events and parameters are sent or run several ad platforms.
How do I know if my ads are incremental?
Run a holdout. Turn spend off, or down, in a randomly chosen set of regions for a few weeks and compare their sales with matched regions where spend continued. The difference, not the platform's attributed conversions, is the incremental effect.
Sources
- Apple Developer — App Tracking Transparency
- WebKit — Full Third-Party Cookie Blocking and More
- Meta for Developers — Handling duplicate Pixel and Conversions API events
- Shopify Help Center — Facebook & Instagram customer data sharing
- Google Ads Help — About enhanced conversions
- Vaver & Koehler (2011), Measuring Ad Effectiveness Using Geo Experiments — Google Research