← กลับไปหน้าบทความ
ขั้นสูง (MarTech)

ให้เซิร์ฟเวอร์เป็นคนเขียนคุกกี้แทน JavaScript ต่างกันตรงไหนและได้อะไรกลับมา

ทีมบรรณาธิการ linli01 พ.ย. 09:28อัปเดต 01 พ.ย. 09:28อ่าน 3 นาที
ให้เซิร์ฟเวอร์เป็นคนเขียนคุกกี้แทน JavaScript ต่างกันตรงไหนและได้อะไรกลับมา
บทความนี้จัดทำเพื่อความรู้ ชื่อธุรกิจ ตัวเลข หรือบทสนทนาที่ไม่มีแหล่งอ้างอิงกำกับเป็นกรณีตัวอย่างเพื่ออธิบายแนวคิด ดูรายละเอียดที่ นโยบายกองบรรณาธิการ

สรุปสั้น ๆ

คุกกี้ที่เซิร์ฟเวอร์ตั้งผ่านหัว Set-Cookie ของ HTTP ไม่ถูก Safari ตัดอายุด้วยกติกาเดียวกับคุกกี้ที่ JavaScript เขียนด้วย document.cookie จึงเก็บรหัสคลิกอย่าง fbclid และ gclid ได้นานกว่าบน iPhone แต่มันไม่ช่วยเรื่องความยินยอม เบราว์เซอร์ในแอป หรือการเปลี่ยนเครื่อง และต้องเป็นเซิร์ฟเวอร์ first-party จริงเท่านั้นถึงจะได้อายุเต็ม

สมมติร้านสอนภาษาแห่งหนึ่งยิงแอด Meta ไปที่หน้าสมัครคอร์ส แล้วให้กดปุ่มไปคุยต่อใน LINE ลูกค้าคนหนึ่งเปิดหน้านั้นบน iPhone เมื่อวันจันทร์ ยังไม่ทัก แล้วกลับมาทักวันจันทร์ถัดไป รวมเป็น 8 วันหลังคลิกแรก ตอนกลับมาเขาเปิดจากบุ๊กมาร์ก URL ไม่มี fbclid แล้ว และคุกกี้ที่ pixel เขียนไว้ก็ถูก Safari เก็บกวาดไปเมื่อวาน คอร์สราคา 6,900 บาทก้อนนั้นจึงไปอยู่ในช่อง direct

จุดที่พังไม่ได้อยู่ที่ pixel หรือที่แอดมินตอบแชท แต่อยู่ที่ว่าใครเป็นคนเขียนคุกกี้ลงเครื่องลูกค้า ถ้าสคริปต์ในหน้าเว็บเขียน เบราว์เซอร์บางตัวจะลดอายุให้สั้นลงเอง ถ้าเซิร์ฟเวอร์ของคุณเขียนผ่านหัวตอบกลับ HTTP กติกาจะต่างออกไป ซึ่งช่วยได้จริงในบางกรณี และไม่ช่วยในอีกหลายกรณี

สองคนที่เขียนคุกกี้ได้ และเบราว์เซอร์ไม่ปฏิบัติต่อทั้งสองเท่ากัน

วิธีแรกคือสคริปต์ในหน้าเว็บสั่งเขียนด้วย document.cookie ซึ่งเป็นวิธีที่ pixel ส่วนใหญ่ใช้ วิธีที่สองคือเซิร์ฟเวอร์ใส่หัว Set-Cookie ไว้ในคำตอบ HTTP ที่ส่งกลับมาพร้อมหน้าเว็บ ผลลัพธ์ในเครื่องลูกค้าหน้าตาเหมือนกัน แต่เบราว์เซอร์ถือว่าสองแบบนี้คนละชั้นตอนตัดอายุ เพราะสคริปต์เป็นช่องทางที่บริษัทโฆษณาใช้ตามรอยคนข้ามเว็บมานาน

