ข้ามไปยังเนื้อหา

เว็บฮุก แจ้งเหตุการณ์ไปยังระบบของคุณ

เว็บฮุกคือที่อยู่ของคุณที่ Tellfox ส่งข้อความไปเมื่อมีสิ่งที่เกิดขึ้น เช่น การจองใหม่ การยกเลิก ลูกค้าใหม่ หรือการให้แต้ม ไม่ต้องคอยเรียกถาม เจ้าของร้านเพิ่มได้ที่ ตั้งค่า → API → เว็บฮุก พร้อมเลือกเหตุการณ์ที่ต้องการ (หรือทั้งหมด) สำหรับร้านจริงหรือสำเนาทดสอบ ได้สูงสุด 5 ที่ต่อธุรกิจ

เหตุการณ์เมื่อ
customer.createdมีลูกค้าใหม่
customer.updatedข้อมูลลูกค้าเปลี่ยน
customer.erasedลบข้อมูลลูกค้าตามคำขอ
customer.note_addedเพิ่มโน้ตลูกค้า
booking.createdมีการจองใหม่
booking.movedเลื่อนการจอง
booking.assignedเปลี่ยนคนให้บริการ
booking.cancelledยกเลิกการจอง
booking.completedการจองเสร็จสิ้น
booking.no_showลูกค้าไม่มา
booking.reconfirmedลูกค้ายืนยันว่าจะมา
class.signupลงชื่อเข้าคลาส
class.cancelledยกเลิกที่ในคลาส
session.cancelledยกเลิกรอบคลาส
package.soldขายแพ็กเกจ
package.voidedยกเลิกการขายแพ็กเกจ
package.used_upใช้แพ็กเกจครบแล้ว
loyalty.stamps_givenให้แต้ม
loyalty.points_givenให้คะแนน
loyalty.coupon_givenให้คูปอง
loyalty.coupon_usedใช้คูปอง
payment.confirmedยืนยันการชำระเงิน
ticket_order.paidมีผู้ซื้อหรือลงทะเบียนบัตร

เหตุการณ์ส่งถึงภายในประมาณหนึ่งนาที แต่ละเหตุการณ์ส่งครั้งเดียวต่อเว็บฮุก แต่ระบบของคุณอาจได้รับซ้ำได้ถ้าตอบช้าเกินไป ใช้ id ของเหตุการณ์เพื่อข้ามรายการซ้ำ

POST พร้อม JSON

{
"id": "evt_9c0…",
"type": "booking.created",
"created_at": "2026-10-22T09:30:00Z",
"mode": "live",
"business_id": "biz_…",
"data": { "booking": { "id": "bk_…", "status": "confirmed", "start": "2026-10-23T03:00:00Z", "customer_id": "cus_…", "service": { "id": "svc_…", "name": "Massage" } } }
}

data มีข้อมูลแบบเดียวกับที่ API แสดง (booking customer package payment) หรือสำหรับบัตรสะสมแต้มคือ customer_id และ card ลูกค้าที่ถูกลบข้อมูลตามคำขอส่งเป็น customer.erased มีเพียง customer_id ให้ลบสำเนาในระบบของคุณ Header ที่ส่งมา

  • Tellfox-Event ประเภทเหตุการณ์
  • Tellfox-Delivery id ของเหตุการณ์
  • Tellfox-Signature t=<วินาที unix>,v1=<hex>

ตอบกลับด้วย 2xx ใดก็ได้ภายใน 10 วินาที ถ้าตอบอย่างอื่น ไม่ตอบ หรือเปลี่ยนเส้นทาง จะส่งใหม่หลัง 1 นาที 5 นาที 30 นาที 2 ชั่วโมง 6 ชั่วโมง และ 24 ชั่วโมง บันทึกการส่งที่ ตั้งค่า → API แสดงแต่ละรายการ 30 วัน พร้อมปุ่ม ส่งอีกครั้ง เว็บฮุกที่ส่งไม่สำเร็จติดต่อกัน 3 วันจะถูกปิดและเจ้าของร้านได้รับอีเมล เปิดใหม่ได้ที่หน้าเดียวกัน

v1 คือ HMAC-SHA256 ของ t จุด และเนื้อหาข้อความดิบ ด้วยรหัสลับของเว็บฮุก (whsec_… แสดงครั้งเดียวตอนเพิ่ม) เปรียบเทียบแบบเวลาคงที่ และไม่รับ t ที่เก่ากว่า 5 นาที

Node.js
import crypto from 'node:crypto';
function fromTellfox(rawBody, header, secret) {
const t = /t=(\d+)/.exec(header)?.[1], v1 = /v1=([0-9a-f]+)/.exec(header)?.[1];
if (!t || !v1 || v1.length !== 64 || Math.abs(Date.now() / 1000 - Number(t)) > 300) return false;
const expected = crypto.createHmac('sha256', secret).update(`${t}.${rawBody}`).digest('hex');
return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(v1));
}
// PHP
function from_tellfox(string $raw, string $header, string $secret): bool {
preg_match('/t=(\d+)/', $header, $t); preg_match('/v1=([0-9a-f]+)/', $header, $v);
if (!$t || !$v || abs(time() - (int) $t[1]) > 300) return false;
return hash_equals(hash_hmac('sha256', $t[1] . '.' . $raw, $secret), $v[1]);
}
# Python
import hmac, hashlib, re, time
def from_tellfox(raw: bytes, header: str, secret: str) -> bool:
t, v1 = re.search(r"t=(\d+)", header), re.search(r"v1=([0-9a-f]+)", header)
if not t or not v1 or abs(time.time() - int(t[1])) > 300: return False
expected = hmac.new(secret.encode(), f"{t[1]}.".encode() + raw, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, v1[1])
  1. ใน Make สร้าง scenario ด้วย Webhooks → Custom webhook เพิ่มเว็บฮุกและคัดลอกที่อยู่
  2. ใน Tellfox ไปที่ ตั้งค่า → API → เว็บฮุก → เพิ่มเว็บฮุก วางที่อยู่ เลือก มีการจองใหม่ (booking.created) แล้วกดเพิ่ม กด ส่งทดสอบ เพื่อให้ Make รู้รูปแบบข้อความ
  3. ใน Make เพิ่ม Google Sheets → Add a row ต่อจากเว็บฮุก แล้วจับคู่คอลัมน์ data.booking.start data.booking.service.name data.booking.reference data.booking.customer_id
  4. เปิด scenario การจองใหม่แต่ละรายการจะเพิ่มแถวภายในประมาณหนึ่งนาที