GA4 ecommerce events reference
last verified · against GA4 ecommerce docs as of 2026-07
Field reference for GA4 ecommerce events: the full funnel, every item-array parameter, currency and value rules, and the gotchas that silence revenue in reports.
What this is
A field-level reference for the GA4 recommended ecommerce events — the event parameters, item-object fields, and revenue rules for the full purchase funnel. Use it to instrument or audit view_item_list through purchase and refund without re-reading the vendor docs.
Event reference
Typical funnel order: view_item_list → select_item → view_item → add_to_cart → view_cart → remove_from_cart → begin_checkout → add_shipping_info → add_payment_info → purchase → refund. Non-linear events: add_to_wishlist, view_promotion, select_promotion.
| Event | Required | Optional |
|---|---|---|
view_item_list |
items |
currency, item_list_id, item_list_name |
select_item |
items |
item_list_id, item_list_name (both ignored if set at item level) |
view_item |
items |
currency (required if value set), value |
add_to_cart |
items |
currency (required if value set), value |
remove_from_cart |
items |
currency (required if value set), value |
view_cart |
items (all cart items) |
currency (required if value set), value |
begin_checkout |
items |
currency (required if value set), value, coupon |
add_shipping_info |
items |
currency (required if value set), value, coupon, shipping_tier |
add_payment_info |
items |
currency (required if value set), value, coupon, payment_type |
purchase |
transaction_id, items |
value + currency (required for revenue metrics), coupon, shipping, tax, customer_type |
refund |
transaction_id |
currency (required if value set), value, coupon, shipping, tax, items (recommended for item-level refund metrics) |
add_to_wishlist |
items |
currency (required if value set), value |
view_promotion |
items |
creative_name, creative_slot, promotion_id, promotion_name |
select_promotion |
items |
creative_name, creative_slot, promotion_id, promotion_name |
Notes: shipping_tier is a delivery option (e.g. Ground, Air, Next-day); payment_type is the chosen method of payment; shipping and tax on purchase/refund are monetary costs associated with the transaction; customer_type is new or returning.
Item object fields
Each object in the items array. One of item_id or item_name is required; every other field is optional.
| Field | Type | Definition |
|---|---|---|
item_id |
string | Product identifier / SKU (e.g. SKU_12345). One of item_id or item_name required. |
item_name |
string | Product name (e.g. Stan and Friends Tee). One of item_id or item_name required. |
price |
number | Unit price of the item in the specified currency (e.g. 10.01). |
quantity |
number | Item quantity (e.g. 3). Defaults to 1 if not set. |
affiliation |
string | Product affiliation / supplying company or store location. |
index |
number | Index / position of the item in a list. |
item_brand |
string | Brand of the item. |
item_category … item_category5 |
string | Hierarchical category levels (e.g. Apparel, Adult, Shirts, Crew, Short sleeve). |
item_variant |
string | Variant or unique code / description for additional options (e.g. green). |
item_list_id |
string | ID of the list the item is presented in. Overrides the event-level value if set at item level. |
item_list_name |
string | Name of the list the item is presented in. Overrides the event-level value if set at item level. |
location_id |
string | Physical location for the item (e.g. the store). Google Place ID recommended (e.g. ChIJIQBpAG2ahYAR_6128GcTUEo). |
coupon |
string | Coupon associated with the item. Independent of the event-level coupon. |
discount |
number | Unit monetary discount value associated with the item. |
Revenue parameter rules
| Parameter | Rule |
|---|---|
value |
The monetary value of the event. Set to the sum of price * quantity for all items in items. Do not include shipping or tax. Send as a number, not a string. |
currency |
Required if value is set. Must be 3-letter ISO 4217 format (e.g. USD). Set at the event level when sending value (revenue) data. |
transaction_id |
The unique identifier of a transaction. Helps avoid duplicate purchase events. |
quantity |
If not set, quantity is set to 1. |
coupon (item vs event) |
Event-level and item-level coupon parameters are independent. |
item_list_id / item_list_name |
Event-level values are ignored if the same parameters are set at the item level. |
Limits
| Limit | Value |
|---|---|
items array maximum |
200 elements |
| Custom (item-scoped) parameters per item | up to 27 |
The docs fetched do not specify a maximum length or format constraint for transaction_id, item_id, or string parameter values; those are governed by separate GA4 event/parameter limit docs.
Gotchas
- Symptom Purchase fires in DebugView but reports show zero revenue. Cause
valueis absent, undefined, zero, or sent as a string ('49.99'or'$49.99'). Fix Sendvalueas a numeric type and confirm a positive number appears under the event in DebugView before shipping. - Symptom Revenue metrics are not computed even though
valueis present. Causecurrencyis missing, empty, or a symbol ($) instead of a 3-letter ISO 4217 code. Fix Sendcurrencyas a valid ISO 4217 code (USD,EUR,GBP); GA4 requires it whenevervalueis set. - Symptom Value or currency comes through as zero / undefined intermittently. Cause A GTM tag fires on DOM Ready / Page Load before the ecommerce dataLayer push has executed, so the tag reads empty values. Fix Trigger the tag on the ecommerce dataLayer Custom Event keyed to the event name, not on Page View / DOM Ready.
- Symptom Duplicate purchases inflate transaction counts and revenue. Cause
transaction_idis missing, or the confirmation page can be reloaded and re-firespurchase. Fix Always send a stable, uniquetransaction_idper order; GA4 dedupes on it. - Symptom Events arrive but item-level reports (item revenue, item refunds) are empty. Cause The
itemsarray is omitted, items lack bothitem_idanditem_name, orrefundis sent without items. Fix Include anitemsarray with at leastitem_idoritem_name, and include item info inrefundto get item-level refund metrics. - Symptom List or promotion attribution is wrong or missing. Cause Event-level
item_list_id/item_list_nameare ignored when also set at item level, and promotion events need anitemsarray for some reports. Fix Set list and promotion IDs consistently at one scope, and include theitemsarray on promotion events. - Symptom Reported revenue is higher than actual order totals. Cause
valueincluded shipping and tax, or was set to a per-item price instead of the sum ofprice * quantity. Fix Setvalueto the sum ofprice * quantityfor all items, exclude shipping and tax, and sendshippingandtaxas their own parameters.
Quick recipes
// Full item object: every documented field populated.gtag('event', 'add_to_cart', { currency: 'USD', value: 30.03, // sum of price * quantity, excluding shipping and tax items: [{ item_id: 'SKU_12345', item_name: 'Stan and Friends Tee', affiliation: 'Google Merchandise Store', coupon: 'SUMMER_FUN', discount: 2.22, index: 0, item_brand: 'Google', item_category: 'Apparel', item_category2: 'Adult', item_category3: 'Shirts', item_category4: 'Crew', item_category5: 'Short sleeve', item_list_id: 'related_products', item_list_name: 'Related Products', item_variant: 'green', location_id: 'ChIJIQBpAG2ahYAR_6128GcTUEo', price: 10.01, quantity: 3 }]});// The four fields audits check first: transaction_id, value, currency, items.gtag('event', 'purchase', { transaction_id: 'T_12345', // required: deduplication currency: 'USD', // required if value is set (ISO 4217) value: 30.03, // number: sum of price * quantity, no shipping/tax shipping: 4.99, // sent separately, not folded into value tax: 2.40, coupon: 'SUMMER_FUN', items: [{ item_id: 'SKU_12345', item_name: 'Stan and Friends Tee', price: 10.01, quantity: 3 }]});// currency is optional here; item_list_id/name apply to every item in the list.gtag('event', 'view_item_list', { item_list_id: 'related_products', item_list_name: 'Related Products', items: [ { item_id: 'SKU_12345', item_name: 'Stan and Friends Tee', index: 0 }, { item_id: 'SKU_12346', item_name: 'Google Grey Tee', index: 1 } ]});// Include items to get item-level refund metrics; transaction_id matches the purchase.gtag('event', 'refund', { transaction_id: 'T_12345', currency: 'USD', value: 10.01, items: [{ item_id: 'SKU_12345', quantity: 1 }]});// GTM pattern: push after order data exists; fire the tag on this Custom Event,// not on Page View / DOM Ready, or value and currency read empty.window.dataLayer = window.dataLayer || [];dataLayer.push({ event: 'purchase', ecommerce: { transaction_id: 'T_12345', currency: 'USD', value: 30.03, tax: 2.40, shipping: 4.99, items: [{ item_id: 'SKU_12345', item_name: 'Stan and Friends Tee', price: 10.01, quantity: 3 }] }});// Event-level coupon is independent of any item-level coupon.gtag('event', 'begin_checkout', { currency: 'USD', value: 30.03, coupon: 'SUMMER_FUN', items: [{ item_id: 'SKU_12345', item_name: 'Stan and Friends Tee', price: 10.01, quantity: 3 }]});Related
Sources
- Measure ecommerce — Google Analytics (read 2026-07-20)
- Event reference (gtag.js) — Tag Platform (read 2026-07-20)
- Recommended events — Google Analytics (read 2026-07-20)
Changelog
- — Initial version, verified against official Google documentation.