TimLi Logo

【GTM進階教學】如何使用Google Tag Manager串接GA加強型電子商務報表?

Table of Contents

前言

隨著第三方cookie即將被淘汰,身為電商行銷人員,最重要的其中一件事,就是要懂得如何好好追蹤消費者在自家網站的行爲,尤其Google Analytics轉換報表底下的電子商務報表,更是記錄了消費者產生轉換行爲的最後一哩路。但除了一般的電子商務報表,如果想要更完整的分析數據,如結帳行爲的分析、更細項的產品業績等等,則必須串接好GA的「加強型電子商務報表」。

然而,「加強型電子商務報表」在實作的串接上並非按按幾個GA按鈕就能夠串接好如此簡單,我們必須到網站後台編輯些許程式碼,如果你是完全不懂code的行銷人員,你可以把我這篇文章分享給公司的技術人員,或者你像我一樣必須負責管理公司網站與數位行銷的相關業務,那就跟著我來一起實作吧!

加強型電子商務報表介紹

相較於初階的電子商務報表,加強型電子商務報表,能夠提供給我們行銷人員更細節的行銷數據,以下將列舉兩個例子給大家。

1.如下圖,結帳行為報表可以讓你把消費者的結帳流程拆解成:(1) 查看購物車 → (2) 點擊前往結賬 → (3) 點擊提交訂單 → (4) 發生交易,過程中有多少顧客流失、多少人前往下一階段、最後有多人成功轉換,都可以從這個報表一目了然,最後再根據公司所訂定的KPI,找出是否有可以優化的消費者購物流程或網站購物體驗的地方。此外,除了第四步驟發生交易以外,一到三步驟的內容都可以依照網站的購物流程或行銷目標自行調整,或者你想要多追蹤一項「是否有始有折扣禮券」也是可行的,這個部分將會留到稍後設定教學跟大家說明。

GA轉換報表-電子商務-結帳行為報表

2.如下圖,成功串接加強型電子商務報表之後,則可以看到「個別產品」、「產品類別」的銷售資訊,如產品收益、購買人數、平均販售價格、平均販售數量等,對於想要監控特定商品、類別銷售的狀況的行銷人員來說,絕對是非常重要的報表之一。

GA轉換報表-電子商務-產品業績報表

如果你還沒有串接電子商務報表的經驗,那我建議你可以先看看以下這篇文章:【GTM進階篇】如何用GTM設定GA電子商務追蹤,當你有了data layer的概念後,再讓我們繼續下去吧!

以下是加強型電子商務報表幾項重要的追蹤指標:

  • 產品曝光 (Product Impressions):追蹤首頁、著陸頁 (Landing Page)、搜尋結果等頁面所曝光的產品。
  • 產品點擊 (Product Clicks):追蹤消費者所點擊的產品。
  • 產品細節瀏覽 (Product Detail Impressions):追蹤產品頁面的產品詳細資訊。
  • 加入/移除購物車 (Add /Remove from Cart):追蹤加入/移除購物車的產品。
  • 行銷活動曝光 (Promotion Impressions):追蹤消費者瀏覽頁面所曝光的行銷活動(如88節banner、雙11的折扣popup等)。
  • 行銷活動點擊 (Promotion Clicks):追蹤消費者點擊了哪些行銷活動。
  • 結帳流程 (Checkout):追蹤消費者整體的結帳流程,如加入購物車、點擊結帳按鈕、點擊提交訂單。
  • 購買 (Purchases):追蹤消費者抵達結帳完成的頁面,以確認完成購買。
  • 退款 (Refunds):追蹤消費者的退款,用來確保上述data的正確性。

設定步驟

一、GA基本設定

設定 > 資料檢視 > 電子商務設定 > 啟用加強型電子商務報表

GA-設定-電子商務設定

二、GTM基本設定

  • 新增GTM變數
加強型電子商務報表 - GTM設定
  • 選擇Google Analytics(分析)設定
加強型電子商務報表 - GTM設定
  • 輸入與GA串接的追蹤編號(UA開頭)> 勾選啟用加強型電子商務功能及使用資料層 
加強型電子商務報表 - GTM設定

