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

เช็กให้ชัดว่าใครล็อกอินเข้า LIFF จริง ก่อนเชื่อตัวเลขในรายงาน

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

สรุปสั้น ๆ

การวัด Login ใน LIFF ต้องแยกให้ออกระหว่าง ‘เปิดหน้าจอขอสิทธิ์’ กับ ‘ล็อกอินสำเร็จจริง’ และต้องตรวจ Permission, Scope และ Identifier ให้ครบก่อน Launch เพราะถ้าตั้งผิดจุดเดียว ตัวเลข Login ที่เห็นในรายงานอาจสูงหรือต่ำกว่าความจริงได้มาก

ทีมเทคนิคของธุรกิจหนึ่งตั้งค่า LIFF เสร็จก่อน Launch แคมเปญใหญ่หนึ่งวัน แล้วรายงานกับทีมการตลาดว่า ‘Login ทำงานปกติ’ เพราะทดสอบเปิดหน้าจอขอสิทธิ์แล้วเห็นว่าแสดงผลถูกต้อง แต่พอแคมเปญเริ่มยิงจริง ตัวเลข Login Completed ในระบบกลับต่ำผิดปกติ ทั้งที่คนกดเข้า LIFF เยอะมาก

ปัญหาที่ตามมาคือทีมการตลาดเอาตัวเลข Login ต่ำนี้ไปสรุปว่าครีเอทีฟไม่ดึงดูดพอ ทั้งที่ปัญหาจริงคือการตั้งค่า Scope ของ LINE Login ผิด ทำให้ Event Login Completed ไม่ถูกยิงแม้ผู้ใช้จะกดยืนยันสำเร็จแล้วก็ตาม

บทความนี้จะพาไล่ดูสิ่งที่ควรตรวจก่อน Launch เพื่อให้มั่นใจว่าตัวเลขการวัด Login ใน LIFF สะท้อนความจริง ไม่ใช่ตัวเลขที่ผิดเพี้ยนจากการตั้งค่าที่พลาดไปตั้งแต่ต้น

Login ใน LIFF หมายถึงอะไรกันแน่

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

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

ลำดับคำสั่ง SDK ที่ต้องเรียงให้ถูกก่อนนับว่า Login สำเร็จ

ในโค้ดจริง ลำดับที่ถูกต้องเริ่มจาก liff.init({ liffId }) แล้วรอ Promise resolve ก่อนเรียกฟังก์ชันอื่นใด ๆ จากนั้นเช็ก liff.isLoggedIn() ถ้าเป็น false ให้เรียก liff.login({ redirectUri }) เพื่อพาไปหน้ายืนยันสิทธิ์ เมื่อผู้ใช้กดยืนยันแล้วเบราว์เซอร์จะ Redirect กลับมาที่ redirectUri พร้อม Session ที่ล็อกอินแล้ว ตรงจุดนี้เองที่ควรเรียก liff.getProfile() อีกครั้งเพื่อยืนยันว่าได้ userId กลับมาจริง ไม่ใช่แค่เช็กว่า Redirect กลับมาสำเร็จเฉย ๆ เพราะบางกรณี Redirect กลับมาได้ แต่ getProfile() ยัง throw Error อยู่จากปัญหา Session ฝั่ง LINE เอง

อีกจุดที่มักสับสนคือความต่างระหว่าง liff.getIDToken() กับ liff.getAccessToken() ตัว ID Token เป็น JWT ที่ใช้ยืนยันตัวตนของผู้ใช้และตรวจสอบได้ฝั่งเซิร์ฟเวอร์โดยไม่ต้องเรียก LINE API เพิ่ม ส่วน Access Token ใช้เรียก LINE API อื่น ๆ ต่อ เช่น ดึงข้อมูลโปรไฟล์แบบเต็ม ถ้าระบบหลังบ้านต้องการตรวจสอบว่า Login มาจาก LIFF จริงไม่ใช่การปลอมคำขอ ควรตรวจสอบ ID Token ฝั่งเซิร์ฟเวอร์เพิ่มอีกชั้น ไม่ใช่เชื่อแค่ค่าที่ฝั่ง Client ส่งมาบอกว่า Login สำเร็จแล้ว

LIFF Endpoint URL ไม่ตรงกัน ทำให้ Login ไม่เกิดตั้งแต่ต้น

สาเหตุหนึ่งที่ทำให้ตัวเลข Login Completed ต่ำผิดปกติทั้งที่ยอด Click เข้า LIFF สูง คือ LIFF Endpoint URL ที่ตั้งไว้ใน LINE Developers Console ไม่ตรงกับ URL จริงที่หน้าเว็บถูก Deploy อยู่ เช่น ตั้งไว้เป็น https ตัวหนึ่งแต่ระบบ Deploy จริงเปลี่ยนไปใช้ Domain อื่นหลัง Migrate เซิร์ฟเวอร์ กรณีนี้ผู้ใช้จะเห็นข้อความ Error ทำนอง LIFF ID และ URL ไม่ตรงกันทันทีที่เปิดหน้า โดยที่หน้าจอขอสิทธิ์ Login ไม่มีโอกาสแสดงผลเลยด้วยซ้ำ

