← กลับไปหน้าบทความ
LINE Tracking

สลับเบอร์โทร/ปุ่ม LINE บน Landing Page หน้าเดียวใช้หลายแคมเปญ แล้ว Tracking พังยังไง

ทีมบรรณาธิการ linli07 ก.ย. 07:43อัปเดต 07 ก.ย. 07:43อ่าน 4 นาที
สลับเบอร์โทร/ปุ่ม LINE บน Landing Page หน้าเดียวใช้หลายแคมเปญ แล้ว Tracking พังยังไง
บทความนี้จัดทำเพื่อความรู้ ชื่อธุรกิจ ตัวเลข หรือบทสนทนาที่ไม่มีแหล่งอ้างอิงกำกับเป็นกรณีตัวอย่างเพื่ออธิบายแนวคิด ดูรายละเอียดที่ นโยบายกองบรรณาธิการ

สรุปสั้น ๆ

เมื่อ Landing Page หน้าเดียวถูกใช้ซ้ำในหลายแคมเปญแล้วสลับเบอร์โทร/ปุ่มแอด LINE ตามพารามิเตอร์ URL (dynamic number insertion หรือ query param) ปัญหาหลักคือ cache ฝั่ง CDN/เบราว์เซอร์เสิร์ฟเบอร์ผิดให้คนละแหล่งที่มา, JS ที่อ่านพารามิเตอร์ทำงานช้ากว่าคนคลิกจริง และ pixel ที่ผูกกับปุ่มไม่ได้ผูกกับ event listener ตัวใหม่หลัง DOM เปลี่ยน ต้องแก้ที่จุดโหลดข้อมูลก่อน render และ cache-bust ตาม UTM ไม่ใช่แก้ที่ตัวปุ่มอย่างเดียว

เจ้าของธุรกิจหลายคนพยายามประหยัดเวลาด้วยการทำ Landing Page ไว้หน้าเดียว แล้วยิงแอดหลายชุดพร้อมกัน — Facebook คนละแคมเปญ, Google Search, TikTok — โดยตั้งค่าให้หน้าเว็บ "สลับ" เบอร์โทรหรือปุ่มแอด LINE ตามพารามิเตอร์ที่แนบมากับลิงก์ วิธีนี้ประหยัดงานทำหน้าเว็บจริง แต่ก็เป็นจุดที่ tracking พังบ่อยที่สุดจุดหนึ่งที่ผมเจอตอนไล่เคสให้ลูกค้า เพราะมันพังแบบ "เงียบ" — หน้าเว็บยังโหลดได้ ปุ่มยังกดได้ แชทยังเข้า LINE ได้ปกติ แต่ตัวเลขในรายงานฝั่งแอดกลับไม่ตรงกับที่แอดมินเห็นในแชทจริง

อาการที่พบบ่อยคือแคมเปญ A ที่ควรได้เครดิต conversion กลับไม่มีเลย ในขณะที่แคมเปญ B ที่งบน้อยกว่าโชว์ยอดพุ่งผิดปกติ พอไปเช็คในแชท LINE จริงกลับเจอว่าลูกค้าที่ทักมาจริง ๆ มาจากแคมเปญ A แต่ระบบไปนับให้ B เพราะปุ่ม/เบอร์ที่โชว์บนหน้าเว็บตอนนั้นเป็นของ B ทั้งที่คนคลิกมาจากลิงก์ A

บทความนี้จะไล่ทีละจุดว่า dynamic swap แบบนี้พังจากอะไรได้บ้าง วิธีเช็คว่าใช่ปัญหานี้จริงไหม และแนวทางแก้ที่ไม่ต้องทิ้งโครงสร้างหน้าเดียวหลายแคมเปญไป

Dynamic Number/Button Insertion คืออะไร ทำไมธุรกิจถึงใช้

หลักการคือหน้าเว็บอ่านค่าพารามิเตอร์จาก URL (เช่น ?src=fb1 หรือ utm_source=google) แล้วใช้ JavaScript เปลี่ยนเบอร์โทรหรือ href ของปุ่ม "แชท LINE" ให้ชี้ไปยัง LINE OA คนละบัญชี หรือแนบ referral code คนละชุดตามแหล่งที่มา วิธีนี้เกิดจากความต้องการจริง — เจ้าของธุรกิจไม่อยากทำ Landing Page แยกทุกแคมเปญเพราะเสียเวลาคุมคอนเทนต์ให้ตรงกัน และบาง platform (เช่น Google Ads) ก็ชอบ URL ที่ใช้ domain เดียวกันมากกว่าโดเมนย่อยกระจัดกระจาย