以上,我們就完成在GA跟GTM上基礎的設定,接下來就要進入今天的重點,程式碼的串接!

三、產品曝光 (Product Impressions)

首先,我們希望消費者瀏覽了哪些產品,所以請複製以下程式碼,並貼上至你要衡量產品曝光的頁面,基本就是你的首頁、Landing Page、搜尋頁、產品系列頁等等,每當消費者點進這些頁面,這些產品的曝光數就會+1。

以下三點請特別注意!
*以下兩段程式碼分別為Google官方的範例以及我修改後符合我們官網的範例。
*下列currencyCode、name、id、price、brand、category等key所對應的值必須取代成你們網站會使用的變數。
*以下Google範例impressions包了兩件產品的內容,但在實作上因爲電商網站的頁面通常都會陳列許多產品,所以此處必須藉由for迴圈的方式來呈現頁面上的所有產品。

<script>
//Google 範例
dataLayer.push({ ecommerce: null });   // Clear the previous ecommerce object.
dataLayer.push({
  'ecommerce': {
    'currencyCode': 'EUR',   // Local currency is optional.
    'impressions': [
     {
       'name': 'Triblend Android T-Shirt',   // Name or ID is required.
       'id': '12345',
       'price': '15.25',
       'brand': 'Google',
       'category': 'Apparel',
       'variant': 'Gray',
       'list': 'Search Results',
       'position': 1
     },
     {
       'name': 'Donut Friday Scented T-Shirt',
       'id': '67890',
       'price': '33.75',
       'brand': 'Google',
       'category': 'Apparel',
       'variant': 'Black',
       'list': 'Search Results',
       'position': 2
     }]
  }
});
----------------------------------------------------------------
//我的版本(使用Shopify的liquid)
dataLayer.push({ ecommerce: null });  
dataLayer.push({
  'ecommerce': {
    'currencyCode': '{{ shop.currency }}',     
    'impressions': [
     {% for product in products %}
       {
         'name': '{{ product.title }}',
         'id': '{{ product.id }}',
         'price': '{{ product.price | divided_by: 100.0 }}',
         'brand': '{{ product.vendor }}',
         'category': '{{ product.type }}',
         'list': '{{ collection.title }}' 
       },
     {% endfor %} 
    ]
  }
});
</script>

代碼設定

  • 代碼類型:Google Analytics (分析):通用 Analytics (分析)
  • 追蹤類型:網頁類型
  • Google Analytics (分析)設定:前述所設定的GTM變數(讓程式碼知道要把數據push到哪個GA)

觸發條件

  • gtm.dom自訂事件

追蹤產品曝光設定
追蹤產品曝光設定

四、產品點擊 (Product Clicks)

因為此處我們要追蹤消費者點擊了哪些產品,以下請在產品曝光的同個頁面做設定,當消費者點擊該產品的連結後,code就會把該產品的詳細資訊傳至GA。

*此處因爲shopify套版的限制,我的做法是先取得該頁面所有a連結,並從中過濾出產品的網址,並把網址上的產品名稱擷取下來,push至GA,也歡迎大家提出自己的想法!

<script>
//Google 範例
function(productObj) {
  dataLayer.push({ ecommerce: null });  // Clear the previous ecommerce object.
  dataLayer.push({
    'event': 'productClick',
    'ecommerce': {
      'click': {
        'actionField': {'list': 'Search Results'}, // Optional list property.
        'products': [{
          'name': productObj.name,  // Name or ID is required.
          'id': productObj.id,
          'price': productObj.price,
          'brand': productObj.brand,
          'category': productObj.cat,
          'variant': productObj.variant,
          'position': productObj.position
         }]
       }
     },
     'eventCallback': function() {
       document.location = productObj.url
     }
  });
}
----------------------------------------------------------------
//我的版本(使用Shopify的liquid)
const item = document.querySelectorAll("a");

