Skip to content

Webhooks & รายงานการส่ง ​

การส่งสำเร็จหมายถึง "รับไว้เพื่อส่ง" ไม่ใช่ "ส่งถึงแล้ว" รายงานการส่ง (DR) จะมาถึงแบบ asynchronous ในรูปแบบ webhook โดยอ้างอิงจาก transaction_uuid ที่คุณกำหนดบนข้อความ

รับรายงานการส่ง ​

ชี้ HTTPS endpoint สาธารณะมายัง MessageEagle และจัดการ callback:

ts
app.post("/webhooks/messageeagle", (req, res) => {
  const { transaction_uuid, status } = req.body;
  // 1. ตอบรับเร็ว — ส่ง 2xx ก่อนทำงานหนัก
  res.sendStatus(200);
  // 2. ค้นหาข้อความเดิมด้วย transaction_uuid และอัปเดตสถานะ
  queue.enqueue({ transaction_uuid, status });
});

ออกแบบให้รองรับกรณียาก ​

Webhook ส่งแบบ at-least-once ออกแบบ handler ทุกตัวให้รองรับสิ่งนี้

  • อัปเดตแบบ idempotent ใช้ transaction_uuid เป็น key — การรับ DR เดิมสองครั้ง ต้องไม่มีผลใด ๆ เพิ่มเติม ควรใช้ UPSERT แทน INSERT
  • ตอบรับก่อน ประมวลผลทีหลัง ส่ง 2xx ทันที แล้วทำงานจริงใน queue handler ที่ช้าทำให้เกิดการส่ง webhook ซ้ำ
  • รองรับการมาผิดลำดับ delivered อาจมาก่อน sent ใช้ลำดับความสำคัญของสถานะ ไม่ใช่แบบ last-write-wins

ยืนยันแหล่งที่มา

ตรวจสอบ signature ของ request (หรือ shared secret) ก่อนเชื่อถือ payload อย่าดำเนินการกับ webhook body ที่ยังยืนยันตัวตนไม่ได้

รูปแบบสถานะ ​

สถานะความหมาย
queuedรับไว้แล้ว รอการส่งออก
sentส่งถึง carrier แล้ว
deliveredยืนยันว่าถึงมือถือแล้ว
failedcarrier ปฏิเสธหรือส่งไม่ได้
expiredหมดเวลา TTL ก่อนส่งถึง (เช่น มือถือติดต่อไม่ได้)

การสิ้นสุดของ Voice ​

Voice session ก็ emit callback เมื่อสิ้นสุดเช่นกัน — การบันทึกเสียง transcript บันทึก DTMF และค่าใช้จ่ายจะไปปรากฏที่ VoiceSession ใช้ GET /organization/{organizationId}/webhook-deliveries เป็น fallback หาก callback หาย — ดู การส่ง Webhook