Tổng quan
DBestChatBot gửi webhook ra ngoài khi có sự kiện quan trọng xảy ra trên chatbot của bạn (thu thập được khách tiềm năng, cuộc trò chuyện bắt đầu hoặc kết thúc, tin nhắn được gửi hoặc nhận). Bạn cấu hình URL đích trong bảng điều khiển và chúng tôi POST một gói JSON đến đó trong vòng vài giây sau mỗi sự kiện.
Webhooks là tính năng của gói Pro / Agency. Free-tier accounts can still view conversations and leads in the dashboard but can't pipe them to external systems.
Sự kiện
Mỗi webhook đăng ký một hoặc nhiều loại sự kiện sau:
| Sự kiện | Khi nó kích hoạt |
|---|---|
lead.captured | Một khách truy cập gửi biểu mẫu trước trò chuyện, HOẶC một tin nhắn đến trên WhatsApp bắt đầu cuộc trò chuyện (chúng tôi luôn có số điện thoại của họ). Khuyến nghị cho việc kết nối CRM. |
conversation.started | Một cuộc trò chuyện mới bắt đầu. Hữu ích cho phân tích marketing hoặc khởi động ngay các quy trình theo dõi tiếp. |
conversation.ended | Khách truy cập đóng cuộc trò chuyện hoặc không hoạt động trong hơn 5 phút. Phù hợp để kích hoạt email theo dõi. |
message.received | Khách truy cập đã gửi tin nhắn. Lưu lượng lớn — chỉ đăng ký nếu bạn có nhu cầu cụ thể. |
message.sent | AI đã trả lời một khách truy cập. Lưu lượng lớn — chỉ đăng ký nếu bạn có nhu cầu cụ thể. |
Định dạng payload
Mỗi webhook POST một gói JSON với các trường cấp cao nhất giống nhau. data đối tượng thay đổi theo loại sự kiện. Ví dụ cho lead.captured:
{
"event": "lead.captured",
"id": "evt_abc123def456",
"created_at": "2026-05-17T15:30:00+00:00",
"data": {
"conversation_id": "conv_xyz789",
"chatbot": {
"id": 42,
"name": "Acme Support"
},
"visitor": {
"name": "Jane Doe",
"email": "jane@acme.com",
"phone": "+15551234567"
},
"source_url": "https://acme.com/pricing",
"message_count": 4,
"transcript_url": "https://dbestchatbot.com/app/conversations/conv_xyz789",
"capture_method": "prechat_form"
}
}Tiêu đề yêu cầu
Mỗi yêu cầu bao gồm:
Content-Type: application/jsonUser-Agent: DBestChatBot-Webhook/1.0X-DBestChatBot-Event: lead.captured— tên sự kiệnX-DBestChatBot-Delivery: evt_abc123— ID gửi duy nhất, dùng để loại trùngX-DBestChatBot-Signature: t=1747490400,v1=<hex_hmac>— chữ ký xác minh
Xác minh chữ ký (khuyến nghị)
Luôn xác minh payload webhook để đảm bảo chúng thực sự đến từ DBestChatBot. Định dạng chữ ký tương thích với Stripe: dấu thời gian Unix t và một chuỗi băm hex HMAC-SHA-256 v1, được nối bằng dấu phẩy.
Thuật toán:
- Extract
tandv1từ phần đầu trang - Từ chối nếu
tcách thời điểm hiện tại hơn 5 phút (bảo vệ chống phát lại) - Tính toán
expected = HMAC_SHA256(signing_secret, "t.raw_request_body") - So sánh thời gian hằng
expectedwithv1 - Nếu chúng khớp, dữ liệu tải là xác thực. Ngược lại, hãy từ chối.
Node.js / Express
// Node.js / Express example — verify the signature header
import express from 'express';
import crypto from 'crypto';
const app = express();
const SIGNING_SECRET = process.env.DBESTCHATBOT_SIGNING_SECRET;
// IMPORTANT: use raw body, not parsed JSON, for signature verification
app.post('/webhooks/dbestchatbot',
express.raw({ type: 'application/json' }),
(req, res) => {
const header = req.header('X-DBestChatBot-Signature') || '';
const match = header.match(/t=(\d+),v1=([a-f0-9]+)/);
if (!match) return res.status(400).send('bad signature header');
const [, ts, signature] = match;
// 5-minute replay window
if (Math.abs(Date.now() / 1000 - parseInt(ts)) > 300) {
return res.status(400).send('stale timestamp');
}
const expected = crypto
.createHmac('sha256', SIGNING_SECRET)
.update(`${ts}.${req.body}`)
.digest('hex');
if (!crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature))) {
return res.status(401).send('signature mismatch');
}
const event = JSON.parse(req.body.toString());
console.log('Verified event:', event.event, event.data);
// Always respond 2xx quickly — we'll retry up to 5x with backoff if you don't
res.status(200).send('ok');
},
);PHP
<?php
// PHP example — verify the signature header
$signingSecret = getenv('DBESTCHATBOT_SIGNING_SECRET');
$rawBody = file_get_contents('php://input');
$header = $_SERVER['HTTP_X_DBESTCHATBOT_SIGNATURE'] ?? '';
if (! preg_match('/t=(\d+),v1=([a-f0-9]+)/', $header, $m)) {
http_response_code(400); exit('bad signature header');
}
[, $ts, $signature] = $m;
if (abs(time() - (int) $ts) > 300) {
http_response_code(400); exit('stale timestamp');
}
$expected = hash_hmac('sha256', "{$ts}.{$rawBody}", $signingSecret);
if (! hash_equals($expected, $signature)) {
http_response_code(401); exit('signature mismatch');
}
$event = json_decode($rawBody, true);
// process $event['event'], $event['data'] ...
http_response_code(200);
echo 'ok';Thử lại và đảm bảo gửi
Chúng tôi thử lại tối đa 5 lần with exponential backoff if your endpoint doesn't return a 2xx response within 30 seconds:
| Lần thử | Độ trễ so với bước trước |
|---|---|
| 1 | immediate |
| 2 | +1 phút |
| 3 | +5 phút |
| 4 | +30 phút |
| 5 | +2 giờ |
Sau lần thử thất bại thứ 5, lần gửi được đánh dấu là failed và chúng tôi ngừng thử lại. Bạn có thể xem nhật ký gửi đầy đủ (bao gồm trạng thái HTTP, thông báo lỗi và số lần thử) trên trang chi tiết webhook trong bảng điều khiển của bạn.
Luôn trả về trạng thái 2xx nhanh chóng. Nếu bạn cần xử lý nặng, hãy xác nhận bằng 200 trước và xử lý bất đồng bộ.
Tính bất biến
Mỗi lần gửi có một id trường (cũng được gửi dưới dạng X-DBestChatBot-Delivery). Because we retry on failure, your endpoint may receive the same event more than once. Store the IDs you've already processed and skip duplicates.
Danh sách IP được phép
Webhook gửi đi xuất phát từ máy chủ production của chúng tôi tại 15.204.199.41. Nếu bạn đưa vào danh sách cho phép theo IP, hãy cho phép địa chỉ này. Tuy nhiên, chữ ký là cách xác minh đáng tin cậy hơn — IP có thể bị giả mạo, HMAC thì không (nếu không có khóa bí mật).
Bắt đầu
- Đi đến Webhooks trong bảng điều khiển của bạn
- Nhấp Thêm endpoint — dán URL của bạn, chọn sự kiện
- Sao chép signing secret hiển thị sau khi tạo
- Gửi sự kiện thử nghiệm để xác minh endpoint của bạn nhận và xác thực sự kiện đó
- Xem các sự kiện thực tế diễn ra khi khách truy cập sử dụng chatbot của bạn
Đang kết nối với Zapier / Make / n8n
All three tools have a generic "Catch Hook" or "Webhook Trigger" action — paste the URL they generate into a new endpoint here, subscribe to the events you want, done. Map fields from data.visitor vào CRM, Sheets của bạn hoặc bất cứ đâu từ đó.
HubSpot — hướng dẫn đầy đủ
Đây là thiết lập phổ biến nhất. Ghi lại mọi khách hàng tiềm năng từ chatbot dưới dạng Liên hệ HubSpot:
- Trong Zapier, nhấp Tạo Zap → Kích hoạt: Webhooks by Zapier → sự kiện Catch Hook → tiếp tục. Zapier sẽ hiển thị cho bạn một URL tùy chỉnh như
https://hooks.zapier.com/hooks/catch/12345/abc/ - Trong DBestChatBot, vào Webhooks → Thêm endpoint. Paste the Zapier URL, name it "HubSpot via Zapier," subscribe to
lead.captured, lưu. - Quay lại Zapier: nhấp Test trigger. Sau đó trên trang webhook DBestChatBot của bạn, nhấp vào Gửi sự kiện thử nghiệm. Zapier sẽ nhận được một payload mẫu — mẫu bao gồm
data.visitor.name,data.visitor.email,data.visitor.phone, và mọi trường trước trò chuyện tùy chỉnh mà bạn đã định nghĩa. - Trong Zapier, thêm một Action → HubSpot → sự kiện Tạo hoặc cập nhật liên hệ. Cấp quyền cho tài khoản HubSpot của bạn.
- Ánh xạ các trường:
- HubSpot
email← Zapierdata.visitor.email - HubSpot
firstname← Zapierdata.visitor.name(split first/last if you need) - HubSpot
phone← Zapierdata.visitor.phone - HubSpot
company← Zapierdata.visitor.company(if you added a custom "Company" field in your chatbot's pre-chat form) - HubSpot
lifecycle_stage→ gán cứng vào Lead or Người đăng ký - HubSpot
website← Zapierdata.source_url
- HubSpot
- Tùy chọn nhưng được khuyến nghị: thêm hành động thứ hai → HubSpot → Tạo ghi chú trên liên hệ đó kèm URL bản ghi cuộc trò chuyện
data.transcript_urllàm nội dung ghi chú. Đội ngũ bán hàng của bạn nhấp vào liên kết và xem toàn bộ cuộc trò chuyện dẫn đến việc thu thập thông tin. - Bật Zap. Mọi
lead.capturedsự kiện tự động tạo / cập nhật một HubSpot Contact trong vài giây.
Pro tip: if you want to route HIGH-VALUE leads differently (e.g. enterprise pricing inquiries) from FAQ-style chats, add a custom field to your pre-chat form like "What are you looking to do?" with options "Just browsing / Buying / Sales question." Then in Zapier add a Filter step that only continues to HubSpot if the answer is "Sales question" — your CRM stays clean.
Các CRM khác: cùng một mô hình áp dụng cho Pipedrive (hành động: Create Deal), Salesforce (hành động: Create/Update Lead), Close (hành động: Create Lead), monday.com (hành động: Create Item) và Airtable (hành động: Create Record). Phía DBestChatBot là giống hệt nhau — chỉ cần trỏ một Zap khác vào cùng URL webhook.
FAQ
Why isn't my endpoint receiving events?
- Kiểm tra webhook đang active trong bảng điều khiển
- Check you're subscribed to the right event type
- Kiểm tra nhật ký gửi trên trang chi tiết webhook để tìm lỗi HTTP
- Dùng Gửi sự kiện thử nghiệm button to bypass real-world triggers
Làm sao để tạm ngừng nhận sự kiện?
Toggle the webhook off — no events are queued or buffered, they're simply dropped.
Tôi có thể lấy các sự kiện cũ đã diễn ra không?
Không, webhook chỉ gửi một lần và không lưu lại. Để xem dữ liệu lịch sử, hãy dùng bảng điều khiển Hội thoại xuất (CSV) hoặc liên hệ với chúng tôi về việc bổ sung dữ liệu một lần.