เปิด LIFF ในแอป LINE กับเปิดในเบราว์เซอร์ปกติ เก็บข้อมูลได้ไม่เท่ากัน
สรุปสั้น ๆ
LIFF ที่เปิดในแอป LINE รู้ว่าผู้ใช้คือใครตั้งแต่โหลดหน้า ส่วนที่เปิดในเบราว์เซอร์ปกติต้องผ่านหน้าล็อกอินของ LINE ก่อน จึงมีคนหลุดก่อนระบุตัวตนได้ ตัวเลขสองสภาพแวดล้อมนี้ห้ามรวมเป็นก้อนเดียว ให้บันทึกค่า environment ติดไปกับทุก event แล้วอ่านฟันเนลแยกกัน
สมมติคุณยิงแอดเข้าหน้า LIFF ใบเดียวกัน วันหนึ่งมีคนเปิด 1,000 ครั้ง แต่ในฐานข้อมูลมี event ที่ผูกกับโปรไฟล์ LINE ได้แค่ 820 ครั้ง อีก 180 ครั้งไม่รู้ว่าเป็นใคร ทีมเริ่มเถียงกันว่าระบบบันทึกตกหล่นหรือเปล่า ทั้งที่ระบบไม่ได้พัง คนกลุ่มนั้นเปิดมาจากอีกสภาพแวดล้อมหนึ่ง
ลิงก์ LIFF เป็น URL เดียว แต่ปลายทางมีสองแบบ แบบแรกเปิดข้างในแอป LINE ซึ่งผู้ใช้ล็อกอินค้างอยู่แล้ว แบบที่สองเปิดในเบราว์เซอร์ธรรมดาอย่าง Safari หรือ Chrome ที่ไม่รู้จักเขาเลย หน้าเว็บที่โหลดขึ้นมาหน้าตาเหมือนกัน แต่ข้อมูลที่ได้กลับมาไม่เท่ากัน
ชื่อเมธอดและข้อจำกัดของ API ในบทความนี้อ้างจากเอกสาร LIFF ที่ผมอ่านไว้ เปลี่ยนได้ตามเวอร์ชัน ให้ตรวจซ้ำกับเอกสารล่าสุดก่อนใช้จริง
ลิงก์เดียวกันไปลงได้สองที่ยังไง
คนที่แตะลิงก์ LIFF จากแชทใน LINE หรือจาก Rich Menu จะเปิดในแอป LINE แน่นอน แต่ลิงก์ที่วางในโฆษณา Facebook, Google หรือ TikTok เป็นอีกเรื่อง ผู้ใช้อาจเห็นหน้าเว็บในเว็บวิวของแอปโฆษณาเอง อาจเด้งไปเบราว์เซอร์ประจำเครื่อง หรืออาจถูกส่งเข้าแอป LINE ก็ได้ ขึ้นกับระบบปฏิบัติการ เวอร์ชันแอป และการตั้งค่าเปิดลิงก์ของเครื่องนั้น
เราควบคุมไม่ได้ว่าผู้ใช้จะลงที่ไหน ทำได้แค่รู้แล้วบันทึกไว้ เว็บวิวของแอปอื่นผมนับรวมเป็น “เบราว์เซอร์ปกติ” เพราะผู้ใช้ยังไม่ได้ล็อกอิน LINE ในนั้น
สองสภาพแวดล้อมต่างกันตรงไหน
ตารางนี้สรุปความต่างที่กระทบการวัดผลโดยตรง ส่วนรายละเอียดว่า API ตัวไหนใช้ได้ในเบราว์เซอร์ภายนอกบ้าง ให้ดูตารางความเข้ากันได้ในเอกสารของแต่ละเมธอดอีกครั้ง
| เรื่อง | เปิดในแอป LINE | เปิดในเบราว์เซอร์ปกติ |
|---|---|---|
| สถานะล็อกอิน | ล็อกอิน LINE อยู่แล้ว ไม่ต้องทำอะไร | ยังไม่ล็อกอิน ต้องเรียก liff.login() เด้งไปหน้าล็อกอินของ LINE |
| ตรวจสภาพแวดล้อม | liff.isInClient() ได้ true | liff.isInClient() ได้ false |
| ดึงโปรไฟล์ | liff.getProfile() ใช้ได้เมื่อขอ scope profile ไว้ | ใช้ได้หลังล็อกอินสำเร็จเท่านั้น |
| ส่งข้อความเข้าแชท | liff.sendMessages() ใช้ได้เมื่อมี scope chat_message.write | ใช้ไม่ได้ ต้องออกแบบทางเลือกอื่น |
| คุกกี้และ storage | เป็นพื้นที่ของเว็บวิวใน LINE แยกจากเบราว์เซอร์ที่ผู้ใช้ท่องเว็บปกติ | เป็นของเบราว์เซอร์นั้น และอยู่ใต้กฎความเป็นส่วนตัวของเบราว์เซอร์ |
| สิ่งที่ผู้ใช้เห็น | เห็นหน้าเว็บทันที | เห็นหน้าล็อกอินของ LINE หนึ่งรอบ และเลือกปิดทิ้งได้ |
ติดค่าสภาพแวดล้อมไปกับทุก event
วิธีที่ถูกที่สุดคือไม่ต้องเดาจากตัวเลขย้อนหลัง แต่เก็บคำตอบไว้ตั้งแต่ตอนเกิด event ตามขั้นนี้
- หลัง
liff.init()เสร็จ ให้อ่านliff.isInClient(),liff.isLoggedIn()และliff.getOS()เก็บไว้เป็นตัวแปรของ session - ใส่ค่า
env(app หรือ browser) กับosลงใน payload ของทุก event ตั้งแต่ page_view ไปจนถึงปุ่มส่งฟอร์ม - ส่ง page_view แรกทันทีด้วย visitor id ชั่วคราว อย่ารอล็อกอินเสร็จ ไม่อย่างนั้นคนที่หลุดตรงหน้าล็อกอินจะไม่ถูกนับเลย แล้วค่อยผูก LINE userId ทีหลังเมื่อได้ตัวตน
- ตั้งชื่อ event ของจุดล็อกอินแยกต่างหาก เช่น login_prompt_shown, login_completed, login_abandoned แล้วอ่านรายละเอียดต่อใน เช็กว่าใครล็อกอิน LIFF จริง
ฟันเนลที่แยกแล้วเล่าเรื่องต่างจากฟันเนลรวม
สมมติฝั่งในแอปส่งฟอร์มได้ 140 ราย ฝั่งเบราว์เซอร์ส่งได้ 30 ราย ถ้ารวมกันจะได้ 17% ซึ่งดูเป็นหน้าฟอร์มธรรมดา แต่พอแยกจะเห็นว่าฝั่งในแอปได้ 20% (140 จาก 700) ส่วนฝั่งเบราว์เซอร์ที่ผ่านล็อกอินแล้วส่งฟอร์มได้ 25% (30 จาก 120) คนที่หายไปคือ 180 จาก 300 หรือ 60% ซึ่งหลุดที่หน้าล็อกอิน ไม่ได้หลุดที่หน้าฟอร์ม
ข้อสรุปจึงต่างกันมาก ถ้าอ่านจากตัวเลขรวม คุณจะไปแก้ดีไซน์ฟอร์ม แต่จุดที่ควรแก้คือทำให้คนในเบราว์เซอร์เห็นเหตุผลว่าทำไมต้องล็อกอิน หรือหาทางให้ลิงก์ในโฆษณาพาเข้าแอป LINE ตรง ๆ ดูแนวทางการพาเข้าแอปได้ใน Deep Link เปิดใน LINE
สี่ข้อสรุปผิดที่เกิดจากการรวมตัวเลขสองฝั่ง
- “หน้า LIFF แปลงต่ำ” ทั้งที่คนในแอปแปลงปกติ ส่วนที่ฉุดคือคนในเบราว์เซอร์ที่ตายตรงหน้าล็อกอิน
- “ระบบบันทึกตกหล่น” ทั้งที่ event ถูกบันทึกครบ เพียงแต่ฝั่งเบราว์เซอร์ยังไม่มี userId ให้ผูก
- “ผู้ใช้ Android สนใจน้อยกว่า” ทั้งที่ Android อาจแค่ถูกเปิดในเบราว์เซอร์มากกว่า iOS ตามวิธีจัดการลิงก์ของเครื่อง ต้องดูค่า env คู่กับ os
- “ปุ่มส่งข้อความเข้าแชทพัง” ทั้งที่ sendMessages ใช้ไม่ได้นอกแอป LINE ตั้งแต่ต้น ถ้าฟีเจอร์ของคุณพึ่งปุ่มนี้ ต้องมีทางสำรองสำหรับฝั่งเบราว์เซอร์ ดูตัวอย่างหน้าที่ต้องมีใน LIFF แคตตาล็อกใน LINE
ทดสอบเส้นทางเข้าบนเครื่องจริงก่อนปล่อยแอด
ก่อนใส่งบ ให้เปิดลิงก์ LIFF จากทุกจุดที่จะใช้จริง คือแชท LINE โฆษณาแต่ละแพลตฟอร์ม QR ที่สแกนด้วยกล้องมือถือ และเดสก์ท็อป บน iPhone กับ Android อย่างน้อยอย่างละเครื่อง แล้วจดว่าแต่ละเส้นทางได้ค่า env อะไร เส้นทางไหนตกเป็นเบราว์เซอร์ ก็ตัดสินใจได้ว่าจะยอมรับหน้าล็อกอินหรือเปลี่ยนปลายทางโฆษณา
อีกเรื่องคือจำนวนคลิกที่แพลตฟอร์มโฆษณารายงานกับจำนวนคนที่เปิดหน้าจริงมักไม่เท่ากัน ช่องว่างนี้แยกที่มาได้ตามบทความ ยอด Click ใน LIFF กับ Add Friend
สรุป
ข้อที่ต้องทำก่อนเริ่มแอดคือให้ตัวเลขทุกตัวของหน้า LIFF มีคอลัมน์ env กำกับ ถ้ารายงานของคุณยังไม่มี อัตราแปลงที่ดูอยู่ตอนนี้อาจผสมสองกลุ่มที่พฤติกรรมต่างกัน
จากนั้นดูว่าคนฝั่งเบราว์เซอร์หลุดที่ด่านล็อกอินเท่าไหร่ ถ้าหลุดเกินครึ่งก็คุ้มที่จะลงทุนเปลี่ยนปลายทางโฆษณาให้พาเข้าแอป LINE มากกว่าไปปรับดีไซน์หน้าฟอร์ม
- ลิงก์ LIFF เดียวกันตกลงสองสภาพแวดล้อมได้ และข้อมูลที่ได้ไม่เท่ากัน
- บันทึก env กับ os ติดทุก event ตั้งแต่ page_view แรก
- แยกฟันเนลก่อนอ่านอัตราแปลง และวัดด่านล็อกอินเป็นขั้นของตัวเอง
- ทดสอบเส้นทางเข้าบนเครื่องจริงทุกจุดที่ใช้ยิงแอด
คำถามที่พบบ่อย
ลิงก์ LIFF ที่วางในโฆษณา Facebook จะเปิดในแอป LINE หรือเบราว์เซอร์?
ตอบแน่นอนไม่ได้ เพราะขึ้นกับระบบปฏิบัติการ แอปโฆษณา และการตั้งค่าเปิดลิงก์ของเครื่องผู้ใช้ วิธีที่ตรวจได้คือเปิดทดสอบบนเครื่องจริงแล้วดูค่า liff.isInClient() จากนั้นบันทึกค่านี้ไปกับทุก event เพื่อให้ข้อมูลจริงเป็นตัวบอก
ต้องให้ผู้ใช้ล็อกอินทุกครั้งที่เปิดในเบราว์เซอร์ไหม?
ไม่จำเป็นเสมอไป ถ้าผู้ใช้เคยล็อกอินไว้และ session ยังไม่หมดอายุ SDK จะพาผ่านไปได้ แต่ระยะเวลาที่ session อยู่และพฤติกรรมของแต่ละเบราว์เซอร์ให้ตรวจจากเอกสารและทดสอบเอง อย่าสมมติว่าคนเคยล็อกอินแล้วจะไม่เจอหน้านี้อีก
ถ้าเก็บ event ก่อนล็อกอินจะผูกกับ userId ย้อนหลังได้ไหม?
ได้ ถ้าส่ง visitor id ชั่วคราวไปกับทุก event ตั้งแต่โหลดหน้า แล้วส่งคู่ visitor id กับ userId ตอนล็อกอินสำเร็จ จะย้อนผูก event เก่าได้ แต่เฉพาะ session เดียวกัน ข้ามเครื่องไม่ได้
ฝั่งเบราว์เซอร์มีข้อมูลน้อยกว่า ควรตัดทิ้งไปเลยไหม?
ไม่ควรตัด เพราะนี่คือคนที่คลิกโฆษณาจริงและคุณจ่ายเงินให้เขาแล้ว ให้ดูเป็นฟันเนลอีกเส้นที่มีด่านล็อกอินเพิ่มเข้ามา แล้ววัดว่าด่านนั้นทำให้เสียคนไปกี่เปอร์เซ็นต์
เปิดจากเดสก์ท็อปนับเป็นเบราว์เซอร์ปกติหรือเปล่า?
โดยทั่วไปนับเป็นภายนอกแอปและต้องล็อกอินเช่นกัน แต่พฤติกรรมของ LINE บนเดสก์ท็อปอาจต่างออกไป ให้ทดสอบจริงและใช้ค่า os จาก liff.getOS() แยกกลุ่มในรายงาน
ลองตรวจด้วยตัวเอง
LIFF Campaign Parameter Lab
ทดสอบว่า UTM และพารามิเตอร์แคมเปญของคุณรอดผ่าน liff.state เข้าแอปหรือหายกลางทาง
ทดสอบ LIFF URLใช้ฟรี ไม่ต้องสมัคร ไม่เก็บข้อมูลที่คุณกรอก
อ่านต่อแบบเจาะลึก
รู้ว่าโฆษณาเข้า LINE ทำยอดขายจริงแค่ไหน
linli ติดตามลูกค้าตั้งแต่คลิกโฆษณา กดเพิ่มเพื่อน ทักแชท จนปิดการขาย พร้อมส่ง Conversion กลับแพลตฟอร์มโฆษณา เริ่มฟรี 14 วัน
ทดลองใช้ฟรี 14 วัน