← กลับไปหน้าบทความ
ส่ง Conversion กลับ

ร้านขายของออนไลน์ปิดออเดอร์วันละ 200 ใบ แต่ไม่เคยเช็คว่า Transaction ID ซ้ำหรือเปล่า

ทีมบรรณาธิการ linli12 ส.ค. 04:53อัปเดต 12 ส.ค. 04:53อ่าน 3 นาที
ร้านขายของออนไลน์ปิดออเดอร์วันละ 200 ใบ แต่ไม่เคยเช็คว่า Transaction ID ซ้ำหรือเปล่า
บทความนี้จัดทำเพื่อความรู้ ชื่อธุรกิจ ตัวเลข หรือบทสนทนาที่ไม่มีแหล่งอ้างอิงกำกับเป็นกรณีตัวอย่างเพื่ออธิบายแนวคิด ดูรายละเอียดที่ นโยบายกองบรรณาธิการ

สรุปสั้น ๆ

GA4 Transaction ID Deduplication คือการใช้ transaction_id เดียวกันเป็นตัวอ้างอิงเพื่อป้องกันไม่ให้ Purchase Event รายการเดียวกันถูกนับซ้ำ เช่น เมื่อระบบยิง Event ทั้งจากฝั่ง Client และฝั่ง Server สำหรับออเดอร์เดียวกัน ถ้า transaction_id ไม่ตรงกันหรือไม่ถูกส่งเลย GA4 จะไม่สามารถรู้ได้ว่ารายการไหนคือรายการเดียวกัน และ Revenue ที่รายงานออกมาก็จะสูงเกินความจริง

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

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

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

transaction_id คืออะไร ทำไมถึงเป็นกุญแจสำคัญของการกันซ้ำ

transaction_id คือค่าที่ใช้ระบุออเดอร์แต่ละรายการให้ไม่ซ้ำกัน ปกติมักอ้างอิงมาจากเลขที่ออเดอร์ในระบบขายหรือระบบชำระเงินของธุรกิจเอง เมื่อส่ง Purchase Event เข้า GA4 พร้อม transaction_id นี้ ระบบจะใช้ค่าดังกล่าวเป็นตัวเทียบว่าเคยได้รับ Event ของออเดอร์นี้มาก่อนหรือยัง

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

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

สาเหตุที่ Purchase Event ถูกส่งซ้ำเกิดขึ้นได้จากอะไรบ้าง

สาเหตุแรกที่พบบ่อยคือลูกค้ากด Refresh หน้ายืนยันคำสั่งซื้อ หรือกดปุ่มย้อนกลับแล้วกดยืนยันซ้ำอีกครั้ง ถ้าหน้าเว็บไม่มีการป้องกัน อาจยิง Purchase Event ซ้ำจากพฤติกรรมของผู้ใช้เองโดยไม่มีเจตนา

สาเหตุที่สองคือธุรกิจที่ยิง Event ทั้งจากฝั่ง Client เช่น JavaScript บนเว็บไซต์ และฝั่ง Server เช่น Measurement Protocol พร้อมกันสำหรับออเดอร์เดียวกัน โดยไม่ได้กำหนด transaction_id ให้ตรงกันทั้งสองฝั่ง ทำให้ GA4 มองว่าเป็นสองเหตุการณ์แยกกัน

สาเหตุที่สามคือระบบ Webhook หรือการเชื่อมต่อกับแพลตฟอร์มชำระเงินที่มีการ Retry อัตโนมัติเมื่อ Response ล่าช้าหรือมีปัญหาเครือข่ายชั่วคราว ถ้าไม่มีการตรวจสอบก่อนว่าเคยส่ง Event ของออเดอร์นั้นไปแล้วหรือยัง การ Retry อาจทำให้ Event เดิมถูกยิงซ้ำได้ง่าย

สาเหตุที่สี่ซึ่งพบเฉพาะธุรกิจที่ขายผ่าน LINE คือกรณีที่แอดมินบันทึกออเดอร์ในระบบหลังบ้านเองหลังปิดการขายในแชท แล้วมีสคริปต์แยกอีกตัวยิง Event เข้า GA4 อัตโนมัติ ถ้าแอดมินคนละคนบันทึกออเดอร์เดียวกันซ้ำสองครั้งด้วยความเข้าใจผิด ระบบก็จะยิง Purchase Event ซ้ำตามไปด้วย