เรื่องที่เทียบเขียนด้วย JavaScriptเขียนโดยเซิร์ฟเวอร์ (Set-Cookie)
ใครสั่งเขียนสคริปต์ในหน้าเว็บ หลังหน้าโหลดเสร็จเซิร์ฟเวอร์ ในคำตอบ HTTP ก่อนหน้าเว็บถึงเบราว์เซอร์
Safari (ITP)ถูกจำกัดอายุเหลือ 7 วัน และอาจเหลือ 24 ชั่วโมงเมื่อมาจากลิงก์ติดตามบางประเภทไม่เข้ากติกานั้น แต่ถ้าเซิร์ฟเวอร์ไม่ใช่ first-party จริง (CNAME หรือ IP ต่างกลุ่ม) อาจถูกจำกัดเหลือ 7 วัน
Chromeเพดานอายุไม่เกิน 400 วันเพดานเดียวกัน
สคริปต์อื่นอ่านได้ไหมอ่านได้ทุกตัวในหน้าอ่านไม่ได้ ถ้าใส่ HttpOnly
ต้องมีอะไรเพิ่มไม่ต้องต้องมีจุดควบคุมคำตอบ HTTP เช่น เซิร์ฟเวอร์เว็บ พร็อกซี หรือ edge function

Safari ตัดอายุคุกกี้ฝั่งสคริปต์ด้วยกติกาที่กระทบสายโฆษณาโดยตรง

ตัวเลขที่ต้องจำมีสองตัว ตัวแรกคือคุกกี้ที่เขียนด้วย document.cookie ถูกจำกัดให้อยู่ได้ 7 วันของการใช้ Safari ถ้าลูกค้าไม่กลับมาโต้ตอบกับเว็บนั้นอีก ตัวที่สองคือถ้าลูกค้าเข้ามาด้วยลิงก์ที่มีพารามิเตอร์ติดตามอย่าง fbclid จากโดเมนที่ Safari จัดว่าติดตามข้ามเว็บ คุกกี้ฝั่งสคริปต์ที่เขียนในครั้งนั้นอาจเหลือแค่ 24 ชั่วโมง ซึ่งตรงกับเส้นทางคลิกจากแอดเกือบทุกกรณี ตัวเลขนี้มาจากประกาศของ WebKit ปี 2019 และถูกปรับมาหลายรอบ ตรวจเอกสารล่าสุดก่อนใช้

คุกกี้จากเซิร์ฟเวอร์เลี่ยงสองกติกานี้ได้ แต่ Safari ตรวจด้วยว่าเซิร์ฟเวอร์ที่ตั้งคุกกี้เป็นของเว็บนั้นจริงไหม ถ้าคุณชี้ track.yourshop.com ไปหาผู้ให้บริการภายนอกด้วย CNAME หรือเซิร์ฟเวอร์อยู่ในกลุ่ม IP คนละชุดกับเว็บหลัก Safari อาจลดอายุเหลือ 7 วันอยู่ดี ให้คำตอบมาจากเซิร์ฟเวอร์หรือพร็อกซีที่อยู่หน้าโดเมนหลักของคุณเอง

ภาพใหญ่ของเรื่องนี้อยู่ใน คุกกี้และ pixel เสื่อม ทำไมต้องวัดฝั่งเซิร์ฟเวอร์

  1. ให้หน้า landing ถูกเสิร์ฟผ่านจุดที่ควบคุมคำตอบ HTTP ได้ เช่นเซิร์ฟเวอร์เว็บ พร็อกซีหน้าเว็บ หรือ edge function แล้วอ่าน fbclid, gclid และ utm จาก URL ในคำขอแรกที่ลูกค้าเข้ามา (เรื่อง เก็บ fbclid ไม่ให้หลุด)
  2. ถ้ามีรหัสคลิก ให้ตอบกลับพร้อมหัว Set-Cookie: lead_ref=ค่ารหัสคลิก; Max-Age=7776000; Path=/; Domain=yourshop.com; Secure; SameSite=Lax เลข 7776000 คือ 90 วันเป็นวินาที ใกล้เคียงอายุของ _fbc ที่ pixel เคยตั้ง ปรับตามรอบซื้อของธุรกิจคุณได้ ถ้าจะส่งค่านี้เข้า Conversions API ของ Meta ให้เก็บรูปแบบ fb.1.เวลามิลลิวินาที.fbclid ตามที่ Meta กำหนดให้ _fbc
  3. ออกรหัสผู้เยี่ยมชมสั้น ๆ (visitor id) เก็บในคุกกี้อีกตัว ไว้ผูกกับบทสนทนา อย่าใส่ชื่อ เบอร์โทร หรืออีเมลลงในคุกกี้
  4. ชี้ปุ่ม LINE ไปที่ปลายทางของคุณเอง เช่น /go/line ให้เซิร์ฟเวอร์อ่านคุกกี้ บันทึกคู่ (visitor id, รหัสคลิก, เวลา) แล้วรีไดเรกต์ไป LINE พร้อมรหัสสั้นที่ติดไปกับข้อความแรก วิธีไม่ให้ UTM หายระหว่างรีไดเรกต์ดูใน บทความเรื่อง UTM หายหลังรีไดเรกต์
  5. เมื่อลูกค้าทักมาพร้อมรหัสสั้นนั้น ฝั่งหลังบ้านใช้รหัสดึงรหัสคลิกกลับมา เพื่อส่งต่อเป็น conversion ตอนปิดการขาย

