Skip to main content

แคมเปญส่งข้อความ

ภาพรวม

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_idrich_message.id — เนื้อหาที่จะส่ง
  • audience_idaudience.id (nullable) — กลุ่มเป้าหมายกรณี multicast
  • line_oa_idline_oa.id และ organization_idorganization.id

Snapshot ณ เวลาส่ง เก็บไว้เพื่อให้รายงานย้อนหลังยังตีความได้แม้เนื้อหาต้นทางถูกแก้ไปแล้ว

  • rich_message_content JSONB — เนื้อหาที่ resolve เรียบร้อยแล้ว
  • line_message_object JSONB — payload ที่ส่งเข้า LINE API จริง
  • template_tracking JSONB — mapping ระหว่างปุ่มกับ tracking key
  • end_tracking_date — วันสิ้นสุดการเก็บสถิติ

Merge taghas_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 — model Campaign
  • manual-sql/8.campaign_claim.sql — สถานะ sending และคอลัมน์ claimed_at
  • manual-sql/8.campaign_delivery_batch.sql — ตาราง batch (อ้างอิง spec ฝั่ง worker-go)
  • manual-sql/4.sql — trigger notify_campaign_click บน tracking_log
  • seed-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 จากการคลิก)