DHDataHọc
Lý thuyếtBài 7/86 phút đọc+10 XP

UTM và chất lượng dữ liệu

Bạn sẽ học được

  • Năm tham số UTM và quy ước đặt giá trị.
  • Vì sao phần lớn "direct traffic" thực ra không phải direct.
  • Viết truy vấn kiểm tra chất lượng tham số.
  • Đối soát số liệu giữa nền tảng, analytics và kho dữ liệu.
  • Quy trình quản trị để lỗi không tái diễn.

Khái niệm cốt lõi

Mọi phân tích marketing phụ thuộc vào việc gắn thẻ đúng. Năm tham số UTM:

Tham sốÝ nghĩaVí dụ
utm_sourceNguồnfacebook, google, newsletter
utm_mediumLoại phương tiệnpaid_social, cpc, email
utm_campaignChiến dịchtet_2026_launch
utm_contentMẫu quảng cáovideo_a, banner_1
utm_termTừ khoámua_giay_the_thao

Quy ước quan trọng hơn tên cụ thể:

  • Chữ thường toàn bộ. Facebook và facebook là hai nguồn khác nhau với mọi công cụ.
  • Dùng gạch dưới giữa các từ. paid_social, không phải paid social.
  • Không dấu, không khoảng trắng.
  • Tên chiến dịch có kỳ: tet_2026, không phải campaign1.
  • Một bảng quy ước được chia sẻ cho mọi người tạo chiến dịch.

Direct traffic không phải lúc nào cũng direct

Khi người dùng bấm từ ứng dụng Facebook sang trang, tham số có thể bị mất. Khi đó phiên được ghi là direct dù thực chất đến từ quảng cáo.

Hệ quả:

  • Kênh trả phí bị đánh giá thấp.
  • Direct bị thổi phồng.
  • Last-touch gán công sai.

Nếu direct chiếm 30–40% phiên, hãy kiểm tra trước khi tin vào bất kỳ báo cáo quy công nào.

code
SELECT
  COALESCE(NULLIF(utm_source, ''), 'direct') AS nguon,
  COUNT(*) AS phien,
  ROUND(100.0 * COUNT(*) / SUM(COUNT(*)) OVER (), 1) AS ty_le_pct
FROM sessions
WHERE started_at >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY 1
ORDER BY 2 DESC;

Nếu direct quá cao, kiểm tra: thẻ trên các mẫu quảng cáo, chuyển hướng qua trang trung gian, ứng dụng trong webview có giữ tham số không.

Kiểm tra chất lượng tham số

1. Biến thể chữ hoa/thường:

code
SELECT
  lower(utm_source) AS nguon_chuan,
  COUNT(DISTINCT utm_source) AS so_bien_the,
  array_agg(DISTINCT utm_source) AS cac_bien_the
FROM sessions
WHERE utm_source IS NOT NULL
GROUP BY 1
HAVING COUNT(DISTINCT utm_source) > 1;

Kết quả dạng này là danh sách việc cần sửa: Facebook, facebook, FB nên gộp thành một.

2. Giá trị không khớp quy ước:

code
SELECT utm_medium, COUNT(*) AS n
FROM sessions
WHERE utm_medium IS NOT NULL
  AND utm_medium NOT IN ('paid_social', 'cpc', 'email', 'organic', 'referral')
GROUP BY 1
ORDER BY 2 DESC;

3. Chiến dịch thiếu tham số:

code
SELECT
  COUNT(*) FILTER (WHERE utm_source IS NULL AND utm_medium IS NOT NULL) AS thieu_source,
  COUNT(*) FILTER (WHERE utm_medium IS NULL AND utm_source IS NOT NULL) AS thieu_medium
FROM sessions
WHERE started_at >= CURRENT_DATE - INTERVAL '30 days';

4. Tham số mới xuất hiện bất thường: chạy danh sách giá trị mỗi tuần và so với tuần trước. Giá trị mới không nằm trong quy ước là dấu hiệu ai đó vừa tạo chiến dịch sai.

Đối soát ba nguồn

Ba nguồn số liệu luôn lệch nhau:

NguồnVí dụ 30 ngày
Nền tảng quảng cáo18.000 đơn
Analytics14.500 đơn
Kho dữ liệu (từ sự kiện)14.200 đơn