ทีมการตลาดที่ไม่รู้รายละเอียดนี้มักเข้าใจผิดว่าปัญหาอยู่ที่ครีเอทีฟหรือกลุ่มเป้าหมายของแคมเปญ ทั้งที่จริงแล้วเป็นปัญหาการตั้งค่าฝั่งเทคนิคล้วน ๆ วิธีป้องกันคือทุกครั้งที่มีการเปลี่ยน Domain หรือ Deploy เว็บไซต์ใหม่ ต้องตรวจ LIFF Endpoint URL ในหน้า Console ควบคู่ไปด้วยเสมอ ไม่ใช่ตรวจแค่ว่าเว็บไซต์เปิดได้ปกติ

วิธีตรวจที่เร็วที่สุดคือเปิดลิงก์ LIFF ผ่าน line://app/{liffId} จากมือถือจริงทันทีหลัง Deploy ทุกครั้ง ถ้าเจอ Error เรื่อง URL ไม่ตรงกันให้แก้ที่ Console ก่อนปล่อยงบโฆษณาเข้าแคมเปญ เพราะการปล่อยงบไปพร้อมกับปัญหานี้เท่ากับเสียเงินค่าแอดไปกับ Traffic ที่ไม่มีทางกลายเป็น Lead ได้เลยสักคนเดียว

ตรวจ Scope และ Permission ก่อนเสมอ

LINE Login มีการกำหนด Scope ว่าจะขอสิทธิ์อะไรบ้าง เช่น Profile หรือ OpenID ถ้า Scope ที่ตั้งไว้ไม่ตรงกับสิ่งที่แอปพลิเคชันต้องใช้จริง อาจทำให้ Login สำเร็จในมุมของผู้ใช้ แต่ระบบฝั่งธุรกิจไม่ได้รับข้อมูลที่ต้องใช้ต่อ ทำให้ดูเหมือน Login ล้มเหลวทั้งที่จริงแล้วผู้ใช้กดยืนยันไปแล้ว

ก่อน Launch ควรตรวจ Channel Permission ของ LINE Login ให้ตรงกับ Scope ที่โค้ดเรียกใช้จริง เพราะบางครั้งการตั้งค่าฝั่ง Console กับโค้ดที่ทีมพัฒนาเขียนไม่ตรงกัน ซึ่งเป็นสาเหตุอันดับต้น ๆ ที่ทำให้ Login Completed ไม่ถูกบันทึก

ผูก Identifier ต้นทางเข้ากับ Login ให้ถูกจุด

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

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

ในทางปฏิบัติ วิธีที่ทำงานได้เสถียรกว่าการอ่านค่าจาก URL Query String ตรง ๆ คือเก็บ Identifier ลง sessionStorage ไว้ตั้งแต่ตอนหน้าเว็บโหลดครั้งแรก ก่อนที่ผู้ใช้จะถูก Redirect ไปหน้ายืนยันสิทธิ์ของ LINE Login เพราะเมื่อ liff.login({ redirectUri }) พาผู้ใช้ออกจากหน้าเว็บไปแล้วกลับมาอีกครั้ง URL อาจไม่มี Query String เดิมติดกลับมาด้วย ถ้าโค้ดพึ่งอ่านค่าจาก URL อย่างเดียวโดยไม่สำรองไว้ก่อน จะเจอปัญหา Identifier หายไปตอน Redirect กลับมาทุกครั้งที่ผู้ใช้ต้องผ่านหน้าจอขอสิทธิ์จริง

รายการตรวจก่อน Launch แคมเปญที่ใช้ LIFF Login

ตารางนี้สรุปประเด็นหลักที่ควรตรวจก่อนเปิดแคมเปญ พร้อมสิ่งที่ต้องดูเป็นหลักฐานว่าผ่านจริง

สิ่งที่ต้องตรวจวิธีตรวจสัญญาณว่าผ่าน
Scope ตรงกับที่โค้ดเรียกเทียบ Console กับโค้ดจริงไม่มี Error เรื่องสิทธิ์ตอนทดสอบ
Login Completed ถูกยิงจริงทดสอบล็อกอินจากอุปกรณ์จริงเห็น Event ในระบบหลังยืนยันสำเร็จ
Identifier ติดไปกับ Loginเช็กค่าที่แนบไปกับ EventIdentifier ไม่ว่างเปล่า
ทดสอบทั้ง iOS และ Androidเปิดจากสองระบบปฏิบัติการผลลัพธ์เหมือนกันทั้งสองฝั่ง

