Skip to main content

การติดตามที่มาของเพื่อนใหม่

ภาพรวม

Friend Track ตอบคำถามว่า "เพื่อนใหม่คนนี้มาจากช่องทางไหน" องค์กรสามารถแจกลิงก์หรือ QR Code ที่ฝังค่า ref ต่างกันตามช่องทาง เช่น โฆษณา Facebook, ป้ายหน้าร้าน หรือบูธในงานอีเวนต์ เมื่อผู้ใช้เปิด LIFF ผ่านลิงก์นั้นแล้วกดเพิ่มเพื่อน ระบบจะผูกเหตุการณ์ follow เข้ากับแคมเปญต้นทางให้อัตโนมัติ

ฝั่ง Worker รับผิดชอบสองส่วน คือ (1) นำเข้ารายการ ref จำนวนมากจากไฟล์ CSV ผ่านคิว friend_track_ref_import และ (2) บันทึกเหตุการณ์ follow / unfollow พร้อมข้อมูล attribution ในระหว่างการประมวลผล webhook

Business Flow

การนำเข้ารายการ ref (คิว friend_track_ref_import)

  1. รับ payload ที่ประกอบด้วย campaignId, lineOaId, organizationId และรายการ refIds
  2. Insert รายการ ref ลงตาราง friend_track_ref เป็นชุด ชุดละ 1,000 รายการ รายการที่ซ้ำกับของเดิมจะถูกนับเป็น skipped โดยไม่ถือเป็นข้อผิดพลาด
  3. สรุปจำนวน inserted และ skipped แล้วอัปเดตสถานะการนำเข้ากลับไปที่ friend_track_campaign เพื่อให้หน้าจอ CMS แสดงผลได้

การทำ Attribution เมื่อมีผู้กดเพิ่มเพื่อน

ขั้นตอนนี้ถูกเรียกจาก handler ของ LINE webhook เมื่อได้รับ event ประเภท follow

  1. เรียก runFriendTrackAttribution เพื่อเริ่มกระบวนการ
  2. ค้นหาเหตุการณ์ liff_visit ล่าสุดของผู้ใช้รายนั้น พร้อมโหลดแคมเปญ friend_track_campaign ที่ผูกอยู่
  3. หากพบ จะบันทึกเหตุการณ์ประเภท follow ลงตาราง friend_track_event พร้อมข้อมูลแคมเปญ ชื่อผู้ใช้ รูปโปรไฟล์ และค่า ref ต้นทาง
  4. หากแคมเปญกำหนด attribute_config หรือ ref_attribute_key ไว้ ระบบจะเขียนค่า ref ลงเป็น custom attribute ของผู้ใช้ เช่น source = facebook-ads-jan ทำให้นำไปใช้แบ่งกลุ่มผู้ใช้ตามช่องทางได้ทันที
  5. การ INSERT ลง friend_track_event จะทำให้ Postgres trigger ยิง pg_notify('friend_track_event_inserted') ต่อไปยัง pg-listener แล้วเข้าคิว friend_track_event_trigger เพื่อให้ Trigger Engine ประเมินกฎที่มี source_type = 'friend_track_event'

การเลิกติดตาม

เมื่อได้รับ event unfollow ระบบจะบันทึกเหตุการณ์ประเภท unfollow ลงตารางเดียวกัน เพื่อใช้คำนวณอัตราการเลิกติดตามของแต่ละแคมเปญ

ไฟล์และฟังก์ชันหลัก

ไฟล์หน้าที่
internal/friendtrack/refimport.goRefImportService.ProcessImport นำเข้ารายการ ref เป็นชุดละ 1,000 รายการ ผ่านโครงสร้าง RefImportPayload
internal/friendtrack/service.goService.GetLastAttribution, Service.RecordFollowEvent, Service.RecordUnfollowEvent และ enum ของประเภทเหตุการณ์กับสถานะแคมเปญ
internal/friendtrack/consumer.goConsumer.HandleImport — consumer ของคิว friend_track_ref_import
internal/lineoa/webhook.gorunFriendTrackAttribution, handleFollowEvent, handleUnfollowEvent, selectLineUserAttribute
cmd/worker/integration.gofriendTrackForLineOa — adapter ที่จำกัดชนิดข้อมูลให้เหมาะกับโดเมน lineoa

คิวที่เกี่ยวข้อง: consume friend_track_ref_import บน profile main ส่วนผลของการ INSERT จะไปปรากฏที่คิว friend_track_event_trigger บน profile trigger-worker

จุดเชื่อมต่อกับ Service อื่น

  • cms-api-go — เป็นผู้ส่งงานเข้าคิว เมื่อผู้ดูแลระบบอัปโหลดรายการ ref ของแคมเปญ
  • client-api-go — เป็นผู้บันทึกเหตุการณ์ liff_visit ตอนผู้ใช้เปิด LIFF ผ่านลิงก์ ref ซึ่งเป็นข้อมูลตั้งต้นของการทำ attribution
  • ตารางฐานข้อมูลfriend_track_ref (รายการ ref), friend_track_campaign (ข้อมูลแคมเปญและสถานะการนำเข้า), friend_track_event (เหตุการณ์ liff_visit / follow / unfollow) และ line_user (เขียน custom attribute)
  • Postgres trigger และ pg-listener — ทำให้เหตุการณ์ follow สามารถกระตุ้น workflow ต่อได้
  • ไม่มีการเรียก LINE API โดยตรง เนื่องจากข้อมูลโปรไฟล์ผู้ใช้ได้มาจาก flow ของ webhook อยู่แล้ว