WooCommerce and GA4: Why Revenue in GA4 Does Not Match Your Orders

Every WooCommerce owner who opens GA4 sooner or later asks the same question: why is the revenue different from what the shop shows? Some difference is normal. A large difference usually has a specific cause that can be found and fixed.

Differences that are normal

  • Consent: visitors who decline analytics cookies are not recorded in GA4, or only as modelled data. In the EU this alone can mean a noticeable gap.
  • Ad blockers and privacy browsers block GA4 for part of your visitors.
  • Time zones: if the shop and the GA4 property use different time zones, orders near midnight fall on different days.
  • Processing delay: GA4 data for the last day or two is not complete.

How big this gap is depends on your audience and consent rate, so there is no single “normal” number. If the gap is much bigger for one payment method, or GA4 shows more purchases than the shop, look for one of the causes below.

When GA4 shows fewer purchases

The thank-you page is not reached

Most WooCommerce tracking fires the purchase on the order confirmation page. When payment goes through an external gateway, the buyer may not return to that page: they close the tab after paying, or the return redirect fails. The order exists in WooCommerce, but GA4 never sees it. Compare orders by payment method; if one gateway has a much bigger gap, this is the cause.

Orders that do not come from the website

Phone orders, orders created manually in the admin and marketplace orders appear in WooCommerce but never pass through the browser. Exclude them before comparing.

When GA4 shows more purchases

The purchase fires twice

A common setup is GA4 from a WooCommerce plugin plus GA4 in Google Tag Manager, each sending its own purchase. Check that every order produces exactly one purchase event. GA4 does deduplicate purchases with the same transaction_id within a property, but only if the ID is actually sent.

Reloading the confirmation page

If the purchase fires every time the confirmation page loads and no transaction_id is sent, a buyer who reloads the page or opens it again from the confirmation email creates another purchase.

When revenue differs but the number of orders matches

Then the issue is in how value is defined:

  • tax and shipping included in WooCommerce totals but not in the GA4 value, or the other way round,
  • discounts applied differently,
  • currency: a multi-currency shop sending values without the currency parameter,
  • refunds and cancelled orders: they reduce revenue in WooCommerce but stay in GA4 unless you send refund events.

Decide what “revenue” means for your reports, for example net of tax and shipping, and send exactly that value.

How to find the cause

  1. Export orders from WooCommerce for one week, with order number, date, total and payment method.
  2. In GA4, create an exploration with Transaction ID, date and revenue for the same week.
  3. Compare the two lists by order number. Orders missing in GA4 show which gateway or step loses data; transaction IDs that appear twice show duplicates.

For shops where the thank-you page is unreliable, the purchase can be sent from the server when WooCommerce marks the order as paid, through server-side GTM or the GA4 Measurement Protocol. The visitor’s consent still applies.

If you would like the comparison done for you, a tracking audit includes it for webshops.