item.forEach(link => {
  var proURL = link.href;
  if (proURL.includes("collections") && proURL.includes("variant")){
    var arr = proURL.split("/");
    var arr2 = arr[6].split("?");
    var str2 = arr2[0];
    var proName = str2.replace(/-/g, ' ');
           
    link.addEventListener("click", function() {
      dataLayer.push({ ecommerce: null });
      dataLayer.push({
        'event': 'productClick',
        'ecommerce': {
          'click': {
            'actionField': {'list': '{{ collection.title }}'},
              'products': [             
                {
                  'name': proName            
                }
              ]
            }
          },
          'eventCallback': function() {
            document.location = proURL
          }
        });
    });

  }
});
</script>

代碼設定

  • 代碼類型:Google Analytics (分析):通用 Analytics (分析)
  • 追蹤類型:事件
  • 類別:Ecommerce
  • 動作:productClick
  • Google Analytics (分析)設定:前述所設定的GTM變數(讓程式碼知道要把數據push到哪個GA)

觸發條件

  • productClick事件
  • 須注意事件名稱的命名productClick必須與程式碼event的值相同

追蹤產品點擊設定
追蹤產品點擊設定

五、產品細節瀏覽 (Product Detail Impressions)

這個部分我們要追蹤的是消費著點擊產品連結之後,產品的詳細資訊,所以請至獨立產品頁面做設定,當消費者點擊進入產品的頁面後,code就會把該產品的詳細資訊傳至GA。

<script>
//Google 範例
dataLayer.push({ ecommerce: null });  // Clear the previous ecommerce object.
dataLayer.push({
  'ecommerce': {
    'detail': {
      'actionField': {'list': 'Apparel Gallery'},    // 'detail' actions have an optional list property.
      'products': [{
        'name': 'Triblend Android T-Shirt',         // Name or ID is required.
        'id': '12345',
        'price': '15.25',
        'brand': 'Google',
        'category': 'Apparel',
        'variant': 'Gray'
       }]
     }
   }
});
----------------------------------------------------------------
//我的版本(使用Shopify的liquid)
dataLayer.push({ ecommerce: null });  
dataLayer.push({
  'ecommerce': {
    'detail': {
      'actionField': {'list': '{{ collection.title }}'}, 
      'products': [{
        'name': '{{ product.title }}', 
        'id': '{{ product.id }}',
        'price': '{{ product.price | divided_by: 100.0 }}',
        'brand': '{{ product.vendor }}',
        'category': '{{ product.type }}',
        'variant': '{{ product.selected_variant.title }}'
       }]
     }
   }
});
</script>

代碼設定

  • 代碼類型:Google Analytics (分析):通用 Analytics (分析)
  • 追蹤類型:網頁瀏覽
  • Google Analytics (分析)設定:前述所設定的GTM變數(讓程式碼知道要把數據push到哪個GA)

觸發條件

  • gtm.dom自訂事件

追蹤產品細節曝光設定
追蹤產品曝光設定

六、加入/移除購物車 (Add /Remove from Cart)

加入購物車

此部分我們要追蹤了的是消費者新增了哪些產品、數量是多少,所以請至購物車頁面做設定,邏輯跟前面的步驟都相同,當消費者進入購物車的頁面後,code就會把該產品的詳細資訊傳至GA。

<script>
//Google 範例
dataLayer.push({ ecommerce: null });  // Clear the previous ecommerce object.
dataLayer.push({
  'event': 'addToCart',
  'ecommerce': {
    'currencyCode': 'EUR',
    'add': {                                // 'add' actionFieldObject measures.
      'products': [{                        //  adding a product to a shopping cart.
        'name': 'Triblend Android T-Shirt',
        'id': '12345',
        'price': '15.25',
        'brand': 'Google',
        'category': 'Apparel',
        'variant': 'Gray',
        'quantity': 1
       }]
    }
  }
});
----------------------------------------------------------------
//我的版本(使用Shopify的liquid)
dataLayer.push({ ecommerce: null }); 
dataLayer.push({
  'event': 'addToCart',
  'ecommerce': {
    'currencyCode': '{{ cart.currency.iso_code }}',
    'add': {  
      'products': [ 
      {% for line_item in cart.items %}
        {                        
          'name': '{{ line_item.product.title }}',
          'id': '{{ line_item.product.id }}',
          'price': '{{ line_item.product.price | divided_by: 100.0 }}',
          'brand': '{{ line_item.product.vendor }}',
          'category': '{{ line_item.product.type }}',
          'variant': '{{ line_item.variant.title }}',
          'quantity': '{{ line_item.quantity }}'
        },
      {% endfor %}
      ]
    }
  }
});
</script>

