Book a Call

GA4 purchase tracking audit for COD stores: the checklist I use

If GA4 counts purchases wrong, every report built on it is wrong too. This is the checklist I run on cash on delivery stores before I trust a single number.

The short answer

To audit GA4 purchase tracking on a COD store, check that purchase fires once per order with a unique transaction_id, the right value and your store's currency. Remove duplicate tags from the theme, apps and Tag Manager, test in DebugView, then compare GA4 purchases with Shopify orders. Don't expect GA4 to match the courier sheet.

GA4 purchase audit

  1. One purchase per order
  2. Send transaction_id every time
  3. Right value and currency
  4. Remove duplicate tags
  5. Compare with Shopify weekly
Read the steps
In this post

Before I touch a store's ads, I check whether GA4 is counting purchases correctly. If it isn't, every report built on it is wrong: revenue, conversion rate, best selling products, and any Google Ads conversion imported from it.

On cash on delivery stores there are extra traps, because a placed order is not a paid order. This is the audit I run, in the order I run it.

Is the GA4 purchase event firing once per order?

It should fire exactly once, when the order is confirmed, and never again for the same order. Firing twice inflates revenue. Not firing at all hides sales. Both are common.

Place a test order and watch what GA4 receives. Then reload the order confirmation page and see whether purchase fires again. On many themes and custom checkouts, it does. Also check that purchase doesn't fire on the cart or checkout page by mistake, which happens when a tag is set to fire on "all pages".

The rule for purchase tracking

1 order = 1 purchase

Same order, same transaction ID, sent once. Anything else means a tag needs fixing.

What parameters should the purchase event send?

At minimum, purchase should send a unique transaction_id, the order value and the currency, plus the items in the order. Currency should be your store's currency, for example PKR in Pakistan or AED in the UAE, and value should match what the customer was charged.

  • transaction_id. Use your store's order number. It lets you match GA4 against Shopify, and GA4 can use it to spot repeated purchases.
  • value. Decide whether it includes shipping and tax, write that down, and keep it the same everywhere.
  • currency. Your store's currency code, such as PKR, AED or GBP. If it's missing or set to USD, revenue reports will be wrong or empty.
  • items. Product name, ID, price and quantity, so product reports work.

Why is GA4 counting purchases twice?

Usually because more than one thing is sending the purchase event. On Shopify stores I often find GA4 code pasted into the theme, the Google and YouTube channel app connected to GA4, and a Tag Manager container with its own GA4 tags, all at once.

Pick one source and remove the others. On Shopify, the Google channel app is usually the simplest choice for GA4. Keep GA4 in that app on Shopify, because theme code no longer runs on the thank-you page and Google doesn't support Tag Manager inside Shopify custom pixels. On WooCommerce or a custom site, Tag Manager is a good single source. Install Google Tag Assistant and look at a product page: if you see the same GA4 measurement ID loading twice, you have a duplicate.

If Tag Manager is part of your setup, I go through which tags a store needs in the handful of GTM tags most stores need.

How do I test GA4 purchases in DebugView?

Turn on debug mode, place a test order and open DebugView in GA4 admin. You'll see each event arrive in real time, and you can click purchase to read every parameter it sent.

The easiest way to turn on debug mode is Tag Manager's Preview mode, or the Tag Assistant browser extension. Then check the purchase event for transaction_id, value, currency and items. Cancel the test order in Shopify afterwards so it doesn't count as a sale.

How do I compare GA4 purchases with Shopify orders?

Pick one full week, count online orders in Shopify, and count purchases in GA4 for the same dates. Then look at the gap. A small, steady gap with GA4 lower is normal. GA4 higher than Shopify almost always means duplicates.

For a closer look, export the transaction IDs from a GA4 exploration and compare them with Shopify order numbers. Missing IDs show orders GA4 never saw. Repeated IDs show duplicates. Leave out orders your team created by hand for phone or WhatsApp customers, because they never touched the website.

You are not trying to make GA4 match Shopify perfectly. You are trying to know why it doesn't.

Why will GA4 never match the courier sheet?

Because GA4 counts orders placed on the website, and your courier sheet counts parcels that were delivered and paid for. On COD those are different numbers, and they should be.

My GA4 purchase audit checklist

  1. Purchase fires once per test order, and not again on reload.
  2. transaction_id is the order number, unique every time.
  3. Value and currency are right, with currency set to your store's currency.
  4. Only one source sends GA4 events: theme, app or Tag Manager.
  5. DebugView shows every parameter on a test purchase.
  6. GA4 and Shopify compared for one full week, gap explained.
  7. Courier data kept separate for delivered revenue.

Run this once properly, then repeat the Shopify comparison every month and after any theme or app change.

If you want to learn tracking step by step, the course covers it. If you'd rather audit your store with me, book a strategy call.

Questions people ask me about GA4 purchase tracking

Why does GA4 show fewer purchases than Shopify?

Some shoppers block analytics, decline cookies or leave before the confirmation page loads, so GA4 never sees those orders. Orders created by your team for phone or WhatsApp customers also never touch the website. A small, steady gap is normal. A sudden change usually means a tag broke.

Why does GA4 show more purchases than Shopify?

That almost always means purchase is firing more than once. Common causes are two tags sending the same event, or the confirmation page firing again when the customer reloads it. Check the transaction_id values in your purchase report. The same ID appearing twice tells you it is a duplicate.

Should I track delivered COD orders in GA4?

GA4 is good at what happened on the website. Delivery happens later, off the website, so I keep delivered orders in the store or courier sheet and use that for profit. If you need delivered sales in your ad platforms, use their own offline or adjustment tools instead of forcing it into GA4.

Got a question this didn't answer? Message me on WhatsApp.

Where this comes from

Everything in this post comes from setting up and fixing ad accounts myself. Platform menus and names change often, so if a screen looks different from what I describe, check the platform's own help pages for the current wording, or message me and I'll point you to the right one.

Moiz Khan

Written by Moiz Khan

Meta and Google Ads consultant, 13+ years in ad accounts

I'm Moiz Khan. I've spent 13+ years inside Meta and Google ad accounts and managed $12M+ in ad spend, for e-commerce and service businesses in Pakistan and abroad. Here I write down what I check, what I change and why, so you can fix your own account or know what to ask for.

Share Contents Book a Call