For a long time, many teams were unsure whether gross or net amounts should be transferred in Google Analytics 4 (GA4) – and used gross amounts “to be on the safe side”. This still leads to incorrect sales in GA4 today. Google has now clearly specified that value and price should be net.
According to GA4 documentation values for "value" and "price" - net
Google has clarified this in the official event reference:
“Set value to the sum of (price × quantity) for all elements in items. Do not specify shipping or tax.“
Google for Developers
This makes it clear that value & price should be specified net. This is necessary for a clean view of the data in GA4.
purchase - Event parameters (event scope)
Name | Type | Required | Example value | Description |
|---|---|---|---|---|
currency | string | Yes* | EUR | The currency of the items assigned to the event in three-letter ISO 4217 format. Value measures for the view_item event do not contribute to sales. * If you set value, currency is required for sales measures to be calculated accurately. |
value | number | Yes* | 30,03 | The monetary value of the event. * Set value to the sum of (price * quantity) for all elements in items. Do not specify shipping or tax. * value is usually required for meaningful reports. If you mark the event as a key event, you should specify value. * currency is required if you specify value. |
customer_type | string (new / returning) | No | new | Does the conversion come from a new or returning customer? new: New customer – has not purchased anything in the specified period (time window of 540 days recommended and set as standard, but not mandatory) returning: A returning customer who has purchased something in the specified period. Do not enter a value if the classification is not certain, e.g. if the user paid as a guest. |
transaction_id | string | Yes | T_12345 | The unique ID of a transaction. The transaction_id parameter can be used to avoid duplicate events being recorded for a purchase. |
coupon | string | No | SUMMER_FUN | The name/code of the voucher assigned to the event. coupon parameters at event and item level are independent of each other. |
shipping | number | No | 3,33 | The shipping costs assigned to a transaction. |
tax | number | No | 1,11 | The taxes for a transaction. |
items | Array | Yes | The articles for the event. |
purchase - Item parameters (item scope)
Name | Type | Required | Example value | Description |
|---|---|---|---|---|
item_id | string | Yes* | SKU_12345 | The ID of the article. *Either item_id or item_name is required. |
item_name | string | Yes* | “Stan and Friends T-shirt | The name of the article. *Either item_id or item_name is required. |
affiliation | string | No | Google Store | A product affiliation to specify a supplier or store Note: “affiliation” is only available at element level. |
coupon | string | No | SUMMER_FUN | The name/code of the voucher assigned to the item. coupon parameters at event and item level are independent of each other. |
discount | number | No | 2,22 | The monetary value of the discount per unit assigned to the item. |
index | number | No | 5 | The index or the position of the item in a list. |
item_brand | string | No | Google | The brand of the article |
item_category | string | No | Clothing | The category of the item If it is used as part of a category hierarchy or taxonomy, this is the first category. |
item_category2 | string | No | Adult | The second category hierarchy or additional taxonomy of the article. |
item_category3 | string | No | Shirts | The third category hierarchy or additional taxonomy of the article. |
item_category4 | string | No | Crew | The fourth category hierarchy or additional taxonomy of the article. |
item_category5 | string | No | Short sleeve | The fifth category hierarchy or additional taxonomy of the article. |
item_list_id | string | No | related_products | The ID of the list in which the item was presented to the user If set, item_list_id is ignored at event level. If not set, the item_list_id is used at event level, if available. |
item_list_name | string | No | Similar products | The name of the list in which the item was presented to the user If specified, item_list_name is ignored at event level. If not specified, the item_list_name is used at event level, if available. |
item_variant | string | No | Green | The item variant or the unique code or description for additional item details/options. |
location_id | string | No | ChIJIQBpAG2ahYAR_6128GcTUEo (the Google Place ID for San Francisco) | The physical location assigned to the item, e.g. the location of the store. We recommend using the Google Place ID that corresponds to the associated item. A user-defined location ID can also be used. Note: `location id` is only available at item level. |
price | number | No | 10,01 | The price of the item in the specified currency. If a discount is applied to the item, set price to the reduced unit price and specify the unit price discount in the discount parameter. |
quantity | number | No | 3 | Item quantity. If not specified, quantity is set to 1. |
Why the gross confusion arose
How to set up GA4 correctly today
gtag("event","purchase",{
transaction_id: "T_1001",
currency: "EUR",
value: 100.00, // Netto-Warenwert (Summe aus price*quantity)
tax: 19.00, // USt. separat
shipping: 5.00, // Versand separat
items: [{
item_id: "SKU_1",
item_name: "T-Shirt",
price: 50.00, // Netto-Einzelpreis nach Rabatt
quantity: 2,
discount: 5.00 // optional: pro Einheit
}]
});
- value = (price × quantity) of all items – without tax/shipping.
- currency is mandatory as soon as value is set.
- Item parameters (e.g. price, quantity) vs. event parameters (e.g. value, tax, shipping) are clearly separated.
Since value is to be formed from price × quantity and must not include tax/shipping, price must be net (after discount, but without tax) – otherwise you would automatically “add” gross to value. The requirement not to add tax/shipping to value is explicitly documented.
What happens if you keep sending gross?
- Excessive sales KPIs: Event-level sales KPIs in GA4 are based on the value parameter. If it is gross, total/purchase revenue deviates from your accounting.
- Inconsistencies in the “E-commerce purchases” report: Item revenue is calculated from price × quantity. If price is incorrectly gross, but tax is also sent as an event parameter, you will get logical breaks between item and event level.
- Incorrect conversion values in ads & bidding systems: Google recommends setting a value for key events. If the value is too high, you distort ROAS/CPA.
Check & fix checklist
- Check data layer: Are items[].price net (after discount) and items[].quantity correct?
- Calculate value on the server/client side: Σ(price × qty) across all items; no tax/shipping.
- tax & shipping separately as an event parameter.
- currency if value is available.
- Check DebugView & Realtime after deployment; if revenue is missing: Follow the “Missing revenue data” guide.
What events are there in Google Analytics
For all properties
Event | Trigger when a user… |
|---|---|
ad_impression | sees a display (app only). |
earn_virtual_currency | receives a virtual currency, e.g. coins, gemstones or tokens. |
generate_lead | sends a form or a request for information. |
join_group | joins a group. |
login | registers. |
purchase | buys something. |
refund | receives a refund. |
search | searches on your website or in your app. |
select_content | selects content on your website or in your app. |
share | shares content from your website or app. |
sign_up | registers for an account on your website or in your app. |
spend_virtual_currency | virtual currency, e.g. coins, gemstones or tokens. |
tutorial_begin | a tutorial starts during the onboarding process. |
tutorial_complete | completes a tutorial during the onboarding process. |
For online sales
Event | Trigger when a user… |
|---|---|
add_payment_info | sends payment information during the payment process. |
add_shipping_info | Sends shipping information during the payment process. |
add_to_cart | item in the shopping cart. |
add_to_wishlist | adds items to a wish list. |
begin_checkout | starts the payment process. |
purchase | buys something. |
refund | receives a refund. |
remove_from_cart | Item removed from shopping cart. |
select_item | selects an item from a list of items or offers. |
select_promotion | selects an offer. |
view_cart | the shopping cart. |
view_item | an article. |
view_item_list | a list of articles or offers. |
view_promotion | views an offer on your website or in your app. |
For lead generation
Event | Trigger when a user… |
|---|---|
generate_lead | sends a form online or provides information offline. |
qualify_lead | is marked as meeting the criteria for a qualified lead. |
disqualify_lead | is not marked as a lead for one of several reasons. |
working_lead | contacts an employee or is contacted by someone from your company. |
close_convert_lead | becomes a lead with conversion (a customer). |
close_unconvert_lead | is not marked as a converted lead for one of several reasons |
For games
Event | Trigger when a user… |
|---|---|
earn_virtual_currency | receives a virtual currency, e.g. coins, gemstones or tokens. |
join_group | joins a group. |
level_end | completed a level in a game. |
level_start | a new level in a game begins. |
level_up | reaches the next level in a game. |
post_score | posts his score. |
select_content | Selects content. |
spend_virtual_currency | virtual currency, e.g. coins, gemstones or tokens. |
tutorial_begin | a tutorial starts during the onboarding process. |
tutorial_complete | completes a tutorial during the onboarding process. |
unlock_achievement | a success. |
FAQ
Set price to the discounted net unit price and additionally discount per item (optional).
Value is typically required for “meaningful reports”; it is recommended for key events.
They are event parameters and should not be included in value – this keeps the item and event levels clean and comparable.
Copy all DataLayers with source code
Conclusion
The previous gross practice was understandable, but is no longer GA4-compliant. Change to net-price and value = Σ(price × qty) without tax/shipping. This means your sales in GA4 match your shop/ERP – and your reporting & bidding signals are reliable.
Sources (excerpt): GA4 event reference (tag platform) with value rule and reporting note; GA4 e-commerce examples for parameter scopes; guide to missing sales.