เว็บฮุก แจ้งเหตุการณ์ไปยังระบบของคุณ
เว็บฮุกคือที่อยู่ของคุณที่ 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-Deliveryidของเหตุการณ์Tellfox-Signaturet=<วินาที unix>,v1=<hex>
ตอบกลับด้วย 2xx ใดก็ได้ภายใน 10 วินาที ถ้าตอบอย่างอื่น ไม่ตอบ หรือเปลี่ยนเส้นทาง จะส่งใหม่หลัง 1 นาที 5 นาที 30 นาที 2 ชั่วโมง 6 ชั่วโมง และ 24 ชั่วโมง บันทึกการส่งที่ ตั้งค่า → API แสดงแต่ละรายการ 30 วัน พร้อมปุ่ม ส่งอีกครั้ง เว็บฮุกที่ส่งไม่สำเร็จติดต่อกัน 3 วันจะถูกปิดและเจ้าของร้านได้รับอีเมล เปิดใหม่ได้ที่หน้าเดียวกัน
ตรวจลายเซ็น
หัวข้อที่มีชื่อว่า “ตรวจลายเซ็น”v1 คือ HMAC-SHA256 ของ t จุด และเนื้อหาข้อความดิบ ด้วยรหัสลับของเว็บฮุก (whsec_… แสดงครั้งเดียวตอนเพิ่ม) เปรียบเทียบแบบเวลาคงที่ และไม่รับ t ที่เก่ากว่า 5 นาที
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));}// PHPfunction 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]);}# Pythonimport hmac, hashlib, re, timedef 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])ส่งการจองใหม่เข้า Google Sheets ด้วย Make
หัวข้อที่มีชื่อว่า “ส่งการจองใหม่เข้า Google Sheets ด้วย Make”- ใน Make สร้าง scenario ด้วย Webhooks → Custom webhook เพิ่มเว็บฮุกและคัดลอกที่อยู่
- ใน Tellfox ไปที่ ตั้งค่า → API → เว็บฮุก → เพิ่มเว็บฮุก วางที่อยู่ เลือก มีการจองใหม่ (
booking.created) แล้วกดเพิ่ม กด ส่งทดสอบ เพื่อให้ Make รู้รูปแบบข้อความ - ใน Make เพิ่ม Google Sheets → Add a row ต่อจากเว็บฮุก แล้วจับคู่คอลัมน์
data.booking.startdata.booking.service.namedata.booking.referencedata.booking.customer_id - เปิด scenario การจองใหม่แต่ละรายการจะเพิ่มแถวภายในประมาณหนึ่งนาที