Webclat / GA4 Practice
Home / QA / Measurement Protocol and server-side

Why does my GA4 purchase event report the wrong price (extra zeros / wrong currency scale)?

Quick answer

GA4 expects value, price, and every item-level price to be a decimal number in the currency's major unit (e.g. 19.99 for nineteen dollars ninety-nine cents), but many payment platforms and carts store or emit amounts in minor units (cents) - sending 1999 straight from a Stripe/Shopify webhook produces a purchase that reports as $1,999.00 instead of $19.99.

Why This Happens

01 / CAUSE

The mismatch happens because two very common data sources disagree on units by design: Stripe's API, many POS systems, and some cart platforms represent money as integer minor units specifically to avoid floating-point rounding errors, while GA4's schema was defined around a plain decimal major-unit number. Neither side is wrong on its own terms - the bug is in the handoff between them.

It compounds silently because GA4 doesn't validate that a value is 'reasonable' for the currency - it will happily record and report a $1,999 purchase from a $19.99 order with no warning, so the error is usually caught only when someone notices revenue totals are wildly inflated (or occasionally deflated, if the conversion happens in the wrong direction).

Fix It

02 / STEPS

Identify where the value originates

Trace the value backward to its source: your cart/checkout code, a payment webhook payload, or a GTM variable pulling from a dataLayer push. Confirm what unit that specific source actually uses before touching the GA4 side.

Convert minor units to major units at the source of truth

If the raw value is in cents (common with Stripe, Square, and many POS integrations), divide by 100 before it's placed in the dataLayer or Measurement Protocol payload: const gaValue = stripeAmountInCents / 100;. Do this conversion once, as close to the raw source as possible, not in multiple places.

Check every item-level price too, not just the top-level value

GA4 ecommerce events carry both a top-level value and a per-item price inside the items array. A units bug often only gets fixed in one of the two, leaving item-level revenue reports (Monetization > Ecommerce purchases, by item) still wrong even after the overall purchase total looks correct.

Confirm the currency parameter matches the actual transaction currency

A correct value in the wrong currency code (e.g. sending USD amounts tagged as currency: 'EUR') produces a different but related distortion - GA4 does not convert currencies for you, it reports the number and code exactly as sent.

How To Verify It Worked

03 / VERIFY

In GA4 DebugView, click through a real (or sandboxed) checkout and inspect the purchase event's parameters directly - confirm value and each item's price match the actual order total and per-item price to the cent, not off by a factor of 10, 100, or 1000.

Cross-check against your payment processor's own dashboard for the same order: if GA4's Monetization > Ecommerce purchases report shows a daily revenue total that's a suspiciously round multiple (roughly 100x or 1000x) of the processor's total for the same date range, that ratio itself is the fingerprint of a units bug.

Still Not Fixed?

We audit and fix GA4 implementations for a living - if this doesn't resolve it, the next step is usually a full event-by-event audit.

Talk to a GA4 Consultant