ปัญหาที่คุกกี้ฝั่งเซิร์ฟเวอร์ช่วยไม่ได้

หลายทีมตั้งเสร็จแล้วรอตัวเลขดีขึ้น แล้วไม่ขยับ เพราะติดข้อจำกัดด้านล่างนี้ เรื่องความยินยอมคุกกี้การตลาดดูแนวทางที่ การขอคุกกี้ก่อนวัดผลเข้า LINE

สถานการณ์คุกกี้ฝั่งเซิร์ฟเวอร์ช่วยไหมเหตุผล
Safari ลบคุกกี้ที่ pixel เขียนหลัง 7 วันช่วย ถ้าเซิร์ฟเวอร์เป็น first-party จริงคุกกี้ไม่เข้ากติกาตัดอายุของสคริปต์
ลูกค้ายังไม่กดยินยอมคุกกี้การตลาดไม่ช่วยวิธีเขียนไม่เปลี่ยนวัตถุประสงค์ ต้องรอความยินยอมก่อนตั้ง
คลิกในแอป Facebook แล้วเปิดต่อในเบราว์เซอร์ปกติทีหลังไม่ช่วยเบราว์เซอร์ในแอปเก็บคุกกี้แยกจาก Safari หรือ Chrome
ลูกค้าเปลี่ยนเครื่องหรือล้างคุกกี้ไม่ช่วยคุกกี้หายไปพร้อมเครื่องหรือการล้าง
สคริปต์ pixel ถูกตัวบล็อกตัดทิ้งช่วยบางส่วนเซิร์ฟเวอร์ยังเห็นคำขอและเขียนรหัสคลิกได้ แต่ pixel ฝั่งเบราว์เซอร์ยังไม่ทำงาน

สี่จุดที่ตั้งคุกกี้แล้วแต่อ่านกลับไม่เจอ

  • Domain ไม่ครอบ subdomain ตั้งที่ www.yourshop.com แต่หน้า landing อยู่ที่ promo.yourshop.com คุกกี้จะไม่ถูกส่งไปด้วย ให้ตั้ง Domain เป็น yourshop.com
  • HttpOnly บนคุกกี้ที่ pixel ต้องอ่าน ถ้าเขียน _fbc หรือ _fbp แบบ HttpOnly สคริปต์ของ Meta จะอ่านไม่ได้ ใช้ HttpOnly เฉพาะคุกกี้ที่มีแต่เซิร์ฟเวอร์ใช้ เช่น visitor id
  • SameSite=Strict ทำให้เบราว์เซอร์ไม่แนบคุกกี้เมื่อลูกค้ากลับมาจากลิงก์ภายนอก เช่นกดจากข้อความใน LINE ใช้ Lax แทน
  • CDN แคชทั้งหน้า หน้าที่ถูกแคชอาจไม่ผ่านเซิร์ฟเวอร์ของคุณ หรือ CDN ตัด Set-Cookie ทิ้ง ให้ตั้งผ่าน edge function หรือยกเว้นหน้านั้นจากการแคช

ทำเมื่อไรถึงคุ้ม วัดจากข้อมูลที่มีอยู่แล้ว

