Skip to main content

การติดตามผล (Tracking)

ภาพรวม

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

โครงสร้างประกอบด้วย 3 ตาราง

ตารางหน้าที่
tracking_logบันทึกเหตุการณ์ที่เกิดขึ้น (append-only)
tracking_tokenทะเบียนลิงก์สั้นและปลายทาง
tracking_line_usersกันการนับซ้ำรายบุคคล

โครงสร้างข้อมูลหลัก

tracking_log (model TrackingLog, PK UUID)

ตารางเหตุการณ์แบบ append-only จำแนกเหตุการณ์ด้วย enum หลายชุด

  • service (enum TrackingService) — webhook หรือ redirect บอกว่าเหตุการณ์เข้ามาทางไหน
  • action_type (enum ActionType) — read / click / send
  • type (enum TrackingType) — message / uri / asset / postback
  • content_type (enum ContentType) — rich_menu / campaign / auto_response / trigger_rule / lead_generation

การอ้างถึงต้นทางใช้คอลัมน์ campaign_id, rich_menu_id, rich_menu_action_index, rich_message_id, rich_message_index, auto_response_id, trigger_rule_id และ rich_menu_archive_id

การระบุตัวตนผู้ใช้ใช้ line_uid ร่วมกับ composite FK (line_uid, line_oa_id, organization_id)line_user

ข้อมูลลิงก์ประกอบด้วย redirect_id, token, short_url, original_url, tracking_label, title และ raw_data JSONB พร้อม created_date

ตารางนี้มี composite index รวม 6 ชุด ครอบคลุมมุมมองรายงานทั้งหมด ได้แก่ รายงานต่อผู้ใช้ ต่อแคมเปญ ต่อ rich menu ต่อ service/type และการนับ unique click

tracking_token (model TrackingToken, PK UUID)

ทะเบียนลิงก์สั้น

  • token (unique), destination_url, tracking_label
  • content_type + content_id + action_index — ระบุว่าโทเคนนี้เป็นของปุ่มใดในคอนเทนต์ชิ้นใด
  • line_oa_hash (ใช้ประกอบ URL สาธารณะ), metadata JSONB, expires_at
  • index บน (token, status), (line_oa_id, content_type, content_id) และ (expires_at, status)

tracking_line_users (model TrackingLineUsers, PK UUID)

บันทึกว่าผู้ใช้คนหนึ่งเคยกด key นี้ไปแล้ว เพื่อใช้คำนวณ unique click และ first click ของแคมเปญ

  • unique (tracking_key, line_user_id) ภายใต้ชื่อ uk_tracking_key_line_user_id
  • tracking_key มีรูปแบบ campaignId:richMessageId:bubbleIndex:index (ดูคำอธิบายในไฟล์ seed)

Trigger

tracking_log_campaign_click_notify (AFTER INSERT) เรียกฟังก์ชัน notify_campaign_click() ซึ่งยิง pg_notify('campaign_click', ...) เมื่อเหตุการณ์นั้นเป็นการคลิกของแคมเปญ ที่ระบุตัวผู้ใช้ได้ ฝั่ง worker จะรับสัญญาณนี้ไปอัปเดตยอดและจุด trigger rule ต่อ

ไฟล์ที่เกี่ยวข้อง

  • prisma/schema.prisma:610 — model TrackingLog
  • prisma/schema.prisma:857 — model TrackingToken
  • prisma/schema.prisma:888 — model TrackingLineUsers
  • manual-sql/4.sql — trigger notify_campaign_click
  • manual-sql/5.sql — เวอร์ชันที่เขียนลง event_outbox เพิ่มด้วย
  • seed-data/15.tracking_line_users.sql
  • schema-dumps/2026-07-24/schema.sql:2980, :3012, :2963

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

  • client-api-go — endpoint redirect (/r/...) อ่าน tracking_token เขียน tracking_log แล้วตอบ 302 ไปยัง destination_url
  • webhook-go — เขียน log ฝั่ง event ได้แก่ read และ postback
  • worker-go — รวมยอดกลับไปที่คอลัมน์ campaign.total_* และ listen ช่อง campaign_click
  • cms-api-go — หน้ารายงานผลผ่านโมดูล tracking-log

โดเมนที่เกี่ยวข้อง: แคมเปญส่งข้อความ, Rich Menu, ตอบกลับอัตโนมัติ, เพื่อน LINE