Measure ecommerce

You can set up ecommerce events to collect information about the shopping behavior of your users. The events enable you to quantify your most popular products and see the influence of promotions and product placement on revenue.

This article describes each ecommerce event and when to set up the event. For a step-by-step example of how to set up an ecommerce event, see Set up a purchase event.

Make sure you’ve added the Google Analytics: GA4 Configuration tag to your website and can access Analytics and the website source code.

  • Enable debug mode so you can see events in realtime and more easily troubleshoot issues
  • Review the custom dimension and metric limits when sending custom parameters with ecommerce events
  • Set currency when sending value (revenue) data to ensure revenue metrics are calculated correctly
  • Set each ecommerce parameter you have data for, regardless of whether the parameter is optional
  • Use the sample ecommerce website to see an example of how to tag your website

A typical ecommerce implementation measures any of the following actions:

At the heart of these actions are the products and services you sell. You can represent products and services as an array of items that can be added to ecommerce events. The following example demonstrates how to create the collection of items that are referenced throughout this guide. The items array can include up to 200 elements.

 
items: [
   
{
      item_id
: "SKU_12345",
      item_name
: "Stan and Friends Tee",
      affiliation
: "Google Merchandise Store",
      coupon
: "SUMMER_FUN",
      currency
: "USD",
      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
: 9.99,
      quantity
: 1
   
},
   
{
      item_id
: "SKU_12346",
      item_name
: "Google Grey Women's Tee",
      affiliation
: "Google Merchandise Store",
      coupon
: "SUMMER_FUN",
      currency
: "USD",
      discount
: 3.33,
      index
: 1,
      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
: "gray",
      location_id
: "ChIJIQBpAG2ahYAR_6128GcTUEo",
      price
: 20.99,
      quantity
: 1
   
}
]

If you have already implemented ecommerce for Universal Analytics, you can do one of the following to migrate to Google Analytics 4:

  • Use your UA ecommerce implementation to populate GA4 ecommerce events
  • Replace your UA ecommerce implementation with GA4 ecommerce events

For information about how to transition your ecommerce implementation from Universal Analytics to Google Analytics 4, see the GA4 ecommerce migration guide for Google Tag Manager.

It’s recommended that you use the following command to clear the ecommerce object prior to pushing an ecommerce event to the data layer. Clearing the object will prevent multiple ecommerce events on a page from affecting each other.

 
dataLayer.push({ ecommerce: null });  // Clear the previous ecommerce object.

When a user is presented with a list of results, send a view_item_list event including an items array parameter containing the displayed items. For details on the parameters to send, see the Events reference.

 
dataLayer.push({ ecommerce: null });  // Clear the previous ecommerce object.
dataLayer
.push({
 
event: "view_item_list",
  ecommerce
: {
    items
: [
     
{
      item_id
: "SKU_12345",
      item_name
: "Stan and Friends Tee",
      affiliation
: "Google Merchandise Store",
      coupon
: "SUMMER_FUN",
      currency
: "USD",
      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
: 9.99,
      quantity
: 1
   
},
   
{
      item_id
: "SKU_12346",
      item_name
: "Google Grey Women's Tee",
      affiliation
: "Google Merchandise Store",
      coupon
: "SUMMER_FUN",
      currency
: "USD",
      discount
: 3.33,
      index
: 1,
      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
: "gray",
      location_id
: "ChIJIQBpAG2ahYAR_6128GcTUEo",
      price
: 20.99,
      promotion_id
: "P_12345",
      promotion_name
: "Summer Sale",
      quantity
: 1
   
}]
 
}
});

Once a user selects an item from the list, send the select_item event with the selected item in an items array parameter. For details on the parameters to send, see the Events reference.

 
dataLayer.push({ ecommerce: null });  // Clear the previous ecommerce object.
dataLayer
.push({
 
event: "select_item",
  ecommerce
: {
    items
: [
   
{
      item_id
: "SKU_12345",
      item_name
: "Stan and Friends Tee",
      affiliation
: "Google Merchandise Store",
      coupon
: "SUMMER_FUN",
      currency
: "USD",
      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
: 9.99,
      quantity
: 1
   
}
   
]
 
}
});

To measure how many times item details are viewed, send a view_item event whenever a user views an item’s details screen. For details on the parameters to send, see the Events reference.

 
dataLayer.push({ ecommerce: null });  // Clear the previous ecommerce object.
dataLayer
.push({
 
event: "view_item",
  ecommerce
: {
    items
: [
   
{
      item_id
: "SKU_12345",
      item_name
: "Stan and Friends Tee",
      affiliation
: "Google Merchandise Store",
      coupon
: "SUMMER_FUN",
      currency
: "USD",
      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
: 9.99,
      quantity
: 1
   
}
   
]
 
}
});