ข้อผิดพลาดที่พบบ่อยตอนตั้งค่า Login

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

อีกข้อผิดพลาดคือทดสอบแค่บนคอมพิวเตอร์ผ่านเบราว์เซอร์จำลอง LIFF ซึ่งพฤติกรรมบางอย่างต่างจากการเปิดจริงในแอป LINE บนมือถือ ควรทดสอบบนอุปกรณ์จริงเสมอก่อน Launch แคมเปญที่มีงบสูง และควรเข้าใจภาพรวมของการนับ Attribution บน LINEควบคู่กันไป เพราะ Login ที่วัดผิดจะพา Attribution ทั้งเส้นทางผิดตามไปด้วย

ขั้นตอนยืนยันว่า Login วัดถูกก่อนเปิดงบจริง

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

  1. ล้างสิทธิ์ที่เคยให้ไว้ก่อน แล้วทดสอบล็อกอินใหม่เหมือนเป็นผู้ใช้ครั้งแรก
  2. ตรวจว่า Event Login Completed ปรากฏในระบบหลังยืนยันสำเร็จภายในไม่กี่วินาที
  3. ตรวจว่า Identifier ต้นทางติดไปกับ Event นั้นถูกต้องตรงกับลิงก์ที่ทดสอบ
  4. ทดสอบซ้ำอีกครั้งหลังผ่านไปหนึ่งวัน เพื่อดูว่าพฤติกรรม Cache หรือ Session เดิมไม่ทำให้ผลลัพธ์เปลี่ยนไป

หลัง Launch แล้วยังต้องตรวจซ้ำไหม

ควรตรวจซ้ำทุกครั้งที่มีการเปลี่ยนแปลงฝั่งเว็บไซต์หรือฝั่ง LIFF แม้จะเป็นการเปลี่ยนเล็กน้อยอย่างการอัปเดตข้อความบนหน้า Landing Page ก็ตาม เพราะบางครั้งการแก้โค้ดจุดหนึ่งอาจกระทบลำดับการยิง Event โดยที่ทีมไม่ได้ตั้งใจ และการตรวจสถานะบัญชี LINE Developer ตามแนวทาง Audit ตอน Onboarding ระบบ Trackingเป็นระยะก็ช่วยจับความผิดปกติได้เร็วขึ้น รวมถึงควรตรวจโครงสร้าง Event ฝั่ง GA4ให้สอดคล้องกันด้วยถ้าส่งข้อมูลชุดเดียวกันเข้าไปทั้งสองระบบ

สรุป

ตัวเลข Login ใน LIFF ผิดเพี้ยนได้ง่ายจากการตั้งค่า Scope, Permission และ Identifier ที่ไม่ตรงกัน การตรวจให้ครบก่อน Launch ช่วยป้องกันไม่ให้ทีมการตลาดตัดสินใจผิดจากตัวเลขที่ไม่สะท้อนความจริง

การตรวจซ้ำหลัง Launch ก็สำคัญไม่แพ้กัน เพราะการเปลี่ยนแปลงเล็กน้อยฝั่งเว็บไซต์หรือ LIFF สามารถกระทบลำดับการยิง Event ได้โดยที่ทีมไม่รู้ตัว โดยเฉพาะการเปลี่ยน Domain หรือ Deploy ใหม่ที่มักลืมตรวจ LIFF Endpoint URL ตามไปด้วย

  • แยกให้ชัดระหว่าง ‘เปิดหน้าจอขอสิทธิ์’ กับ ‘Login สำเร็จจริง’ สองเหตุการณ์นี้ไม่เท่ากัน
  • ตรวจ Scope, Permission และ Identifier ให้ตรงกันก่อน Launch ทุกครั้ง
  • ทดสอบด้วยบัญชีใหม่บนอุปกรณ์จริงทั้ง iOS และ Android ไม่ใช่บัญชีที่เคยให้สิทธิ์ไปแล้ว
  • ตรวจ LIFF Endpoint URL ทุกครั้งที่ Deploy เว็บไซต์ใหม่ เพราะ URL ไม่ตรงกันทำให้ Login ไม่เกิดขึ้นเลยตั้งแต่ต้น

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

ทำไมทดสอบ Login แล้วผ่าน แต่พอเปิดแคมเปญจริงตัวเลขกลับต่ำ

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

Scope ของ LINE Login ควรขอเท่าไหร่ถึงจะพอ

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

เปิดหน้าจอขอสิทธิ์แล้ว แปลว่า Login สำเร็จหรือยัง

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

ต้องทดสอบทั้ง iOS และ Android จริงหรือ

