Product Impressions vs product views

Bronze Contributor
Bronze Contributor

Can someone explain to me how a product impression is defined? Can all products on a page be sent, even if all are not actually viewed (For example, if they at the bottom of the page and never scrolled into view.)? How does this differ from product views in a list?


Product Impressions vs product views

Tealium Expert
Tealium Expert

Hello @essdeeee

I am not sure what analytics tool you are working with.

But based on my understanding and assuming SiteCatalyst, it depends on how many products on that page. We are doing something similar in our organization but the products are very less around 5,

  • We pass it in product string with no 'revenue' and no 'purchase event', but trigger a set of product_events which will identify them as viewed.

Another method would be, collect the list of products in list evar which will help you to report them as invividual variables.

Hope this helps!




Product Impressions vs product views

Bronze Contributor
Bronze Contributor

From a Google Analytics perspective, it may be helpful to refer to their Enhanced Ecommerce documentation:

A Product Impression is defined as viewing one (or usually multiple) product offers on a given page.
A typical scenario would be loading a page on which multiple products in a given category are being browsed.
Each of the different product offers on this page would count as a Product Impression.

You can send all of the products in the impression list hit to Google Analytics,
or you could use a Javascript Extension such as the example below to send impression tracking hits as a user scrolls down
into a category page.

This code sample assumes that you've set up your utag_data data layer mappings and that you're using the Ecommerce Extension in Tealium.

// #3: if a product qualifies as an impression, trigger a utag tracking call to track an impression on that product.  
checkProductPositions = function () {
    try {
        var $productElements = $([]);
        var impressionsAdded = false,
            productsViewed = [];

        // select all product element items on the page.
        $productElements = $("div.products");

        $productElements.each(function (index) {
            // check to see if the element is in the browser viewport.
            // check to see if we haven't sent an impression hit for that product.  
            if (isElementVisible($(this)) && typeof ($(this).data('ecomm_impression')) == "undefined") {
                if (typeof window.utag_data._cprodname == 'undefined') {
                    window.utag_data._cprodname = new Array();
                if (typeof window.utag_data._ccat == 'undefined') {
                    window.utag_data._ccat = new Array();
                // gather the product information from visible product element. 
                // there are many ways to do this - choose the one that makes the most sense 
                // for your implementation.
                window.utag_data._cprodname.push(""); // product name
                window.utag_data._ccat.push(""); // product category
                // ..etc.

                if (window.utag_data._cprodname.length > 0) {
                    // we have new product impressions to sent to tag management.  
                    impressionsAdded = true;

                    // mark each product on the page as having been viewed so that we don't 
                    // resend an impression for a product that has already sent an impression.
                    $(this).data('ecomm_impression', 'sent');

        if (impressionsAdded) {
            // send call with utag_data for the impression hit.  
            // this example will trigger the Google Analytics event and a Enhanced Ecommerce impression list
            // in our implementation.  this is dependant on how you've mapped your utag_data variables.  
                event_name: "Product Impression",
                event_action: "Category Page",
                event_category: "eCommerce Event",
                event_nonInteraction: true,
                _cprodname: window.utag_data._cprodname,
                _ccat: window.utag_data._ccat
    } catch (e) {;

// #2: check for new products every 3 seconds.  
setProductCheck = function () {
    window.setInterval(function () {
        if (typeof (this.checkProductTimeoutId) == "number") {
        this.checkProductTimeoutId = setTimeout(checkProductPositions, 300);
    }, 3000);

// #1: as user scrolls down the page, check for new products.
window.onscroll = function () {
Robert Anderson