เทียบวิธีป้องกัน Purchase Event ซ้ำแบบต่าง ๆ

การกันซ้ำทำได้หลายชั้น ตารางนี้เทียบให้เห็นว่าแต่ละวิธีป้องกันปัญหาจากจุดไหน

วิธีป้องกันทำงานที่จุดไหนข้อจำกัด
ใช้ transaction_id เดียวกันทุกจุดที่ส่ง Eventฝั่ง GA4 เมื่อรับ Event เข้ามาต้องออกแบบให้ Client และ Server ใช้ค่าเดียวกันตั้งแต่ต้น
ป้องกันการยิงซ้ำจากหน้า Thank You Pageฝั่ง Client ก่อนส่ง Eventไม่ครอบคลุมกรณี Event ยิงจาก Server แยกต่างหาก
ตรวจสอบสถานะออเดอร์ก่อนยิง Event จาก Serverฝั่ง Server ก่อนส่ง Eventต้องมีระบบเก็บสถานะว่าออเดอร์ไหนส่ง Event ไปแล้ว
ตรวจรายงานย้อนหลังเปรียบเทียบกับระบบขายจริงหลังข้อมูลเข้า GA4 แล้วแก้ได้แค่ตรวจพบ ไม่ป้องกันไม่ให้เกิดซ้ำล่วงหน้า

ถ้าไม่กันซ้ำเลย Revenue ใน GA4 จะเพี้ยนไปมากแค่ไหน

เมื่อ Purchase Event ถูกนับซ้ำแม้เพียงส่วนน้อยของออเดอร์ทั้งหมด ตัวเลข Revenue ที่รายงานใน GA4 จะสูงกว่าความจริงในสัดส่วนที่ใกล้เคียงกับอัตราการซ้ำนั้น ธุรกิจที่ใช้ตัวเลขนี้เทียบ ROAS กับ Ad Spend ก็จะเห็นภาพที่ดีกว่าความเป็นจริง

ปัญหาจะยิ่งชัดเมื่อธุรกิจนำ Revenue จาก GA4 ไปใช้ตัดสินใจงบโฆษณาต่อ Channel เพราะถ้า Channel หนึ่งมีอัตราการเกิด Purchase Event ซ้ำสูงกว่า Channel อื่นโดยบังเอิญ เช่น มาจากพฤติกรรมผู้ใช้ที่ต่างกันหรือความเร็วเครือข่ายที่ต่างกัน การเปรียบเทียบ Channel ก็จะบิดเบือนไปโดยไม่รู้ตัว

อีกผลกระทบที่มักถูกมองข้ามคือ AOV หรือมูลค่าเฉลี่ยต่อออเดอร์ที่รายงานใน GA4 จะต่ำกว่าความจริง เพราะจำนวน Transaction ที่นับได้มากกว่าจำนวนออเดอร์จริง ทั้งที่ยอดรวม Revenue อาจใกล้เคียงหรือสูงกว่าความจริงพร้อมกัน ทำให้ตีความ Metric ทั้งสองตัวผิดไปพร้อมกันในทิศทางตรงข้าม

ขั้นตอนตั้งค่า transaction_id ให้กันซ้ำได้จริง

การตั้งค่าที่ดีต้องเริ่มจากออกแบบว่า Order ID ในระบบขายจะกลายเป็น transaction_id ใน GA4 อย่างไร ก่อนจะเริ่มยิง Event จริง

  1. กำหนดให้ transaction_id อ้างอิงจาก Order ID ในระบบขายโดยตรง ไม่สร้างค่าใหม่แยกต่างหากที่ไม่เชื่อมกับระบบหลัก
  2. ถ้ายิง Event ทั้งจาก Client และ Server สำหรับออเดอร์เดียวกัน ต้องตรวจให้ค่า transaction_id ตรงกันทุกตัวอักษรทั้งสองฝั่ง
  3. เพิ่มการตรวจสอบสถานะก่อนยิง Event ฝั่ง Server เช่น เช็คว่าออเดอร์นี้เคยถูกบันทึกว่าส่ง Purchase Event ไปแล้วหรือยัง
  4. ทดสอบสถานการณ์ที่มักทำให้เกิดซ้ำ เช่น กด Refresh หน้ายืนยันคำสั่งซื้อ หรือจำลอง Webhook Retry เพื่อดูว่าระบบยังกันซ้ำได้ตามที่ออกแบบไว้
  5. ตั้งรอบตรวจสอบเปรียบเทียบจำนวน Transaction ใน GA4 กับจำนวนออเดอร์จริงในระบบขายเป็นประจำ เพื่อจับความผิดปกติได้เร็ว

