Bài này là bài kỹ thuật nhất series. Nếu bạn không phải dev hoặc không có team kỹ thuật, đọc phần “decision tree” ở dưới rồi quyết định có làm hay không. Nếu “không” → nhảy qua bài 8.
Nếu “có” → đọc tiếp, có thể cần đối tác kỹ thuật hỗ trợ phần setup cloud.
Sao lại cần một server ở giữa
Cách track event “truyền thống” (bài 4-6): browser của user gửi event trực tiếp đến google-analytics.com qua tag GA4. Cách này có 3 vấn đề ngày càng lớn:
Vấn đề 1, Ad blocker chặn domain Google
Khoảng 15-30% user (tùy ngành) cài uBlock Origin, AdGuard, hoặc trình duyệt Brave/DuckDuckGo. Các tool này chặn request đến google-analytics.com và googletagmanager.com → event không gửi đi → user không xuất hiện trong GA4.
Với traffic 100 nghìn user/tháng → bạn đang “mất” 15-30 nghìn user trên báo cáo. Marketing report dựa vào GA4 thì hiểu sai bức tranh.
Vấn đề 2, iOS 14+ giới hạn attribution
Từ tháng 4/2021, iOS 14 yêu cầu user opt-in để app theo dõi cross-app. Hầu hết user nhấn “Don't track” → Facebook không nhận được event mua hàng từ user iOS → attribution Facebook Ads cho user iOS bị mất.
Meta phản ứng bằng cách giới thiệu Conversion API (CAPI): thay vì chỉ nhận event qua browser pixel, Meta cho phép server gửi event trực tiếp từ server-to-server. Server-side bypass iOS restrictions vì không qua user browser.
Vấn đề 3, Bạn không kiểm soát data trước khi gửi đi
Khi event gửi trực tiếp browser → GA4, bạn không có cơ hội: lọc bot, thêm/sửa parameter, hash dữ liệu nhạy cảm (email, phone) trước khi gửi đi. Server-side cho phép bạn xử lý event trước khi forward.
sGTM hoạt động ra sao
Mô hình mới với sGTM:
[Website] → gửi event đến → [sGTM server (data.congty.vn)] → forward đến →
├── GA4
├── Meta Conversion API
├── TikTok Events API
├── Google Ads Conversion API
└── (bạn xử lý gì cũng được trước khi forward)
data.congty.vn là subdomain bạn sở hữu, trỏ DNS đến server cloud chạy sGTM container.
User browser không còn biết Google. Ad blocker không chặn được vì request đến domain của bạn.
Decision tree, bạn có cần sGTM không?
Trả lời các câu hỏi:
Q1: Doanh thu online tháng có ≥5 tỷ?
- Không → có thể chưa cần. Đọc tiếp Q2.
- Có → đọc Q3.
Q2: Bạn đang chạy ads Meta/TikTok với budget ≥50 triệu/tháng và attribution đang bị mất?
- Không → KHÔNG cần sGTM. Tập trung bài 8-10. Quay lại bài này khi quy mô lớn hơn.
- Có → đọc Q3.
Q3: Bạn có người vận hành kỹ thuật trong đội ngũ (in-house dev / agency)?
- Không → KHÔNG nên tự làm sGTM. Hoặc thuê đối tác làm, hoặc dùng SaaS như Stape / Addingwell (~$50-200/tháng tùy quy mô), họ host và quản lý hộ.
- Có → đọc Q4.
Q4: Bạn sẵn sàng chi $50-150/tháng cho cloud + 1-2 ngày setup?
- Không → KHÔNG đủ ngân sách. Skip.
- Có → setup sGTM. Đọc phần dưới.
Một con số thực tế
Tôi đã setup sGTM cho ~10 doanh nghiệp Việt trong 2024-2025. Lợi ích thực:
- Bypass ad blocker: thêm 8-15% event so với chỉ client-side
- Meta CAPI: tăng match quality của Meta Ads từ ~3.5/10 lên ~7/10
- ROI tổng thể: rõ ràng với doanh nghiệp chi ads >100 triệu/tháng. Mờ với dưới 50 triệu/tháng.
Đừng làm sGTM vì “technical cool”. Làm khi business case rõ.
Setup sGTM, quy trình 4-8 giờ
Phần này tôi giả định bạn có đội kỹ thuật / dev. Nếu không, đối tác làm hộ.
Bước 1, Tạo Server container trong GTM (5 phút)
Vào tagmanager.google.com → Admin → Create Container:
- Container name:
[website], Server - Target platform: Server
Bấm Create. Google sẽ hỏi cách bạn muốn deploy:
Option A, Manually deployed (khuyến nghị): bạn tự deploy lên Google Cloud Run / App Engine. Linh hoạt, scale theo nhu cầu.
Option B, Automatically provisioned on Google Cloud: Google tự setup Cloud Run cho bạn (cần kết nối Google Cloud project, billing đã enable). Đơn giản hơn nhưng ít kiểm soát.
Tôi chọn Option A. Google cho 2 thông tin:
- Container Config: chuỗi base64 dài (sẽ dùng làm env variable)
- Default URL: dạng
https://server-side-tagging-XXXX-uc.a.run.app
Bước 2, Deploy server lên Google Cloud Run (30-60 phút)
Cần Google Cloud project (free tier khi đăng ký mới có $300 credit).
Trên local terminal, có Docker installed:
# Pull image GTM server từ Google Container Registry
docker pull gcr.io/cloud-tagging-10302018/gtm-cloud-image:stable
# Login Google Cloud
gcloud auth login
gcloud config set project YOUR_PROJECT_ID
# Deploy lên Cloud Run
gcloud run deploy gtm-server \
--image gcr.io/cloud-tagging-10302018/gtm-cloud-image:stable \
--region asia-southeast1 \
--platform managed \
--allow-unauthenticated \
--set-env-vars CONTAINER_CONFIG="[paste container config từ bước 1]"
Sau 2-3 phút, Cloud Run trả về URL public. Mở URL trong browser → thấy “tagging server” message → server đang chạy.
Region quan trọng: chọn asia-southeast1 (Singapore) hoặc asia-east1 (Đài Loan) cho khách Việt Nam, latency thấp nhất.
Bước 3, Trỏ subdomain (15-30 phút)
Server chạy ở xxxx.run.app không phù hợp dùng public (browser sẽ gửi event đến domain bạn không sở hữu, vẫn bị một số ad blocker chặn).
Tạo subdomain dành riêng. Vào DNS provider (Cloudflare, GoDaddy, AWS Route 53...):
- Tạo CNAME record:
data.congty.vn→ghs.googlehosted.com - Hoặc: trỏ A record đến IP Cloud Run (lấy IP từ Cloud Run domain mapping)
Trong Cloud Run → click service gtm-server → tab Custom Domains → add data.congty.vn. Google verify ownership → setup SSL tự động.
Sau ~10 phút, https://data.congty.vn hoạt động và trả về cùng kết quả xxxx.run.app.
Quay lại GTM → Server Container → Admin → Container Settings → đổi URL từ xxxx.run.app sang https://data.congty.vn → Save.
Bước 4, Chuyển tag GA4 từ client sang server (30 phút)
Trong Web GTM container (cái bạn cài bài 4):
- Mở tag GA4, Configuration → tab Configuration → mục
transport_url - Thêm parameter:
transport_url=https://data.congty.vn - Save → Submit → publish
Từ giờ, mọi event GA4 từ web sẽ gửi đến data.congty.vn thay vì google-analytics.com.
Trong Server GTM container:
- Tạo client mới: Clients → New → Google Analytics: GA4 → Save
- Tạo tag: Tags → New → Google Analytics: GA4 → để mặc định → trigger All Events
- Submit → publish
Server giờ nhận event từ web, forward đến GA4. Verify: vào GA4 → DebugView → mở website → thấy event chảy về như trước.
Bước 5, Thêm Meta Conversion API (60 phút)
Đây là phần giá trị nhất của sGTM với doanh nghiệp chạy Meta Ads.
Trong Meta Events Manager:
- Chọn pixel của website
- Tab Settings → cuộn xuống Conversions API → Generate access token → copy token (chỉ hiện 1 lần, lưu kỹ)
Trong Server GTM container:
- Cài community template Facebook Conversion API Tag (từ Template Gallery của GTM, search “Facebook Conversions API” → cài tag template của Stape hoặc gtm-templates-simo-ahava)
- Tạo tag mới với template này
- Pixel ID + Access Token: paste từ Meta
- Trigger: All Events (hoặc filter cụ thể event nào gửi: purchase, lead, add_to_cart)
- Test Event Code (lấy từ Meta Events Manager → Test Events tab): dùng để verify khi setup
- Save → Submit
Trong Meta Events Manager → Test Events tab → nhập domain website → mua thử 1 đơn → thấy event xuất hiện trong Test Events trong vòng 1-2 phút → CAPI hoạt động.
Sau 24-48h, Meta sẽ cập nhật Event Match Quality (EMQ) cho từng event. Mục tiêu: tất cả event ≥6/10. Nếu thấp, cần truyền thêm user data (hashed email, phone, fbp cookie) trong event.
3 user data bạn nên gửi qua CAPI
Càng nhiều user data → match quality càng cao → attribution chính xác hơn. 3 cái dễ thêm nhất:
- fbp (Facebook browser ID): cookie
_fbptrên website (Meta pixel tự set). Đọc cookie và truyền lên server qua dataLayer. - Email hashed: nếu user đã đăng ký, hash SHA256 email và truyền. Meta deduplicate được với data đối khớp.
- External ID: customer ID của bạn (vd. user.id trong DB). Hash SHA256.
Email và phone phải hash SHA256 (lowercase trước khi hash). KHÔNG gửi plain, vi phạm chính sách Meta.
Chi phí thực, đếm tiền
Cloud Run với GTM server image, khả năng 100 nghìn events/tháng:
- 1 instance min, max 3 instance → cost ~$30-50/tháng (1 vCPU, 512MB-1GB RAM)
- Network egress (forward đến GA4, Meta): ~$5-10/tháng
- Cloud Logging (nếu lưu logs để debug): ~$5-15/tháng
Total: $40-75/tháng cho website quy mô vừa.
Quy mô lớn (500K-1M events/tháng): $100-250/tháng.
Nếu không muốn tự host: Stape (managed sGTM) $20-200/tháng tùy gói. Addingwell $30-200/tháng. Hai service này host và quản lý Cloud Run cho bạn, đỡ phần devops.
AI hỗ trợ, phần phức tạp nhất series
Sinh transformation rules
Trong sGTM, bạn có thể transform data trước khi gửi đi. Vd: bạn muốn gửi user.email_hashed đến Meta CAPI nhưng từ dataLayer chỉ có user_email (plain).
Prompt:
Tôi đang viết Custom JavaScript Variable trong sGTM (server container).
Input: event data có field "user_email" (plain text).
Output: SHA256 hash của lowercase email.
Yêu cầu:
1. Lowercase email trước khi hash (Meta CAPI standard)
2. Nếu email rỗng/undefined → return undefined
3. Dùng API có sẵn trong sGTM sandbox (require('crypto'))
4. Code production-safe
Viết code đầy đủ.
Output ra ~15 dòng code paste vào sGTM variable.
Viết Cloud Run service phụ trợ
Một số task không làm được trong sGTM template (vd. gọi API bên thứ 3 để enrich data). Bạn deploy một Cloud Function/Run service riêng, gọi từ sGTM bằng sendHttpRequest.
Prompt:
Viết Cloud Run service Node.js Express nhận POST request từ sGTM với
body { user_id, event_name, value }. Service:
1. Validate user_id format
2. Gọi internal API https://crm.congty.vn/api/user/{user_id} để fetch
customer_segment, lifetime_value (auth qua API key trong env)
3. Trả về JSON { customer_segment, lifetime_value, enriched_at }
4. Handle error: 500 nếu CRM API fail, không block sGTM event forwarding
Dockerfile + gcloud run deploy command đầy đủ.
Output ra service + Dockerfile + deploy command. 1-2 giờ thay vì 1 ngày.
Debug Meta CAPI signature
Khi event không xuất hiện trong Meta Test Events:
sGTM forward event "purchase" đến Meta Conversion API. Trong Meta Test Events
KHÔNG thấy event nhưng sGTM logs ghi "200 OK" sau khi gửi đi. 3 nguyên nhân
khả thi nhất và cách check từng cái?
AI list ra: test event code không khớp, event_name không phải Meta standard (Meta accept Purchase viết hoa, không phải purchase), payload thiếu user_data... AI biết edge cases này khá tốt.
Trước khi sang bài 8
Checklist nếu đã setup sGTM:
- ✅ Server container đã deploy, có URL custom domain HTTPS
- ✅ Web container đã chuyển
transport_urlsang custom domain - ✅ GA4 vẫn nhận event đầy đủ (verify trong DebugView)
- ✅ Meta CAPI test event xuất hiện trong Meta Test Events
- ✅ EMQ ≥6/10 cho event
Purchasesau 24-48h - ✅ Server logs có lưu lại (Cloud Logging), sẽ dùng debug ở bài 8
- ✅ Cost monitor set up: cloud budget alert nếu >$100/tháng
Nếu bạn skip bài 7, đó là quyết định đúng cho hầu hết SME. Quay lại khi quy mô tăng.
Bài tiếp theo là phần mọi người đều cần: debug và validate data trong GA4 / GTM. Đảm bảo những gì bạn cài thực sự đo đúng. AI giúp nhiều ở phần này vì việc debug data quality là task lặp lại, AI làm checklist nhanh.
Một mẹo khi đối tác làm sGTM hộ
Nếu thuê agency làm sGTM, yêu cầu họ bàn giao:
- Google Cloud project ID + access role Owner cho email công ty
- GTM Server container ID + admin access
- Documentation về: subdomain DNS đã setup, env variables, danh sách tag/client/variable trong container
- Cost report tháng đầu để biết baseline
- Runbook: nếu server down, debug ra sao
Không bàn giao những thứ này → 1 năm sau agency biến mất, bạn không thể fix gì. Đầu tư bàn giao đúng quan trọng hơn setup đẹp.
Đọc tiếp
Bà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àiBài 3, Cài GA4 lần đầu: từ tạo property đến dữ liệu chảy về sau 15 phút
Hướng dẫn cài GA4 cho người chưa từng làm, tạo account, property, data stream, gắn vào website (Wordpress / Shopify / custom). Có checklist cài đặt ban đầu và cách dùng AI sinh code cho từng nền tảng.
Đọc bài