Your GA4 revenue report shows a different number than your Shopify or WooCommerce dashboard. The gap is not random noise. It follows a predictable pattern, and in many cases it is caused by a structural currency mismatch that no amount of tag auditing will fix unless you understand the root cause. Currency issues in GA4 are more common than most analytics practitioners acknowledge, because they are easy to overlook when everything else looks technically correct. Events fire. Purchase events appear in DebugView. The currency parameter is present. Yet revenue is still wrong. This article covers every dimension of the problem and how to fix each one.
How GA4 handles currency
Every purchase event in GA4 must include two mandatory parameters:valueand currency. The value is the transaction revenue amount. The currency must be a three-letterISO 4217currency code, such as GBP, EUR, USD, or AUD. If currency is missing or contains an invalid value (such as the currency symbol £ or $ instead of the code), GA4 discards the revenue entirely and reports zero for that transaction. Our reference onGA4 purchase event parameterslists every required and recommended field.
GA4 applies currency conversion using Google's daily exchange rates; the precise timing of rate application during data processing is not publicly documented by Google, but the result differs from payment-provider rates. This is the first potential source of mismatch.
Property currency vs transaction currency mismatch
When you create a GA4 property, you set a reporting currency in Property Settings. If your store operates in GBP but your GA4 property is set to USD, every purchase event you send will be converted from GBP to USD using Google's exchange rate. This rate differs from the rate your payment provider uses, creating a systematic discrepancy on every transaction.
The most common fix is to align the property reporting currency with the primary currency your finance and trading teams use for decision-making. If you intentionally report in a different currency, document that choice and expect reconciliation differences created by exchange-rate handling.
Multi-currency stores: the structural problem
For international stores accepting multiple currencies, the problem is more complex. When a customer in Germany visits a USD-based WooCommerce store and a currency switcher plugin displays prices in EUR, the checkout pixel fires with the EUR amount the customer saw. GA4 receives that EUR value, then converts it to USD using its own daily exchange rate.
Your WooCommerce order is recorded in USD using the exchange rate the currency switcher applied at checkout time. GA4 has no access to that rate. It uses its own. The two rates diverge. The result is that every international transaction has a slightly different revenue value in GA4 than in your store backend, and the gap compounds with transaction volume.
This is not always a simple tag error. It is often an architectural limitation of browser-side purchase tracking in multi-currency stores. A common fix is to send purchase values from the confirmed order record rather than from the browser display layer, often through a server-confirmed or tightly controlled ecommerce implementation.
Currency symbol instead of currency code
A surprisingly common implementation error is sending the currency symbol rather than the ISO code. Sending currency: '$' or currency: '£' results in GA4 rejecting the revenue parameter entirely. All affected purchase events will show an event count in your reports but zero revenue against them.
To check for this, go to GA4 Admin and open DebugView. Complete a test purchase and examine the purchase event parameters carefully. The currency value must be exactly three capital letters matching an ISO 4217 code. Any other format will cause silent revenue rejection. If your purchase event count looks fine but revenue stays at zero, see our diagnostic onGA4 purchases showing zero revenue.
Want to check your purchase events for currency parameter errors automatically?
Tax and shipping included in value
Another consistent source of inflated revenue is sending the value parameter with tax and/or shipping included rather than just the item revenue. GA4's data model expects value to represent the transaction revenue net of tax and shipping (unless you specifically need to track gross amounts). If your dataLayer pushes total order value including tax and shipping, your GA4 revenue will be systematically higher than your net revenue figure in your accounting system.
Check what your dataLayer push looks like for a test order. Compare the value being sent to the net order total in your store backend. If they match, the implementation is correct. If the GA4 value includes tax or shipping, you need to modify the dataLayer push or the GTM tag to send only the correct revenue component. The same root cause is often behind broader gaps documented in our piece onfixing missing revenue on GA4 purchase events.
The 30-day revenue reconciliation test
The most reliable way to quantify a currency issue is to run a structured reconciliation over a meaningful period such as 30 days. Pull total revenue from GA4 and compare it with completed-order revenue from your operational system for the same dates, order-status rules, and cancellation treatment. The important question is not whether the numbers are identical. It is whether you can explain the gap.
If you identify a gap, use DebugView with a test purchase to examine every parameter on the purchase event. Check value, currency, transaction_id, items array, and whether the event is named exactly purchase. The event name must be purchase for GA4 to register revenue at all. Any other name, even completed_purchase or order_success, will result in the event being recorded but revenue being ignored. For the wider funnel, our guide toGA4 ecommerce tracking checkscovers the events you should validate alongside purchase.
Currency mismatch: validate, fix, and monitor
Validate
- Open GA4 Admin > Property Settings and note the Currency displayed as setting
- Use DebugView to trigger a test purchase and inspect the purchase event parameters, check the exact value of the currency parameter
- Confirm currency is a three-letter ISO 4217 code (GBP, EUR, USD) not a symbol (£, €, $)
- Run a 30-day revenue reconciliation and document the causes of any material gap between GA4 and your store backend
- In Explorations, check purchase events over the past 30 days, any events with event count > 0 but revenue = 0 have a rejected or missing currency parameter
Fix
- Align property reporting currency with your primary trading currency: Admin > Property Settings > Currency displayed as
- Update your implementation to send currency as a three-letter ISO 4217 code, not a symbol
- Ensure the event name is exactly purchase, not completed_purchase, order_success, or any other variant
- Modify dataLayer pushes to send net revenue only (excluding tax and shipping) in the value parameter, or document that gross amounts are intentional
- For multi-currency stores: move to a server-side purchase event that reads the base currency order value from your database rather than the browser-side display currency
Watch for
- Purchase events appearing in DebugView with value present but revenue showing as zero in reports
- GA4 revenue diverging from store backend without a documented explanation
- Currency-related gaps growing over time as international transaction volume increases
- Any new market launch or currency switcher plugin installation, these frequently introduce currency parameter regressions
Currency mismatch audit checklist
- GA4 property reporting currency matches the store's primary trading currency
- currency parameter uses ISO 4217 three-letter code, not a symbol
- value parameter contains net revenue only, not including tax or shipping
- Event name is exactly purchase, not a variant or custom name
- Multi-currency stores send base currency value rather than display currency value
- 30-day revenue reconciliation conducted and gap documented with identified causes
- DebugView confirms correct value and currency parameters on test purchases
Related guides to read next
GA4 Purchase Event Parameters: The Complete Reference
Every required and recommended parameter for the purchase event, with examples and common implementation mistakes.
Fix Missing Revenue in GA4 Purchase Events
Step-by-step diagnosis for purchase events that fire but report zero revenue, covering all root causes.
Are your purchase events sending the right currency?
GA4Audits can flag missing currency codes and revenue mismatches, but reconciliation findings still need a qualified analyst who understands your finance and checkout logic.