Measure an item being added to a shopping cart by sending an add_to_cart event with the relevant items in an items array. For details on the parameters to send, see the Events reference.

 
dataLayer.push({ ecommerce: null });  // Clear the previous ecommerce object.
dataLayer
.push({
 
event: "add_to_cart",
  ecommerce
: {
    items
: [
   
{
      item_id
: "SKU_12345",
      item_name
: "Stan and Friends Tee",
      affiliation
: "Google Merchandise Store",
      coupon
: "SUMMER_FUN",
      currency
: "USD",
      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
: 9.99,
      quantity
: 1
   
}
   
]
 
}
});

You can also measure when an item is added to a wishlist by sending an add_to_wishlist event with the relevant items in an items array. For details on the parameters to send, see the Events reference.

 
dataLayer.push({ ecommerce: null });  // Clear the previous ecommerce object.
dataLayer
.push({
 
event: "add_to_wishlist",
  ecommerce
: {
    currency
: "USD",
    value
: 7.77,
    items
: [
   
{
      item_id
: "SKU_12345",
      item_name
: "Stan and Friends Tee",
      affiliation
: "Google Merchandise Store",
      coupon
: "SUMMER_FUN",
      currency
: "USD",
      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
: 9.99,
      quantity
: 1
   
}
   
]
 
}
});

When a user subsequently views the cart, send the view_cart event with all items in the cart. For details on the parameters to send, see the Events reference.

 
dataLayer.push({ ecommerce: null });  // Clear the previous ecommerce object.
dataLayer
.push({
 
event: "view_cart",
  ecommerce
: {
    currency
: "USD",
    value
: 7.77,
    items
: [
   
{
      item_id
: "SKU_12345",
      item_name
: "Stan and Friends Tee",
      affiliation
: "Google Merchandise Store",
      coupon
: "SUMMER_FUN",
      currency
: "USD",
      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
: 9.99,
      quantity
: 1
   
}
   
]
 
}
});

To measure when a user removes an item from a cart, send the remove_from_cart event. For details on the parameters to send, see the Events reference.

 
dataLayer.push({ ecommerce: null });  // Clear the previous ecommerce object.
dataLayer
.push({
 
event: "remove_from_cart",
  ecommerce
: {
    items
: [
   
{
      item_id
: "SKU_12345",
      item_name
: "Stan and Friends Tee",
      affiliation
: "Google Merchandise Store",
      coupon
: "SUMMER_FUN",
      currency
: "USD",
      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
: 9.99,
      quantity
: 1
   
}
   
]
 
}
});

Measure the first step in a checkout process by sending a begin_checkout event with one or more items defined with the relevant fields. A coupon can also be added at this stage to the entire order by adding it to the event or applied to a particular item by adding it to specific elements in the items array. For details on the parameters to send, see the Events reference.

 
dataLayer.push({ ecommerce: null });  // Clear the previous ecommerce object.
dataLayer
.push({
 
event: "begin_checkout",
  ecommerce
: {
    items
: [
   
{
      item_id
: "SKU_12345",
      item_name
: "Stan and Friends Tee",
      affiliation
: "Google Merchandise Store",
      coupon
: "SUMMER_FUN",
      currency
: "USD",
      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
: 9.99,
      quantity
: 1
   
}
   
]
 
}
});

When a user proceeds to the next step in the checkout process and adds shipping information, send an add_shipping_info event. Use the parameter shipping_tier to specify the user’s delivery option, such as “Ground”, “Air”, or “Next-day”. For details on the parameters to send, see the Events reference.

 
dataLayer.push({ ecommerce: null });  // Clear the previous ecommerce object.
dataLayer
.push({
 
event: "add_shipping_info",
  ecommerce
: {
    currency
: "USD",
    value
: 7.77,
    coupon
: "SUMMER_FUN",
    shipping_tier
: "Ground",
    items
: [
   
{
      item_id
: "SKU_12345",
      item_name
: "Stan and Friends Tee",
      affiliation
: "Google Merchandise Store",
      coupon
: "SUMMER_FUN",
      currency
: "USD",
      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
: 9.99,
      quantity
: 1
   
}
   
]
 
}
});

Send the add_payment_info event when a user submits their payment information. If applicable, include payment_type with this event for the chosen method of payment. For details on the parameters to send, see the Events reference.

 
dataLayer.push({ ecommerce: null });  // Clear the previous ecommerce object.
dataLayer
.push({
 
event: "add_payment_info",
  ecommerce
: {
    currency
: "USD",
    value
: 7.77,
    coupon
: "SUMMER_FUN",
    payment_type
: "Credit Card",
    items
: [
   
{
      item_id
: "SKU_12345",
      item_name
: "Stan and Friends Tee",
      affiliation
: "Google Merchandise Store",
      coupon
: "SUMMER_FUN",
      currency
: "USD",
      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
: 9.99,
      quantity
: 1
   
}
   
]
 
}
});

