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_listselect_itemview_itemadd_to_cartview_cartremove_from_cartbegin_checkoutadd_shipping_infoadd_payment_infopurchaserefund. 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_categoryitem_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

  1. Symptom Purchase fires in DebugView but reports show zero revenue. Cause value is absent, undefined, zero, or sent as a string ('49.99' or '$49.99'). Fix Send value as a numeric type and confirm a positive number appears under the event in DebugView before shipping.
  2. Symptom Revenue metrics are not computed even though value is present. Cause currency is missing, empty, or a symbol ($) instead of a 3-letter ISO 4217 code. Fix Send currency as a valid ISO 4217 code (USD, EUR, GBP); GA4 requires it whenever value is set.
  3. 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.
  4. Symptom Duplicate purchases inflate transaction counts and revenue. Cause transaction_id is missing, or the confirmation page can be reloaded and re-fires purchase. Fix Always send a stable, unique transaction_id per order; GA4 dedupes on it.
  5. Symptom Events arrive but item-level reports (item revenue, item refunds) are empty. Cause The items array is omitted, items lack both item_id and item_name, or refund is sent without items. Fix Include an items array with at least item_id or item_name, and include item info in refund to get item-level refund metrics.
  6. Symptom List or promotion attribution is wrong or missing. Cause Event-level item_list_id / item_list_name are ignored when also set at item level, and promotion events need an items array for some reports. Fix Set list and promotion IDs consistently at one scope, and include the items array on promotion events.
  7. Symptom Reported revenue is higher than actual order totals. Cause value included shipping and tax, or was set to a per-item price instead of the sum of price * quantity. Fix Set value to the sum of price * quantity for all items, exclude shipping and tax, and send shipping and tax as their own parameters.

Quick recipes

add-to-cart.js
// 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
}]
});
purchase.js
// 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 }]
});
view-item-list.js
// 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 }
]
});
refund.js
// 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 }]
});
datalayer-purchase.js
// 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 }]
}
});
begin-checkout.js
// 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 }]
});

Sources

Changelog

  • — Initial version, verified against official Google documentation.

dataLayer

0 events · 0 sent

    • home /
      writing /writing
      guides /guides
      work /#work
      about /about
      colophon /colophon
      toggle analyst mode ctrl+.
      print session receipt /#receipt