ธุรกิจที่ปิดยอดผ่านแชท LINE แล้วบันทึกออเดอร์ทีหลัง ต้องระวังอะไรเป็นพิเศษ

ธุรกิจจำนวนมากที่ขายผ่าน LINE ไม่ได้ปิดการขายผ่านหน้าเว็บไซต์โดยตรง แต่ให้ลูกค้าทักแชทแล้วแอดมินเป็นคนบันทึกออเดอร์เข้าระบบหลังบ้านเอง กรณีแบบนี้ Purchase Event มักถูกยิงจากฝั่ง Server เพียงจุดเดียวหลังแอดมินยืนยันการขาย ไม่ได้มาจากฝั่ง Client เหมือนเว็บไซต์อีคอมเมิร์ซทั่วไป

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

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

ความเข้าใจผิดที่พบบ่อยเกี่ยวกับ Transaction ID Deduplication

ความเข้าใจผิดแรกคือคิดว่าแค่มี transaction_id ในทุก Event ก็เพียงพอแล้ว ทั้งที่ถ้าค่าที่ส่งมาจากแต่ละจุดไม่ตรงกัน เช่น จุดหนึ่งใช้ Order ID ล้วน อีกจุดหนึ่งเติมตัวอักษรนำหน้า GA4 ก็จะมองว่าเป็นคนละรายการอยู่ดี

ความเข้าใจผิดที่สองคือคิดว่าปัญหา Purchase ซ้ำเกิดจากบั๊กของ GA4 เอง ทั้งที่ต้นตอส่วนใหญ่มาจากการออกแบบการส่ง Event ของธุรกิจเองที่ไม่ได้วางแผนเรื่องการกันซ้ำไว้ตั้งแต่ต้น

ธุรกิจที่อยากมั่นใจว่าตัวเลข Revenue สะท้อนความจริง ควรตรวจสอบ ข้อมูลพฤติกรรมลูกค้าที่ใช้วิเคราะห์ต่อ ควบคู่กับการกระทบยอดจำนวน Transaction กับระบบขายเป็นประจำ ไม่ใช่เชื่อตัวเลขใน Dashboard โดยไม่เคยตรวจสอบที่มา

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

สรุป

Transaction ID Deduplication ไม่ใช่ฟีเจอร์ที่ทำงานให้อัตโนมัติโดยธุรกิจไม่ต้องทำอะไร แต่เป็นผลลัพธ์ของการออกแบบการส่ง Event ที่ดีตั้งแต่ต้นทาง โดยเฉพาะธุรกิจที่ปิดยอดผ่าน LINE ซึ่งมักมีจุดบันทึกออเดอร์นอกเว็บไซต์ที่เสี่ยงต่อการซ้ำมากกว่าอีคอมเมิร์ซทั่วไป

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

  • transaction_id ใช้เป็นตัวอ้างอิงให้ GA4 รู้ว่า Event สองครั้งเป็นออเดอร์เดียวกันหรือไม่
  • Purchase Event ซ้ำมักเกิดจาก Refresh หน้ายืนยัน, ยิง Event ทั้ง Client และ Server, หรือ Webhook Retry
  • ถ้าไม่กันซ้ำ Revenue จะสูงเกินจริง ขณะที่ AOV จะต่ำกว่าความจริงไปพร้อมกัน
  • ธุรกิจที่บันทึกออเดอร์จากแชท LINE ต้องระวังแอดมินหลายคนบันทึกออเดอร์เดียวกันซ้ำเป็นพิเศษ

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

