แคมเปญส่งข้อความ
ภาพรวม
Campaign คือหน่วยของ การส่งข้อความออกไปหาเพื่อน LINE รองรับทั้งการส่งทันทีและการตั้งเวลาส่งล่วงหน้า
โดยแบ่งรูปแบบการส่งออกเป็น 3 โหมดตาม enum CastType
| โหมด | ความหมาย |
|---|---|
broadcast | ส่งถึงเพื่อนทุกคนของ LINE OA นั้น |
multicast | ส่งเจาะกลุ่มตาม audience ที่ระบุ |
narrowcast | ส่งโดยใช้เงื่อนไขการกำหนดกลุ่มของ LINE เอง |
ตาราง campaign ทำหน้าที่สองอย่างพร้อมกัน คือเป็นทั้ง คำสั่งส่ง และ รายงานผล
กล่าวคือเก็บ snapshot ของเนื้อหาที่ส่งออกไปจริง ณ เวลานั้น ควบคู่กับตัวนับผลลัพธ์
(reach / click) ที่ถูกอัปเดตย้อนกลับมาจาก tracking log
โครงสร้างข้อมูลหลัก
campaign (model Campaign)
ข้อมูลการตั้งค่าการส่งประกอบด้วย name, broadcast_now, start_date, cast_type
และ status (enum CampaignStatus)
ความสัมพันธ์หลัก
rich_message_id→rich_message.id— เนื้อหาที่จะส่งaudience_id→audience.id(nullable) — กลุ่มเป้าหมายกรณี multicastline_oa_id→line_oa.idและorganization_id→organization.id
Snapshot ณ เวลาส่ง เก็บไว้เพื่อให้รายงานย้อนหลังยังตีความได้แม้เนื้อหาต้นทางถูกแก้ไปแล้ว
rich_message_contentJSONB — เนื้อหาที่ resolve เรียบร้อยแล้วline_message_objectJSONB — payload ที่ส่งเข้า LINE API จริงtemplate_trackingJSONB — mapping ระหว่างปุ่มกับ tracking keyend_tracking_date— วันสิ้นสุดการเก็บสถิติ
Merge tag — has_merge_tags และ skip_merge_tag_missing ควบคุมว่าเมื่อผู้รับบางคน
ไม่มีค่าตัวแปรที่อ้างถึงในข้อความ ระบบจะข้ามผู้รับคนนั้นหรือส่งทั้งที่ค่าว่าง
ตัวนับผลลัพธ์ — total_activity, total_recipient, total_reach,
total_unique_click, total_first_click และ reason สำหรับบันทึกเหตุผลกรณียกเลิกหรือส่งล้มเหลว
กลไก atomic claim — คอลัมน์ claimed_at (เพิ่มด้วย manual SQL) ร่วมกับสถานะ sending
ที่เพิ่มเข้า enum ผ่าน ALTER TYPE "CampaignStatus" ADD VALUE ใช้ป้องกันไม่ให้ worker
หลายตัวหยิบแคมเปญเดียวกันไปส่งซ้ำ แถวที่ค้างสถานะ sending นานเกิน lease
จะถูก reaper ย้อนสถานะกลับเป็น scheduled โดยอัตโนมัติ
campaign_delivery_batch
ตารางนี้ถูกสร้างด้วย manual SQL เท่านั้น ไม่ปรากฏใน Prisma schema ใช้ติดตามการส่งที่ถูกแบ่งออกเป็นก้อนย่อย
- unique
(campaign_id, batch_no)พร้อมuser_countและstatus(pending/sending/done/failed) - ตัวนับรายก้อน
sent_count,error_count,skipped_count - partial index บน
(campaign_id, status)สำหรับตรวจว่ายังมีก้อนใดค้างอยู่
ลำดับการทำงานคือ planner ของ worker เป็นผู้ insert รายการ batch, delivery worker เป็นผู้ claim และอัปเดตสถานะ และก้อนสุดท้ายที่ทำงานจบจะเป็นผู้ปิดยอดรวมของแคมเปญ
ไฟล์ที่เกี่ยวข้อง
prisma/schema.prisma:380— modelCampaignmanual-sql/8.campaign_claim.sql— สถานะsendingและคอลัมน์claimed_atmanual-sql/8.campaign_delivery_batch.sql— ตาราง batch (อ้างอิง spec ฝั่ง worker-go)manual-sql/4.sql— triggernotify_campaign_clickบนtracking_logseed-data/12.campaign.sql— ตัวอย่างแคมเปญทั้ง 3 โหมดschema-dumps/2026-07-24/schema.sql:1154,:1190
จุดเชื่อมต่อกับ Service อื่น
- cms-api-go — สร้าง แก้ไข และยกเลิกแคมเปญ รวมถึงหน้ารายงานผล
- worker-go — ตัวส่งจริง ทำหน้าที่ claim แคมเปญ แบ่ง batch เรียก LINE API
อัปเดตตัวนับ และ listen ช่อง
campaign_click - client-api-go — endpoint redirect ที่บันทึก
tracking_logเมื่อผู้ใช้กดลิงก์ ก่อนพาไปยังปลายทางจริง
โดเมนที่เกี่ยวข้อง: คลังข้อความ (เนื้อหาที่ส่ง), Audience (กลุ่มเป้าหมาย), การติดตามผล (ผลลัพธ์การกด), Event Outbox (การจุด trigger จากการคลิก)