GTM 變數介紹:資料層變數(Data Layer Variable)

Ian
I think, therefore I do.
11 min readDec 6, 2023

在之前 介紹 Data Layer 的文章當中,我們都知道除了 代碼、觸發條件以及變數 之外,學習 GTM 還必須要認識 Data Layer,儘管我們已經請工程師將所需要的項目參數推送到 Data Layer 當中,如果需要取用其參數,我們就得透過 GTM 將其設定為資料層變數(Data Layer Variable),才有辦法將其應用在 GTM 的代碼、觸發條件甚至是變數(如:自訂 Java Script 變數)當中。

了解如何透過 GTM 資料層變數取得資料,會是一件相當方便且可以確保所取得參數正確性的事,較不容易因為網站前端改版而受到影響(如果你是用爬取頁面獲取資料的方式)。

(還不認識資料層 Data Layer 的朋友,可以先去看這篇文章: Data Layer 資料層是什麼? ,然後再回來這邊繼續看下去,會比較容易理解。)

到底什麼是資料層變數 Data Layer Variables?
我又可以如何應用在我的網站追蹤當中?
我要如何透過 GTM 設定取用 Data Layer 中的資料?

讓我們繼續看下去,但如果你只想要知道如何設定,可以直接跳到 這邊

什麼是資料層變數(Data Layer Variable)

透過 GTM 預覽模式 中 Data Layer 的頁籤我們可以看到資料層中的資料,所有的項目都是以鍵值對的方式呈現(Key-Value Pair),以下圖的範例就是:

form_type : “contact-us” 是一組鍵值對
form_location : “Maldive-tour-page” 也是一組鍵值對

以此類推。

當使用者提交表單之後,同時透過 dataLayer.push 推送相關參數到資料層當中,身為網站分析師的我們,就可以應用這些參數,來了解使用者是提交了哪份表單,幫助我們進行後續的追蹤分析。

再以下圖為例,下圖為 GA4 電子商務事件的 Data Layer 格式,表示當前網站有事件「view_item」發生,所觀看的產品 id 是「 SKU_12345」、產品名稱是「Stan and Friends Tee」、使用了折價券「SUMMER_FUN」以及產品品牌名稱為「Google」,以此類推其它資訊如產品所屬目錄、產品顏色、價格以及數量等。

既然資料層都有這些資料了,如此一來應該可以直接拿來應用了吧?

先等等。

雖然我們需要的參數都在資料層當中了,我們是無法直接取用的,因為 GTM 無法判斷這些由我們自行客製化後推送的名稱,此時就是資料層變數(Data Layer Variables)登場的時候了,必須要先讓 GTM 認識這些鍵值對(Key-Value Pair),才有辦法應用在 GTM 的代碼、觸發條件以及其它變數當中。

另外,如果想知道如何看到 Data Layer 的資料,請參考這篇文章: 可以從哪裡看到 Data Layer 的資料?

有些 GTM 內建變數就是資料層變數?

變數介面中,我們可以看到 GTM 本身其實已經給了我們許多預設的變數,例如 點擊相關變數(Click Classes、Click Element、Click ID 以及 Click URL 等)或是 表單相關變數 (Form Classes、Form Element 以及 Form ID 等)。

你在使用這些變數時之所以有會有相對應的值,是因為 GTM 在使用者執行相關動作時(例如點擊),已經幫你推送了參數到資料層當中,然後將其設定為變數,因此你才有辦法使用。

(這邊還牽扯到 GTM 使用的是本身的 Data Model 而不是網站 Data Layar,但這又是另外一個故事了,先不在這邊討論。)

如下圖可以看到,當使用者點擊了連結,GTM 推送了帶有相關參數的 Link Click 事件到資料層當中,GTM 將資料層中的 elementClass、elementID 以及 elementUrl 等變成了內建變數中的 Click Classes、Click ID 以及 Click URL,以此類推其他 GTM 內建的資料層變數,也是這樣來的。

如何設定資料層變數?

知道了運作原理後,就可以開始著手設定資料層變數以取得我們需要的資料了,假設今天想要追蹤的是訂單完成購買的感謝頁面,其頁面的 Data Layer 資料層如下:

有了資料層這些資料,我們就可以設定資料層變數,並將變數與 GA4 購買事件代碼綁定,讓其隨著 GA4 事件發送到 GA4 中,幫助我們分析資料,如此一來,就可以知道使用者完成的這筆訂單,為我們帶來了多少價值。

新增資料層變數

假設我們今天要取得的是這筆訂單的 幣值,也就是上圖中與 「currency」 相對應的「USD」,「currency」就是 key,而「USD」就是 value(別忘了前面我們提到的 鍵值對 key-value pair ) ,我們可以這麼做:

GTM 變數介面 > 新增使用者定義的變數 > 選擇「資料層變數」

在資料層變數名稱的位置,輸入與資料層內的資料一樣的命名,在這邊就是「currency」,注意大小寫,需完全ㄧ樣,但因為 currency 位在 ecommerence 底下,因此我們必須要這麼寫:「ecommerce.currency」,才可以抓取到 currency 的資料。

設定完成並將變數儲存之後,來到 GTM 預覽模式的變數頁籤,就可以看到在 purchase 事件發生時,已經抓到了剛剛設定的資料層變數「 dlv — purchase_currency 」,值為「USD」。