Nguyên nhân:

  • Chặn theo dõi: người dùng chặn cookie/script.
  • Cửa sổ quy công khác nhau: nền tảng 7 ngày click, analytics 30 ngày.
  • Múi giờ: nền tảng báo theo múi giờ tài khoản, kho dữ liệu theo UTC.
  • Đơn trùng hoặc huỷ: nền tảng đếm đơn tạo, kho đếm đơn hoàn tất.
  • Mất tham số: như phần trên.

Quy tắc đối soát:

  1. Chọn một nguồn chuẩn — thường là kho dữ liệu.
  2. Đối soát theo ngày và theo kênh, không chỉ tổng tháng.
  3. Ghi nhận chênh lệch thường xuyên (ví dụ analytics luôn thấp hơn 15–20%).
  4. Điều tra khi chênh lệch vượt ngưỡng bình thường, không điều tra mọi chênh lệch.
code
SELECT
  ngay,
  SUM(don_nen_tang) AS don_nen_tang,
  SUM(don_kho) AS don_kho,
  ROUND(100.0 * (SUM(don_nen_tang) - SUM(don_kho))
        / NULLIF(SUM(don_kho), 0), 1) AS chenh_lech_pct
FROM reconciliation_daily
WHERE ngay >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY 1
ORDER BY 1;

Quản trị dữ liệu

Ba việc giữ cho dữ liệu sạch lâu dài:

  1. Tài liệu quy ước: một trang liệt kê giá trị hợp lệ cho từng tham số, kèm ví dụ. Ai tạo chiến dịch cũng phải đọc.
  2. Người chịu trách nhiệm: một người hoặc một nhóm duyệt tên chiến dịch mới.
  3. Kiểm tra định kỳ: chạy báo cáo chất lượng hằng tuần, xử lý giá trị lạ trước khi chúng tích tụ.

Chi phí sửa dữ liệu cũ tăng theo thời gian. Sửa một chiến dịch sai ngay tuần đầu mất vài phút; sau sáu tháng phải viết mapping và giải thích lại mọi báo cáo.

Lỗi thường gặp

  • Đổi quy ước giữa chừng: lịch sử bị tách đôi, không so sánh được.
  • Dùng UTM cho liên kết nội bộ: phiên bị cắt, số liệu nhiễu.
  • Không gắn thẻ email: email rơi vào direct.
  • Đặt tên có ngày cụ thể trong utm_campaign nhưng không có quy ước: mỗi chiến dịch là một giá trị mới.
  • Tin tuyệt đối vào số nền tảng: chi phí đúng, chuyển đổi thường phồng.
  • Không ghi múi giờ: hai báo cáo lệch một ngày.

Thực hành

  1. Viết truy vấn tìm các biến thể chữ hoa/thường của utm_source.
  2. Kiểm tra tỷ lệ direct trong 30 ngày.
  3. Đối soát số đơn giữa nền tảng và kho dữ liệu theo ngày.
  4. Viết quy ước UTM cho một chiến dịch Tết.
  5. Liệt kê ba nguyên nhân chênh lệch và cách kiểm tra từng nguyên nhân.

Lỗi thường gặp

Triệu chứngNguyên nhânCách sửa
Direct chiếm 35%Mất tham số từ ứng dụngKiểm tra webview, chuyển hướng
Cùng kênh có 4 tênKhông có quy ướcChuẩn hoá và mapping lịch sử
Số đơn nền tảng cao hơn khoCửa sổ quy công, chặn theo dõiGhi nhận và đối soát theo ngày
Chiến dịch mới không xuất hiệnThiếu utm_campaignKiểm tra mẫu quảng cáo
Báo cáo lệch một ngàyMúi giờChốt múi giờ báo cáo
Không ai biết giá trị hợp lệThiếu tài liệuViết và chia sẻ quy ước

Tóm tắt

  • UTM cần quy ước: chữ thường, gạch dưới, có kỳ, có tài liệu.
  • Direct cao bất thường thường là tham số bị mất.
  • Kiểm tra biến thể, giá trị lạ, tham số thiếu và giá trị mới mỗi tuần.
  • Chọn một nguồn chuẩn và đối soát theo ngày.
  • Quản trị tốt rẻ hơn sửa dữ liệu lịch sử rất nhiều.

Dùng ← → để chuyển bài