ควรทดสอบทั้งสองระบบ เพราะพฤติกรรมของ In-app Browser และการจัดการ Session ระหว่างสองระบบปฏิบัติการมีความต่างกันในบางกรณี การทดสอบแค่ระบบเดียวอาจพลาดปัญหาที่เกิดเฉพาะอีกฝั่ง

ถ้า Identifier ไม่ติดไปกับ Login Completed แก้ยังไง

ต้องตรวจลำดับโค้ดว่าอ่านค่า Identifier ก่อนยิง Event หรือหลังยิง Event ถ้าอ่านช้ากว่าต้องปรับให้ Identifier พร้อมใช้งานก่อนเรียก Event เสมอ

ควรตรวจ Login ซ้ำบ่อยแค่ไหนหลัง Launch แล้ว

ควรตรวจทุกครั้งที่มีการแก้ไขเว็บไซต์หรือ LIFF แม้เป็นการแก้เล็กน้อย และควรสุ่มตรวจเป็นระยะแม้ไม่มีการเปลี่ยนแปลงใด ๆ เพื่อจับความผิดปกติจากฝั่งแพลตฟอร์ม LINE เองที่อาจเปลี่ยนแปลงได้เช่นกัน

ทำไมยอด Click เข้า LIFF สูง แต่ Login Completed แทบเป็นศูนย์

ให้สงสัย LIFF Endpoint URL ที่ตั้งไว้ใน Console ไม่ตรงกับ URL จริงที่เว็บไซต์ถูก Deploy อยู่เป็นอันดับแรก เพราะกรณีนี้ผู้ใช้จะเจอ Error ทันทีที่เปิดหน้า หน้าจอขอสิทธิ์ Login จะไม่แสดงผลเลยด้วยซ้ำ ไม่ใช่ปัญหาครีเอทีฟหรือกลุ่มเป้าหมายอย่างที่หลายทีมเข้าใจผิด

getIDToken() กับ getAccessToken() ต่างกันยังไง ต้องใช้ตัวไหนตรวจ Login

ID Token เป็น JWT ที่ตรวจสอบตัวตนผู้ใช้ได้ฝั่งเซิร์ฟเวอร์โดยตรง เหมาะกับการยืนยันว่า Login มาจาก LIFF จริง ส่วน Access Token ใช้เรียก LINE API อื่นต่อ ถ้าต้องการความน่าเชื่อถือของข้อมูล Login ควรตรวจสอบ ID Token ฝั่งเซิร์ฟเวอร์เพิ่ม ไม่ใช่เชื่อค่าที่ฝั่ง Client รายงานมาเพียงอย่างเดียว

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

LIFF Campaign Parameter Lab

ทดสอบว่า UTM และพารามิเตอร์แคมเปญของคุณรอดผ่าน liff.state เข้าแอปหรือหายกลางทาง

ทดสอบ LIFF URL

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

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

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

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

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

ทำไมคนสแกน QR code หน้าร้านแล้วเข้า LINE แต่ระบบนับไม่ได้สักคน

ทำไมคนสแกน QR code หน้าร้านแล้วเข้า LINE แต่ระบบนับไม่ได้สักคน

QR Code บนโต๊ะร้าน ใบปลิว หรือบูธงาน มักไม่มี Tracking ติดไปด้วยเลย บทความนี้อธิบายว่าทำไมช่องทางออฟไลน์วัดยากกว่าออนไลน์ พร้อมวิธีออกแบบ URL ให้ GTM จับได้ตั้งแต่คลิกแรก
ทักเข้ามาเยอะทุกวันแต่ไล่ไม่ทันว่าใครมาจากแคมเปญไหน แก้ยังไง

ทักเข้ามาเยอะทุกวันแต่ไล่ไม่ทันว่าใครมาจากแคมเปญไหน แก้ยังไง

ธุรกิจที่ยิงหลายแคมเปญพร้อมกันมักไล่ไม่ทันว่าแชทที่เข้ามาแต่ละวันมาจากไหน บทความนี้พาวาง LINE Messaging API Tracking ให้ตอบคำถามนี้ได้อย่างเป็นระบบ
ลูกค้าบล็อกหรือเลิกติดตามเราไปแล้ว จะรู้ได้ยังไงว่าใครหายไปบ้าง

ลูกค้าบล็อกหรือเลิกติดตามเราไปแล้ว จะรู้ได้ยังไงว่าใครหายไปบ้าง

ลูกค้าที่บล็อก LINE OA จะหายไปจากแชทเงียบ ๆ โดยไม่บอกเหตุผล บทความนี้พาดูว่า LINE Webhook Unfollow Event จับเหตุการณ์นี้ได้แค่ไหน แล้วเอาไปใช้วิเคราะห์อะไรได้บ้าง