這邊要注意的是,目前這些都是只存在於資料層上的資料,沒有傳送到 GA4 ,切勿搞混,以為這樣 GA4 就會收到資料了,還是需要設定 GA4 事件。

關於 GA4 事件設定的方式,可以參考這篇 設定「表單提交」事件的文章 ,邏輯都是一樣的,只是我們這邊舉的範例是「purchase」事件,而文章是「WebformSubmit」事件。

抓不到 Data Layer 中的資料?

但是,如果我今天想要抓取更多資料呢?例如以範例來說,我想要知道訂單中第一個產品的名稱是什麼,我應該要如何設定我的資料層變數?

你可能會想說,這還不簡單,就照下圖的做法不就好了!?

一層一層的往下找下去,在資料層變數名稱的位置輸入「 ecommerce.items.item_name 」。

因為在範例的資料層中,使用者購買的產品不是只有一個,在 items 的陣列(Array)中,包含了兩個產品物件(Objects),如果我們只是輸入「 ecommerce.items.item_name 」,GTM 不會知道要取得的是哪一個產品的產品名稱。

(如果不清楚陣列(Array)以及物件(Objects)的朋友,可以參考這篇文章: 更深層的認識 Data Layer 。)

為了取得第一個品項的產品名稱,我們必須要將輸入的名稱改成「 ecommerce.items.0.item_name」,因為在 Javascript 當中,第一個項目的順序為「0」,接著才是依序 1,2,3,4,5 排列下去,以此類推,假設今天要選擇的是第二個項目,就必須改成「 ecommerce.items.1.item_name 」。

這樣,我們就可以取得資料層中第一個產品項目名稱了。

資料層版本 1 V.S 版本 2?(進階)

接下來的段落會是比較深入了解資料層變數,如果你只是想知道資料層變數怎麼使用,那就不用再繼續看下去,但如果你還有餘力認識更多關於資料層變數的設定,可以進一步了解一下,這個存在變數設定當中的「資料層版本」是什麼?

資料層版本 1 :
無法取用巢狀結構內的 key 以及後面 dataLayer.push 的資料 不能 與前一個 dataLayer.push 的資料合併,會覆蓋掉前一個資料。

資料層版本 2(一般常用的版本):
可以取用巢狀結構內的 key,後面 dataLayer.push 的資料 可以 與前一個 dataLayer.push 的資料合併。

舉例來說,假設今天使用的是 資料層版本 1,在我們的下圖範例中,你只能取的 event、gtm、event_id 以及 ecommerce 這些最上層的母 key,其底下巢狀結構內的 key 都無法抓到,但在 版本 2 就沒有這個問題,可以如同前面的範例,用「 . 」的符號,取得巢狀結構內的 key。

另一個狀況則是在版本 1, 最新的 datalayer.push 資料會覆蓋掉當前的資料層,假設網站當前的資料層如下:

//當前網站資料層(版本 1 )
{
user_id : “123”,
user_name : “Nick”
}

我如果再推送一個 user_status:"premium" 到資料層中,此時在版本 1 的資料層中,就會變成下面這樣:

//二次推送後的網站資料層(版本 1 )
{
user_status : "premium" // user_id & user_name 被覆寫了
}

原本的 user_id 以及 user_name 直接被覆蓋掉,變成只有最後一次推送的 user_status。

但如果是 資料層版本 2 ,第二次的 dataLayer.push 會跟當前資料層合併,變成這樣:

// 合併在一起了(版本 2 )
{
user_id : “123”,
user_name : “Nick”,
user_status : “premium”
}

雖然說版本 2 的資料層會與當前的資料層合併,但如果推送的是相同的 key 名稱,依然是會覆蓋當前資料層中同樣 key 名稱的值喔,例如:

// 當前資料層長這樣(版本 2 ) 
{
user_id : "123",
user_name : "Nick",
user_status : "premium"
}

如果再進行一次 datalayer.push ,推送的資料如下:

// 再度推送到資料層的資料(版本 2) 
{
user_name : "Nancy",
user_location : "Taipei"
}

結果就會變成:

//(版本 2) 
{
user_id : "123",
user_name : "Nan", //被改寫了
user_status : "premium",
user_location : "Taipei"// 新增的
}

總結

在這篇文章當中,我們認識了

  1. 什麼是資料層變數,了解該如何找到它們並且看懂資料層。
  2. 接著透過 GTM 建立資料層變數(Data Layer Variables ),並了解如何取用巢狀結構內的資料。
  3. 雖然會用「.」的方式取得巢狀結構內的資料了,但在面對母 key 底下帶有許多物件(object)的情況下,我們該如何取得物件中的 key 值,例如:資料層有很多不同產品時。
  4. 最後認識資料層版本 1 版本 2 的差異,雖然選擇版本 2 足以處理大部分資料層變數的應用,但多了解其背後邏輯總是好的,難保哪天出現解不了的問題時,可以馬上想到可能的答案。

在使用 GTM 的路上,你最常會使用到的變數大概就是資料層變數了,因為透過資料層取得的資料通常都會是最穩固的也最不會出狀況的(相對 DOM 元素變數以及自動事件變數),不會面臨到因為網站前端的修改,造成抓取不到資料的狀況,儘管網站改版,也不需要重新設定 GTM 中抓取頁面資料的方式。

--

--