ปัญหาคือวิธีนี้ผูกความถูกต้องของข้อมูลไว้กับ "จังหวะเวลา" สามจุดที่ต้องแม่นพร้อมกัน คือ (1) พารามิเตอร์ต้องถูกส่งมาจริงและไม่ถูกตัด (2) JavaScript ต้องรันเสร็จก่อนคนกดปุ่ม และ (3) ค่า cache ของหน้าเว็บต้องไม่เสิร์ฟเวอร์ชันเก่าที่สลับเบอร์ไว้ให้คนละแหล่งที่มาไปแล้ว พลาดจุดใดจุดหนึ่งก็เพียงพอที่จะทำให้ conversion ไปตกอยู่กับแคมเปญผิด

4 จุดที่ระบบสลับเบอร์/ปุ่มพังจริงในทางปฏิบัติ

  • CDN/Browser Cache เสิร์ฟ HTML เก่า — ถ้าใช้ static caching (เช่น Cloudflare cache-everything) หน้าเว็บที่ render เบอร์ไว้ฝั่ง server อาจถูก cache ไว้ตั้งแต่ครั้งแรกที่มีคนเข้า แล้วเสิร์ฟเบอร์เดิมให้ทุกคนหลังจากนั้น ทั้งที่พารามิเตอร์ใน URL ต่างกัน
  • JS ทำงานช้ากว่าที่คนกดปุ่ม — บนมือถือ 4G ที่สัญญาณไม่แรง สคริปต์ที่อ่าน query param แล้วเขียนทับ href อาจยังรันไม่เสร็จตอนคนรีบกดปุ่มแชทจากหน้าที่โหลดเสร็จบางส่วน ปุ่มจึงยังพาไปที่ LINE OA ตั้งต้น (default) แทนที่จะเป็นตัวที่ควรสลับ
  • พารามิเตอร์หายระหว่างทาง — แพลตฟอร์มโฆษณาบางตัว auto-redirect ผ่าน tracking domain ก่อนถึงหน้าเว็บจริง (เช่น click tracker ของ affiliate หรือ shortener) ซึ่งบางตัวไม่ forward query string ทั้งหมด ทำให้ตัวแปรที่หน้าเว็บรอใช้อ่านไม่เจอ แล้ว fallback ไปใช้ค่า default
  • Event listener ผูกกับปุ่มเก่าไม่ใช่ปุ่มใหม่ — บางเว็บใช้ JS สร้าง DOM ปุ่มใหม่ทับของเดิมตอนสลับ แต่ pixel/GTM tag ที่ผูก event ไว้ตอนโหลดหน้าแรกยังจับ element ตัวเก่าอยู่ พอปุ่มถูกแทนที่ event listener ก็หลุดไปด้วย กดปุ่มได้แต่ pixel ไม่ยิง

เช็กลิสต์: อาการแบบไหนบ่งชี้ว่าใช่ปัญหานี้

อาการที่สังเกตได้สาเหตุที่เป็นไปได้มากที่สุด
แคมเปญที่งบน้อยกลับได้ conversion เยอะผิดปกติหน้าเว็บถูก cache ไว้ด้วยเบอร์/ปุ่มของแคมเปญนั้น แล้วเสิร์ฟซ้ำให้ทุกแหล่งที่มา
สัดส่วน conversion ต่างกันมากระหว่างมือถือกับคอมพิวเตอร์JS สลับปุ่มทำงานไม่ทันบนมือถือที่โหลดช้ากว่า
conversion หายไปเฉพาะช่วงที่มีการรีดีไซน์/แก้หน้าเว็บโครงสร้าง DOM เปลี่ยน ทำให้ event listener หรือ selector ที่ผูกไว้เดิมหาปุ่มไม่เจอ
ลูกค้าทักมาจาก LINE OA ผิดบัญชีเมื่อเทียบกับแอดที่คลิกปุ่มสลับไปที่ OA ผิดเพราะพารามิเตอร์ไม่ถูกส่งต่อผ่าน redirect ระหว่างทาง

