[Google Analytics 4](/about/google-analytics-4) November 13, 2026

# GA4 ecommerce tracking audit, step by step

Audit GA4 ecommerce tracking in order: the funnel events, the purchase fields, duplicates and gaps, refunds, consent, and the match with real orders.

![](/images/65d75b0ae8d69ef95785a5d6_david-pombar.webp)

**[David Pombar](/authors-guides/david-pombar)** Swiss army knife at Trackingplan

9 min read · 1998 words

To audit ecommerce tracking in GA4, walk the funnel from `view_item` to `purchase` and confirm that each event fires once with its items, then check that every `purchase` carries `transaction_id`, `value`, `currency` and `items`. Then hunt for duplicate and missing purchases, check refunds and consent, and match GA4 transactions to your orders by ID.

That last step is the one that decides whether the audit passed. Everything before it explains why the numbers don’t match.

This guide is the ecommerce part of a [Google Analytics audit](/blog/google-analytics-audit). It assumes ecommerce is already set up; if it isn’t, start with the [GA4 ecommerce setup guide](/guides/ga4-ecommerce-guide).

![Black and white photograph of an early self-service grocery store, with railed aisles leading from an entrance sign past the shelves to a single checkout and an exit sign](/images/ga4-ecommerce-tracking-audit-checkout-lanes.jpg)

One entrance, one checkout, one exit. Your funnel should be that easy to count. Image: Clarence Saunders, Wikimedia Commons, Public domain

## What the audit checks

| Check | Where you look | It passes when |
| --- | --- | --- |
| Funnel events | DebugView, GTM Preview, the Network tab | Each step fires once, with the same items |
| Purchase payload | The `purchase` hit | `transaction_id`, `value`, `currency` and `items` are there, in the right format |
| Duplicates and gaps | An exploration by Transaction ID | One purchase per order, on every checkout path |
| Value and currency | GA4 revenue metrics against the backend | Revenue means the same thing on both sides |
| Refunds | The `refund` event | Refunded orders reach GA4 at all |
| Consent | The Network tab, per consent state | No hit before consent, no lost purchases after it |
| Reconciliation | GA4 transaction IDs joined to order IDs | The gap is small, stable and explained |

![Diagram of four GA4 ecommerce audit checks in order: walk the funnel from view\_item to purchase, read the purchase payload for transaction\_id, value, currency and items, look for duplicates and gaps, and match GA4 to orders, revenue and refunds. A band says a GA4 purchase is right when it matches an order: same ID, same items, same currency.](/images/ga4-ecommerce-tracking-audit-four-checks.webp)

Four checks, in the order the money moves.

## Start from the event list Google expects

