Paid Ads

Shopify's Native Analytics Are Lying to You: Fixing GA4 and Meta CAPI for Ecommerce

Shopify's built-in analytics and the browser-only Meta Pixel both misreport ecommerce performance. Here's how to configure GA4 and Meta CAPI properly.

Jason Poonia Jason Poonia | | 16 min read
Shopify's Native Analytics Are Lying to You: Fixing GA4 and Meta CAPI for Ecommerce

Why does Shopify’s analytics not match GA4 or Meta Ads manager?

Shopify’s built-in analytics, Google Analytics 4, and Meta Ads manager will almost never show the same revenue number, and that’s expected behaviour, not a bug. Each one attributes a sale differently: Shopify credits the last channel it tracked, GA4 applies its own attribution model across sessions, and Meta reports conversions inside its own attribution window using pixel and modelled data. If you’re comparing these dashboards to find the “real” number, you’re asking the wrong question. The real problem is usually upstream: your tracking setup isn’t capturing events accurately in the first place, so all three tools are working from incomplete or duplicated data.

For a store spending real money on Meta Ads or Google Ads, this isn’t an academic quibble. If your Meta Pixel is only catching a fraction of actual purchases because of iOS tracking restrictions and ad blockers, you’re making budget decisions off understated conversion data, and campaigns that are actually profitable get paused because they “look” underwater. That’s money left on the table because of a tracking gap, not a targeting problem.

This post covers why the default Shopify and Meta Pixel setup falls short, and what a properly configured GA4 ecommerce and Meta Conversions API (CAPI) setup looks like for a Shopify store specifically.

Why Shopify’s built-in analytics overstate or understate performance

Shopify’s analytics dashboard measures what happened inside Shopify’s checkout, not what happened across the customer’s actual journey, so it systematically misattributes credit for the sale. Shopify’s “Sessions by traffic source” report and its default attribution tend to over-credit the last touchpoint before checkout, usually direct or organic, even when a Meta or Google ad started the journey days earlier. If a customer clicks your Instagram ad on Monday, leaves, then comes back through a Google search on Wednesday to buy, Shopify’s native reporting will hand most of the credit to “Direct” or “Organic search,” and your ad platform gets none.

This creates a common and expensive pattern: store owners look at Shopify’s channel breakdown, see paid social contributing a small slice of revenue, and cut the budget. Meanwhile that same campaign was the first touch on a meaningful share of purchases that Shopify logged under a different channel entirely.

Shopify’s analytics also isn’t built for multi-touch or cross-device journeys. A customer researching on mobile and buying on desktop shows up as two disconnected sessions rather than one journey. None of this makes Shopify’s dashboard useless, it’s fine for order volume, product performance, and basic sales trends, but it was never designed to answer “which ad drove this sale,” and using it that way leads to bad budget decisions.

Why the browser-only Meta Pixel undercounts conversions

The Meta Pixel relies on the customer’s browser to fire tracking events, and browsers, ad blockers, and Apple’s tracking restrictions increasingly block or delay those events before they ever reach Meta. Since Apple introduced App Tracking Transparency (ATT) on iOS in 2021, a large share of iPhone and iPad users decline app-level tracking permissions, and Safari’s Intelligent Tracking Prevention independently limits how long browser-based pixels can persist cookies. Add ad blockers, privacy browsers, and corporate network filtering into the mix, and a meaningful slice of real purchases simply never reach Meta as a signal.

The practical effect for a Shopify store: Meta Ads manager under-reports purchases and revenue, cost-per-purchase looks artificially high, and the algorithm has a thinner signal to optimise delivery against. Meta’s automated bidding relies on fast, complete conversion signals to find more people likely to buy. When a chunk of real purchases are invisible to the pixel, the algorithm is optimising with one eye closed, which tends to show up as rising costs even when the offer and creative haven’t changed.

This is exactly the gap the Meta Conversions API was built to close, by sending conversion events directly from Shopify’s server to Meta, bypassing the browser entirely.

What Meta Conversions API (CAPI) actually does differently

