Your Shopify dashboard shows orders coming in, but GA4's Monetisation reports are empty or way too low. This guide is the hands-on fix. (If GA4 tracks purchases but the totals just don't line up, start with why GA4 revenue doesn't match Shopify orders instead.)
The cause is almost always the same. Purchases happen on Shopify's checkout, and checkout doesn't run your theme code. Tracking has to reach checkout through an app pixel or a custom pixel, and that's where setups break.
Step 1: Confirm what's actually happening
- In GA4, open Reports › Realtime (or Admin › DebugView).
- In a private window, accept all cookies on your store and place a test order. A 100% discount code or Shopify's test payment mode keeps it free.
- Watch for a
purchaseevent.
There are three possible results:
- No purchase event at all: checkout tracking is missing or broken. Go to step 2.
- A purchase event but no revenue in reports: the event is missing
valueorcurrency. Go to step 5. - A purchase event appears, but reports still show too few: check consent and the GA4 property settings (steps 4 and 6), and allow 24–48 hours for reports to process.
Step 2: Find out how GA4 is installed
There are three common routes. Many stores have more than one by accident.
| Route | Where to look | Tracks checkout? |
|---|---|---|
| Shopify's Google & YouTube app | Sales channels / Apps | Yes, via an app pixel |
| Custom pixel | Settings › Customer events | Yes, if coded correctly |
GTM or gtag in theme.liquid | Online Store › Themes › Edit code | No, theme code doesn't run on checkout |
One more place to check: the old order-status page "Additional scripts" box. Shopify has been moving stores off legacy checkout scripts onto Checkout Extensibility. Purchase tracking that lived there stops working once a store is upgraded, and this is one of the most common reasons GA4 purchases suddenly drop to zero.
Step 3: Fix the purchase tracking
Option A: Google & YouTube app (simplest)
- Open the app and check it's connected to the right GA4 property. The measurement ID (G-XXXXXXX) should match GA4 › Admin › Data streams.
- Remove other GA4 installs (theme code, GTM GA4 tags, GA4 custom pixels), or you'll swap "missing" for "duplicated".
- Place another test order and check DebugView.
Option B: a custom pixel
If you need more control, go to Settings › Customer events › Add custom pixel. Custom pixels subscribe to Shopify's standard events. The purchase event is checkout_completed. Here's a minimal sketch, to be checked against Shopify's current Web Pixels API reference before you use it:
const s = document.createElement('script');
s.src = 'https://www.googletagmanager.com/gtag/js?id=G-XXXXXXX';
document.head.appendChild(s);
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-XXXXXXX', { send_page_view: false });
analytics.subscribe('checkout_completed', (event) => {
const c = event.data.checkout;
gtag('event', 'purchase', {
transaction_id: c.order?.id,
value: c.totalPrice?.amount,
currency: c.currencyCode,
tax: c.totalTax?.amount,
shipping: c.shippingLine?.price?.amount,
items: c.lineItems.map(li => ({
item_id: li.variant?.product?.id,
item_name: li.title,
price: li.variant?.price?.amount,
quantity: li.quantity
}))
});
});
Custom pixels run in a sandbox, so values like the page URL can look different from your storefront. Consider passing page_location from event.context.document.location.href. GTM Preview mode won't see a custom pixel, so test with DebugView and the Network tab.
Not sure what your store fires before consent?
Send us your URL and we'll run a free homepage pre-consent scan: which trackers and cookies load before a shopper chooses. No obligation.
Get my free scan Use the free checklistStep 4: Check consent isn't blocking everything
Each custom pixel and app pixel respects Shopify's Customer Privacy API. That's correct behaviour: visitors who reject analytics shouldn't be tracked. But misconfiguration can block everyone:
- The pixel requires a category your banner never grants. Check the custom pixel's privacy permission and your banner's category mapping.
- The consent app doesn't write to the Customer Privacy API. Shopify then treats every visitor as "no consent".
- You tested without accepting. Always accept all in your test window.
If purchases appear only when you accept, consent is working. The remaining gap is the visitors who decline, which is expected. See our Shopify cookie banner guide for banner settings.
Step 5: Make sure revenue is recorded
GA4 needs both value and currency on the purchase event to record revenue. If currency is missing, revenue won't be counted properly. In DebugView, click the purchase event and check:
transaction_id: present and unique per ordervalue: a number in pounds, not pencecurrency:GBP(or the order currency)items: present, if you want product-level reports
Step 6: Check the GA4 property
- Data filters: Admin › Data settings › Data filters. An "Internal traffic" or "Developer traffic" filter set to Active can hide test orders, or worse.
- Right stream: the measurement ID on your site must match this property's web stream.
- Currency and time zone: Admin › Property details. A time zone mismatch shifts orders between days.
- Patience: standard reports can take 24–48 hours to process. Realtime and DebugView are the immediate checks.
Step 7: Prove it with a reconciliation
A few days after the fix, compare GA4 transactions with Shopify Online Store orders, day by day. Then match transaction IDs against your order export. You should see a steady capture rate, with no sudden drops and nothing over 100%. If GA4 now shows more purchases than Shopify, you've got duplicates. Our duplicate purchase events guide covers that.
Quick checklist
- Test order shows one
purchasein DebugView with accepted consent - Only one GA4 install route
- Nothing relying on theme code or old "Additional scripts" for purchases
valueandcurrencypresent- No active filter hiding real traffic
- Daily capture rate steady over the next week
Want it checked properly?
The TrackCheck Health Check is a fixed-price review for UK Shopify and WooCommerce stores: a full consent test (before choice, after "Reject all", after "Accept all", including Consent Mode v2 signals), a GA4-vs-orders reconciliation, a prioritised fix list and a recorded walkthrough, delivered in 5 working days.
See Health Check pricing Start with a free scanThis article is technical guidance, not legal advice. Platform menus change; check the vendor's current documentation if a setting has moved.