GA4 purchases show zero revenue: causes and fixes
GA4 shows purchases without revenue when the purchase event has no currency, sends value as text (with a currency symbol or a comma), puts value inside items instead of on the event, or when Tag Manager does not send the ecommerce data at all. Send value as a number and currency as a three-letter code on the event itself.
Check your own site: the free scan tells you in about a minute whether this problem is on your page.
What GA4 needs on a purchase
Google lists these as required on the purchase event: transaction_id, value, currency and items (each with item_id or item_name). Purchase revenue is read from the event-level value; item revenue from each item's price and quantity.
gtag('event', 'purchase', {
transaction_id: '10045',
value: 1299.00,
currency: 'SEK',
items: [{ item_id: 'SKU-123', item_name: 'Wool scarf', price: 1299.00, quantity: 1 }]
});
Cause 1: currency is missing
A value without a currency is not recorded as revenue. In the Network tab (filter /g/collect) the purchase request should have cu=SEK (or your code). If cu is missing, add currency to the event, as a string in ISO 4217 format.
Cause 2: value is text, not a number
"1 299,00 kr", "$100.00" and "1.299,00" are strings GA4 cannot read as an amount. Send 1299.00: a number, dot as the decimal separator, no symbol, no thousands separator. Shop templates that print a formatted price into the dataLayer are the usual source; use the raw amount instead.
Cause 3: value is in the wrong place
value and currency must be on the event, not only inside items, and spelled in lower case. A dataLayer push with ecommerce.Value or ecommerce.revenue (the old Universal Analytics name) leaves the event without a value.
Cause 4: Tag Manager does not send the ecommerce data
With Google Tag Manager, the GA4 event tag for purchase must have Send Ecommerce data turned on with the data layer as the source, or map value, currency and items as event parameters. Also clear the ecommerce object before each push, so a previous event's data is not reused:
dataLayer.push({ ecommerce: null });
dataLayer.push({ event: 'purchase', ecommerce: { transaction_id: '10045', value: 1299.00, currency: 'SEK', items: [ … ] } });
Cause 5: the event fires before the order data exists
On checkouts that load the order through JavaScript, a purchase event fired on page load can go out with value: 0 or undefined. Fire it on the dataLayer push that contains the order, not on "Page View".
When revenue is there but wrong
- Too high: a reloaded confirmation page without
transaction_idcreates a second purchase; two installs send every event twice. - Different from your shop: GA4 converts other currencies into the property's currency, and shops often include tax and shipping where your value does not, or the other way round. Decide what value means and send it the same way everywhere.
- Not there yet: standard reports can take up to a day. Use DebugView or Realtime to check a change.
Confirm the fix
- Place a test order with DevTools open on the Network tab. The
/g/collectrequest withen=purchaseshould carrycu, the value (epn.value) andep.transaction_id. - Open Admin, then DebugView, with debug mode or Tag Assistant on, and check the purchase event shows
valueandcurrency.
Sources
- Google Analytics: Fix missing revenue data
- Google Analytics: Set up a purchase event
- Google Analytics: Measure ecommerce
Based on the platforms' public documentation; menus and names change, so check the linked pages if a step looks different.