← → 翻页 · ESC 索引
Vol.04 · Module Four
01 / 20
NTUB · GTM × 廣告科技 · Module 4

Data Layer
基礎與進階

三小時內,把 dataLayer 這條合約講清楚,
從 push 一個自訂事件到 SPA / AJAX 場景的虛擬頁面追蹤,前端開發同學最強武器。

Keyword·dataLayer ·Custom Event ·SPA / AJAX
Duration·3 小時授課 ·3 單元
National Taipei University of Business 數位行銷實務 II|GTM × 廣告科技 2026 Spring
Opening · Manifesto
02 / 20 講義 · M4
Why this module matters
dataLayer 不是另一個工具
前端與行銷的合約——
前端負責 push,GTM 負責消費。
—— Module 4 · 整條追蹤鏈的關節

沒有 dataLayer,每加一個平台就要動一次前端;
有了 dataLayer,一個 push 同時餵 GA4 / Meta / TikTok / Google Ads

Module 4 · Opening NTUB GTM × AdTech
This Module · Outcomes
03 / 20 講義 · M4
Learning Outcomes · 三件事做到

三小時,三個能說清楚

不求精通——求能畫圖、能 push、能 debug

Outcome 01
01
能在 Console 看 dataLayer 內容,解釋至少 3 筆事件,畫出資料流圖。
Outcome 02
02
在 LocalWP 站用 dataLayer.push 追到 1 個非電商事件,DebugView 能看見。
Outcome 03
03
能說明 SPA 換頁為何漏追,並在 Demo 站用 virtual_page_view 補回來。
NTUB · Module 4 3hr · 3 Units · The Contract Layer
From M3 · Connecting
04 / 20 講義 · M4
前情提要 · 從 Trigger / 變數 走進來

M3 學會看見
M4 開始製造資料

M3 學了什麼
8 種 Trigger、DLV / Lookup Table、Debug 五層排查流程——你已經會「消費既有資料」。
Past
M4 要做什麼
當頁面沒有現成 dataLayer——你要自己定義並 push,讓後續模組(M5 電商、M6 Meta、M7 廣告)有資料可用。
Now
M4 之後
M5 用 dataLayer push 完整 ecommerce items array、M6/M7 把這些 push 一鍵餵到所有平台。這層沒做好,後面全卡住
Next
Module 4 · Bridge 從消費者變生產者
Act I · Unit 4-1
05 / 20
Section 4.1 · dataLayer 基礎

dataLayer
是什麼

一個 JavaScript 陣列——
GTM 的血液、前後端追蹤的合約、跨頁傳資料的容器

5 Slides·Concept ·~50 min
Act I · The Basics Unit 4-1
4-1 · Anatomy
06 / 20 講義 · M4-1
Step 01 · 一行 JS 講完本質

本質就是一個陣列
但時序不能錯

GTM 監聽 dataLayer 的新增——每個 push 就像丟一封信到 GTM 信箱。但信箱要先架好,信才寄得到。

Page load timing · 按 → 逐步點亮
01
dataLayer 宣告
GTM script 最上方先建立 window.dataLayer = window.dataLayer || []
02
GTM container 載入
container.js 開始監聽——沒這步前的 push 全漏
03
頁面 push
HTML / JS 各處 dataLayer.push({...}) 商業事件。
04
GTM Fire Tag
監聽到 event 觸發對應的 GA4 / Meta / Google Ads Tag。
記憶點陣列而非物件——同一頁會有 view_item、add_to_cart、purchase 多個事件,每筆獨立留存。GTM4WP 會自動處理時序,手刻的站要格外小心 script 位置。
Unit 4-1 · Anatomy 陣列 · 時序 · 監聽
4-1 · Built-in Events
07 / 20 講義 · M4-1
Step 02 · GTM 自帶的三個事件

GTM 自己會 push 三件事
對應 M3 的 Trigger 時機

理解這三個 event = 理解 GTM 觸發時機。不理解就會一直卡在「為什麼我的 Tag 偶爾 Fire 不到」

event 01
gtm.js
容器載入完成。對應 Trigger 的 Page View——最早可用,但 DOM 元素可能還沒齊。
event 02
gtm.dom
DOM ready。對應 DOM Ready——可以安全讀取 element、綁 click listener。
event 03
gtm.load
全部資源(圖片、外部 script)載完。對應 Window Loaded——最晚但最完整。
口訣js → dom → load,由內而外、由快而全。送給 GA4 的 page_view 用 gtm.js,綁 click 監聽用 gtm.dom,讀第三方 widget 高度用 gtm.load。
Unit 4-1 · Built-in Events 三個時機 · 三種風險
4-1 · The Philosophy
08 / 20 講義 · M4-1
Step 03 · 整個 dataLayer 設計的核心思維

前端負責生產
GTM 負責分配