代碼設定

  • 代碼類型:Google Analytics (分析):通用 Analytics (分析)
  • 追蹤類型:事件
  • 類別:Ecommerce
  • 動作:{{event}}
  • Google Analytics (分析)設定:前述所設定的GTM變數(讓程式碼知道要把數據push到哪個GA)

觸發條件

  • addToCart事件
  • 須注意事件名稱的命名addToCart必須與程式碼event的值相同

加入購物車設定

加入購物車設定

移除購物車

移除購物車我沒有幫我們網站做設定,但同樣在購物車頁面做設定即可。

*特別注意,code中的quantity代表該產品需被移除的數量,而不是該產品在購物車內剩餘的數量。

<script>
//Google 範例
dataLayer.push({ ecommerce: null });   // Clear the previous ecommerce object.
dataLayer.push({
  'event': 'removeFromCart',
  'ecommerce': {
    'remove': {   // 'remove' actionFieldObject measures.
      'products': [{   //  removing a product to a shopping cart.
          'name': 'Triblend Android T-Shirt',
          'id': '12345',
          'price': '15.25',
          'brand': 'Google',
          'category': 'Apparel',
          'variant': 'Gray',
          'quantity': 1
      }]
    }
  }
});
</script>

七、行銷活動曝光 (Promotion Impressions)、行銷活動點擊 (Promotion Clicks)

因為我們網站目前沒有追蹤這兩個指標的需求,但基本上與前述的設定邏輯相同,就麻煩自己動手設定吧!

<script>
//Google 範例 Promotion Impressions
dataLayer.push({ ecommerce: null });  // Clear the previous ecommerce object.
dataLayer.push({
  'ecommerce': {
    'promoView': {
      'promotions': [                     // Array of promoFieldObjects.
       {
         'id': 'JUNE_PROMO13',            // ID or Name is required.
         'name': 'June Sale',
         'creative': 'banner1',
         'position': 'slot1'
       },
       {
         'id': 'FREE_SHIP13',
         'name': 'Free Shipping Promo',
         'creative': 'skyscraper1',
         'position': 'slot2'
       }]
    }
  }
});

//Google 範例 Promotion Clicks
function onPromoClick(promoObj) {
  dataLayer.push({ ecommerce: null });  // Clear the previous ecommerce object.
  dataLayer.push({
    'event': 'promotionClick',
    'ecommerce': {
      'promoClick': {
        'promotions': [
         {
           'id': promoObj.id,                         // Name or ID is required.
           'name': promoObj.name,
           'creative': promoObj.creative,
           'position': promoObj.pos
         }]
      }
    },
    'eventCallback': function() {
      document.location = promoObj.destinationUrl;
    }
  });
}
</script>

八、結帳流程 (Checkout)

接下來這個步驟稍微複雜了些,因為必須根據網站的結帳流程來做設定多個步驟。以我們官網為例,如果希望能夠在GA看到如下圖四個個階段的流量以及流失的狀況,我們就必須到設定→資料檢視→電子商務的部分將結帳流程將步驟解成(1)查看購物車、(2)點擊前往結帳、(3)點擊提交訂單,並且在各自的頁面一一做設定。

*此步驟的內容是以我當初所追蹤的網站為準,實際要追蹤哪些步驟請依照自家網站的結帳流程做調整。
*「發生交易的工作階段」不須額外設定。
*此步驟的程式碼是function,所以記得在你打算追蹤的按鈕上,藉由onclick來觸發這段程式碼。
*actionfield的值代表是步驟,請務必填寫正確!
*因為1~3步驟的設定內容基本上都相同,此處就只示範第一步囉。

結帳流程設定結帳流程設定

