• 28/06 cập nhật đăng ký đăng nhập qua Google & Facebook

Đổi nguồn click Zalo thành web — nghi vấn ở sàn và cách fix

TenHoshi

Administrator
Staff member
Trusted Uploader

1. Nghi vấn​

Đơn phát sinh từ traffic Zalo bị sàn xếp vào cột Kênh = Zalo, nghi là nguyên nhân đơn bị huỷ/không duyệt hoa hồng cao hơn các kênh khác.

Chưa có số liệu chứng minh tiền đề này — nó đến từ quan sát thủ công, chưa tính tỷ lệ huỷ theo từng giá trị Kênh. Các bên áp fix nên biết trước điểm này.

2. Sàn suy ra "Kênh" từ đâu​

Kết luận từ 3 mẫu đơn thật, cùng một pipeline s.shopee.vn/an_redir mà ra 3 kênh khác nhau:

Kênh sàn báoKhớp với
Facebookreferrer m.facebook.com / l.facebook.com
EdgeBrowserkhông có referrer nhận diện được → rơi về tên trình duyệt
Otherskhông phân loại được
→ Sàn chốt kênh lúc click, ưu tiên referrer, UA/tên trình duyệt làm dự phòng.

Giá trị Kênh quan sát được: Facebook, Zalo, Websites, Others, YouTube, EdgeBrowser, Google Search, TikTok.

3. Nguyên nhân kỹ thuật​

Redirect 302 giữ nguyên referrer của request gốc. Khách bấm link trong webview Zalo thì referrer https://jp.zaloapp.com/ được đẩy thẳng sang sàn → sàn xếp kênh Zalo.

Đo trên dự án referrer jp.zaloapp.com chiếm (30%), UA webview Zalo chiếm 36%.

4. Cách fix​

Bỏ 302 cho người thật, chuyển tiếp bằng trang trung gian HTML: trình duyệt tải trang của domain rút gọn rồi tự location.replace() sang sàn → referrer gửi sang sàn là domain rút gọn, không còn jp.zaloapp.com. Thêm Referrer-Policy: origin để chắc chắn không rơi về referrer cũ. Khách không phải thao tác thêm, chuyển tiếp xong trong ~150ms.

Bot xem trước link vẫn phải nhận 302. Zalo/Telegram/Facebook dựng thẻ preview trong chat bằng bot; cho bot xem trang trung gian thì thẻ hiện "Đang mở liên kết…" thay vì sản phẩm. Bot chiếm khoảng 2/3 request (7 ngày gần nhất: 69.183 bot / 36.357 người thật).

Code:
// $goto = link affiliate đích đã dựng xong
$ua = strtolower($_SERVER['HTTP_USER_AGENT'] ?? '');
$is_bot = (strpos($ua, 'mozilla') === false && strpos($ua, 'opera') === false) || preg_match('#bot|crawl|spider|slurp|externalhit|preview|embed|coccoc|yandex' . '|ahrefs|semrush|okhttp|fasthttp|curl/|wget|python-requests|go-http-client' . '|chatgpt|headlesschrome#', $ua);
if ($is_bot) { header('Location: ' . $goto); // thẻ preview trong chat vẫn ra sản phẩm exit;
}
header('Referrer-Policy: origin');
header('Cache-Control: no-store');
$js = json_encode($goto, JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT);
$h = htmlspecialchars($goto, ENT_QUOTES, 'UTF-8');
?>
<!DOCTYPE html><html lang="vi"><head><meta charset="utf-8">
<!-- Script đứng trước mọi thứ khác: chạy ngay khi parse tới đây, không đợi style/body -->
<script>location.replace(<?= $js ?>);</script>
<noscript><meta data-fr-http-equiv="refresh" content="0;url=<?= $h ?>"></noscript>
<title>Đang mở liên kết…</title></head><body></body></html>

Hai việc kèm theo (ít quan trọng hơn nhưng nên làm cùng):
  • sub_id không chứa chữ nhận diện nguồn. Bên mình đổi tag mặc định zalobot → web + 4 ký tự ngẫu nhiên, mỗi bot một mã. Khách cũ không bị đổi ngầm để không vỡ bộ lọc đối soát đơn cũ — nên hiện vẫn còn 12.334/16.735 link 7 ngày mang tag cũ.
  • Ghi log click sau fastcgi_finish_request() để 2 query không nằm trên đường găng, bù lại độ trễ của round-trip thêm.
Rollback: trả lại đúng một dòng header('Location: ' . $goto).

5. Nghiệm thu (bước còn thiếu, cả bên mình cũng chưa làm được)​

Log phía mình không thấy được kết quả: us_ckref ghi referrer đến domain rút gọn, vẫn là jp.zaloapp.com. Chỉ báo cáo đơn của sàn mới thấy cột Kênh đổi hay không.

Shopee Affiliate Open API — Kênh = trường referrer trên ConversionReport (không phải channelType, trường đó trả Social Medias cho mọi đơn):

Code:
{ conversionReport(purchaseTimeStart: <ts>, purchaseTimeEnd: <ts>, limit: 100, scrollId: "<cursor>") { nodes { clickTime purchaseTime utmContent device referrer orders { orderStatus items { channelType fraudStatus displayItemStatus } } } pageInfo { hasNextPage scrollId } } }

Phân trang bằng scrollId. Gom theo clickTime (đơn mua sau mốc vẫn có thể từ click trước mốc), tách trước/sau mốc deploy, chỉ so trong cùng nhóm sub_id — trộn traffic Facebook/website có sẵn thì tỷ lệ loãng, không kết luận được gì.

Không có App ID/Secret thì chủ tài khoản affiliate tự lọc cột Kênh trong Shopee Affiliate Center theo SubID, so trước/sau mốc — nhanh hơn chờ key.

6. Hạn chế đã biết​

  • UA vẫn chứa Zalo. Nếu sàn cũng sniff UA thì 15% click người thật (5.548/36.357, 7 ngày) vẫn lộ. Chưa có mẫu đơn nào cho đúng tổ hợp mới (referrer = domain rút gọn + UA Zalo) nên chưa biết sàn xử thế nào. Hướng dự phòng: đẩy click vào app Shopee bằng deeplink để UA thoát khỏi webview Zalo.
  • Đơn hoàn tiền/nhóm chat có thể bị từ chối vì là traffic khuyến khích, không phải vì chữ "Zalo". Nếu đúng vậy thì fix này không chạm tới nguyên nhân.
  • Thêm một round-trip HTML trước khi sang sàn (~150ms). Giao diện chờ nên nín 400ms rồi mới hiện, nếu hiện ngay khách thấy một nháy rồi mất, cảm giác chậm hơn cả khi không hiện.
 

Guest Post 2022

Top