transaction_id ต้องเป็นตัวเลขเท่านั้นหรือใช้ตัวอักษรผสมได้

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

ถ้าไม่เคยใส่ transaction_id มาก่อนเลย ควรเริ่มแก้อย่างไร

ควรเริ่มจากตรวจสอบว่า Purchase Event ปัจจุบันถูกยิงจากจุดไหนบ้าง แล้ววางแผนให้ transaction_id อ้างอิงจาก Order ID เดียวกันในทุกจุด จากนั้นทดสอบกับออเดอร์ตัวอย่างก่อนใช้งานจริงเต็มรูปแบบ

GA4 กันซ้ำให้อัตโนมัติทั้งหมดโดยไม่ต้องทำอะไรเพิ่มใช่ไหม

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

ทำไมยอด Purchase ใน GA4 กับยอดขายในบัญชีธนาคารถึงไม่มีวันตรงกันเป๊ะ

นอกจากปัญหาการซ้ำแล้ว ยังมีปัจจัยอื่น เช่น การคืนเงินที่เกิดหลังบันทึก Event ไปแล้ว ความล่าช้าของการกระทบยอด และธุรกรรมที่เกิดนอกช่วงเวลาที่ระบบติดตามครอบคลุม จึงควรใช้ทั้งสองตัวเลขประกอบกันแทนที่จะคาดหวังว่าจะตรงกันเป๊ะ

ธุรกิจที่ปิดยอดผ่าน LINE อย่างเดียวไม่มีเว็บไซต์อีคอมเมิร์ซ ยังต้องสนใจเรื่องนี้ไหม

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

ควรตรวจสอบความซ้ำของ Transaction บ่อยแค่ไหน

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

ลองตรวจด้วยตัวเอง

Event Deduplication Debugger

ใส่ browser event กับ server event ของคุณ แล้วดูว่าแพลตฟอร์มจะจับคู่ dedup ให้หรือนับซ้ำ

เช็ก dedup ฟรี

ใช้ฟรี ไม่ต้องสมัคร ไม่เก็บข้อมูลที่คุณกรอก

รู้ว่าโฆษณาเข้า LINE ทำยอดขายจริงแค่ไหน

linli ติดตามลูกค้าตั้งแต่คลิกโฆษณา กดเพิ่มเพื่อน ทักแชท จนปิดการขาย พร้อมส่ง Conversion กลับแพลตฟอร์มโฆษณา เริ่มฟรี 14 วัน

ทดลองใช้ฟรี 14 วัน

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

เว็บมีคนเข้าเพียบ แต่ยอดขายไปโผล่ในแชท LINE จะตามรอยได้ยังไง

เว็บมีคนเข้าเพียบ แต่ยอดขายไปโผล่ในแชท LINE จะตามรอยได้ยังไง

ร้านที่ใช้ WooCommerce แล้วปิดการขายจริงในแชท LINE มักเห็นแค่ครึ่งภาพ บทความนี้เล่าวิธีต่อข้อมูลจากหน้าเว็บไปจนถึง Order ที่ปิดในแชท ให้รู้ว่าแคมเปญไหนสร้างยอดจริง ไม่ใช่แค่คนเข้าเว็บ
ผูก Stripe Payment Event เข้ากับ Campaign ต้นทางก่อนเงินจะหายไปในแชท

ผูก Stripe Payment Event เข้ากับ Campaign ต้นทางก่อนเงินจะหายไปในแชท

ธุรกิจที่ใช้ Stripe รับเงินหลังจากคุยจบในแชท LINE มักมี Event การชำระเงินอยู่ในมือ แต่ยังขาดจุดเชื่อมกลับไปยัง Campaign ที่พาลูกค้ามา บทความนี้อธิบายวิธีต่อสองฝั่งนี้เข้าด้วยกันอย่างมีขอบเขต
เชื่อม Opn Payments แบบ Webhook กับแบบเข้าไปดูเองใน Dashboard ต่างกันตรงไหนตอนผูก Campaign

เชื่อม Opn Payments แบบ Webhook กับแบบเข้าไปดูเองใน Dashboard ต่างกันตรงไหนตอนผูก Campaign

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