วิธีวินิจฉัยด้วยตัวเองก่อนโทรหาทีมพัฒนา

  1. เปิด Landing Page ในโหมด Incognito แล้วแปะ URL พร้อมพารามิเตอร์ของแต่ละแคมเปญทีละอัน ดูว่าปุ่ม/เบอร์เปลี่ยนตามจริงหรือไม่ในหน้าจอแรกที่โหลดเสร็จ (ไม่ใช่รอ 5 วินาทีแล้วค่อยดู)
  2. เปิด DevTools แท็บ Network แล้วกรองดูว่า request แรกที่ได้ HTML กลับมามีสถานะ 200 จาก origin server หรือ 200 (from disk cache)/(from memory cache) — ถ้าเป็น cache ให้สงสัยปัญหาข้อ 1 ก่อน
  3. จำลองเน็ตช้าด้วย throttling เป็น Slow 3G ใน DevTools แล้วลองกดปุ่มทันทีที่หน้าเว็บพอมองเห็นได้ (ไม่รอโหลดครบ) ถ้าปุ่มยังพาไปที่ default เดิม แปลว่า race condition ระหว่าง JS กับพฤติกรรมคนกดจริง
  4. ลองคลิกลิงก์แอดจริงจากอุปกรณ์อื่น (ไม่ใช่ลิงก์ preview ในตัวจัดการแอด) แล้วดูว่า URL ที่ landing บนเบราว์เซอร์ยังมีพารามิเตอร์ครบไหม ถ้าหายไปกลางทาง ให้สงสัย redirect/tracking domain ตรงกลาง
  5. ถามแอดมินแชทว่าเห็นค่า referral/source id อะไรในหน้าแชทตอนลูกค้าทักเข้ามา เทียบกับ log ฝั่งแอดว่าตรงกันไหม ถ้าไม่ตรงคือรอยรั่วเกิดก่อนถึงจุดยิง pixel แล้ว

แนวทางแก้ที่ยั่งยืนกว่าการแพตช์ทีละจุด

ทางแก้ระยะสั้นที่หลายทีมทำคือไปไล่แพตช์ selector หรือปรับ timeout ของ JS ให้รอนานขึ้น ซึ่งช่วยได้จริงแต่ไม่ได้แก้ที่ต้นตอ ถ้าอยากให้ระบบมั่นคงในระยะยาว ควรแยกความรับผิดชอบสามชั้นให้ชัด คือชั้น cache, ชั้น routing/redirect, และชั้น attribution

สำหรับ cache ให้ตั้งค่า CDN ไม่ให้ cache หน้าที่มีการ render ตามพารามิเตอร์แบบไดนามิก (bypass cache เมื่อมี query string เฉพาะ) หรือย้าย logic การสลับเบอร์ไปทำฝั่ง client ทั้งหมดแทนการ render ฝั่ง server ตาม request แรก เพื่อไม่ให้ cache จำ HTML ผิดเวอร์ชันไว้

สำหรับ routing ถ้าจำเป็นต้องผ่าน redirect ระหว่างทาง (เช่นจาก short link) ให้ตรวจสอบว่าตัว redirect นั้น forward query string ครบ 100% ไม่ตัดทิ้งบางตัว ปัญหานี้มีอาการคล้ายกับ UTM หายระหว่าง redirect ที่หลายทีมเคยเจอ จึงควรทดสอบทุกครั้งที่เปลี่ยนผู้ให้บริการ shortener และถ้าปุ่มยังกดได้แต่ pixel ไม่ยิงเลย ให้ตรวจสอบเพิ่มเติมว่าไม่ได้เจอปัญหา pixel ไม่ยิง ซ้อนอยู่ด้วย

สำหรับ attribution เอง แนวทางที่มั่นคงกว่าการพึ่งปุ่มสลับอย่างเดียวคือฝัง พารามิเตอร์อ้างอิงไว้ใน LINE OA link เอง (เช่นใช้ referral code ต่อท้าย OA link ตามแคมเปญ) แล้วให้แอดมินหรือระบบฝั่งหลังบันทึกค่านั้นทันทีที่แชทเปิด แทนที่จะพึ่งพา JS หน้าเว็บอย่างเดียวเป็นจุดตัดสินว่าลูกค้ามาจากไหน

ตัวอย่างสมมติ: ร้านเฟอร์นิเจอร์สั่งทำที่เจอปัญหานี้

ลองนึกภาพร้านเฟอร์นิเจอร์สั่งทำที่มี Landing Page หน้าเดียว ยิงแอด Facebook 3 แคมเปญ (โซฟา, ห้องครัว, ห้องนอน) พร้อมกัน โดยตั้งให้ปุ่มแชท LINE สลับ OA ตามหมวดที่คลิกมา เดือนแรกเห็นว่าแคมเปญโซฟาได้แชททักเข้ามาเยอะสุดในรายงาน แต่พอเจ้าของร้านนั่งไล่แชทจริงกลับพบว่าคนที่ทักถามเรื่องห้องนอนก็ถูกนับเป็นแคมเปญโซฟาไปด้วย เพราะพวกเขากดปุ่มก่อนที่ JS จะเปลี่ยนปุ่มให้ทันบนมือถือรุ่นเก่าที่โหลดหน้าเว็บช้า

