GA4 purchase sent with a value but no currency
Updated 2026-09-28
A GA4 purchase that sends a value but no currency has epn.value (or ep.value) in the request and neither cu nor ep.currency. Google's GA4 events reference says that when value is set, currency is required for revenue metrics to be computed accurately, so fix the tag rather than rely on reports. Universal Pixel Debugger shows the currency as Not observed in that case and never fills it in from the store or another network.
What the symptom looks like
Orders arrive in GA4, but their revenue looks wrong or does not appear the way you expect, while the ad platforms show amounts for the same orders. The same gap can affect other events that carry a value, such as add_to_cart or begin_checkout, and other networks' tags.
How to recognize it in the request
GA4 sends events to a /g/collect endpoint. The event name is in en, numeric event parameters are prefixed epn. and text parameters ep.. The currency usually travels as the top-level cu key rather than as an event parameter.
| Network | Value key | Currency key | Missing currency looks like |
|---|---|---|---|
| GA4 | epn.value, then ep.value | cu, then ep.currency | en=purchase with epn.value and no cu or ep.currency |
| Meta Pixel | cd[value] | cd[currency] | ev=Purchase with cd[value] and no cd[currency] |
| Google Ads | value | currency_code, cu or currency | value with none of the currency keys |
Cases that look similar
- Currency sent but empty. A
cukey with no value is treated the same as no currency and shown as Not observed. - Currency sent but not a code. Text such as
undefinedfrom an unset tag variable, or a symbol instead of a three-letter code, is flagged as Invalid currency format, with the key and the exact text sent. - Lowercase codes.
usdpasses the three-letter check and is kept as sent. It is compared withUSDon other networks without regard to case. - Currency only on the items. Custom tokens inside the packed items, such as a
k0currency/v0pair inpr1, are shown as sent but are not the event currency. On a live store, cart events carried such a token alongsidecu. - The opposite case. On live stores, GA4
add_to_cartsentcuand the item price inpr1but noepn.value. The extension then shows the value as Not observed rather than using the price.
Common causes to check
These are typical reasons a tag drops the currency. The request shows only the result, not which one applies.
- The tag maps the order total to
valuebut has no currency field, or the currency field points to a data layer variable that is empty on the confirmation page. - Currency is set on some events, such as
view_item, but the purchase is built by a different tag or trigger that leaves it out. - The currency variable holds a symbol or a display string instead of an ISO 4217 code.
Missing currency on other networks
The same problem appears outside GA4. On a live store, Google Ads CCM and view-through requests carried a value with no currency, while the main conversion request for the same action carried currency_code; those formats carry different fields by design, so the extension compares only requests of the same format (see Google Ads CCM and view-through requests). On another occasion, one Google Ads account received no currency for an event while a second account received USD. The extension reported that as Currency differs between destinations, listing nothing for the first account.
How to check with Universal Pixel Debugger
- On your own store, open the side panel with the toolbar icon, click Clear, then complete a test order or add a product to the cart.
- Wait a few seconds. A GA4 hit can arrive after the other networks.
- Click the
purchaseevent in the GA4 lane or the timeline. Value shows its key, for example from epn.value. Currency shows from cu or from ep.currency when sent, and Not observed when not. - Open the GA4 parameters checklist. A missing currency appears in the Not sent list under its keys,
cuandep.currency. - If other networks sent the same order ID, expand the compare strip for that order. A summary such as Currency missing means some networks sent a currency and others did not; the expanded view shows how many observations lack it and the original values each destination received.
- Check the issues for Invalid currency format or Currency differs between destinations.
A value without a currency does not raise a separate issue on its own. Read the Currency line of each event that carries a value.
What to fix or ask your developer
- Send a three-letter ISO 4217 code with every event that has a value: in GA4 the
currencyparameter of the event, which leaves the browser ascuorep.currency. - Use the currency the order was charged in, from the same source as the value.
- Check every event with a value, not only the purchase:
add_to_cart,begin_checkoutand refunds as well. - Apply the same fix to the Meta and Google Ads tags, and to every pixel or account that receives the event.
- Repeat the test order and confirm that Currency now shows the key it came from on every network. For revenue gaps that remain, see why Meta and GA4 report different revenue.
The side panel shows what the browser sent. It cannot show how GA4 processed the hit, and events sent from a server, such as through the Measurement Protocol, never appear there.