Measure a purchase by sending a purchase event with one or more items defined with the relevant fields. For details on the parameters to send, see the Events reference.

 
dataLayer.push({ ecommerce: null });  // Clear the previous ecommerce object.
dataLayer
.push({
 
event: "purchase",
  ecommerce
: {
      transaction_id
: "T_12345",
      affiliation
: "Google Merchandise Store",
      value
: 25.42,
      tax
: 4.90,
      shipping
: 5.99,
      currency
: "USD",
      coupon
: "SUMMER_SALE",
      items
: [
       
{
        item_id
: "SKU_12345",
        item_name
: "Stan and Friends Tee",
        affiliation
: "Google Merchandise Store",
        coupon
: "SUMMER_FUN",
        currency
: "USD",
        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
: 9.99,
        quantity
: 1
     
},
     
{
        item_id
: "SKU_12346",
        item_name
: "Google Grey Women's Tee",
        affiliation
: "Google Merchandise Store",
        coupon
: "SUMMER_FUN",
        currency
: "USD",
        discount
: 3.33,
        index
: 1,
        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
: "gray",
        location_id
: "ChIJIQBpAG2ahYAR_6128GcTUEo",
        price
: 20.99,
        promotion_id
: "P_12345",
        promotion_name
: "Summer Sale",
        quantity
: 1
     
}]
 
}
});

Measure refunds by sending a refund event with the relevant transaction_id specified and optionally (for partial refunds) one or more items defined with item_id and quantity. For details on the parameters to send, see the Events reference.

Partial refund

 
dataLayer.push({ ecommerce: null });  // Clear the previous ecommerce object.
dataLayer
.push({
 
event: "refund",
  ecommerce
: {
    currency
: "USD",
    transaction_id
: "T_12345",
    value
: 12.21,
    affiliation
: "Google Merchandise Store",
    coupon
: "SUMMER_FUN",
    shipping
: 3.33,
    tax
: 1.11,
    items
: [
   
{
      item_id
: "SKU_12345",
      item_name
: "Stan and Friends Tee",
      affiliation
: "Google Merchandise Store",
      coupon
: "SUMMER_FUN",
      currency
: "USD",
      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
: 9.99,
      quantity
: 1
   
}
   
]
 
}
});

Full refund

 
dataLayer.push({ ecommerce: null });  // Clear the previous ecommerce object.
dataLayer
.push({
 
event: "refund",
  ecommerce
: {
    transaction_id
: "T12345" // Transaction ID. Required for purchases and refunds.
 
}
});

Ecommerce includes support for measuring impressions and clicks of internal promotions, such as banners displayed to promote a sale.

Promotion impressions are typically measured with the initial screen view by sending the view_promotion event with an items parameter to specify the promoted item. For details on the parameters to send, see the Events reference.

 
dataLayer.push({ ecommerce: null });  // Clear the previous ecommerce object.
dataLayer
.push({
 
event: "view_promotion",
  ecommerce
: {
    items
: [
   
{
      item_id
: "SKU_12345",
      item_name
: "Stan and Friends Tee",
      affiliation
: "Google Merchandise Store",
      coupon
: "SUMMER_FUN",
      currency
: "USD",
      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
: 9.99,
      quantity
: 1
   
}
   
]
 
}
});

To indicate a user clicked on a promotion, send a select_promotion event with that item as an item parameter. For details on the parameters to send, see the Events reference.

 
dataLayer.push({ ecommerce: null });  // Clear the previous ecommerce object.
dataLayer
.push({
 
event: "select_promotion",
  ecommerce
: {
    items
: [
   
{
      item_id
: "SKU_12345",
      item_name
: "Stan and Friends Tee",
      affiliation
: "Google Merchandise Store",
      coupon
: "SUMMER_FUN",
      currency
: "USD",
      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
: 9.99,
      quantity
: 1
   
}
   
]
 
}
});

If your website does not support a data layer, you can use a Custom JavaScript Variable to call a function that returns the ecommerce data object. This object should use the data layer syntax shown earlier in this guide; for example:

 
// A Custom JavaScript Variable that returns an ecommerceData object
// that follows the data layer syntax.
function getEcommerceData() {
 
var ecommerceProductData = [
   
{
      item_name
: "Stan and Friends Tee",
      item_id
: "SKU_12345",  // ID is required.
     
// Rest of the product data should follow the data layer syntax.
   
},
   
// Multiple products may be included.
 
];
 
return ecommerceProductData;
}

If you choose to use a Custom JavaScript Variable, then you can use it in the same manner as you would the data layer — you can supply the value from the 'items' parameter as an event parameter in your tag configuration.

Tag configuration:

  • Tag type: GA4 Event
  • Event Name: any
  • Read data from Variable: {{gaEcommerceData}}
  • Trigger: event equals gtm.dom

gaEcommerceData Variable Settings

  • Variable type: Custom JavaScript

Tell Us About Your Project

I will share ideas and recommendations for how to make it successful