ผลคือทีมโฆษณาเข้าใจผิดว่าแคมเปญโซฟาทำผลงานดีที่สุด เลยเพิ่มงบให้แคมเปญนั้นต่ออีก 2 สัปดาห์ ในขณะที่แคมเปญห้องนอนซึ่งจริง ๆ แล้วมีคนสนใจไม่น้อยกลับถูกลดงบเพราะตัวเลขดูแย่ ทั้งที่ปัญหาที่แท้จริงคือ tracking ไม่ใช่ตัวสินค้า พอแก้โดยย้าย logic สลับปุ่มมาทำงานทันทีตั้งแต่ first paint (ไม่รอ JS แยกก้อนโหลดทีหลัง) ตัวเลขของทั้งสามแคมเปญก็กระจายตัวใกล้เคียงกับที่แอดมินเห็นในแชทจริงมากขึ้น

ป้องกันไม่ให้ปัญหานี้กลับมาเวลามีแคมเปญใหม่

  • ทุกครั้งที่เพิ่มแคมเปญใหม่ที่ใช้ Landing Page เดิม ให้ทดสอบ URL จริงในโหมด Incognito ก่อนเปิดงบจริงเสมอ ไม่ใช่เชื่อว่าโค้ดเดิมใช้ได้เพราะแคมเปญก่อนหน้าเคยใช้ได้
  • ทำ log ง่าย ๆ (เช่นบันทึกลง Google Sheet ผ่าน webhook) ทุกครั้งที่ JS สลับปุ่มสำเร็จ พร้อม timestamp กับพารามิเตอร์ที่อ่านได้ เพื่อย้อนดูได้ว่าช่วงไหนสลับผิดพลาดบ้าง
  • ตั้งการแจ้งเตือนเมื่อสัดส่วน conversion ของแคมเปญใดแคมเปญหนึ่งเปลี่ยนแปลงผิดปกติเกินเกณฑ์ที่ตั้งไว้ในช่วงเวลาสั้น ๆ เพราะเป็นสัญญาณแรกที่บอกว่า tracking อาจพังโดยไม่มีใครสังเกต
  • พิจารณาว่าจริง ๆ แล้วธุรกิจต้องการ Landing Page แยกตามแคมเปญหรือไม่ ถ้าจำนวนแคมเปญไม่เยอะมาก การแยกหน้าจริง (แม้เนื้อหาคล้ายกัน 90%) มักจะลดความเสี่ยงเรื่อง tracking ได้มากกว่าการพึ่งพา dynamic swap ที่ซับซ้อนขึ้นเรื่อย ๆ

สรุป

การสลับเบอร์โทรหรือปุ่ม LINE บน Landing Page หน้าเดียวเป็นวิธีที่ประหยัดงานจริง แต่แลกมาด้วยความเสี่ยงเรื่อง cache, timing ของ JS, และการ forward พารามิเตอร์ระหว่างทางที่ต้องแม่นพร้อมกันทั้งสามจุด พลาดจุดใดจุดหนึ่งก็ทำให้ตัวเลขในรายงานโฆษณาไม่ตรงกับที่เกิดขึ้นจริงในแชท

ก่อนจะไปเพิ่มงบหรือปรับกลยุทธ์ตามตัวเลขในรายงาน ควรกลับมาเช็คก่อนว่าตัวเลขนั้นสะท้อนความจริงหรือเป็นผลจากปัญหาการสลับปุ่มที่พังอยู่เงียบ ๆ การทดสอบ URL จริงในโหมด Incognito และดูแท็บ Network เป็นวิธีที่เร็วและไม่ต้องรอทีมพัฒนามาช่วยตรวจในขั้นแรก

  • Cache ฝั่ง CDN คือสาเหตุอันดับหนึ่งที่ทำให้หน้าเว็บเสิร์ฟเบอร์/ปุ่มผิดให้คนละแคมเปญ
  • JS ที่สลับปุ่มต้องทำงานให้ทันก่อนคนกด โดยเฉพาะบนมือถือที่เน็ตช้า
  • redirect ระหว่างทางต้อง forward query string ครบ ไม่งั้นพารามิเตอร์หายกลางทาง
  • path แยกตามแคมเปญมักเสถียรกว่า query parameter ในระยะยาว
  • ตั้งการแจ้งเตือนเมื่อสัดส่วน conversion ผิดปกติ จะช่วยจับปัญหานี้ได้เร็วกว่ารอดูรายงานรายเดือน

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