前端 · Producer
只 push 商業事件
user 買了什麼、做了什麼——忠實記錄。不關心要送 GA4 還是 Meta,那不是前端的事。
Output·dataLayer.push
GTM · Consumer
挑選與分配
同一筆 push 可同時送 GA4、Meta、Google Ads、TikTok。加新平台只要加 Tag,不動前端
Output·Fire Tag
合約原則:dataLayer schema 是前端與 GTM 工程師共同維護的文件——每個欄位註明型別、範例、必填與否、什麼時機 push。沒有文件=亂命名的起點。下一頁告訴你不這樣做的下場。
Unit 4-1 · Decoupling Schema as Contract
4-1 · Case Study
09 / 20 講義 · M4-1
實戰案例 · 命名不一致毀掉半年數據

6 個工程師各自命名
DPA 匹配率剩 40%

混亂前
40%
Meta DPA 動態商品廣告 匹配率——product_id / productId / sku 三種命名混用。
建 schema 後
92%
三個月內匹配率拉回。schema 文件 + GTM validator 變數(命名不對就 DebugView 打紅字)。
DPA ROAS
×2.1
廣告投放同樣預算、同樣受眾——只是把 dataLayer 命名統一,ROAS 翻倍。
落地:dataLayer schema 要放前端 repo 的 README(工程師看得到)+ Notion / 共享文件(行銷看得到)雙份。每改一個欄位都要雙方同意——這是合約。
Unit 4-1 · Case Study 命名 · 合約 · ROAS
Act II · Unit 4-2
10 / 20
Section 4.2 · dataLayer.push 自訂事件實作

第一個
dataLayer.push

把點擊按鈕、送出表單、看完影片——
變成 GTM 能消費的事件

5 Slides·Hands-on ·~70 min
Act II · The Push Unit 4-2
4-2 · Syntax & Binding
11 / 20 講義 · M4-2
Hands-on · 從語法到第一個成功 push

四步把表單成功變事件

Contact Form 7 提交成功會觸發 wpcf7mailsent JS 事件——監聽它、push 它、讓 GTM 接住

Pipeline · 4 step ship a custom event
01
護欄宣告
window.dataLayer = window.dataLayer || []——避免 TypeError
02
綁 JS 事件
document.addEventListener('wpcf7mailsent', fn)——表單成功時才 push
03
push 事件
dataLayer.push({event:'submit_contact_form', form_id, form_location})
04
GTM Custom Event
下一頁——用 Custom Event Trigger 接住
換 CMS 也通:Gravity Forms、Ninja Forms、Elementor Form 各有自己的 JS 事件名,查文件即可。所有「使用者完成某動作」都能用同樣四步走
Unit 4-2 · Push Pipeline 監聽 · 護欄 · 推送
4-2 · GTM Side
12 / 20 講義 · M4-2
Step 02 · GTM 端接住 push

Custom Event Trigger,
合約名接住

建 Trigger
GTM Triggers New Custom Event Event name 填 submit_contact_form
Step 1
建 DLV 變數
為 form_id、form_location 各建一個 Data Layer Variable(DLV)——這樣才能在 Tag 裡用 {{DLV - form_id}} 引用。
Step 2
建 GA4 Event Tag
Event Name 用 generate_lead(GA4 推薦事件名),params 接上面的 DLV。「合約名」≠「平台名」——這是設計,不是 bug。
Step 3
綁 Trigger
GA4 Event Tag 的 Triggering 選剛才的 submit_contact_form——同一個 push 之後可加 Meta Lead Tag 一起綁,前端 0 改動。
Step 4
Unit 4-2 · GTM Side Custom Event · DLV · 一推送多平台
4-2 · Schema Rules
13 / 20 講義 · M4-2
Step 04 · 參數設計四原則

push 什麼、不 push 什麼

原則 ①
只 push 必要
不要把 debug 訊息、整個 user object 都塞進去——每個欄位都要有商業意義
原則 ②
命名 snake_case
form_id 不要寫 formId、FormID、form-id——跟著 GA4 官方規範走,平台間最少阻力。
原則 ③
型別統一
form_id 永遠字串、value 永遠 number——不要時而 "10" 時而 10,後續 Looker Studio 會崩。
原則 ④
避免 PII
email、phone 不要直接 push——違反 GA4 TOS 且會被自動過濾。要做 Enhanced Conversions 另走 hash 流程。
Debug 口訣:Preview Mode 觸發動作 左側事件列出現非 gtm.* 的事件 點進去看 Data Layer 分頁——看不到事件 90% 是 push 根本沒跑到,先 console.log 確認。
Unit 4-2 · Schema Rules 必要 · 一致 · 隱私
4-2 · Case Study
14 / 20 講義 · M4-2
實戰案例 · 別讓老闆以為流量真的少了
某 Vue.js SPA,GA4 PV 從 8 萬→ 跳到 27 萬/月。
不是流量變多——
終於看到真實狀況
修法:Vue Router afterEach hook 加 1 行 dataLayer.push

原本 SPA 進站只記 1 次 page_view,使用者切到 10 個頁面全漏——實際 PV 被低估 70%。修法只要在路由 hook push {event:'virtual_pageview', page_path},GTM 用 Custom Event 接 GA4 page_view。

