Google Analytics Enhanced Ecommerce Note

0. Setup

Load GA

<script>
/* GA code*/

// GA init
ga('create', 'UA-XXXXXXXX');

// GA plugins
ga('require', 'ec');

</script>

On each page

<script type="text/javascript">
    ga('send','pageview');
</script>

Object

class ImpressionFieldObject {
    id: string;
    name: string;
    list: string;
    brand: string;
    category: string;
    variant: string;
    position: number;
    price: number;
}

class ProductFieldObject {
    id: string
    name: string
    brand: string
    category: string
    variant: string
    price: number;
    quantity: number;
    coupon: string;
    position: number
}

class ActionFieldObject {
    id: string;
    affiliation: string;
    revenue: number;
    tax: number;
    shipping: number;
    coupon: string
    list: string
    step: number;
    option: string; 
}

enum EcActionType {
    Click = 'click',
    Detail = 'detail',
    Add = 'add',
    Remove = 'remove',
    Checkout = 'checkout',
    CheckoutOption = 'checkout_option',
    Purchase = 'purchase',
    Refund = 'refund',
    PromoClick = 'promo_click'
}

1. View product (on the category page)

let impressionFieldObject: ImpressionFieldObject = {};

ga('ec:addImpression', impressionFieldObject)

2. Click product in the category page

let productFieldObject: ProductFieldObject = {};

let list = 'Search Results';

ga('ec:addProduct', productFieldObject);
ga('ec:setAction', EcActionType.Click, {list: list});
ga('send', 'event', list, EcActionType.Click, 'Results', {
    hitCallback: () => {/* Do something when request done (e.g. navigate to the product page). */}
});

3. Add to cart (on the category page)

let productFieldObject: ProductFieldObject = {};

let list = 'Search Results';

ga('ec:addProduct', productFieldObject);
ga('ec:setAction', EcActionType.Add);
ga('send', 'event', list, EcActionType.Click, 'Add to Cart');

4. View product (on the product page)

let productFieldObject: ProductFieldObject = {};

ga('ec:addProduct', productFieldObject);
ga('ec:setAction', EcActionType.Detail);

5. Add to cart (on the product page)

let productFieldObject: ProductFieldObject = {};

const list = 'Product detail'

ga('ec:addProduct', productFieldObject);
ga('ec:setAction', EcActionType.Add);
ga('send', 'event', list, EcActionType.Click, 'Add to Cart');

6. Remove from cart (at the cart)

let productsInTheCart: ProductFieldObject[] = [];

const onProductRemoveBtnClick = (product: ProductFieldObject) => {
    ga('ec:addProduct', product)
    ga('ec:setAction', EcActionType.Remove);
    ga('send', 'event', 'Cart', EcActionType.Click, 'Remove from Cart');
}

7. Click Checkout

let productsInTheCart: ProductFieldObject[] = [];

for(let product of productsInTheCart) {
    ga('ec:addProduct', product);
}

ga('ec:setAction', EcActionType.Checkout, {step: 1});
ga('send', 'pageview');

8. Click next step button on each checkout step

const nextStep = 2;

ga('ec:setAction', EcActionType.Checkout, {step: 2});
ga('send', 'pageview');

9. Purchase (complete order)

let productsInTheCart: ProductFieldObject[] = [];

for(let product of productsInTheCart) {
    ga('ec:addProduct', product);
}

ga('ec:setAction', EcActionType.Purchase, {step: 1});
ga('send', 'pageview');

10. Refund

// No need if refund the entire order.
let productsToRefund: ProductFieldObject[] = [];
for(let product of productsInTheCart) {
    ga('ec:addProduct', product);
}

let transactionId: string = 'XXXXXXX';
let category = 'yyyyy'; // e.g. Ecommerce
let actionName = 'Refund';
ga('ec:setAction', EcActionType.Refund, {id: transactionId});
ga('send', 'events', category, actionName, {nonInteraction: 1});

If you need to send refund data using an event and the event is not part of normally measured onsite behavior (i.e. not user initiated), then it’s recommended that you send a non-interaction event. This will prevent metrics such as bounce rate, time on site, etc. from being affected by the event.