Meta CAPI sends purchase and other conversion events directly from your Shopify store’s server to Meta, instead of relying on the customer’s browser to fire the event. Because the data comes from the server, it isn’t affected by ad blockers, Safari’s tracking restrictions, or a customer closing the tab before the browser-side pixel finishes firing. The result is a more complete, more reliable stream of conversion data reaching Meta.

CAPI doesn’t replace the browser pixel, it works alongside it. Meta explicitly recommends running both together: the pixel captures rich browser-side signal (page views, add-to-carts, time on page) while CAPI backs it up with server-side purchase and checkout data the browser might miss. Run correctly, Shopify stores commonly see improved event match quality in Meta’s Events Manager and a purchase count that more closely reflects actual Shopify order volume, giving Meta’s algorithm a cleaner signal and giving you a truer read on which campaigns are actually working.

Shopify has native, first-party CAPI support built into its Facebook & Instagram sales channel, so for most stores this is a configuration task inside Shopify’s own settings and Meta’s Events Manager, not a custom development project. The setup work is in getting the details right: matching parameters, event deduplication, and passing accurate purchase values.

How to set up Meta CAPI correctly on Shopify

Setting up Meta CAPI on Shopify means connecting your Meta Pixel through Shopify’s Facebook & Instagram channel, verifying your domain, and checking event match quality inside Meta Events Manager, in that order.

1. Connect the Meta Pixel through Shopify’s native Facebook & Instagram channel. Install the official Facebook & Instagram app from the Shopify App Store rather than a third-party pixel injector. This is what enables Shopify’s built-in server-side CAPI integration, so both the browser pixel and the server event fire from a single, Shopify-managed connection.

2. Verify your domain in Meta Business Manager. Domain verification is required for Meta to trust events sent from your store and is a prerequisite for reliable CAPI delivery, particularly for iOS 14.5+ event prioritisation.

3. Confirm deduplication is working, not just enabled. When both the browser pixel and CAPI fire for the same purchase, Meta needs to recognise them as one event, not two, or your reported conversions and revenue will be inflated. Shopify’s native integration handles this automatically by sending a matching event_id on both the pixel and server-side event for the same action. After setup, check Meta Events Manager’s “Deduplicated events” view. A high number of unmatched or duplicate purchase events means the event_id isn’t lining up, and your CAPI setup will double-count sales, which is arguably worse than under-counting because it misleads you into thinking campaigns are performing better than they are.

4. Check event match quality. In Events Manager, each event source has a match quality score based on how many customer parameters (email, phone, external ID) it can send in hashed form. Higher match quality means Meta can match more events to real people, improving both measurement and ad delivery. Shopify’s native integration passes hashed customer data automatically for logged-in and checkout customers, but it’s worth checking this score periodically rather than assuming it stays high after setup.

5. Confirm purchase value is passing through accurately. This is the step stores get wrong most often, and it’s covered in detail below because it directly affects your reported ROAS.

Why purchase value passthrough is where most Shopify CAPI setups break

The most common Shopify CAPI misconfiguration isn’t a missing event, it’s a purchase value that doesn’t match what the customer actually paid, which quietly distorts every ROAS calculation downstream. A few specific failure patterns show up repeatedly on Shopify stores:

  • Discounts applied at checkout not reflected in the event value. If the pixel or CAPI event fires with the pre-discount cart value instead of the final order total, every discounted sale reports as more valuable than it was, inflating ROAS.
  • Currency mismatches on multi-currency stores. A store selling in NZD, AUD, and USD needs the currency parameter passed correctly on every event. If it defaults to one currency regardless of what the customer actually paid, Meta is comparing ad spend in one currency against revenue reported in another, and the ROAS number it shows you is meaningless.
  • Shipping and tax inconsistently included or excluded. Whether you include shipping and tax in the reported purchase value should be a deliberate decision applied consistently, not whatever the default happens to be, because it changes your reported ROAS and needs to match how you calculate profitability internally.
  • Subscription and bundle products reporting the wrong line-item value. Bundled or subscription-first-order values can fire at list price rather than actual charged price if the integration isn’t configured for those product types specifically.