React 用 useEffect([location])、Next.js 用 router.events.on('routeChangeComplete')、Nuxt 同 Vue——關鍵字「framework + virtual pageview GTM」,Stack Overflow 有現成範本。

Unit 4-2 · SPA Reality Check +237% PV · 只是補回真相
Act III · Unit 4-3
15 / 20
Section 4.3 · SPA 與 AJAX 追蹤

SPA 與
AJAX 追蹤

當網站是 Vue / React SPA 或購物車走 AJAX——
傳統 Page View 會失準

4 Slides·Advanced ·~60 min
Act III · SPA / AJAX Unit 4-3
4-3 · Two Approaches
16 / 20 講義 · M4-3
Step 01–02 · SPA 換頁不重載,兩種補法

方案 A 用 GTM,
方案 B 用前端 hook

方案 A · GTM 內建
History Change Trigger
GTM Trigger History Change。GA4 Event Tag 同時綁 All Pages(首次)+ History Change(後續)兩個 Trigger。
Pros·不動前端
Cons·某些框架重複 Fire
方案 B · 前端主動(推薦)
Router hook + virtual_pageview
Vue Router afterEach / React Router useEffect / Next.js routeChangeComplete 裡 dataLayer.push({event:'virtual_pageview', page_path})
Pros·穩定、可控時機
Cons·要前端配合
先別重造輪子:Next.js 有 @next/third-parties/google、許多框架有 built-in GA4 plugin——先查現成方案。已有的話只負責「非 page_view 的自訂事件」即可。
Unit 4-3 · SPA Solutions 內建 vs Hook · 推薦 B
4-3 · AJAX Cart
17 / 20 講義 · M4-3
Step 03 · 點加車不跳頁,怎麼追?

WooCommerce 內建事件,
非 Woo 站找AJAX success

WooCommerce
監聽內建事件 jQuery(document).on('added_to_cart', fn) 後在 callback push {event:'add_to_cart',...}GTM4WP 已內建這塊,不要重做。
Built-in
非 Woo 站
自己找 AJAX 成功 callback——fetch / axios interceptor 是常見落點。或請後端工程師加一個全域 success hook。
Custom
時機鐵則
server 回 200 之後才 push——不要在送出請求時就 push。後端可能因庫存不足 / 限購回失敗,提早 push 出的是假數據。
Timing
避免雙追
既有 GTM4WP enhanced ecommerce、又自己手刻 jQuery hook——兩個都會 Fire,事件數變兩倍。擇一即可。
Anti-Dup
Unit 4-3 · AJAX Tracking Success Callback · 不重複
4-3 · Verification & Case
18 / 20 講義 · M4-3
Step 04–05 · DebugView 驗證 + 一行 JS 修三個下游

看 DebugView,
順便看見三個漏洞

驗證 SPA 追蹤
GA4 DebugView 首次看到 page_view(page_location=A) 點連結後新的 page_view(page_location=B)。

SPA 最常見 bug:page_title 永遠是首頁——document.title 沒在路由變更時更新。工程要修的是 SPA 本身,不是 GTM。
案例 · 一行 JS 修三個下游
某服飾電商 AJAX 加購沒跳頁、沒 push dataLayer——
① GA4 add_to_cart 0 筆,漏斗斷在 view_item;
② Meta Pixel AddToCart 沒觸發,廣告優化目標『加購』完全沒資料
③ 受眾「加購未購買」名單建不出來,再行銷 ROAS 無法衡量

修法:在 AJAX success callback push dataLayer——一行 JS 修復三個下游問題
Unit 4-3 · Verification DebugView · 一行 JS · 三個下游
Wrap-up · Bridge to M5
19 / 20 講義 · M4
本週收束 · 把鑰匙交給 Module 5

會 push 自訂事件,
下週開始 push 整個訂單

M4-1 → M5-1
這週學 dataLayer 是陣列、是合約、有時序——下週 items array 就是這套規則的「電商版本」。
Schema
M4-2 → M5-2
這週用 push 追表單成功、虛擬頁面——下週 WooCommerce 完整實作十大電商事件(view_item / add_to_cart / begin_checkout / purchase ...)。
Hands-on
M4-3 → M5-3
這週懂 SPA / AJAX 補追法——下週處理 purchase 去重(重整頁、上一頁、訂單編號 dedup)與漏斗驗證。
Edge Case
本週課後:在 LocalWP 站實際 push 一個非電商事件(表單/按鈕/影片其一),DebugView 截圖貼進共學群——下週上課前完成,下週就能直接接 ecommerce items。
Module 4 · Wrap-up 下週直接接 M5 Ecommerce
Module 4 · End
20 / 20
Module 4 · 完

To Be
Continued

下週 Module 5 · GA4 Ecommerce 資料結構——
把這週的 push 變成完整訂單

NTUB·GTM × 廣告科技 ·Module 4 / 10