Ở bài 3 bạn đã cài GA4 chạy trực tiếp qua gtag. Hoạt động được. Vậy GTM thêm vào để làm gì?
Tình huống thật: tháng sau, đội marketing muốn thêm Facebook Pixel để chạy ads. Tháng sau nữa, thêm TikTok Pixel. Tháng sau nữa, thêm Hotjar để xem heatmap. Mỗi lần thêm là một lần phải sửa code website, deploy lại, có khi vô tình làm hỏng thứ khác.
GTM là một lớp duy nhất quản lý tất cả tag bên thứ ba. Cài 1 lần vào website. Sau đó mọi tag mới (Pixel, GA4 event, Hotjar, LinkedIn Insight tag) đều được cài qua giao diện GTM, không đụng code.
Đây là tiêu chuẩn từ 2018. Hầu hết doanh nghiệp quy mô vừa trở lên đang chạy GTM. Bài này hướng dẫn cài GTM thay cho gtag, sau đó các bài 5-7 sẽ dùng GTM để track event chi tiết.
3 khái niệm cốt lõi
Nếu hiểu 3 khái niệm này, bạn hiểu được 90% GTM:
Tag, đoạn code sẽ chạy
Mỗi tag là một “script” bạn muốn chạy trên website. Ví dụ:
- GA4 Configuration tag: gửi event
page_viewđến GA4 - GA4 Event tag: gửi event
purchasekhi user mua hàng - Facebook Pixel: gửi event
Purchaseđến Facebook - Custom HTML tag: chạy JavaScript bất kỳ (vd. gắn chat widget)
GTM có sẵn template cho hầu hết tag phổ biến. Bạn không phải viết code, chọn template, điền vài thông số, save.
Trigger, khi nào tag chạy
Tag không chạy lung tung, phải có trigger. Ví dụ:
- All Pages: chạy trên mọi trang (dùng cho GA4 Configuration)
- Click, Just Links: chạy khi user click vào một link nào đó
- Form Submission: chạy khi user submit form
- Custom Event: chạy khi có event tên cụ thể được push lên dataLayer (chi tiết ở bài 6)
Một tag có thể có nhiều trigger. Một trigger có thể kích hoạt nhiều tag.
Variable, giá trị động
Variable là giá trị mà tag/trigger dùng được. Ví dụ:
- Click URL: URL của link user vừa click
- Page Path: đường dẫn của trang hiện tại
- GA4 Measurement ID: ID của GA4 property (lưu thành biến để dùng nhiều chỗ)
- Data Layer Variable: giá trị bạn push từ website lên (vd. giá đơn hàng)
Variable cho phép tag chạy động, vd. tag purchase lấy giá trị từ variable dl.order_total (bạn push lên dataLayer lúc thanh toán xong).
Cách dễ nhớ 3 khái niệm
- Tag = cái gì (làm việc gì)
- Trigger = khi nào (chạy khi nào)
- Variable = giá trị (lấy gì từ đâu)
Một dòng tổng kết: “Khi <trigger>, chạy <tag>, lấy data từ <variable>.”
Bước 1, Cài GTM container vào website (5 phút)
Vào tagmanager.google.com → đăng nhập bằng cùng tài khoản Google đã dùng cho GA4.
Create Account:
- Account Name:
[Tên doanh nghiệp] - Country: Vietnam
- Container Name:
[Tên website](vd.congty.vn) - Target platform: Web
Sau khi tạo, Google hiện 2 đoạn code GTM:
- Đoạn 1 (script) gắn vào
<head>, càng cao càng tốt - Đoạn 2 (noscript) gắn ngay sau thẻ
<body>mở
Important: GỠ đoạn gtag đã cài ở bài 3 ra trước khi gắn GTM. Nếu để cả hai, GA4 sẽ nhận 2 lần page_view cho mỗi page load → số liệu nhân đôi.
Wordpress
Dùng plugin WPCode (đã cài ở bài 3). Xóa đoạn gtag cũ. Thay bằng đoạn GTM <head> script.
Phần <body> noscript: nếu plugin có ô "Footer", chọn ô đó. Hoặc dùng plugin riêng (vd. "Header Footer Code Manager") có hỗ trợ body open.
Shopify
Online Store → Themes → Edit code → mở layout/theme.liquid. Xóa gtag cũ. Thêm GTM script ngay sau <head> tag.
Tìm <body> tag (đầu file) → thêm GTM noscript ngay sau đó.
Next.js (App Router)
Tạo file src/components/google-tag-manager.tsx:
"use client";
import Script from "next/script";
export function GoogleTagManager({ gtmId }: { gtmId: string }) {
return (
<Script id="google-tag-manager" strategy="afterInteractive">
{`
(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','${gtmId}');
`}
</Script>
);
}
export function GoogleTagManagerNoscript({ gtmId }: { gtmId: string }) {
return (
<noscript>
<iframe
src={`https://www.googletagmanager.com/ns.html?id=${gtmId}`}
height="0"
width="0"
style={{ display: "none", visibility: "hidden" }}
/>
</noscript>
);
}
Trong src/app/layout.tsx:
import { GoogleTagManager, GoogleTagManagerNoscript } from "@/components/google-tag-manager";
export default function RootLayout({ children }) {
const gtmId = process.env.NEXT_PUBLIC_GTM_ID;
return (
<html lang="vi">
<head>
{gtmId && <GoogleTagManager gtmId={gtmId} />}
</head>
<body>
{gtmId && <GoogleTagManagerNoscript gtmId={gtmId} />}
{children}
</body>
</html>
);
}
(Hoặc dùng package chính thức @next/third-parties, đơn giản hơn nhưng ít custom.)
Lưu ý: sau khi gắn GTM xong, mở website → DevTools → Console → gõ dataLayer → Enter. Nếu thấy array có ít nhất 1 phần tử {event: "gtm.js", ...} → GTM đã load đúng.
Bước 2, Tạo GA4 Configuration tag trong GTM (5 phút)
Quay lại tagmanager.google.com → workspace bạn vừa tạo. Bên trái có 3 menu chính: Tags, Triggers, Variables.
Tạo variable trước (best practice, tránh hard-code Measurement ID nhiều chỗ):
- Variables → User-Defined Variables → New
- Tên:
GA4, Measurement ID - Type: Constant → Value:
G-XXXXXXXXXX(Measurement ID của bài 3) - Save
Tạo tag:
- Tags → New
- Tên:
GA4, Configuration - Tag Configuration → Google Tag (đây là tag mới của GTM 2024, thay cho
GA4 Configurationcũ) - Tag ID →
{{GA4, Measurement ID}}(chọn variable vừa tạo bằng cách click biểu tượng{{) - Configuration parameters: để mặc định
- Trigger: All Pages
- Save
Workspace giờ có 1 tag + 1 trigger (All Pages mặc định luôn có) + 1 variable.
Đừng cài 2 GA4 Configuration tag song song
Sai lầm rất phổ biến: cài gtag trong website (bài 3) + cài GA4 Configuration trong GTM (bài này) → mỗi page load gửi 2 page_view → user count nhân đôi, doanh thu nhân đôi.
Bắt buộc: gỡ gtag ra khỏi website trước khi cài GTM. Hoặc trong GTM, đặt một custom trigger để chỉ chạy GA4 Configuration khi gtag chưa được khởi tạo. Cách 1 đơn giản hơn, khuyến nghị cách 1.
Bước 3, Preview và publish (3 phút)
GTM không tự động chạy tag bạn vừa tạo, nó chạy trong môi trường preview để bạn test trước.
Bấm Preview (góc trên-phải). Google Tag Assistant mở trong tab mới. Nhập URL website → Connect.
Tag Assistant load website của bạn trong tab khác và hiển thị bên trái: danh sách event đã fire, mỗi event xem được tag nào đã chạy, variable nào có giá trị gì.
Reload trang website. Trong Tag Assistant, bạn phải thấy:
- Event
Container Loaded→ GA4, Configuration tag fired (✓) - Event
DOM Ready→ tag fired - Event
Window Loaded→ tag fired
Nếu thấy tag fired ở Container Loaded → đúng. Vào GA4 → Realtime → chờ 30 giây → thấy 1 user (bạn).
Nếu tag KHÔNG fired → vào lại GTM → click tag → kiểm tra trigger có phải All Pages không.
Khi đã ổn → đóng Preview → quay lại workspace → Submit (góc trên-phải).
- Version name:
v1, Initial GA4 setup - Version description:
Cài GA4 base configuration tag, gắn All Pages trigger, dùng variable cho Measurement ID - Publish
Workspace của bạn giờ là Version 1, đang chạy live trên website.
Bước 4, Cài Built-in Variables hữu ích (2 phút)
Mặc định GTM chỉ enable một số ít built-in variable. Bật thêm các cái sau (dùng cho bài 5):
Variables → Built-In Variables → Configure → tick:
- Page (Page URL, Page Hostname, Page Path, Page Title, Referrer)
- Utilities (Event)
- Clicks (Click Element, Click Classes, Click ID, Click Target, Click URL, Click Text)
- Forms (Form Element, Form Classes, Form ID, Form Target, Form URL, Form Text)
- Scroll (Scroll Depth Threshold, Scroll Depth Units, Scroll Direction)
- Videos (Video Provider, Video URL, Video Title, Video Duration, Video Current Time, Video Percent, Video Visible, Video Status)
- Errors (Error Message, Error URL, Error Line, Debug Mode)
Tick xong → các variable này có sẵn để dùng trong trigger và tag. Đỡ phải tự tạo lại.
AI hỗ trợ, cách dùng nhiều nhất ở GTM
1. Sinh JSON import cho cả workspace
Nếu measurement plan ở bài 2 có 10+ event, ngồi click tạo từng tag rất chậm. GTM hỗ trợ import từ JSON file. Bạn có thể nhờ AI sinh JSON.
Prompt:
Tôi đang setup Google Tag Manager cho website e-commerce Việt. Cần sinh
GTM workspace JSON để import. Container ID: GTM-XXXXXXX. GA4 Measurement
ID: G-XXXXXXXXXX.
Events cần track (từ measurement plan):
1. page_view, All Pages
2. view_item, DOM event "view_item" push lên dataLayer
3. add_to_cart, DOM event "add_to_cart"
4. begin_checkout, DOM event "begin_checkout"
5. purchase, DOM event "purchase"
6. submit_lead_form, DOM event "submit_lead_form"
Yêu cầu:
- 1 GA4 Configuration tag (All Pages)
- 6 GA4 Event tag, mỗi tag fire trên custom event tương ứng
- 6 custom event trigger, mỗi trigger match event name
- 1 GA4 Measurement ID constant variable
- Các Data Layer Variables cần thiết (ecommerce.items, ecommerce.value,
ecommerce.transaction_id, lead_source, ...)
Trả về JSON đúng format GTM Container Import (đầy đủ exportFormatVersion,
containerVersion structure). Tôi sẽ import vào GTM Admin → Import Container.
Output ra file JSON ~200 dòng. Vào GTM → Admin → Import Container → upload file → Merge → Workspace mới có sẵn 6 event tag.
Lưu ý quan trọng: AI có thể sai format JSON. Sau khi import, check từng tag trong Preview mode. Nếu workspace lỗi → import lại với option Overwrite chứ đừng để 2 set tag chồng lên nhau.
2. Debug “vì sao tag không fire”
Đây là chỗ tôi dùng AI gần như mỗi tuần. Cảnh phổ biến: tạo tag, set trigger, preview, tag không fire. Lý do có thể là 50 thứ.
Cách dùng AI: chụp màn hình 3 thứ → paste vào Claude:
- Cấu hình tag (Tag Configuration screen)
- Cấu hình trigger
- Tag Assistant Preview showing tag NOT fired + Event detail
Prompt:
Tag "GA4 Event, Add to Cart" không fire trong Preview mode dù tôi đã click
nút Add to Cart. Trigger đang là Custom Event "add_to_cart". Đây là 3 screenshot:
- Tag config: [paste]
- Trigger config: [paste]
- Tag Assistant Event detail khi click Add to Cart: [paste]
Liệt kê 3 nguyên nhân khả thi nhất, mỗi cái kèm cách check.
AI thường tìm ra: dataLayer push chưa đúng event name, trigger condition match sai (case-sensitive), tag không nằm trong workspace bạn đang preview...
3. Viết Custom JavaScript variable
Một số trường hợp built-in variable không đủ. Vd: bạn muốn lấy giá trị data-product-id attribute của một element vừa được click. AI viết Custom JS variable nhanh:
Viết Custom JavaScript variable cho GTM trả về giá trị của HTML attribute
"data-product-id" trên element vừa được click. Nếu element không có attribute
này, trả về undefined. Code phải sẵn dùng, wrap trong function() { return ...; }
như chuẩn Custom JS variable của GTM.
Output ra 10-15 dòng JS sẵn paste:
function() {
var el = {{Click Element}};
if (!el) return undefined;
return el.getAttribute('data-product-id') || undefined;
}
5 phút thay vì 30 phút tự nghĩ.
GTM workspace mẫu cho e-commerce Việt
Workspace cơ bản cho 1 website e-commerce Việt thường có:
- Tags: 1 GA4 Configuration + 6-10 GA4 Event tag + 2-3 Facebook/TikTok Pixel + 1 Custom HTML chat widget = ~10-15 tag
- Triggers: 1 All Pages + 6-10 Custom Event + 2-3 Click/Form = ~10-15 trigger
- Variables: 1 GA4 Measurement ID + 8-12 Data Layer Variable + 3-5 Custom JS = ~12-20 variable
Tốn khoảng 4-6 giờ làm thủ công. Với AI sinh JSON + manual refine: 1-2 giờ. Phần tiết kiệm thời gian lớn nhất.
Trước khi sang bài 5
Kiểm tra:
- ✅ GTM container đã cài vào website (verify: gõ
dataLayertrong Console thấy array) - ✅ Đã gỡ gtag cũ (không có 2 GA4 Configuration song song)
- ✅ Đã tạo GA4 Configuration tag trong GTM, trigger All Pages
- ✅ Preview mode confirm tag fire trên mọi page
- ✅ GA4 Realtime thấy user trở lại (sau khi gỡ gtag và cài GTM)
- ✅ Workspace đã Submit thành Version 1 với mô tả rõ
- ✅ Built-in variables đã enable (Click, Form, Scroll, Video)
Khi xong cả 7, bạn đã có infrastructure tag manager để cài event chi tiết. Bài 5 sẽ là phần thú vị nhất với hầu hết website: track các action thường gặp (click vào nút, submit form, scroll qua section quan trọng, xem video), toàn bộ qua GTM, không đụng vào code website.
Một quy tắc tôi luôn áp dụng
Mỗi lần Submit một version GTM, tôi viết description theo format:
v3, [Thêm/Sửa/Xóa] [tag/trigger/variable cụ thể]
Lý do: [business reason ngắn]
Ngày: [date]
Người làm: [name]
Ví dụ: v3, Thêm GA4 Event tag "submit_lead_form" + custom event trigger. Lý do: cần track lead từ form Brevo. Ngày: 15/5/2026. Người làm: Tuấn
Sau 6 tháng có ~30-50 version, bạn hoặc người sau bạn vẫn tìm lại được vì sao mỗi tag được thêm. Không có description → 6 tháng sau không ai dám động vì sợ làm hỏng.
Đọc tiếp
Bài 5, Track click, scroll, form, video qua GTM (không cần code)
Cài 4 nhóm event thường gặp nhất: nút CTA, scroll qua section quan trọng, form submission, video engagement. Hoàn toàn qua giao diện GTM. Có AI prompt sinh CSS selector và đặt tên event theo chuẩn.
Đọc bàiBài 1, GA4 và Universal Analytics: vì sao bạn phải làm lại từ đầu
Universal Analytics đã ngừng nhận dữ liệu từ giữa 2023. GA4 không phải bản nâng cấp, mà là một sản phẩm khác hẳn về cách đo lường. Bài này giải thích vì sao bạn không thể chỉ 'chuyển sang GA4' mà phải dựng lại từ kế hoạch.
Đọc bàiBài 2, Viết measurement plan trong 30 phút (với ChatGPT/Claude)
Measurement plan là tài liệu quan trọng nhất nhưng hầu hết doanh nghiệp Việt bỏ qua. Bài này có template đầy đủ + bộ prompt cụ thể để dùng AI dựng bản nháp, sau đó refine với người trong đội ngũ.
Đọc bài