เริ่มจากตัวเลขสองตัวที่เปิดดูได้ภายในครึ่งชั่วโมง ตัวแรกคือสัดส่วนผู้เยี่ยมชมจากแอดที่ใช้ Safari บน iPhone ดูแยกตามเบราว์เซอร์ได้ใน GA4 ตัวที่สองคือเวลาจากคลิกแรกถึงตอนทักแชท ถ้าส่วนใหญ่ทักภายในวันเดียว ต่อให้ Safari ตัดคุกกี้เหลือ 24 ชั่วโมงก็ยังอยู่ทัน คุณแทบไม่ได้อะไรจากงานนี้

แต่ถ้า iPhone เป็นก้อนใหญ่ของทราฟฟิกแอด และธุรกิจคุณตัดสินใจกันเป็นวัน เช่นคอร์สเรียน คลินิก รถยนต์ งานนี้ให้ผลต่อเนื่องกว่าการไล่แก้ตัวเลข direct ย้อนหลังทุกเดือน ถ้ามี GTM server-side container อยู่แล้ว การตั้งคุกกี้จากตรงนั้นเป็นทางลัดที่ถูกกว่าเขียนระบบใหม่

สรุป

ลำดับที่ผมจะทำคือดูสัดส่วน Safari กับเวลาจากคลิกถึงทักก่อนแตะโค้ด ถ้าตัวเลขไม่ชี้ว่ารหัสคลิกหายเป็นกอบเป็นกำ ให้เก็บงบวิศวกรไว้ทำเรื่องอื่น

ถ้าตัวเลขชี้ว่าควรทำ ให้ทดสอบบน Safari จริงสองรอบ วันที่คลิกกับวันที่ 8 ถ้าคุกกี้ยังอยู่ แปลว่าเซิร์ฟเวอร์ของคุณผ่านด่านตรวจ first-party ของ Safari แล้ว

  • คุกกี้เซิร์ฟเวอร์ช่วยเรื่องอายุบน Safari แต่ไม่แก้เรื่องความยินยอม เบราว์เซอร์ในแอป และการเปลี่ยนเครื่อง
  • เซิร์ฟเวอร์ต้องเป็น first-party จริงทั้งโดเมนและกลุ่ม IP ไม่ใช่ CNAME ชี้ออกไปที่ผู้ให้บริการ
  • ใช้ HttpOnly เฉพาะคุกกี้ที่ฝั่งเซิร์ฟเวอร์ใช้คนเดียว และใช้ SameSite=Lax กับหน้า landing
  • วัดว่าคุ้มหรือไม่จากสัดส่วน Safari กับเวลาจากคลิกถึงทัก ก่อนลงมือเขียนโค้ด

คำถามที่พบบ่อย

คุกกี้ที่เซิร์ฟเวอร์ตั้งนับเป็น first-party cookie เสมอไหม

นับเมื่อโดเมนของคุกกี้ตรงกับเว็บที่ลูกค้ากำลังเปิดอยู่ ไม่เกี่ยวกับว่าใครเป็นคนเขียน แต่ Safari ดูเพิ่มด้วยว่าเซิร์ฟเวอร์ที่ตอบเป็นของเว็บนั้นจริงไหม ถ้า subdomain ชี้ออกไปผู้ให้บริการภายนอกด้วย CNAME อาจถูกลดอายุเหลือ 7 วัน

เว็บทำบน WordPress หรือเว็บสำเร็จรูป ตั้ง Set-Cookie ได้ไหม

WordPress ทำได้ผ่านโค้ดฝั่ง PHP ที่รันก่อนส่งหน้า หรือปลั๊กอิน ส่วนเว็บสำเร็จรูปบางเจ้าไม่เปิดให้แก้หัวตอบกลับ ทางออกคือวางพร็อกซีหรือ edge function ไว้หน้าโดเมนที่คุณคุมได้ แล้วตั้งคุกกี้ตรงนั้น

ตั้งอายุคุกกี้ 2 ปีเลยได้ไหม จะได้ไม่ต้องกังวล

Chrome ตัดอายุที่ 400 วันอยู่แล้ว และเรื่อง PDPA ควรเก็บเท่าที่จำเป็นกับรอบการขายจริง ธุรกิจที่ตัดสินใจซื้อภายในไม่กี่สัปดาห์ไม่มีเหตุผลต้องถือรหัสคลิกเป็นปี ตั้งตามรอบขายแล้วบันทึกเหตุผลไว้