The fix is to test purchase events directly rather than assume the native integration handles every edge case. Use Meta’s Test Events tool in Events Manager, place a real test order with a discount code applied, and confirm the value that arrives in Meta matches the actual amount charged, not the cart subtotal. Do this again for any multi-currency market and any subscription or bundle product type the store sells. It’s a 20-minute check that prevents months of budget decisions being made against a distorted ROAS figure.

What proper GA4 ecommerce tracking looks like for Shopify

Proper GA4 ecommerce tracking for Shopify means enabling Enhanced Ecommerce through Google’s native Shopify channel (or a well-configured Google Tag Manager container), confirming the full purchase funnel fires correctly, and checking that GA4’s reported revenue reconciles with actual Shopify order data. GA4’s ecommerce reporting is only as good as the events feeding it, and the default Shopify setup, particularly for stores that installed Google Analytics years ago and never revisited it, is often missing key steps in the funnel.

Enable GA4 ecommerce through Shopify’s Google & YouTube channel. This native integration is the most reliable path for Shopify stores because it’s built and maintained specifically for Shopify’s checkout structure, rather than a generic ecommerce tracking snippet that has to guess at Shopify’s page structure.

Confirm every funnel stage is firing, not just purchase. A complete GA4 ecommerce setup tracks view_item, add_to_cart, begin_checkout, add_shipping_info, add_payment_info, and purchase as distinct events. Many Shopify stores have purchase firing correctly but are missing begin_checkout or add_payment_info, which breaks the funnel visualisation and makes it impossible to see where checkout abandonment is actually happening. If you can’t see a clean drop-off between “add to cart” and “purchase” in GA4’s funnel exploration, one of the middle steps usually isn’t firing.

Check that purchase events pass the full transaction, not just the total. GA4’s ecommerce schema expects item-level data (product ID, name, category, price, quantity) attached to the purchase event, not just a single transaction total. This is what lets you segment revenue by product, category, or collection later, and it’s commonly missing on stores that set up GA4 with a basic conversion pixel rather than the proper ecommerce event structure.

Reconcile GA4 revenue against Shopify’s actual order total periodically. Some gap is normal, GA4 excludes orders it never observed (app purchases, phone orders, cookie-consent declines) and applies its own session-based attribution. A large or growing gap usually signals a tracking problem: duplicate purchase events firing on page refresh, a broken checkout step, or consent mode blocking more traffic than expected. Set a recurring monthly check rather than assuming it stays accurate after the initial setup.

Set purchase as a key event (formerly “conversion”) in GA4 admin. This sounds obvious, but it’s a step that’s easy to skip, and without it, GA4’s conversion-focused reports and any Google Ads conversion import built on GA4 data will read as zero even though purchases are tracking correctly in the raw event data.

GA4 vs Meta CAPI: why you need both, not one or the other

GA4 and Meta CAPI serve different jobs and neither one replaces the other: GA4 gives you a single, platform-neutral view of on-site behaviour and revenue across every channel, while Meta CAPI feeds Meta’s own algorithm the conversion signal it needs to optimise ad delivery. Trying to run one without the other leaves a real gap. GA4 alone can’t tell Meta which specific ad, audience, or creative to show more of, because that instruction has to come from data inside Meta’s own ecosystem. Meta CAPI alone can’t give you a cross-channel view that includes organic, email, and Google Ads alongside paid social, because it only reports what happened in relation to Meta.

The practical approach is to run GA4 as your source of truth for total ecommerce performance and channel comparison, and run Meta CAPI (alongside the pixel) specifically to make Meta’s own ad delivery and reporting more accurate. Expect the two to disagree on exact revenue numbers even when both are configured correctly, they’re built on different attribution logic and measurement windows. What matters is that both capture a complete, accurate picture within their own scope, not that they match each other to the dollar.

If your paid ads reporting and analytics have never been properly separated and audited like this, it’s worth having someone check the setup end to end rather than assuming both are working because the dashboards are populated. Populated is not the same as accurate. Our paid ads team and conversion rate optimisation work both depend on this kind of tracking being right before we’ll trust the numbers enough to act on them.

Signs your Shopify tracking setup is broken right now

A handful of patterns reliably point to a tracking problem rather than a genuine performance problem, and they’re worth checking before you touch budget or creative.