ทำ Landing Page หน้าเดียวหลายแคมเปญยังคุ้มอยู่ไหม ถ้าเจอปัญหาสลับปุ่มพัง

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

จะรู้ได้ยังไงว่าปัญหาอยู่ที่ cache ไม่ใช่ที่ JS

เปิด DevTools แท็บ Network ดูสถานะของ request หน้าแรกว่ามาจาก cache หรือไม่ (from disk cache/memory cache) ถ้าใช่และค่าที่โชว์ไม่ตรงกับพารามิเตอร์ล่าสุดที่ใส่ แปลว่าปัญหาอยู่ที่ cache ก่อน ถ้า request ไม่ได้มาจาก cache แต่ปุ่มยังผิด ให้สงสัยที่ตัว JS หรือ timing แทน

ควรใช้ query parameter หรือ path แยกดีกว่าสำหรับสลับ OA ตามแคมเปญ

path แยก (เช่น /sofa กับ /bedroom) มักเสถียรกว่า query parameter เพราะไม่เสี่ยงถูก redirect ตัดพารามิเตอร์ทิ้งระหว่างทาง และ cache ที่ระดับ path ทำได้ตรงไปตรงมากว่า cache ที่ต้องแยกตามพารามิเตอร์ ถ้าจำนวนแคมเปญไม่เยอะเกินไปควรพิจารณาทางนี้ก่อน

แอดมินควรถามอะไรลูกค้าเพื่อช่วยยืนยันแหล่งที่มาเวลา tracking น่าสงสัย

ถามกว้าง ๆ ว่าลูกค้าเห็นโฆษณาชิ้นไหนหรือค้นหาคำว่าอะไรมา ไม่ต้องเจาะจงชื่อแคมเปญเพราะลูกค้าไม่รู้จัก คำตอบแบบ "เห็นในเฟซบุ๊กเรื่องโซฟา" ก็เพียงพอให้เทียบกับ log ฝั่งระบบว่าตรงกันไหม

ถ้าเปลี่ยนไปใช้ path แยกแล้ว จำเป็นต้องเขียนเนื้อหาใหม่ทั้งหมดไหม

ไม่จำเป็น ส่วนใหญ่ใช้เทมเพลตหน้าเดียวกันได้ แค่เปลี่ยนตัวแปรที่ render ตาม path (ชื่อสินค้า, รูปหลัก, ปุ่ม LINE OA) ส่วนเนื้อหาหลักอย่างรีวิวหรือคำถามที่พบบ่อยยังใช้ร่วมกันได้ตามปกติ งานหลักคือย้าย logic จาก query param มาเป็น path routing เท่านั้น

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

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

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

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

ทีมช่วยกันตั้งชื่อ UTM ไม่มีมาตรฐาน แคมเปญเดียวกันกลายเป็นข้อมูลกระจัดกระจายหลายแถว

ทีมช่วยกันตั้งชื่อ UTM ไม่มีมาตรฐาน แคมเปญเดียวกันกลายเป็นข้อมูลกระจัดกระจายหลายแถว

เมื่อหลายคนในทีมช่วยกันตั้งค่า UTM โดยไม่มีมาตรฐานร่วมกัน แคมเปญเดียวกันอาจถูกบันทึกเป็น utm_campaign คนละชื่อ ทำให้รายงานแยกเป็นหลายแถวและดูเหมือนแต่ละแถวมีผลงานต่ำ ทั้งที่รวมกันแล้วคือแคมเปญเดียว บทความนี้แนะนำวิธีวางมาตรฐานและกอบกู้ข้อมูลเก่า
ร้านค้าในต่างจังหวัดที่ลูกค้าใช้เน็ตมือถือสัญญาณอ่อน Conversion หลุดก่อนโหลด Pixel ทัน

ร้านค้าในต่างจังหวัดที่ลูกค้าใช้เน็ตมือถือสัญญาณอ่อน Conversion หลุดก่อนโหลด Pixel ทัน

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

ทำไมยิงแอดเข้า LINE แล้ววัดผลไม่ได้ (และแก้ยังไง)

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