You can’t audit against nothing. [Google’s developer guide](https://developers.google.com/analytics/devguides/collection/ga4/ecommerce) lists the recommended events: `view_item_list`, `select_item`, `view_item`, `add_to_cart`, `add_to_wishlist`, `view_cart`, `remove_from_cart`, `begin_checkout`, `add_shipping_info`, `add_payment_info`, `purchase`, `refund`, `view_promotion` and `select_promotion`.

Write down which of them your store should send, and on which pages. A store without wishlists doesn’t need `add_to_wishlist`. A store that sells subscriptions through a hosted checkout may never see `add_payment_info` on its own domain. The list is your expected state; the audit compares the site with it.

Then the fields. [Google’s event reference](https://developers.google.com/analytics/devguides/collection/ga4/reference/events) sets these for `purchase`:

| Parameter | Status | What Google says |
| --- | --- | --- |
| `transaction_id` | Required | It “helps you avoid getting duplicate events for a purchase” |
| `items` | Required | Each item needs an `item_id` or an `item_name` |
| `value` | Required for reporting | The sum of `price * quantity` for all items, without `shipping` or `tax` |
| `currency` | Required if `value` is set | ISO 4217, set at the event level |

The [ecommerce dataLayer guide](/guides/ga4-ecommerce-datalayer) shows the push for every event if you need the shape for each one.

## Walk the funnel

Open GTM Preview and GA4 DebugView, and buy something. Go through the whole journey a customer takes: a category page, a product, the cart, the checkout steps, the confirmation. Do it on desktop and on mobile, as a guest and logged in, and with each payment method you offer.

At every step, check three things:

-   **The event fires once.** Two `add_to_cart` for one click is a trigger problem, not a keen customer.
-   **The items are the same items.** The `item_id` you saw in `view_item` should be the one in `add_to_cart`, `begin_checkout` and `purchase`. A product reported by SKU on one page and by name on another splits it in two in the reports.
-   **The step exists at all.** Checkout redesigns tend to drop the middle steps first.

For the volume view, build a funnel exploration in Explore with the same steps. [Google’s Analytics Help](https://support.google.com/analytics/answer/9327974) describes it as a way to “visualize the steps your users take to complete a task”. A step that shows zero, or a drop far steeper than the steps around it, points at the page to test by hand.

## Read the purchase payload

Open the `purchase` hit itself, in DebugView or in the Network tab, and read it field by field.

-   **`transaction_id`** is there, is unique per order and contains no customer data. [Google’s Analytics Help](https://support.google.com/analytics/answer/12313109) says the ID shouldn’t contain information that identifies customers. An email address or a phone number used as an order reference goes on the privacy list too.
-   **`value`** is a number, not a string, and follows the definition you agreed: Google’s reference leaves shipping and tax out of `value` and gives them their own parameters.
-   **`currency`** is a three-letter ISO 4217 code and matches the market. A store that sells in euros and pounds from one GTM container should never send `EUR` on the UK checkout.
-   **`items`** is complete: each item has an ID or a name, a price and a quantity, and the sum of `price * quantity` equals `value`.

A purchase without `currency` still counts as a purchase. It just doesn’t count as revenue, which is the kind of failure no report announces.

## Find duplicate and missing purchases

Google deduplicates part of the problem for you. The same help page says “Google Analytics deduplicates purchase events with the same transaction ID” from the same user. Two cases slip through:

-   **The same order with two IDs.** A confirmation page that builds the ID from a session value, or two tags that each read a different field, sends two valid purchases for one order.
-   **An empty ID.** Google warns: “Don’t send an empty string as the transaction ID.” If you do, GA4 deduplicates every purchase that carries that empty value, and real orders disappear.

To find both, build a free-form exploration with the Transaction ID dimension and the Ecommerce purchases metric. Sort by purchases: anything above one is a duplicate that survived. Then look for a row with an empty or `(not set)` ID. The [guide to duplicate events in GA4](/guides/duplicate-events-ga4) covers the usual causes, from double tags to confirmation page reloads.

Missing purchases are harder, because they leave nothing to sort. Break transactions down by device, browser, country and payment method, and compare each slice with the same slice of orders. A payment provider that redirects off-site and never sends the customer back to your confirmation page shows up as one payment method with almost no GA4 transactions.

## Check value and currency against the backend

GA4 has several revenue metrics, and they don’t mean the same thing. From [Google’s dimensions and metrics reference](https://support.google.com/analytics/answer/9143382):

-   **Purchase revenue** is “the sum of revenue from purchases made on your website or app, minus any refunds given.”
-   **Gross purchase revenue** is the same sum before refunds.
-   **Item revenue**, in the Ecommerce purchases report described in [Google’s report documentation](https://support.google.com/analytics/answer/12924131), is “the total revenue from items only, excluding tax and shipping.”

Your finance team probably reports something else: gross with tax, net of discounts, after returns. Before you compare a single number, agree which backend figure corresponds to which GA4 metric. Many revenue mismatches end there, as two definitions of one word.

For currency, take one week of orders in each currency and compare them with GA4 filtered by the same currency. A market that sends the wrong code shows up as revenue in the wrong place, or as no revenue at all.

## Check refunds

Google’s guide says to “measure refunds by sending a `refund` event with the relevant `transaction_id` specified”, and recommends including item information to get item-level refund metrics.

In most stores, refunds happen in the back office, days after the visit, with no browser involved. So the first question is whether anything sends the `refund` event at all. Pick five refunded orders from last month and look for their transaction IDs in a GA4 exploration with Refund amount. If none appear, Purchase revenue in GA4 is gross revenue under another name, and every comparison with net figures will be off by your refund rate.

## Check consent

Consent decides which purchases GA4 receives. [Google’s tag platform documentation](https://developers.google.com/tag-platform/security/concepts/consent-mode) describes two setups. In basic mode, tags wait for the visitor’s choice, and after a refusal “no data is transferred to Google at all”. In advanced mode, tags load with consent denied and send cookieless measurements.

Audit it in a clean browser session, once per consent state:

1.  Before the banner is answered, check which requests leave in the Network tab and that they match the mode you chose.
2.  After a refusal, complete a purchase and confirm that nothing leaves in basic mode, or that only cookieless measurements leave in advanced mode.
3.  After acceptance, complete a purchase and confirm the `purchase` hit leaves with all its fields.

Then look at the reconciliation by country. If the banner changed last month in one market and GA4 transactions fell there while orders held, look at consent before you look at sales. The [consent mode guide](/guides/implementing-consent-mode-ga4) covers the setup.

## Reconcile GA4 purchases with orders

This is the test the rest of the audit prepares. Export the transaction IDs from your exploration for one closed week, export the order IDs for the same week from the backend, and join them:

-   **In both:** compare value, currency and items.
-   **Only in the backend:** orders GA4 never saw. Group them by payment method, device and country to find the pattern.
-   **Only in GA4:** test orders, duplicates with a different ID, or orders cancelled before they reached the backend’s report.

Some gap is expected: ad blockers, declined consent, customers who close the tab before the confirmation page loads. What you report is a gap that is large, growing or concentrated in one place. The [guide to reconciling GA4 with your backend](/guides/reconcile-ga4-with-backend) goes through the join step by step, including time zones and late events.

## After the audit: keep the purchase event honest

An audit proves the tracking was right on the day you tested it. The next checkout release, a renamed dataLayer key or a new payment provider can undo it, and GA4 will keep rendering reports with less revenue in them.

Trackingplan watches the hits your site sends to GA4 on real traffic and flags “missing properties, dead tags, duplicate fires, broken triggers”, so a `purchase` that loses its `currency` or starts firing twice shows up as it happens. On top of that monitoring, its audits are specific checks you schedule daily or weekly, or run on demand, from a library that includes key events, consent implementation and the data layer. Each run ends with a verdict: OK, Needs attention or Inconclusive. You can also ask its agent from Claude, ChatGPT or Cursor through the [MCP endpoint](/docs/mcp-endpoint): it investigates before it answers and shows the queries behind every answer.

To see it on your own store, the [free analytics audit](/free-analytics-audit) works like this: install one tag, Trackingplan learns your GA4, GTM and pixel setup from real traffic for 2 days, and then you get 7 days free to audit it. For an agency auditing many stores, [Fact](/customer-stories/how-fact-keeps-analytics-accurate-for-a-growing-client-portfolio) put the manual alternative plainly: checking every case by hand “could easily take more than 200 hours”.

## FAQ

### How do I audit ecommerce tracking in GA4?

Walk the funnel from view\_item to purchase and check that each event fires once with its items, then read the purchase payload for transaction\_id, value, currency and items. After that, look for duplicate and missing purchases, check refunds and consent, and match GA4 transactions against the orders in your backend by transaction ID.

### Which parameters does the GA4 purchase event need?

Google’s event reference marks transaction\_id and items as required, and value and currency as required for revenue reporting: currency is required if you set value. Each item needs an item\_id or an item\_name.

### Does GA4 remove duplicate purchases?

Google Analytics deduplicates purchase events with the same transaction ID from the same user. It doesn’t fix a purchase sent with two different IDs, and an empty string as the transaction ID makes it deduplicate every purchase that carries one.

### How often should I audit GA4 ecommerce tracking?

Fully after a checkout change, a new payment method, a platform migration or a consent banner change. Between those, compare transactions with orders every week, and monitor the purchase event on real traffic so a missing field shows up the day it breaks.

Part of[Google Analytics audit: how to audit GA4 by hand or with AI](/blog/google-analytics-audit)

On this page

1.  [*01*What the audit checks](#what-the-audit-checks)
2.  [*02*Start from the event list Google expects](#start-from-the-event-list-google-expects)
3.  [*03*Walk the funnel](#walk-the-funnel)
4.  [*04*Read the purchase payload](#read-the-purchase-payload)
5.  [*05*Find duplicate and missing purchases](#find-duplicate-and-missing-purchases)
6.  [*06*Check value and currency against the backend](#check-value-and-currency-against-the-backend)
7.  [*07*Check refunds](#check-refunds)
8.  [*08*Check consent](#check-consent)
9.  [*09*Reconcile GA4 purchases with orders](#reconcile-ga4-purchases-with-orders)
10.  [*10*After the audit: keep the purchase event honest](#after-the-audit-keep-the-purchase-event-honest)
11.  [*11*FAQ](#faq)

**Stop babysitting tags**

Trackingplan audits your real user data around the clock and flags issues before they cost you.

[Start free trial →](https://app.trackingplan.com/signup)

![](/images/65d75b0ae8d69ef95785a5d6_david-pombar.webp)

**David Pombar** Swiss army knife at Trackingplan

Read more from David, a Senior Product Strategist with 18+ years in digital product development and an atypical error detection knack.

Share Copy link [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fwww.trackingplan.com%2Fguides%2Fga4-ecommerce-tracking-audit) [X](https://twitter.com/intent/tweet?url=https%3A%2F%2Fwww.trackingplan.com%2Fguides%2Fga4-ecommerce-tracking-audit&text=GA4%20ecommerce%20tracking%20audit%2C%20step%20by%20step)

Read next

[All Guides →](/guides)

-   [
    
    4 minGoogle Analytics 4June 16, 2025
    
    ### GA4 ecommerce tracking: how to enable it and set it up
    
    How to enable ecommerce in GA4: the recommended events, a purchase event example, where the data shows up and how to check it against your backend.
    
    by **Rafael Campoamor**](/guides/ga4-ecommerce-guide)
-   [
    
    9 minData IntegrityNovember 2, 2026
    
    ### Reconcile GA4 with your backend: why revenue doesn’t match
    
    Why GA4 transactions and revenue never equal your orders database, which gaps are expected, which are defects, and a step-by-step way to reconcile them.
    
    by **David Pombar**](/guides/reconcile-ga4-with-backend)
-   [
    
    8 minData IntegrityNovember 2, 2026
    
    ### Duplicate events in GA4 and ad pixels: causes and fixes
    
    Why GA4 and ad pixels record one action twice, from double tags to SPA history changes and pixel plus CAPI, and how to find and fix each one at the source.
    
    by **David Pombar**](/guides/duplicate-events-ga4)

Trackingplan

## See everything. Miss nothing.

Your implementations audited around the clock with real-time, real-user data. Real-time alerts about errors or changes in your data, campaigns, pixels, privacy and consent. Let AI flag issues before they cost you.

[Start free trial →](https://app.trackingplan.com/signup) [Book a demo](/demo)