Meta Ads manager purchase count is meaningfully lower than Shopify’s actual order count for the same period. Some gap is normal because of attribution windows, but if the difference is large and consistent across campaigns running to a cold or warm Meta audience, event match quality or CAPI deduplication is worth checking first.

ROAS looks wildly different between Meta Ads manager and your own profit-and-loss numbers. If Meta’s reported ROAS doesn’t come close to matching what your bank balance actually reflects, check whether purchase value passthrough includes discounts, or whether refunded orders are still counted as conversions.

GA4’s ecommerce funnel shows purchases but no begin_checkout or add_payment_info events. This is a clear sign the funnel isn’t fully instrumented, even if the top-line purchase number looks fine.

Shopify’s channel report and GA4’s channel report tell two different stories about which channel drives the most revenue. Some divergence is expected given different attribution models, but if one platform shows paid social as your top channel and the other shows it as negligible, that’s worth investigating rather than picking whichever number you prefer.

Duplicate or near-identical purchase values appearing in Meta Events Manager’s raw event log for the same order. This usually means deduplication via event_id isn’t matching correctly between the browser pixel and CAPI.

None of these are difficult fixes once identified. They’re mostly configuration issues inside tools you already have installed, not a need for new software or a rebuild. The cost of leaving them unfixed is a distorted view of what’s actually working, which tends to compound the longer campaigns run on bad data. For a deeper look at what realistic ecommerce ad performance actually looks like once tracking is accurate, our ecommerce ROAS benchmarks post breaks down real NZ campaign data by season and campaign type.

FAQs

Why does my Meta Ads ROAS not match my Shopify sales?

Meta Ads manager and Shopify use different attribution models and data sources, so an exact match isn’t realistic even with perfect tracking. Meta reports conversions it can attribute within its own attribution window using pixel and CAPI data, while Shopify reports orders based on its own last-touch session logic. A large or growing gap, rather than a small persistent one, is the signal to check your CAPI deduplication and purchase value passthrough, since that’s usually where real tracking errors show up.

Do I need both the Meta Pixel and Conversions API, or just one?

You need both. Meta explicitly recommends running the browser pixel and CAPI together, because they capture overlapping but not identical data, and CAPI is designed to back up the pixel’s gaps, not replace its browsing-behaviour signal entirely. Running CAPI alone loses rich on-site behavioural events like page views and add-to-carts. Running the pixel alone means losing a share of purchase events to ad blockers and iOS tracking restrictions.

How do I know if my Shopify GA4 setup is tracking ecommerce correctly?

Check GA4’s ecommerce funnel exploration and confirm view_item, add_to_cart, begin_checkout, and purchase are all firing with a sensible drop-off between each stage. If purchase is the only event with real volume, the funnel isn’t fully instrumented. Also confirm purchase is marked as a key event in GA4 admin, since this step is easy to miss and affects downstream reporting like Google Ads conversion imports.

Will fixing my tracking actually improve my ad performance, or just my reporting?

Both, through different mechanisms. Fixing your reporting doesn’t directly change how ads perform, but it changes the decisions you make: campaigns that looked unprofitable on incomplete data often turn out to be working once the full purchase signal is captured. Separately, feeding Meta’s algorithm a more complete conversion signal through CAPI gives it better data to optimise delivery against, which can genuinely improve how efficiently it finds buyers over time. Neither is an overnight fix, and results depend on how large the existing tracking gap was.

Can I set up Meta CAPI on Shopify without a developer?

For most stores, yes. Shopify’s native Facebook & Instagram sales channel includes built-in CAPI support configured through Shopify’s own admin settings rather than custom code. Where it gets more technical is verifying deduplication is working correctly, checking event match quality, and confirming purchase values pass through accurately for discounts, multi-currency, and subscription products, which is where most self-managed setups fall short even when the initial connection was straightforward.

Written by

Jason Poonia

Jason Poonia is the founder and Managing Director of Lucid Media, helping NZ businesses grow online since 2018. With over 6 years delivering results for clients across New Zealand and internationally, Jason combines technical expertise with proven marketing strategies to help businesses attract more customers and build scalable systems. Background in Computer Science from the University of Auckland.