เว็บหลายภาษามักมีช่วงที่ตัวเลขดูแปลกมาก
“ทราฟฟิกภาษาหลักลดลงหรือเปล่า?” “ทำไมภาษาอังกฤษ จีน และภาษาอื่นกลับเพิ่มขึ้น?” “เดี๋ยวนะ…ยอดภาษาหลักมีการเปิดเว็บของเราเองปนอยู่ไหม?”
ทั้งสามอย่างเกิดขึ้นพร้อมกันได้
ทราฟฟิกภาษาต่างประเทศอาจโตจริง external landing ของภาษาหลักอาจอ่อนลง และคนดูแลเว็บก็เปิดบทความใหม่ เช็กลิงก์ กลับหน้าแรก รีเฟรชหลังแก้ไข จนกลายเป็น “ผู้อ่านประจำ” ของภาษาหลัก
ผู้อ่านคนนั้นก็คือเจ้าของเว็บเอง
บทความนี้อธิบายวิธีตัด browser ของตัวเองออกจาก analytics, ความต่างระหว่าง localStorage กับ Cookie, ทำไม “เปิดหน้าแล้ว” ไม่ได้แปลว่า “ลงทะเบียน owner แล้ว”, ข้อมูลเก่าจะเป็นอย่างไร และควรอ่านการเติบโตของเว็บหลายภาษาอย่างไร
1. อย่าดูแค่ pageview รวม ให้แยก external landing กับการเดินภายในเว็บก่อน
เมื่อเจ้าของเว็บตรวจหน้าภาษาหลักบ่อย pageview รวมจะสูงเกินจริงได้ง่าย
พฤติกรรมที่ปนเข้ามา เช่น
- เปิดบทความใหม่โดยตรง
- เข้าเรื่องจากหน้าแรก
- คลิกลิงก์บทความที่เกี่ยวข้อง
- ตรวจทั้งคอมและมือถือ
- รีเฟรชหลายครั้งหลัง deploy
- กลับมาตรวจ production ซ้ำอีก
ผู้อ่านทั่วไปอาจอ่านหนึ่งหน้าแล้วออก แต่ผู้ดูแลเว็บทำหน้าที่ทั้ง editor, QA, reader และ monitoring พร้อมกัน
ดังนั้นเว็บหลายภาษาควรแยกอย่างน้อย
- external landing views
- internal referred views
ถ้าภาษาต่างประเทศโตจาก external landing แต่ภาษาหลักมี internal navigation สูง การที่ภาษาหลักดูแรงมากอาจเป็นเพราะผู้ดูแลเดินอยู่ใน UI ภาษาหลักบ่อย
2. “เปิดแล้ว ลงทะเบียนหรือยัง?” — ถ้าไม่มีโค้ดเขียนค่า ก็ยัง
สมมติว่าคุณตัดสินใจให้ browser นี้เป็น owner แล้วเปิดเว็บไซต์หนึ่งครั้ง
ระบบจะลงทะเบียนให้อัตโนมัติไหม?
ไม่
browser ไม่ได้คิดเองว่า
“คนนี้ดูเหมือนเจ้าของเว็บ ต่อไปไม่ต้องนับแล้ว”
ต้องมีการบันทึกสถานะจริง เช่น
- owner flag ใน localStorage
- owner flag ใน Cookie
- การตั้งค่าจากบัญชี admin ที่ล็อกอินอยู่
- ป้าย internal traffic ที่ฝั่ง server
การเปิดหน้าเว็บคือการเข้าชม การลงทะเบียน owner คือการเปลี่ยน state
ถ้าไม่มีโค้ดเขียน state ก็ไม่มีอะไรถูกลงทะเบียน
3. localStorage หรือ Cookie แบบไหนเหมาะกว่า?
สองวิธีที่ใช้บ่อยคือ localStorage และ Cookie
localStorage
localStorage เก็บข้อมูลตาม origin และอยู่ต่อได้ข้าม browser session ปกติ
ตัวอย่าง:
localStorage.setItem("analytics_owner", "1");
ถ้า analytics ส่งจากฝั่ง browser ก็ตรวจได้ก่อนส่ง:
if (localStorage.getItem("analytics_owner") === "1") {
return;
}
ข้อดีคือทำง่าย
ข้อจำกัดคือ server หรือ Edge Worker มองไม่เห็น localStorage ตอน HTTP request แรกเข้ามา
Cookie
Cookie สามารถถูกส่งไปพร้อม HTTP request ที่ตรงเงื่อนไข
ตัวอย่าง:
document.cookie =
"analytics_owner=1; Path=/; Max-Age=31536000; SameSite=Lax; Secure";
server หรือ Edge Worker ตรวจ Cookie ก่อนเพิ่ม counter ได้
วิธีที่เรียบร้อยกว่าคือให้หน้า admin ที่ล็อกอินแล้วหรือ route ส่วนตัวส่ง Set-Cookie กลับมา หาก JavaScript ไม่จำเป็นต้องอ่านค่า ก็พิจารณา HttpOnly ได้
แต่ flag นี้มีไว้เพื่อ “ตัดออกจาก analytics” เท่านั้น
อย่าใช้ localStorage หรือ Cookie ที่ผู้ใช้เขียนเองได้เป็นระบบยืนยันตัวตนหรือสิทธิ์ เพราะจะเหมือนใครเขียนป้ายตัวเองว่า “ผู้บริหาร” แล้วเข้าออฟฟิศผู้บริหารได้ทันที
4. นับที่ server หรือ Edge ใช้ Cookie; ส่ง event จาก browser อย่างเดียวใช้ localStorage ได้
เกณฑ์เลือกขึ้นอยู่กับจุดที่วัด
JavaScript ใน browser เป็นคนส่ง event
localStorage มักเพียงพอ
ตรวจ owner ก่อนส่ง event
CDN, Edge Worker, server หรือ access log เป็นคนเพิ่ม PV
Cookie เหมาะกว่า
server รับ request ก่อน JavaScript ใน browser ทำงาน
localStorage อยู่ใน browser เท่านั้น Cookie มากับ request
เป้าหมายเหมือนกัน แต่จุดวัดต่างกัน
5. เว็บส่วนตัวใช้การตั้งค่าครั้งเดียวก็พอ
บริษัทใหญ่ใช้ออฟฟิศ IP, account หรือ device management ได้
เว็บที่ดูแลคนเดียวไม่จำเป็นต้องซับซ้อน
- เปิดหน้าตั้งค่าส่วนตัว
- ตั้ง owner Cookie ที่มีวันหมดอายุ
- request ที่มี Cookie นี้ไม่เข้าสถิติ
- มีวิธีลบสถานะ owner
จำไว้ว่ามันผูกกับ browser
คอม มือถือ browser อื่น profile อื่น และโหมดไม่ระบุตัวตนเป็นคนละ environment
ตั้งที่หนึ่งไม่ได้ทำให้ “ตัวคุณทุกเวอร์ชัน” หายไปจากอินเทอร์เน็ต
6. ตัวเลขเก่าไม่ลดเอง
ถ้าเริ่มตัด owner วันนี้ PV เมื่อวานจะไม่หายไป
เป้าหมายที่ใช้งานจริงมักเป็น
“จากนี้ไปไม่เอาการเข้าชมของฉันมาปน”
การแก้อดีตต้อง reprocess raw log หรือสร้าง aggregate ใหม่
สำหรับเว็บช่วงเริ่มต้น การเสียเวลาหลายชั่วโมงเพื่อแก้การเปิดเองไม่กี่สิบครั้งมักไม่คุ้ม
กำหนดวันแบ่งแล้วเดินหน้าต่อก็พอ
7. internal traffic filter ของ GA4 กับ Cookie ที่ทำเองไม่ใช่สิ่งเดียวกัน
Google Analytics 4 มีวิธีอย่างเป็นทางการในการกำหนด internal traffic ด้วย IP address และตัดออกด้วย data filter
เหมาะกับเครือข่ายออฟฟิศที่คงที่
แต่ผู้ดูแลเว็บคนเดียวอาจสลับระหว่าง Wi-Fi บ้าน, mobile data, การเดินทาง, tethering และ VPN ทำให้การใช้ IP อย่างเดียวลำบาก
ถ้าเป็น first-party analytics ที่ทำเอง Cookie หรือสถานะ login อาจสะดวกกว่า
แต่สองอย่างนี้เป็นคนละระบบ
ใช้ GA4 ก็ทำตามวิธีของ GA4 และทดสอบ filter ก่อน ใช้ระบบเองก็กรองที่จุดเก็บข้อมูลของระบบเอง
8. ดูการเติบโตหลายภาษาจาก external landing หลังตัด owner
การเปิดเว็บของตัวเองทำให้การเทียบภาษาเพี้ยนได้
สมมติยอดรวมเป็น
ภาษาหลัก 70
ภาษาต่างประเทศ 30
แต่ใน 70 มี
- 20 ครั้งจากการตรวจของเจ้าของ
- 20 ครั้งจาก internal navigation
- 30 ครั้งจาก external landing
ขณะที่ 30 ของภาษาต่างประเทศแทบทั้งหมดเป็น external landing
ความหมายของตัวเลขเปลี่ยนทันที
ถ้าจะวัด discovery และ demand ให้เทียบ
external landing ของภาษาหลัก
กับ
external landing ของภาษาต่างประเทศ
และต้องแยก daily data จาก rolling window ด้วย
ยอด 7 วันอาจลดเพียงเพราะวันเก่าที่สูงหลุดออกจากหน้าต่าง ไม่ได้แปลว่าวันนี้คนอ่านหาย
9. ขั้นตอนทดสอบขั้นต่ำ
อย่าจบที่ “น่าจะใช้ได้แล้ว”
ตรวจอย่างน้อย:
- owner flag ถูกเก็บจริงหรือไม่
- เปิดหน้าปกติหนึ่งครั้ง
- event ไม่ถูกบันทึก หรือถูกทิ้งในฐานะ owner
- browser อื่นยังถูกนับตามปกติ
- ลบ flag แล้วการนับกลับมา
Developer tools ของ browser ตรวจ localStorage และ Cookie ได้
แค่เปิดหน้าตั้งค่าไม่ใช่หลักฐาน
คอมพิวเตอร์ทำตามโค้ดเก่งมาก แต่เดาใจคนไม่เก่งเลย
10. สรุป — ก่อนฉลองเว็บไปต่างประเทศ เอาตัวเองออกจากกลุ่มตัวอย่างก่อน
การเห็นผู้อ่านภาษาอื่นเริ่มเข้ามาเป็นเรื่องดี
แต่ภาษาหลักมักมีผู้เยี่ยมชมที่ภักดีที่สุดคนหนึ่งอยู่แล้ว นั่นคือเจ้าของเว็บ
ดังนั้น:
- แยก external landing กับ internal navigation
- ทำเครื่องหมาย owner browser อย่างชัดเจน
- event ฝั่ง browser ใช้ localStorage
- การนับฝั่ง server หรือ Edge ใช้ Cookie
- แค่เปิดหน้าไม่ถือว่าลงทะเบียน
- ไม่ต้องแก้ข้อมูลเก่าย้อนหลังถ้าไม่คุ้ม
- วัด demand หลายภาษาจาก external landing หลังตัด owner
ถ้าผู้อ่านต่างประเทศกำลังมา นั่นยอดเยี่ยม
แค่ตรวจให้แน่ใจก่อนว่าคะแนนของทีมเจ้าบ้านไม่ได้ถูกเจ้าของเว็บกดเพิ่มเองร้อยครั้ง
- MDN: Window.localStorage
https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage - MDN: Set-Cookie header
https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Set-Cookie - Google Analytics Help: Exclude internal traffic
https://support.google.com/analytics/answer/10104470