ตัวบล็อกโฆษณาจะบล็อกคุกกี้ที่เซิร์ฟเวอร์เขียนไหม

ตัวบล็อกส่วนใหญ่ตัดสคริปต์และคำขอไปยังโดเมนติดตามที่รู้จัก ไม่ได้ลบคุกกี้ที่โดเมนของคุณเองเขียนผ่านหัว HTTP ของหน้าเว็บ แต่ถ้า pixel ถูกตัด เหตุการณ์ฝั่งเบราว์เซอร์ก็ยังหาย ต้องส่งผ่านเซิร์ฟเวอร์แทน

ต้องขอความยินยอมเรื่องคุกกี้ไหม ถ้าเซิร์ฟเวอร์เป็นคนตั้งเอง

ต้องคิดแบบเดิม เพราะวัตถุประสงค์คือการติดตามเพื่อการตลาด ไม่ว่าใครเป็นคนเขียน ถ้าคุกกี้ไม่จำเป็นต่อการทำงานของเว็บ ให้รอความยินยอมก่อนตั้ง และเก็บบันทึกว่าลูกค้ายินยอมเมื่อไร

ทดสอบอย่างไรว่าตั้งสำเร็จ

เปิดหน้า landing ด้วย URL ที่มี fbclid บน Safari จริง แล้วดูในเครื่องมือนักพัฒนาที่แท็บ Storage ว่าคุกกี้มีวันหมดอายุตามที่ตั้ง รอบสองให้กลับมาตรวจหลังผ่านไป 8 วัน ถ้ายังอยู่แปลว่าไม่ถูกตัดที่ 7 วัน

วัด Conversion LINE ทุกแบรนด์ รวมศูนย์ที่เดียว

องค์กรที่มีหลายแบรนด์ หลายสาขา หลาย LINE OA linli รวม Tracking และส่ง Conversion กลับทุกแพลตฟอร์ม พร้อม Custom Limit เริ่มฟรี 14 วัน

ติดต่อทีม Sales

บทความที่เกี่ยวข้อง

ส่งข้อมูลลูกค้าไทยออกไปที่แพลตฟอร์มโฆษณาต่างประเทศ ต้องทำอะไรให้ถูกกฎ

ส่งข้อมูลลูกค้าไทยออกไปที่แพลตฟอร์มโฆษณาต่างประเทศ ต้องทำอะไรให้ถูกกฎ

ทุกครั้งที่ยิง CAPI ข้อมูลลูกค้าไทยเดินทางไปเซิร์ฟเวอร์ต่างประเทศ บทความนี้ไล่ว่ามาตรา 28 และ 29 หมายถึงอะไรกับทีมแอด และเอกสารอะไรที่ควรมีในมือ
ธุรกิจขนาดไหนต้องมีเจ้าหน้าที่คุ้มครองข้อมูล และถ้ายังไม่มีควรทำอะไรก่อน

ธุรกิจขนาดไหนต้องมีเจ้าหน้าที่คุ้มครองข้อมูล และถ้ายังไม่มีควรทำอะไรก่อน

ขนาดบริษัทไม่ใช่ตัวตัดสินว่าต้องมี DPO แต่ลักษณะข้อมูลและกิจกรรมหลักต่างหาก บทความนี้ไล่เกณฑ์มาตรา 41 และลำดับงานสำหรับธุรกิจที่ยังไม่มีคนรับหน้าที่นี้
Data Clean Room จำเป็นกับธุรกิจไทยขนาดไหน หรือยังไม่ต้องคิดถึง

Data Clean Room จำเป็นกับธุรกิจไทยขนาดไหน หรือยังไม่ต้องคิดถึง

Data Clean Room ให้สองฝ่ายจับคู่ข้อมูลโดยไม่เห็นข้อมูลรายคนของกันและกัน บทความนี้ชี้ว่าธุรกิจไทยขนาดไหนคุ้ม ต้นทุนที่ไม่อยู่ในใบเสนอราคา และทางเลือกที่ถูกกว่า