<script>
//Google 範例
function onCheckout() {
  dataLayer.push({ ecommerce: null });  // Clear the previous ecommerce object.
  dataLayer.push({
    'event': 'checkout',
    'ecommerce': {
      'checkout': {
        'actionField': {'step': 1, 'option': 'Visa'},
        'products': [{
          'name': 'Triblend Android T-Shirt',
          'id': '12345',
          'price': '15.25',
          'brand': 'Google',
          'category': 'Apparel',
          'variant': 'Gray',
          'quantity': 1
       }]
     }
   },
   'eventCallback': function() {
      document.location = 'checkout.html';
   }
  });
}
----------------------------------------------------------------
//我的版本(使用Shopify的liquid)
function btnToCart() {
  dataLayer.push({ ecommerce: null }); 
  dataLayer.push({
    'event': 'btnToCart',
    'ecommerce': {
      'checkout': {
        'actionField': {'step': 1}, //actionfield的值代表是步驟,請務必要填寫正確
        'products': [
          {% for line_item in cart.items %}
          {
            'name': '{{ line_item.product.title }}',
            'id': '{{ line_item.product.id }}',
            'price': '{{ line_item.product.price | divided_by: 100.0 }}',
            'brand': '{{ line_item.product.vendor }}',
            'category': '{{ line_item.product.type }}',
            'variant': '{{ line_item.variant.title }}',
            'quantity': '{{ line_item.quantity }}'
          },
          {% endfor %}
        ]
     }
   },
   'eventCallback': function() {
      document.location = '/cart';
   }
  });
}
</script>

代碼設定

  • 代碼類型:Google Analytics (分析):通用 Analytics (分析)
  • 追蹤類型:事件
  • 類別:Ecommerce
  • 動作:{{event}}
  • Google Analytics (分析)設定:前述所設定的GTM變數(讓程式碼知道要把數據push到哪個GA)

觸發條件

  • btnToCart事件
  • 須注意事件名稱的命名btnToCart必須與程式碼event的值相同

結帳流程設定結帳流程設定

九、購買 (Purchases)

追蹤購買基本上就是在完成購買的頁面埋下以下程式碼即可。

*這個部分則包含的程式碼除了總購買金額、運費等方式外,也會push所購買產品的資訊喔。

<script>
//Google 範例
dataLayer.push({ ecommerce: null });  // Clear the previous ecommerce object.
dataLayer.push({
  'ecommerce': {
    'purchase': {
      'actionField': {
        'id': 'T12345',                         // Transaction ID. Required for purchases and refunds.
        'affiliation': 'Online Store',
        'revenue': '35.43',                     // Total transaction value (incl. tax and shipping)
        'tax':'4.90',
        'shipping': '5.99',
        'coupon': 'SUMMER_SALE'
      },
      'products': [{                            // List of productFieldObjects.
        'name': 'Triblend Android T-Shirt',     // Name or ID is required.
        'id': '12345',
        'price': '15.25',
        'brand': 'Google',
        'category': 'Apparel',
        'variant': 'Gray',
        'quantity': 1,
        'coupon': ''                            // Optional fields may be omitted or set to empty string.
       },
       {
        'name': 'Donut Friday Scented T-Shirt',
        'id': '67890',
        'price': '33.75',
        'brand': 'Google',
        'category': 'Apparel',
        'variant': 'Black',
        'quantity': 1
       }]
    }
  }
});
----------------------------------------------------------------
//我的版本(使用Shopify的liquid)
dataLayer.push({ ecommerce: null }); 
dataLayer.push({
  'ecommerce': {
    'purchase': {
      'actionField': {
        'id': '{{ order.name }}',  
        'affiliation': '',
        'revenue': '{{ order.total_price | divided_by: 100.0 }}', 
        'tax':'{{ order.tax_price | divided_by: 100.0 }}',
        'shipping': '{{ order.shipping_price | divided_by: 100.0 }}',
        'coupon': '{{ order.discount_application.title }}'
      },
      'products': [
        {% for line_item in order.line_items %}
        {                           
          'name': '{{ line_item.title }}', 
          'id': '{{ line_item.product.id }}',
          'price': '{{ line_item.product.price | divided_by: 100.0 }}',
          'brand': '{{ line_item.product.vendor }}',
          'category': '{{ line_item.product.type }}',
          'variant': '{{ line_item.variant.title }}',
          'quantity': '{{ line_item.quantity }}',
          'coupon': '{{ line_item.discount_application.title }}'  
        },
        {% endfor %} 
      ]
    }
  }
});  
</script>

