การติดตามที่มาของเพื่อนใหม่
ภาพรวม
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)
- รับ payload ที่ประกอบด้วย
campaignId,lineOaId,organizationIdและรายการrefIds - Insert รายการ
refลงตารางfriend_track_refเป็นชุด ชุดละ 1,000 รายการ รายการที่ซ้ำกับของเดิมจะถูกนับเป็นskippedโดยไม่ถือเป็นข้อผิดพลาด - สรุปจำนวน
insertedและskippedแล้วอัปเดตสถานะการนำเข้ากลับไปที่friend_track_campaignเพื่อให้หน้าจอ CMS แสดงผลได้
การทำ Attribution เมื่อมีผู้กดเพิ่มเพื่อน
ขั้นตอนนี้ถูกเรียกจาก handler ของ LINE webhook เมื่อได้รับ event ประเภท follow
- เรียก
runFriendTrackAttributionเพื่อเริ่มกระบวนการ - ค้นหาเหตุการณ์
liff_visitล่าสุดของผู้ใช้รายนั้น พร้อมโหลดแคมเปญfriend_track_campaignที่ผูกอยู่ - หากพบ จะบันทึกเหตุการณ์ประเภท
followลงตารางfriend_track_eventพร้อมข้อมูลแคมเปญ ชื่อผู้ใช้ รูปโปรไฟล์ และค่าrefต้นทาง - หากแคมเปญกำหนด
attribute_configหรือref_attribute_keyไว้ ระบบจะเขียนค่าrefลงเป็น custom attribute ของผู้ใช้ เช่นsource = facebook-ads-janทำให้นำไปใช้แบ่งกลุ่มผู้ใช้ตามช่องทางได้ทันที - การ 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.go | RefImportService.ProcessImport นำเข้ารายการ ref เป็นชุดละ 1,000 รายการ ผ่านโครงสร้าง RefImportPayload |
internal/friendtrack/service.go | Service.GetLastAttribution, Service.RecordFollowEvent, Service.RecordUnfollowEvent และ enum ของประเภทเหตุการณ์กับสถานะแคมเปญ |
internal/friendtrack/consumer.go | Consumer.HandleImport — consumer ของคิว friend_track_ref_import |
internal/lineoa/webhook.go | runFriendTrackAttribution, handleFollowEvent, handleUnfollowEvent, selectLineUserAttribute |
cmd/worker/integration.go | friendTrackForLineOa — 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 อยู่แล้ว