代碼設定

  • 代碼類型:Google Analytics (分析):通用 Analytics (分析)
  • 追蹤類型:網頁瀏覽
  • Google Analytics (分析)設定:前述所設定的GTM變數(讓程式碼知道要把數據push到哪個GA)

觸發條件

  • gtm.dom自訂事件

追蹤購買設定追蹤產品曝光設定

十、退款 (Refunds)

如果你希望追蹤的資料能夠更加準確,可以多追蹤退款的資訊,退款可以分成部分退款與完整退款,就看你們網站自身的需求,因為這個部分受限於shopify無法追蹤,我就只附上Google官方的教學囉。

*完整退款只需附上訂單的id;但部分退款的話需另外附上產品資訊。

<script>
//Google 範例 完整退款
dataLayer.push({ ecommerce: null });  // Clear the previous ecommerce object.
dataLayer.push({
  'ecommerce': {
    'refund': {
      'actionField': {'id': 'T12345'}         // Transaction ID. Required for purchases and refunds.
    }
  }
});
----------------------------------------------------------------
//Google 範例 部分退款
dataLayer.push({ ecommerce: null });  // Clear the previous ecommerce object.
dataLayer.push({
  'ecommerce': {
    'refund': {
      'actionField': {'id': 'T12345'},        // Transaction ID.
      'products': [
            {'id': 'P4567', 'quantity': 1},   // Product ID and quantity. Required for partial refunds.
            {'id': 'P8901','quantity': 2}
       ]
     }
  }
});
</script>

該如何驗證是否有成功追蹤?

終於設定完成了!如何想知道自己埋的code是否有追蹤成功,則必須藉由GTM的預覽模式來debug。

  • 以「產品曝光」為例,先輸入你預計追蹤產品曝光頁面的網址。
GTM預覽模式
  • 再選擇你GTM代碼 → Message → Data Layer底下是否有顯示你要追蹤的資料,如果有的話就代表你成功替你們的官網埋設好你的追蹤碼了!

GTM預覽模式-2

結語

此篇教學因爲光是截圖搭配文字說明就寫了不少篇幅,所以其實文中有些許部分的細節我就沒有寫得太詳細,如果不懂的地方可以閱讀Google官方的說明文件,或者留言與我一起討論!

參考資料

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

cookieless future
數位行銷
Tim Li

迎接Cookieless時代的數位廣告策略:1st & 3rd Party Data

即將進入Cookieless時代,讓我們行銷人不得不面對日益嚴格的隱私保護法規,這對數位廣告行業帶來了前所未有的挑戰。以歐盟的GDPR為例,這一法規要求企業確保數據使用的透明度和可控性,限制了以Cookie為基礎的廣告追蹤方式,勢必會大大降低的廣告的效率以及成效。

閱讀更多 »
programmatic buying
數位廣告
Tim Li

Programmatic buying vs. Walled Garden,有什麼不一樣?

在此篇文章,我將介紹DV360 (Display & Video 360)和TTD等programmatic buying平台的特點和作用,並分析Meta Ads和Line Ads這些walled garden的特點和使用範疇。此外,本文還將比較programmatic buying和walled garden的差異,包括控制權、數據開放性和廣告曝光策略,並探討它們的優缺點對比。最後,我們將探討數位廣告產業中的programmatic buying和walled garden的未來發展趨勢與挑戰。

閱讀更多 »
行銷工作求職術:我要如何選擇行銷代理商(agency)或品牌行銷?
行銷經驗分享
Tim Li

行銷工作求職術:我該如何選擇行銷代理商 (agency)或品牌行銷 (brand)?

此篇文章討論了選擇行銷代理商 (marketing agency)或品牌行銷人員(brand marketing)對職業發展和專業成長的影響。代理商工作可以提供廣泛的行銷經驗和知識,接觸不同品牌和產業的挑戰。而品牌行銷人員則更專注於品牌定位、策略規劃和資源協調,參與品牌的成長和發展。在認真發展職業的前提下,選擇哪個方向取決於個人的目標、興趣和職業價值觀。

閱讀更多 »