Tài liệu API & Webhook
Kết nối Salezy với hệ thống của bạn theo hai chiều: gọi API để tạo và đọc dữ liệu, hoặc nhận webhook để được báo ngay khi có sự kiện mới — không cần chờ hỏi lại (polling).
Tổng quan
Salezy cho phép hai cách tích hợp bổ sung cho nhau:
- API — hệ thống của bạn gọi vào Salezy để tạo lead/liên hệ mới, hoặc đọc danh sách lead, liên hệ, cơ hội, đơn hàng.
- Webhook — Salezy báo ra cho hệ thống của bạn ngay khi có sự kiện (lead mới, đơn hàng đổi trạng thái…), không cần bạn tự hỏi lại theo chu kỳ.
Bắt đầu trong 3 bước:
- Vào Cài đặt › Tích hợp, tạo một khóa API với quyền (scope) cần dùng.
- Gọi thử
GET /open/međể xác nhận khóa hoạt động (xem mục Public API). - Muốn nhận sự kiện thời gian thực, tạo thêm một webhook trỏ về URL của bạn (xem mục Webhook).
Public API — xác thực & giới hạn
Mọi endpoint nằm dưới một base URL cố định, xác thực bằng header x-api-key. Tạo khóa tại Cài đặt › Tích hợp trong tài khoản Salezy của bạn — mỗi khóa gắn với một hoặc nhiều quyền (scope) bên dưới, chỉ dùng được cho đúng những endpoint thuộc quyền đó.
Chỉ gọi từ server — khóa API dùng cho giao tiếp máy chủ với máy chủ (server-to-server). Không nhúng khóa vào code chạy trên trình duyệt hoặc app di động: bất kỳ ai xem được mã nguồn/traffic đều lấy được khóa. Trình duyệt cũng sẽ tự chặn (CORS) header x-api-key gọi thẳng từ JavaScript phía client.
https://api.salezy.vn/api/v1/open| Quyền (scope) | Ý nghĩa |
|---|---|
| leads:read | Đọc lead — Xem danh sách và chi tiết lead. |
| leads:write | Tạo lead — Tạo mới lead qua API. |
| contacts:read | Đọc liên hệ — Xem danh sách và chi tiết liên hệ. |
| contacts:write | Tạo liên hệ — Tạo mới liên hệ qua API. |
| deals:read | Đọc cơ hội — Xem danh sách và chi tiết cơ hội. |
| orders:read | Đọc đơn hàng — Xem danh sách và chi tiết đơn hàng. |
Giới hạn 1.000 request/giờ VÀ 120 request/phút (chặn burst) cho mỗi khóa API — vượt một trong hai đều nhận về mã 429 kèm header Retry-After (số giây nên chờ trước khi gọi lại).
Kết quả danh sách luôn theo một khuôn có phân trang:
{
"success": true,
"message": "OK",
"data": {
"data": [ /* các bản ghi */ ],
"meta": { "page": 1, "limit": 20, "total": 42, "totalPages": 3 }
}
}Mã lỗi
| HTTP | errorCode | Ý nghĩa |
|---|---|---|
| 400 | BAD_REQUEST | Dữ liệu gửi lên không hợp lệ — thiếu trường bắt buộc hoặc sai định dạng. |
| 401 | INVALID_API_KEY | Khoá API sai, đã bị thu hồi, hoặc thiếu header `x-api-key`. Gửi khoá sai quá 30 lần/phút từ cùng một địa chỉ IP thì các lần sai tiếp theo nhận 429 thay vì 401 (tối đa 60 giây); khoá đúng vẫn gọi được bình thường. |
| 403 | API_SCOPE_MISSING | Khoá API hợp lệ nhưng không có quyền (scope) cần cho endpoint này. |
| 403 | ORGANIZATION_INACTIVE | Tổ chức bị tạm ngưng (chưa thanh toán) chỉ đọc được, không tạo mới được; tổ chức đã xoá bị từ chối hoàn toàn. |
| 404 | NOT_FOUND | Không tìm thấy bản ghi với id đã cho (hoặc bản ghi không thuộc tổ chức của khoá API). |
| 429 | TOO_MANY_REQUESTS | Vượt giới hạn 1.000 request/giờ hoặc 120 request/phút cho một khoá API, hoặc gửi khoá sai quá 30 lần/phút từ cùng một địa chỉ IP (bị chặn tối đa 60 giây). Xem header `Retry-After` (số giây) để biết khi nào gọi lại được. |
Phản hồi lỗi luôn có dạng { "success": false, "message": "...", "errorCode": "..." }.
Kiểm tra khóa API
/open/meKiểm tra khoá API còn dùng được không, xem tổ chức và các quyền (scope) đang có.
Quyền cần: Bất kỳ khoá API hợp lệ nào
curl -s "https://api.salezy.vn/api/v1/open/me" \
-H "x-api-key: sk_ab12cd_9f8e7d6c5b4a3928170615243342516071"{
"success": true,
"message": "OK",
"data": {
"organization": {
"id": "org_3f9a1c2b",
"name": "Cửa hàng An Phát"
},
"key": {
"name": "Zapier",
"prefix": "ab12cd",
"scopes": [
"leads:read",
"leads:write"
]
}
}
}Lead
Tạo và đọc lead — dữ liệu khách hàng tiềm năng trước khi trở thành liên hệ.
/open/leadsTạo một lead mới. Số điện thoại được tự động chuẩn hoá về định dạng Việt Nam.
Quyền cần: Tạo lead (`leads:write`)
| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
| fullName | string | Có | Họ tên khách hàng. |
| phone | string | Không | Số điện thoại (chuẩn hoá tự động). |
| string | Không | Email. | |
| companyName | string | Không | Tên công ty/cửa hàng. |
| need | string | Không | Nhu cầu, mô tả ngắn. |
| budget | string | Không | Ngân sách dự kiến. |
| region | string | Không | Khu vực. |
| note | string | Không | Ghi chú thêm. |
| customFields | object | Không | Trường tuỳ biến (key/value). |
| utm | object | Không | Thông tin nguồn UTM (source, campaign…). |
curl -s -X POST "https://api.salezy.vn/api/v1/open/leads" \
-H "x-api-key: sk_ab12cd_9f8e7d6c5b4a3928170615243342516071" \
-H "Content-Type: application/json" \
-d '{
"fullName": "Nguyễn Văn An",
"phone": "0901234567",
"email": "khach@example.com",
"companyName": "Cửa hàng An Phát",
"need": "Tư vấn gói dịch vụ",
"utm": {
"source": "facebook",
"campaign": "thang-9"
}
}'{
"success": true,
"message": "Tạo lead thành công",
"data": {
"id": "7c0e4f6a-1b2c-4d3e-9f8a-0123456789ab",
"fullName": "Nguyễn Văn An",
"phone": "0901234567",
"email": "khach@example.com",
"companyName": "Cửa hàng An Phát",
"source": "FORM",
"status": "NEW",
"score": 10,
"need": "Tư vấn gói dịch vụ",
"budget": null,
"region": "Hà Nội",
"jobTitle": null,
"note": null,
"ownerId": "usr_8f2a1c3d",
"owner": {
"id": "usr_8f2a1c3d",
"name": "Trần Thị Bình",
"email": "binh@congty.vn"
},
"campaignId": null,
"utm": {
"source": "facebook",
"campaign": "thang-9"
},
"customFields": {},
"convertedContactId": null,
"convertedCompanyId": null,
"convertedDealId": null,
"createdAt": "2026-09-29T08:00:00.000Z",
"updatedAt": "2026-09-29T08:00:00.000Z"
}
}/open/leadsLấy danh sách lead, có phân trang.
Quyền cần: Đọc lead (`leads:read`)
| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
| page | number | Không | Trang, bắt đầu từ 1 (mặc định 1). |
| limit | number | Không | Số bản ghi mỗi trang, tối đa 100 (mặc định 20). |
| updatedSince | string (ISO 8601) | Không | Chỉ lấy bản ghi cập nhật từ thời điểm này trở đi. |
| status | string | Không | Lọc theo trạng thái lead. |
| phone | string | Không | Lọc theo số điện thoại (đã chuẩn hoá). |
| string | Không | Lọc theo email. |
curl -s "https://api.salezy.vn/api/v1/open/leads?page=1&limit=20&status=NEW" \
-H "x-api-key: sk_ab12cd_9f8e7d6c5b4a3928170615243342516071"{
"success": true,
"message": "OK",
"data": {
"data": [
{
"id": "7c0e4f6a-1b2c-4d3e-9f8a-0123456789ab",
"fullName": "Nguyễn Văn An",
"phone": "0901234567",
"email": "khach@example.com",
"companyName": "Cửa hàng An Phát",
"source": "FORM",
"status": "NEW",
"score": 10,
"need": "Tư vấn gói dịch vụ",
"budget": null,
"region": "Hà Nội",
"jobTitle": null,
"note": null,
"ownerId": "usr_8f2a1c3d",
"owner": {
"id": "usr_8f2a1c3d",
"name": "Trần Thị Bình",
"email": "binh@congty.vn"
},
"campaignId": null,
"utm": {
"source": "facebook",
"campaign": "thang-9"
},
"customFields": {},
"convertedContactId": null,
"convertedCompanyId": null,
"convertedDealId": null,
"createdAt": "2026-09-29T08:00:00.000Z",
"updatedAt": "2026-09-29T08:00:00.000Z"
}
],
"meta": {
"page": 1,
"limit": 20,
"total": 1,
"totalPages": 1
}
}
}/open/leads/{id}Lấy chi tiết một lead theo id.
Quyền cần: Đọc lead (`leads:read`)
| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
| id | string | Có | Id của lead. |
curl -s "https://api.salezy.vn/api/v1/open/leads/7c0e4f6a-1b2c-4d3e-9f8a-0123456789ab" \
-H "x-api-key: sk_ab12cd_9f8e7d6c5b4a3928170615243342516071"{
"success": true,
"message": "OK",
"data": {
"id": "7c0e4f6a-1b2c-4d3e-9f8a-0123456789ab",
"fullName": "Nguyễn Văn An",
"phone": "0901234567",
"email": "khach@example.com",
"companyName": "Cửa hàng An Phát",
"source": "FORM",
"status": "NEW",
"score": 10,
"need": "Tư vấn gói dịch vụ",
"budget": null,
"region": "Hà Nội",
"jobTitle": null,
"note": null,
"ownerId": "usr_8f2a1c3d",
"owner": {
"id": "usr_8f2a1c3d",
"name": "Trần Thị Bình",
"email": "binh@congty.vn"
},
"campaignId": null,
"utm": {
"source": "facebook",
"campaign": "thang-9"
},
"customFields": {},
"convertedContactId": null,
"convertedCompanyId": null,
"convertedDealId": null,
"createdAt": "2026-09-29T08:00:00.000Z",
"updatedAt": "2026-09-29T08:00:00.000Z"
}
}Liên hệ
Tạo và đọc liên hệ — khách hàng đã được xác nhận (thường chuyển đổi từ lead).
/open/contactsTạo một liên hệ mới.
Quyền cần: Tạo liên hệ (`contacts:write`)
| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
| fullName | string | Có | Họ tên. |
| phone | string | Không | Số điện thoại (chuẩn hoá tự động). |
| string | Không | Email. | |
| jobTitle | string | Không | Chức danh. |
| note | string | Không | Ghi chú thêm. |
| customFields | object | Không | Trường tuỳ biến (key/value). |
curl -s -X POST "https://api.salezy.vn/api/v1/open/contacts" \
-H "x-api-key: sk_ab12cd_9f8e7d6c5b4a3928170615243342516071" \
-H "Content-Type: application/json" \
-d '{
"fullName": "Lê Thị Hoa",
"phone": "0907654321",
"email": "khach@example.com",
"jobTitle": "Chủ cửa hàng"
}'{
"success": true,
"message": "Tạo liên hệ thành công",
"data": {
"id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"code": "KH-000456",
"fullName": "Lê Thị Hoa",
"phone": "0907654321",
"email": "khach@example.com",
"phones": [
"0907654321"
],
"emails": [
"khach@example.com"
],
"zalo": "0907654321",
"gender": "FEMALE",
"dob": null,
"jobTitle": null,
"companyId": null,
"company": null,
"source": "FORM",
"lifecycleStage": "CUSTOMER",
"customerGroup": null,
"region": "Hà Nội",
"note": null,
"ownerId": "usr_8f2a1c3d",
"owner": {
"id": "usr_8f2a1c3d",
"name": "Trần Thị Bình",
"email": "binh@congty.vn"
},
"doNotContact": false,
"customFields": {},
"createdAt": "2026-09-29T08:00:00.000Z",
"updatedAt": "2026-09-29T08:00:00.000Z"
}
}/open/contactsLấy danh sách liên hệ, có phân trang.
Quyền cần: Đọc liên hệ (`contacts:read`)
| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
| page | number | Không | Trang, bắt đầu từ 1 (mặc định 1). |
| limit | number | Không | Số bản ghi mỗi trang, tối đa 100 (mặc định 20). |
| updatedSince | string (ISO 8601) | Không | Chỉ lấy bản ghi cập nhật từ thời điểm này trở đi. |
| phone | string | Không | Lọc theo số điện thoại (đã chuẩn hoá). |
| string | Không | Lọc theo email. |
curl -s "https://api.salezy.vn/api/v1/open/contacts?page=1&limit=20" \
-H "x-api-key: sk_ab12cd_9f8e7d6c5b4a3928170615243342516071"{
"success": true,
"message": "OK",
"data": {
"data": [
{
"id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"code": "KH-000456",
"fullName": "Lê Thị Hoa",
"phone": "0907654321",
"email": "khach@example.com",
"phones": [
"0907654321"
],
"emails": [
"khach@example.com"
],
"zalo": "0907654321",
"gender": "FEMALE",
"dob": null,
"jobTitle": null,
"companyId": null,
"company": null,
"source": "FORM",
"lifecycleStage": "CUSTOMER",
"customerGroup": null,
"region": "Hà Nội",
"note": null,
"ownerId": "usr_8f2a1c3d",
"owner": {
"id": "usr_8f2a1c3d",
"name": "Trần Thị Bình",
"email": "binh@congty.vn"
},
"doNotContact": false,
"customFields": {},
"createdAt": "2026-09-29T08:00:00.000Z",
"updatedAt": "2026-09-29T08:00:00.000Z"
}
],
"meta": {
"page": 1,
"limit": 20,
"total": 1,
"totalPages": 1
}
}
}/open/contacts/{id}Lấy chi tiết một liên hệ theo id.
Quyền cần: Đọc liên hệ (`contacts:read`)
| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
| id | string | Có | Id của liên hệ. |
curl -s "https://api.salezy.vn/api/v1/open/contacts/a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d" \
-H "x-api-key: sk_ab12cd_9f8e7d6c5b4a3928170615243342516071"{
"success": true,
"message": "OK",
"data": {
"id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"code": "KH-000456",
"fullName": "Lê Thị Hoa",
"phone": "0907654321",
"email": "khach@example.com",
"phones": [
"0907654321"
],
"emails": [
"khach@example.com"
],
"zalo": "0907654321",
"gender": "FEMALE",
"dob": null,
"jobTitle": null,
"companyId": null,
"company": null,
"source": "FORM",
"lifecycleStage": "CUSTOMER",
"customerGroup": null,
"region": "Hà Nội",
"note": null,
"ownerId": "usr_8f2a1c3d",
"owner": {
"id": "usr_8f2a1c3d",
"name": "Trần Thị Bình",
"email": "binh@congty.vn"
},
"doNotContact": false,
"customFields": {},
"createdAt": "2026-09-29T08:00:00.000Z",
"updatedAt": "2026-09-29T08:00:00.000Z"
}
}Cơ hội
Chỉ đọc — cơ hội bán hàng (deal) đang được quản lý trong pipeline.
/open/dealsLấy danh sách cơ hội, có phân trang.
Quyền cần: Đọc cơ hội (`deals:read`)
| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
| page | number | Không | Trang, bắt đầu từ 1 (mặc định 1). |
| limit | number | Không | Số bản ghi mỗi trang, tối đa 100 (mặc định 20). |
| updatedSince | string (ISO 8601) | Không | Chỉ lấy bản ghi cập nhật từ thời điểm này trở đi. |
| stageId | string | Không | Lọc theo giai đoạn trong pipeline. |
| pipelineId | string | Không | Lọc theo pipeline. |
curl -s "https://api.salezy.vn/api/v1/open/deals?page=1&limit=20" \
-H "x-api-key: sk_ab12cd_9f8e7d6c5b4a3928170615243342516071"{
"success": true,
"message": "OK",
"data": {
"data": [
{
"id": "d1e2f3a4-b5c6-4d7e-8f9a-0b1c2d3e4f5a",
"name": "Gói dịch vụ cao cấp - Nguyễn Văn An",
"value": 15000000,
"currency": "VND",
"pipelineId": "pl_default",
"stageId": "stg_negotiation",
"stage": {
"id": "stg_negotiation",
"name": "Đang đàm phán",
"type": "OPEN"
},
"contactId": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"companyId": null,
"ownerId": "usr_8f2a1c3d",
"owner": {
"id": "usr_8f2a1c3d",
"name": "Trần Thị Bình",
"email": "binh@congty.vn"
},
"source": "FORM",
"expectedCloseDate": "2026-10-15T00:00:00.000Z",
"description": null,
"customFields": {},
"createdAt": "2026-09-29T08:00:00.000Z",
"updatedAt": "2026-09-29T08:00:00.000Z"
}
],
"meta": {
"page": 1,
"limit": 20,
"total": 1,
"totalPages": 1
}
}
}/open/deals/{id}Lấy chi tiết một cơ hội theo id.
Quyền cần: Đọc cơ hội (`deals:read`)
| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
| id | string | Có | Id của cơ hội. |
curl -s "https://api.salezy.vn/api/v1/open/deals/d1e2f3a4-b5c6-4d7e-8f9a-0b1c2d3e4f5a" \
-H "x-api-key: sk_ab12cd_9f8e7d6c5b4a3928170615243342516071"{
"success": true,
"message": "OK",
"data": {
"id": "d1e2f3a4-b5c6-4d7e-8f9a-0b1c2d3e4f5a",
"name": "Gói dịch vụ cao cấp - Nguyễn Văn An",
"value": 15000000,
"currency": "VND",
"pipelineId": "pl_default",
"stageId": "stg_negotiation",
"stage": {
"id": "stg_negotiation",
"name": "Đang đàm phán",
"type": "OPEN"
},
"contactId": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"companyId": null,
"ownerId": "usr_8f2a1c3d",
"owner": {
"id": "usr_8f2a1c3d",
"name": "Trần Thị Bình",
"email": "binh@congty.vn"
},
"source": "FORM",
"expectedCloseDate": "2026-10-15T00:00:00.000Z",
"description": null,
"customFields": {},
"createdAt": "2026-09-29T08:00:00.000Z",
"updatedAt": "2026-09-29T08:00:00.000Z"
}
}Đơn hàng
Chỉ đọc — đơn hàng đã tạo trong hệ thống.
/open/ordersLấy danh sách đơn hàng, có phân trang.
Quyền cần: Đọc đơn hàng (`orders:read`)
| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
| page | number | Không | Trang, bắt đầu từ 1 (mặc định 1). |
| limit | number | Không | Số bản ghi mỗi trang, tối đa 100 (mặc định 20). |
| updatedSince | string (ISO 8601) | Không | Chỉ lấy bản ghi cập nhật từ thời điểm này trở đi. |
| status | string | Không | Lọc theo trạng thái đơn hàng. |
curl -s "https://api.salezy.vn/api/v1/open/orders?page=1&limit=20" \
-H "x-api-key: sk_ab12cd_9f8e7d6c5b4a3928170615243342516071"{
"success": true,
"message": "OK",
"data": {
"data": [
{
"id": "e1f2a3b4-c5d6-4e7f-8a9b-0c1d2e3f4a5b",
"number": "DH-000123",
"status": "PROCESSING",
"paymentStatus": "UNPAID",
"subtotal": 500000,
"discount": 0,
"vatAmount": 50000,
"shippingFee": 30000,
"total": 580000,
"contactId": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"contact": {
"id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"fullName": "Lê Thị Hoa",
"phone": "0907654321"
},
"companyId": null,
"shippingAddress": "12 Nguyễn Trãi, Thanh Xuân, Hà Nội",
"note": null,
"expectedDeliveryAt": "2026-10-02T00:00:00.000Z",
"items": [
{
"productId": "p_001",
"variantId": null,
"name": "Áo sơ mi nam trắng",
"sku": "ASM-TRANG-L",
"quantity": 1,
"unitPrice": 500000,
"total": 500000
}
],
"customFields": {},
"createdAt": "2026-09-29T08:00:00.000Z",
"updatedAt": "2026-09-29T08:00:00.000Z"
}
],
"meta": {
"page": 1,
"limit": 20,
"total": 1,
"totalPages": 1
}
}
}/open/orders/{id}Lấy chi tiết một đơn hàng theo id.
Quyền cần: Đọc đơn hàng (`orders:read`)
| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
| id | string | Có | Id của đơn hàng. |
curl -s "https://api.salezy.vn/api/v1/open/orders/e1f2a3b4-c5d6-4e7f-8a9b-0c1d2e3f4a5b" \
-H "x-api-key: sk_ab12cd_9f8e7d6c5b4a3928170615243342516071"{
"success": true,
"message": "OK",
"data": {
"id": "e1f2a3b4-c5d6-4e7f-8a9b-0c1d2e3f4a5b",
"number": "DH-000123",
"status": "PROCESSING",
"paymentStatus": "UNPAID",
"subtotal": 500000,
"discount": 0,
"vatAmount": 50000,
"shippingFee": 30000,
"total": 580000,
"contactId": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"contact": {
"id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"fullName": "Lê Thị Hoa",
"phone": "0907654321"
},
"companyId": null,
"shippingAddress": "12 Nguyễn Trãi, Thanh Xuân, Hà Nội",
"note": null,
"expectedDeliveryAt": "2026-10-02T00:00:00.000Z",
"items": [
{
"productId": "p_001",
"variantId": null,
"name": "Áo sơ mi nam trắng",
"sku": "ASM-TRANG-L",
"quantity": 1,
"unitPrice": 500000,
"total": 500000
}
],
"customFields": {},
"createdAt": "2026-09-29T08:00:00.000Z",
"updatedAt": "2026-09-29T08:00:00.000Z"
}
}Webhook
Tạo một webhook tại Cài đặt › Tích hợp: nhập URL nhận (bắt buộc https:// — URL http:// bị từ chối ngay lúc lưu, mã lỗi WEBHOOK_URL_NOT_ALLOWED) và chọn sự kiện muốn theo dõi. URL không đạt quy tắc này ở bước gọi HTTP trong Tự động hoá sẽ bị từ chối khi chạy. Mỗi lần sự kiện xảy ra, Salezy gửi một request POST tới URL đó với nội dung dạng “envelope” như sau:
{
"id": "evt_5a7c9e21-3b4d-4f6a-8c1e-2d3f4a5b6c7d",
"event": "lead.created",
"at": "2026-09-29T08:00:00.000Z",
"organizationId": "org_3f9a1c2b",
"data": {
"leadId": "7c0e4f6a-1b2c-4d3e-9f8a-0123456789ab",
"lead": {
"id": "7c0e4f6a-1b2c-4d3e-9f8a-0123456789ab",
"fullName": "Nguyễn Văn An",
"phone": "0901234567",
"email": "khach@example.com",
"companyName": "Cửa hàng An Phát",
"source": "FORM",
"status": "NEW",
"score": 10,
"need": "Tư vấn gói dịch vụ",
"budget": null,
"region": "Hà Nội",
"jobTitle": null,
"note": null,
"ownerId": "usr_8f2a1c3d",
"owner": {
"id": "usr_8f2a1c3d",
"name": "Trần Thị Bình",
"email": "binh@congty.vn"
},
"campaignId": null,
"utm": {
"source": "facebook",
"campaign": "thang-9"
},
"customFields": {},
"convertedContactId": null,
"convertedCompanyId": null,
"convertedDealId": null,
"createdAt": "2026-09-29T08:00:00.000Z",
"updatedAt": "2026-09-29T08:00:00.000Z"
}
}
}id (dạng evt_…) là mã của LẦN GỬI này — dùng để chống xử lý trùng (idempotency): lưu lại các id đã xử lý, bỏ qua nếu nhận lại đúng id đó (ví dụ do webhook được gửi lại).
Header đi kèm mỗi request
| Header | Ý nghĩa |
|---|---|
| X-Salezy-Signature | Chữ ký để xác minh request đến từ Salezy — xem mục Kiểm tra chữ ký. |
| x-signature | Chữ ký kiểu cũ (giữ để tương thích ngược) — HMAC-SHA256 trực tiếp trên nội dung gửi đi, không kèm thời gian. |
| X-Salezy-Event | Tên sự kiện, ví dụ “lead.created”. |
| X-Salezy-Delivery | Bằng đúng id trong envelope. |
URL nhận phải trả về mã 2xx trong vòng 10 giây. Bất kỳ điều gì khác — lỗi mạng, mã 3xx/4xx/5xx, hoặc quá thời gian — đều tính là gửi thất bại và được thử lại theo lịch cách quãng tăng dần: 2, 4, 8, 16, 32 phút (tối đa 5 lần gửi lại). Hết số lần trên, Salezy ngừng thử và ghi nhận là lỗi vĩnh viễn cho lần gửi đó.
Trong màn Cài đặt, mỗi webhook có nút Gửi thử để gửi ngay một sự kiện mẫu và xem kết quả, không cần đợi sự kiện thật xảy ra.
Danh sách sự kiện
Bấm vào một sự kiện để xem payload mẫu đầy đủ.
Lead
lead.created— Có lead mới
Bắn khi có một lead mới được tạo trong hệ thống.
{
"id": "evt_5a7c9e21-3b4d-4f6a-8c1e-2d3f4a5b6c7d",
"event": "lead.created",
"at": "2026-09-29T08:00:00.000Z",
"organizationId": "org_3f9a1c2b",
"data": {
"leadId": "7c0e4f6a-1b2c-4d3e-9f8a-0123456789ab",
"lead": {
"id": "7c0e4f6a-1b2c-4d3e-9f8a-0123456789ab",
"fullName": "Nguyễn Văn An",
"phone": "0901234567",
"email": "khach@example.com",
"companyName": "Cửa hàng An Phát",
"source": "FORM",
"status": "NEW",
"score": 10,
"need": "Tư vấn gói dịch vụ",
"budget": null,
"region": "Hà Nội",
"jobTitle": null,
"note": null,
"ownerId": "usr_8f2a1c3d",
"owner": {
"id": "usr_8f2a1c3d",
"name": "Trần Thị Bình",
"email": "binh@congty.vn"
},
"campaignId": null,
"utm": {
"source": "facebook",
"campaign": "thang-9"
},
"customFields": {},
"convertedContactId": null,
"convertedCompanyId": null,
"convertedDealId": null,
"createdAt": "2026-09-29T08:00:00.000Z",
"updatedAt": "2026-09-29T08:00:00.000Z"
}
}
}lead.updated— Lead được cập nhật
Bắn khi thông tin của một lead được sửa.
{
"id": "evt_5a7c9e21-3b4d-4f6a-8c1e-2d3f4a5b6c7d",
"event": "lead.updated",
"at": "2026-09-29T08:00:00.000Z",
"organizationId": "org_3f9a1c2b",
"data": {
"leadId": "7c0e4f6a-1b2c-4d3e-9f8a-0123456789ab",
"changedFields": [
"status",
"note"
],
"lead": {
"id": "7c0e4f6a-1b2c-4d3e-9f8a-0123456789ab",
"fullName": "Nguyễn Văn An",
"phone": "0901234567",
"email": "khach@example.com",
"companyName": "Cửa hàng An Phát",
"source": "FORM",
"status": "NEW",
"score": 10,
"need": "Tư vấn gói dịch vụ",
"budget": null,
"region": "Hà Nội",
"jobTitle": null,
"note": null,
"ownerId": "usr_8f2a1c3d",
"owner": {
"id": "usr_8f2a1c3d",
"name": "Trần Thị Bình",
"email": "binh@congty.vn"
},
"campaignId": null,
"utm": {
"source": "facebook",
"campaign": "thang-9"
},
"customFields": {},
"convertedContactId": null,
"convertedCompanyId": null,
"convertedDealId": null,
"createdAt": "2026-09-29T08:00:00.000Z",
"updatedAt": "2026-09-29T08:00:00.000Z"
}
}
}lead.assigned— Lead được giao người phụ trách
Bắn khi một lead được giao (hoặc đổi) người phụ trách.
{
"id": "evt_5a7c9e21-3b4d-4f6a-8c1e-2d3f4a5b6c7d",
"event": "lead.assigned",
"at": "2026-09-29T08:00:00.000Z",
"organizationId": "org_3f9a1c2b",
"data": {
"leadId": "7c0e4f6a-1b2c-4d3e-9f8a-0123456789ab",
"ownerId": "usr_8f2a1c3d",
"lead": {
"id": "7c0e4f6a-1b2c-4d3e-9f8a-0123456789ab",
"fullName": "Nguyễn Văn An",
"phone": "0901234567",
"email": "khach@example.com",
"companyName": "Cửa hàng An Phát",
"source": "FORM",
"status": "NEW",
"score": 10,
"need": "Tư vấn gói dịch vụ",
"budget": null,
"region": "Hà Nội",
"jobTitle": null,
"note": null,
"ownerId": "usr_8f2a1c3d",
"owner": {
"id": "usr_8f2a1c3d",
"name": "Trần Thị Bình",
"email": "binh@congty.vn"
},
"campaignId": null,
"utm": {
"source": "facebook",
"campaign": "thang-9"
},
"customFields": {},
"convertedContactId": null,
"convertedCompanyId": null,
"convertedDealId": null,
"createdAt": "2026-09-29T08:00:00.000Z",
"updatedAt": "2026-09-29T08:00:00.000Z"
}
}
}lead.converted— Lead chuyển thành khách hàng
Bắn khi lead được chuyển đổi thành liên hệ (và có thể kèm cơ hội).
{
"id": "evt_5a7c9e21-3b4d-4f6a-8c1e-2d3f4a5b6c7d",
"event": "lead.converted",
"at": "2026-09-29T08:00:00.000Z",
"organizationId": "org_3f9a1c2b",
"data": {
"leadId": "7c0e4f6a-1b2c-4d3e-9f8a-0123456789ab",
"contactId": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"companyId": null,
"dealId": "d1e2f3a4-b5c6-4d7e-8f9a-0b1c2d3e4f5a",
"reusedContact": false,
"reusedCompany": false,
"lead": {
"id": "7c0e4f6a-1b2c-4d3e-9f8a-0123456789ab",
"fullName": "Nguyễn Văn An",
"phone": "0901234567",
"email": "khach@example.com",
"companyName": "Cửa hàng An Phát",
"source": "FORM",
"status": "NEW",
"score": 10,
"need": "Tư vấn gói dịch vụ",
"budget": null,
"region": "Hà Nội",
"jobTitle": null,
"note": null,
"ownerId": "usr_8f2a1c3d",
"owner": {
"id": "usr_8f2a1c3d",
"name": "Trần Thị Bình",
"email": "binh@congty.vn"
},
"campaignId": null,
"utm": {
"source": "facebook",
"campaign": "thang-9"
},
"customFields": {},
"convertedContactId": null,
"convertedCompanyId": null,
"convertedDealId": null,
"createdAt": "2026-09-29T08:00:00.000Z",
"updatedAt": "2026-09-29T08:00:00.000Z"
},
"contact": {
"id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"code": "KH-000456",
"fullName": "Lê Thị Hoa",
"phone": "0907654321",
"email": "khach@example.com",
"phones": [
"0907654321"
],
"emails": [
"khach@example.com"
],
"zalo": "0907654321",
"gender": "FEMALE",
"dob": null,
"jobTitle": null,
"companyId": null,
"company": null,
"source": "FORM",
"lifecycleStage": "CUSTOMER",
"customerGroup": null,
"region": "Hà Nội",
"note": null,
"ownerId": "usr_8f2a1c3d",
"owner": {
"id": "usr_8f2a1c3d",
"name": "Trần Thị Bình",
"email": "binh@congty.vn"
},
"doNotContact": false,
"customFields": {},
"createdAt": "2026-09-29T08:00:00.000Z",
"updatedAt": "2026-09-29T08:00:00.000Z"
},
"deal": {
"id": "d1e2f3a4-b5c6-4d7e-8f9a-0b1c2d3e4f5a",
"name": "Gói dịch vụ cao cấp - Nguyễn Văn An",
"value": 15000000,
"currency": "VND",
"pipelineId": "pl_default",
"stageId": "stg_negotiation",
"stage": {
"id": "stg_negotiation",
"name": "Đang đàm phán",
"type": "OPEN"
},
"contactId": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"companyId": null,
"ownerId": "usr_8f2a1c3d",
"owner": {
"id": "usr_8f2a1c3d",
"name": "Trần Thị Bình",
"email": "binh@congty.vn"
},
"source": "FORM",
"expectedCloseDate": "2026-10-15T00:00:00.000Z",
"description": null,
"customFields": {},
"createdAt": "2026-09-29T08:00:00.000Z",
"updatedAt": "2026-09-29T08:00:00.000Z"
}
}
}Liên hệ
contact.created— Có liên hệ mới
Bắn khi có một liên hệ mới được tạo.
{
"id": "evt_5a7c9e21-3b4d-4f6a-8c1e-2d3f4a5b6c7d",
"event": "contact.created",
"at": "2026-09-29T08:00:00.000Z",
"organizationId": "org_3f9a1c2b",
"data": {
"contactId": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"contact": {
"id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"code": "KH-000456",
"fullName": "Lê Thị Hoa",
"phone": "0907654321",
"email": "khach@example.com",
"phones": [
"0907654321"
],
"emails": [
"khach@example.com"
],
"zalo": "0907654321",
"gender": "FEMALE",
"dob": null,
"jobTitle": null,
"companyId": null,
"company": null,
"source": "FORM",
"lifecycleStage": "CUSTOMER",
"customerGroup": null,
"region": "Hà Nội",
"note": null,
"ownerId": "usr_8f2a1c3d",
"owner": {
"id": "usr_8f2a1c3d",
"name": "Trần Thị Bình",
"email": "binh@congty.vn"
},
"doNotContact": false,
"customFields": {},
"createdAt": "2026-09-29T08:00:00.000Z",
"updatedAt": "2026-09-29T08:00:00.000Z"
}
}
}contact.updated— Liên hệ được cập nhật
Bắn khi thông tin của một liên hệ được sửa.
{
"id": "evt_5a7c9e21-3b4d-4f6a-8c1e-2d3f4a5b6c7d",
"event": "contact.updated",
"at": "2026-09-29T08:00:00.000Z",
"organizationId": "org_3f9a1c2b",
"data": {
"contactId": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"changedFields": [
"phone",
"note"
],
"contact": {
"id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"code": "KH-000456",
"fullName": "Lê Thị Hoa",
"phone": "0907654321",
"email": "khach@example.com",
"phones": [
"0907654321"
],
"emails": [
"khach@example.com"
],
"zalo": "0907654321",
"gender": "FEMALE",
"dob": null,
"jobTitle": null,
"companyId": null,
"company": null,
"source": "FORM",
"lifecycleStage": "CUSTOMER",
"customerGroup": null,
"region": "Hà Nội",
"note": null,
"ownerId": "usr_8f2a1c3d",
"owner": {
"id": "usr_8f2a1c3d",
"name": "Trần Thị Bình",
"email": "binh@congty.vn"
},
"doNotContact": false,
"customFields": {},
"createdAt": "2026-09-29T08:00:00.000Z",
"updatedAt": "2026-09-29T08:00:00.000Z"
}
}
}Cơ hội
deal.created— Có cơ hội mới
Bắn khi có một cơ hội (deal) mới được tạo.
{
"id": "evt_5a7c9e21-3b4d-4f6a-8c1e-2d3f4a5b6c7d",
"event": "deal.created",
"at": "2026-09-29T08:00:00.000Z",
"organizationId": "org_3f9a1c2b",
"data": {
"dealId": "d1e2f3a4-b5c6-4d7e-8f9a-0b1c2d3e4f5a",
"deal": {
"id": "d1e2f3a4-b5c6-4d7e-8f9a-0b1c2d3e4f5a",
"name": "Gói dịch vụ cao cấp - Nguyễn Văn An",
"value": 15000000,
"currency": "VND",
"pipelineId": "pl_default",
"stageId": "stg_negotiation",
"stage": {
"id": "stg_negotiation",
"name": "Đang đàm phán",
"type": "OPEN"
},
"contactId": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"companyId": null,
"ownerId": "usr_8f2a1c3d",
"owner": {
"id": "usr_8f2a1c3d",
"name": "Trần Thị Bình",
"email": "binh@congty.vn"
},
"source": "FORM",
"expectedCloseDate": "2026-10-15T00:00:00.000Z",
"description": null,
"customFields": {},
"createdAt": "2026-09-29T08:00:00.000Z",
"updatedAt": "2026-09-29T08:00:00.000Z"
}
}
}deal.updated— Cơ hội được cập nhật
Bắn khi thông tin của một cơ hội được sửa.
{
"id": "evt_5a7c9e21-3b4d-4f6a-8c1e-2d3f4a5b6c7d",
"event": "deal.updated",
"at": "2026-09-29T08:00:00.000Z",
"organizationId": "org_3f9a1c2b",
"data": {
"dealId": "d1e2f3a4-b5c6-4d7e-8f9a-0b1c2d3e4f5a",
"changedFields": [
"value",
"stageId"
],
"deal": {
"id": "d1e2f3a4-b5c6-4d7e-8f9a-0b1c2d3e4f5a",
"name": "Gói dịch vụ cao cấp - Nguyễn Văn An",
"value": 15000000,
"currency": "VND",
"pipelineId": "pl_default",
"stageId": "stg_negotiation",
"stage": {
"id": "stg_negotiation",
"name": "Đang đàm phán",
"type": "OPEN"
},
"contactId": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"companyId": null,
"ownerId": "usr_8f2a1c3d",
"owner": {
"id": "usr_8f2a1c3d",
"name": "Trần Thị Bình",
"email": "binh@congty.vn"
},
"source": "FORM",
"expectedCloseDate": "2026-10-15T00:00:00.000Z",
"description": null,
"customFields": {},
"createdAt": "2026-09-29T08:00:00.000Z",
"updatedAt": "2026-09-29T08:00:00.000Z"
}
}
}deal.stage_changed— Cơ hội chuyển giai đoạn
Bắn khi một cơ hội chuyển sang giai đoạn khác trong pipeline.
{
"id": "evt_5a7c9e21-3b4d-4f6a-8c1e-2d3f4a5b6c7d",
"event": "deal.stage_changed",
"at": "2026-09-29T08:00:00.000Z",
"organizationId": "org_3f9a1c2b",
"data": {
"dealId": "d1e2f3a4-b5c6-4d7e-8f9a-0b1c2d3e4f5a",
"toStageId": "stg_negotiation",
"deal": {
"id": "d1e2f3a4-b5c6-4d7e-8f9a-0b1c2d3e4f5a",
"name": "Gói dịch vụ cao cấp - Nguyễn Văn An",
"value": 15000000,
"currency": "VND",
"pipelineId": "pl_default",
"stageId": "stg_negotiation",
"stage": {
"id": "stg_negotiation",
"name": "Đang đàm phán",
"type": "OPEN"
},
"contactId": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"companyId": null,
"ownerId": "usr_8f2a1c3d",
"owner": {
"id": "usr_8f2a1c3d",
"name": "Trần Thị Bình",
"email": "binh@congty.vn"
},
"source": "FORM",
"expectedCloseDate": "2026-10-15T00:00:00.000Z",
"description": null,
"customFields": {},
"createdAt": "2026-09-29T08:00:00.000Z",
"updatedAt": "2026-09-29T08:00:00.000Z"
}
}
}deal.won— Cơ hội thắng
Bắn khi một cơ hội được đánh dấu thắng.
{
"id": "evt_5a7c9e21-3b4d-4f6a-8c1e-2d3f4a5b6c7d",
"event": "deal.won",
"at": "2026-09-29T08:00:00.000Z",
"organizationId": "org_3f9a1c2b",
"data": {
"dealId": "d1e2f3a4-b5c6-4d7e-8f9a-0b1c2d3e4f5a",
"deal": {
"id": "d1e2f3a4-b5c6-4d7e-8f9a-0b1c2d3e4f5a",
"name": "Gói dịch vụ cao cấp - Nguyễn Văn An",
"value": 15000000,
"currency": "VND",
"pipelineId": "pl_default",
"stageId": "stg_negotiation",
"stage": {
"id": "stg_negotiation",
"name": "Đang đàm phán",
"type": "OPEN"
},
"contactId": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"companyId": null,
"ownerId": "usr_8f2a1c3d",
"owner": {
"id": "usr_8f2a1c3d",
"name": "Trần Thị Bình",
"email": "binh@congty.vn"
},
"source": "FORM",
"expectedCloseDate": "2026-10-15T00:00:00.000Z",
"description": null,
"customFields": {},
"createdAt": "2026-09-29T08:00:00.000Z",
"updatedAt": "2026-09-29T08:00:00.000Z"
}
}
}deal.lost— Cơ hội thua
Bắn khi một cơ hội được đánh dấu thua.
{
"id": "evt_5a7c9e21-3b4d-4f6a-8c1e-2d3f4a5b6c7d",
"event": "deal.lost",
"at": "2026-09-29T08:00:00.000Z",
"organizationId": "org_3f9a1c2b",
"data": {
"dealId": "d1e2f3a4-b5c6-4d7e-8f9a-0b1c2d3e4f5a",
"deal": {
"id": "d1e2f3a4-b5c6-4d7e-8f9a-0b1c2d3e4f5a",
"name": "Gói dịch vụ cao cấp - Nguyễn Văn An",
"value": 15000000,
"currency": "VND",
"pipelineId": "pl_default",
"stageId": "stg_negotiation",
"stage": {
"id": "stg_negotiation",
"name": "Đang đàm phán",
"type": "OPEN"
},
"contactId": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"companyId": null,
"ownerId": "usr_8f2a1c3d",
"owner": {
"id": "usr_8f2a1c3d",
"name": "Trần Thị Bình",
"email": "binh@congty.vn"
},
"source": "FORM",
"expectedCloseDate": "2026-10-15T00:00:00.000Z",
"description": null,
"customFields": {},
"createdAt": "2026-09-29T08:00:00.000Z",
"updatedAt": "2026-09-29T08:00:00.000Z"
}
}
}Đơn hàng
order.created— Có đơn hàng mới
Bắn khi có một đơn hàng mới được tạo.
{
"id": "evt_5a7c9e21-3b4d-4f6a-8c1e-2d3f4a5b6c7d",
"event": "order.created",
"at": "2026-09-29T08:00:00.000Z",
"organizationId": "org_3f9a1c2b",
"data": {
"orderId": "e1f2a3b4-c5d6-4e7f-8a9b-0c1d2e3f4a5b",
"order": {
"id": "e1f2a3b4-c5d6-4e7f-8a9b-0c1d2e3f4a5b",
"number": "DH-000123",
"status": "PROCESSING",
"paymentStatus": "UNPAID",
"subtotal": 500000,
"discount": 0,
"vatAmount": 50000,
"shippingFee": 30000,
"total": 580000,
"contactId": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"contact": {
"id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"fullName": "Lê Thị Hoa",
"phone": "0907654321"
},
"companyId": null,
"shippingAddress": "12 Nguyễn Trãi, Thanh Xuân, Hà Nội",
"note": null,
"expectedDeliveryAt": "2026-10-02T00:00:00.000Z",
"items": [
{
"productId": "p_001",
"variantId": null,
"name": "Áo sơ mi nam trắng",
"sku": "ASM-TRANG-L",
"quantity": 1,
"unitPrice": 500000,
"total": 500000
}
],
"customFields": {},
"createdAt": "2026-09-29T08:00:00.000Z",
"updatedAt": "2026-09-29T08:00:00.000Z"
}
}
}order.status_changed— Đơn hàng đổi trạng thái
Bắn khi trạng thái của một đơn hàng thay đổi.
{
"id": "evt_5a7c9e21-3b4d-4f6a-8c1e-2d3f4a5b6c7d",
"event": "order.status_changed",
"at": "2026-09-29T08:00:00.000Z",
"organizationId": "org_3f9a1c2b",
"data": {
"orderId": "e1f2a3b4-c5d6-4e7f-8a9b-0c1d2e3f4a5b",
"from": "PENDING",
"to": "PROCESSING",
"order": {
"id": "e1f2a3b4-c5d6-4e7f-8a9b-0c1d2e3f4a5b",
"number": "DH-000123",
"status": "PROCESSING",
"paymentStatus": "UNPAID",
"subtotal": 500000,
"discount": 0,
"vatAmount": 50000,
"shippingFee": 30000,
"total": 580000,
"contactId": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"contact": {
"id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"fullName": "Lê Thị Hoa",
"phone": "0907654321"
},
"companyId": null,
"shippingAddress": "12 Nguyễn Trãi, Thanh Xuân, Hà Nội",
"note": null,
"expectedDeliveryAt": "2026-10-02T00:00:00.000Z",
"items": [
{
"productId": "p_001",
"variantId": null,
"name": "Áo sơ mi nam trắng",
"sku": "ASM-TRANG-L",
"quantity": 1,
"unitPrice": 500000,
"total": 500000
}
],
"customFields": {},
"createdAt": "2026-09-29T08:00:00.000Z",
"updatedAt": "2026-09-29T08:00:00.000Z"
}
}
}order.completed— Đơn hàng hoàn thành
Bắn khi một đơn hàng được đánh dấu hoàn thành.
{
"id": "evt_5a7c9e21-3b4d-4f6a-8c1e-2d3f4a5b6c7d",
"event": "order.completed",
"at": "2026-09-29T08:00:00.000Z",
"organizationId": "org_3f9a1c2b",
"data": {
"orderId": "e1f2a3b4-c5d6-4e7f-8a9b-0c1d2e3f4a5b",
"order": {
"id": "e1f2a3b4-c5d6-4e7f-8a9b-0c1d2e3f4a5b",
"number": "DH-000123",
"status": "PROCESSING",
"paymentStatus": "UNPAID",
"subtotal": 500000,
"discount": 0,
"vatAmount": 50000,
"shippingFee": 30000,
"total": 580000,
"contactId": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"contact": {
"id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"fullName": "Lê Thị Hoa",
"phone": "0907654321"
},
"companyId": null,
"shippingAddress": "12 Nguyễn Trãi, Thanh Xuân, Hà Nội",
"note": null,
"expectedDeliveryAt": "2026-10-02T00:00:00.000Z",
"items": [
{
"productId": "p_001",
"variantId": null,
"name": "Áo sơ mi nam trắng",
"sku": "ASM-TRANG-L",
"quantity": 1,
"unitPrice": 500000,
"total": 500000
}
],
"customFields": {},
"createdAt": "2026-09-29T08:00:00.000Z",
"updatedAt": "2026-09-29T08:00:00.000Z"
}
}
}shipment.created— Đã tạo vận đơnPhải chọn riêng
Bắn khi đơn hàng được tạo vận đơn với hãng vận chuyển (sự kiện mới — phải tick riêng, không nằm trong "tất cả").
{
"id": "evt_5a7c9e21-3b4d-4f6a-8c1e-2d3f4a5b6c7d",
"event": "shipment.created",
"at": "2026-09-29T08:00:00.000Z",
"organizationId": "org_3f9a1c2b",
"data": {
"orderId": "e1f2a3b4-c5d6-4e7f-8a9b-0c1d2e3f4a5b",
"shipmentId": "7d0c1f5e-3b9a-4f2e-9c1d-5a6b7c8d9e0f",
"carrier": "GHN",
"trackingCode": "GHN123456789",
"order": {
"id": "e1f2a3b4-c5d6-4e7f-8a9b-0c1d2e3f4a5b",
"number": "DH-000123",
"status": "PROCESSING",
"paymentStatus": "UNPAID",
"subtotal": 500000,
"discount": 0,
"vatAmount": 50000,
"shippingFee": 30000,
"total": 580000,
"contactId": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"contact": {
"id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"fullName": "Lê Thị Hoa",
"phone": "0907654321"
},
"companyId": null,
"shippingAddress": "12 Nguyễn Trãi, Thanh Xuân, Hà Nội",
"note": null,
"expectedDeliveryAt": "2026-10-02T00:00:00.000Z",
"items": [
{
"productId": "p_001",
"variantId": null,
"name": "Áo sơ mi nam trắng",
"sku": "ASM-TRANG-L",
"quantity": 1,
"unitPrice": 500000,
"total": 500000
}
],
"customFields": {},
"createdAt": "2026-09-29T08:00:00.000Z",
"updatedAt": "2026-09-29T08:00:00.000Z"
}
}
}shipment.status_changed— Vận đơn đổi trạng tháiPhải chọn riêng
Bắn khi trạng thái vận đơn thay đổi (đã lấy hàng, đang giao, đã giao, hoàn…) — phải tick riêng, không nằm trong "tất cả".
{
"id": "evt_5a7c9e21-3b4d-4f6a-8c1e-2d3f4a5b6c7d",
"event": "shipment.status_changed",
"at": "2026-09-29T08:00:00.000Z",
"organizationId": "org_3f9a1c2b",
"data": {
"orderId": "e1f2a3b4-c5d6-4e7f-8a9b-0c1d2e3f4a5b",
"shipmentId": "7d0c1f5e-3b9a-4f2e-9c1d-5a6b7c8d9e0f",
"from": "IN_TRANSIT",
"to": "DELIVERED",
"order": {
"id": "e1f2a3b4-c5d6-4e7f-8a9b-0c1d2e3f4a5b",
"number": "DH-000123",
"status": "PROCESSING",
"paymentStatus": "UNPAID",
"subtotal": 500000,
"discount": 0,
"vatAmount": 50000,
"shippingFee": 30000,
"total": 580000,
"contactId": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"contact": {
"id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"fullName": "Lê Thị Hoa",
"phone": "0907654321"
},
"companyId": null,
"shippingAddress": "12 Nguyễn Trãi, Thanh Xuân, Hà Nội",
"note": null,
"expectedDeliveryAt": "2026-10-02T00:00:00.000Z",
"items": [
{
"productId": "p_001",
"variantId": null,
"name": "Áo sơ mi nam trắng",
"sku": "ASM-TRANG-L",
"quantity": 1,
"unitPrice": 500000,
"total": 500000
}
],
"customFields": {},
"createdAt": "2026-09-29T08:00:00.000Z",
"updatedAt": "2026-09-29T08:00:00.000Z"
}
}
}invoice.einvoice_issued— Đã xuất hoá đơn điện tử
Bắn khi hoá đơn bán hàng của đơn được MISA meInvoice cấp số (hoá đơn điện tử đã phát hành). [MISA]
{
"id": "evt_5a7c9e21-3b4d-4f6a-8c1e-2d3f4a5b6c7d",
"event": "invoice.einvoice_issued",
"at": "2026-09-29T08:00:00.000Z",
"organizationId": "org_3f9a1c2b",
"data": {
"orderId": "e1f2a3b4-c5d6-4e7f-8a9b-0c1d2e3f4a5b",
"order": {
"id": "e1f2a3b4-c5d6-4e7f-8a9b-0c1d2e3f4a5b",
"number": "DH-000123",
"status": "PROCESSING",
"paymentStatus": "UNPAID",
"subtotal": 500000,
"discount": 0,
"vatAmount": 50000,
"shippingFee": 30000,
"total": 580000,
"contactId": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"contact": {
"id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"fullName": "Lê Thị Hoa",
"phone": "0907654321"
},
"companyId": null,
"shippingAddress": "12 Nguyễn Trãi, Thanh Xuân, Hà Nội",
"note": null,
"expectedDeliveryAt": "2026-10-02T00:00:00.000Z",
"items": [
{
"productId": "p_001",
"variantId": null,
"name": "Áo sơ mi nam trắng",
"sku": "ASM-TRANG-L",
"quantity": 1,
"unitPrice": 500000,
"total": 500000
}
],
"customFields": {},
"createdAt": "2026-09-29T08:00:00.000Z",
"updatedAt": "2026-09-29T08:00:00.000Z"
}
}
}Phiếu hỗ trợ
ticket.created— Có phiếu hỗ trợ mới
Bắn khi có một phiếu hỗ trợ (ticket) mới được tạo.
{
"id": "evt_5a7c9e21-3b4d-4f6a-8c1e-2d3f4a5b6c7d",
"event": "ticket.created",
"at": "2026-09-29T08:00:00.000Z",
"organizationId": "org_3f9a1c2b",
"data": {
"ticketId": "f1a2b3c4-d5e6-4f7a-8b9c-0d1e2f3a4b5c",
"ticket": {
"id": "f1a2b3c4-d5e6-4f7a-8b9c-0d1e2f3a4b5c",
"number": "TK-000078",
"subject": "Khách hỏi về bảo hành",
"status": "OPEN",
"priority": "NORMAL",
"contactId": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"assigneeId": "usr_8f2a1c3d",
"createdAt": "2026-09-29T08:00:00.000Z",
"updatedAt": "2026-09-29T08:00:00.000Z",
"resolvedAt": null
}
}
}ticket.status_changed— Phiếu hỗ trợ đổi trạng thái
Bắn khi trạng thái của một phiếu hỗ trợ thay đổi.
{
"id": "evt_5a7c9e21-3b4d-4f6a-8c1e-2d3f4a5b6c7d",
"event": "ticket.status_changed",
"at": "2026-09-29T08:00:00.000Z",
"organizationId": "org_3f9a1c2b",
"data": {
"ticketId": "f1a2b3c4-d5e6-4f7a-8b9c-0d1e2f3a4b5c",
"status": "RESOLVED",
"ticket": {
"id": "f1a2b3c4-d5e6-4f7a-8b9c-0d1e2f3a4b5c",
"number": "TK-000078",
"subject": "Khách hỏi về bảo hành",
"status": "OPEN",
"priority": "NORMAL",
"contactId": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"assigneeId": "usr_8f2a1c3d",
"createdAt": "2026-09-29T08:00:00.000Z",
"updatedAt": "2026-09-29T08:00:00.000Z",
"resolvedAt": null
}
}
}Form
form.submitted— Khách gửi form
Bắn khi khách gửi một form (thường sinh ra lead mới).
{
"id": "evt_5a7c9e21-3b4d-4f6a-8c1e-2d3f4a5b6c7d",
"event": "form.submitted",
"at": "2026-09-29T08:00:00.000Z",
"organizationId": "org_3f9a1c2b",
"data": {
"formId": "form_001",
"submissionId": "sub_001",
"leadId": "7c0e4f6a-1b2c-4d3e-9f8a-0123456789ab",
"lead": {
"id": "7c0e4f6a-1b2c-4d3e-9f8a-0123456789ab",
"fullName": "Nguyễn Văn An",
"phone": "0901234567",
"email": "khach@example.com",
"companyName": "Cửa hàng An Phát",
"source": "FORM",
"status": "NEW",
"score": 10,
"need": "Tư vấn gói dịch vụ",
"budget": null,
"region": "Hà Nội",
"jobTitle": null,
"note": null,
"ownerId": "usr_8f2a1c3d",
"owner": {
"id": "usr_8f2a1c3d",
"name": "Trần Thị Bình",
"email": "binh@congty.vn"
},
"campaignId": null,
"utm": {
"source": "facebook",
"campaign": "thang-9"
},
"customFields": {},
"convertedContactId": null,
"convertedCompanyId": null,
"convertedDealId": null,
"createdAt": "2026-09-29T08:00:00.000Z",
"updatedAt": "2026-09-29T08:00:00.000Z"
}
}
}Hội thoại
inbox.conversation_created— Có hội thoại mới
Bắn khi có một hội thoại mới được tạo trong hộp thư.
{
"id": "evt_5a7c9e21-3b4d-4f6a-8c1e-2d3f4a5b6c7d",
"event": "inbox.conversation_created",
"at": "2026-09-29T08:00:00.000Z",
"organizationId": "org_3f9a1c2b",
"data": {
"conversationId": "a2b3c4d5-e6f7-4a8b-9c0d-1e2f3a4b5c6d",
"channel": "MESSENGER",
"conversation": {
"id": "a2b3c4d5-e6f7-4a8b-9c0d-1e2f3a4b5c6d",
"channel": "MESSENGER",
"status": "OPEN",
"contactId": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"assigneeId": "usr_8f2a1c3d",
"lastMessageAt": "2026-09-29T08:00:00.000Z",
"createdAt": "2026-09-29T08:00:00.000Z"
}
}
}inbox.message_received— Tin nhắn mới từ kháchPhải chọn riêng
Bắn khi khách gửi tin nhắn mới vào một hội thoại (tần suất cao, phải tick riêng).
{
"id": "evt_5a7c9e21-3b4d-4f6a-8c1e-2d3f4a5b6c7d",
"event": "inbox.message_received",
"at": "2026-09-29T08:00:00.000Z",
"organizationId": "org_3f9a1c2b",
"data": {
"conversationId": "a2b3c4d5-e6f7-4a8b-9c0d-1e2f3a4b5c6d",
"messageId": "b3c4d5e6-f7a8-4b9c-0d1e-2f3a4b5c6d7e",
"assigneeId": "usr_8f2a1c3d",
"conversation": {
"id": "a2b3c4d5-e6f7-4a8b-9c0d-1e2f3a4b5c6d",
"channel": "MESSENGER",
"status": "OPEN",
"contactId": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"assigneeId": "usr_8f2a1c3d",
"lastMessageAt": "2026-09-29T08:00:00.000Z",
"createdAt": "2026-09-29T08:00:00.000Z"
},
"message": {
"id": "b3c4d5e6-f7a8-4b9c-0d1e-2f3a4b5c6d7e",
"direction": "IN",
"body": "Shop ơi còn hàng không?",
"attachments": [],
"sentByBot": false,
"sentAt": "2026-09-29T08:00:00.000Z",
"sender": null,
"external": false
}
}
}inbox.message_sent— Shop gửi tin cho kháchPhải chọn riêng
Bắn khi shop gửi tin cho khách thành công (nhân viên trả lời trong Salezy, bot tự gửi hoặc nhân viên trả lời ngoài Salezy) — kèm người gửi nếu biết (tần suất cao, phải tick riêng).
{
"id": "evt_5a7c9e21-3b4d-4f6a-8c1e-2d3f4a5b6c7d",
"event": "inbox.message_sent",
"at": "2026-09-29T08:00:00.000Z",
"organizationId": "org_3f9a1c2b",
"data": {
"conversationId": "a2b3c4d5-e6f7-4a8b-9c0d-1e2f3a4b5c6d",
"messageId": "c4d5e6f7-a8b9-4c0d-1e2f-3a4b5c6d7e8f",
"channel": "MESSENGER",
"sentByUserId": "usr_8f2a1c3d",
"source": "STAFF",
"conversation": {
"id": "a2b3c4d5-e6f7-4a8b-9c0d-1e2f3a4b5c6d",
"channel": "MESSENGER",
"status": "OPEN",
"contactId": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"assigneeId": "usr_8f2a1c3d",
"lastMessageAt": "2026-09-29T08:00:00.000Z",
"createdAt": "2026-09-29T08:00:00.000Z"
},
"message": {
"id": "c4d5e6f7-a8b9-4c0d-1e2f-3a4b5c6d7e8f",
"direction": "OUT",
"body": "Dạ shop còn hàng ạ, chị cần size nào ạ?",
"attachments": [],
"sentByBot": false,
"sentAt": "2026-09-29T08:00:00.000Z",
"sender": {
"id": "usr_8f2a1c3d",
"name": "Trần Thị Bình"
},
"external": false
}
}
}Kiểm tra chữ ký
Mỗi request có header X-Salezy-Signature: t=<unix giây>,v1=<chữ ký hex>. Chữ ký là HMAC-SHA256 dùng mã bí mật (secret) của webhook (xem lúc tạo webhook, hoặc bấm “Hiện” trong màn Sửa) tính trên chuỗi ${t}.${nội dung request thô}.
- Tách
tvàv1từ header. - Chỉ chấp nhận khi chênh lệch giữa thời gian hiện tại và t không quá 300 (5 phút) — chặn tấn công phát lại (replay).
- Tính lại HMAC-SHA256 trên
${t}.${nội dung thô}bằng secret của webhook, so sánh vớiv1bằng hàm so sánh hằng thời gian (không dùng===/==— so sánh chuỗi thường có thể bị dò ra bằng cách đo thời gian phản hồi).
Quan trọng: đọc nội dung request THÔ (chưa qua parse JSON) trước khi kiểm chữ ký — parse rồi stringify lại có thể lệch khoảng trắng/thứ tự khóa và làm chữ ký luôn sai một cách khó hiểu.
// Express — cần body THÔ (chưa parse JSON) để chữ ký khớp
const express = require('express');
const crypto = require('crypto');
const app = express();
const WEBHOOK_SECRET = process.env.SALEZY_WEBHOOK_SECRET;
app.post(
'/webhooks/salezy',
express.raw({ type: 'application/json' }),
(req, res) => {
const header = req.header('X-Salezy-Signature') || '';
const parts = Object.fromEntries(header.split(',').map((p) => p.split('=')));
const t = Number(parts.t);
const v1 = parts.v1;
if (!t || !v1) return res.status(400).send('thieu chu ky');
if (Math.abs(Date.now() / 1000 - t) > 300) {
return res.status(400).send('chu ky het han');
}
const rawBody = req.body; // Buffer nhờ express.raw()
const expected = crypto
.createHmac('sha256', WEBHOOK_SECRET)
.update(`${t}.${rawBody}`)
.digest('hex');
const a = Buffer.from(v1, 'hex');
const b = Buffer.from(expected, 'hex');
if (a.length !== b.length || !crypto.timingSafeEqual(a, b)) {
return res.status(401).send('chu ky khong hop le');
}
const event = JSON.parse(rawBody.toString('utf8'));
// Chống xử lý trùng: lưu event.id (= header X-Salezy-Delivery) đã xử lý rồi thì bỏ qua.
console.log('Su kien:', event.event, event.id);
res.sendStatus(200);
},
);
app.listen(3000);
<?php
// Đọc body THÔ trước khi bất kỳ framework nào parse JSON.
$secret = getenv('SALEZY_WEBHOOK_SECRET');
$rawBody = file_get_contents('php://input');
$header = $_SERVER['HTTP_X_SALEZY_SIGNATURE'] ?? '';
parse_str(str_replace(',', '&', $header), $parts);
$t = isset($parts['t']) ? (int) $parts['t'] : 0;
$v1 = $parts['v1'] ?? '';
if (!$t || !$v1 || abs(time() - $t) > 300) {
http_response_code(400);
exit('chu ky het han hoac thieu');
}
$expected = hash_hmac('sha256', $t . '.' . $rawBody, $secret);
if (!hash_equals($expected, $v1)) {
http_response_code(401);
exit('chu ky khong hop le');
}
$event = json_decode($rawBody, true);
// Chống xử lý trùng: lưu $event['id'] (= header X-Salezy-Delivery) đã xử lý rồi thì bỏ qua.
error_log('Su kien: ' . $event['event'] . ' ' . $event['id']);
http_response_code(200);
import hashlib
import hmac
import os
import time
from flask import Flask, request
app = Flask(__name__)
WEBHOOK_SECRET = os.environ["SALEZY_WEBHOOK_SECRET"]
@app.post("/webhooks/salezy")
def salezy_webhook():
raw_body = request.get_data() # bytes — đọc TRƯỚC khi Flask parse JSON
header = request.headers.get("X-Salezy-Signature", "")
parts = dict(p.split("=", 1) for p in header.split(",") if "=" in p)
t = parts.get("t")
v1 = parts.get("v1")
if not t or not v1 or abs(time.time() - int(t)) > 300:
return "chu ky het han hoac thieu", 400
expected = hmac.new(
WEBHOOK_SECRET.encode("utf-8"),
f"{t}.".encode("utf-8") + raw_body,
hashlib.sha256,
).hexdigest()
if not hmac.compare_digest(expected, v1):
return "chu ky khong hop le", 401
event = request.get_json()
# Chống xử lý trùng: lưu event["id"] (= header X-Salezy-Delivery) đã xử lý rồi thì bỏ qua.
print("Su kien:", event["event"], event["id"])
return "", 200
Kết nối không cần code
Google Sheets (Apps Script)
Tạo một Google Sheet, mở Tiện ích mở rộng › Apps Script, dán đoạn mã dưới, rồi triển khai (Deploy) dạng “Web app” — URL được cấp chính là URL webhook để dán vào Salezy. Ví dụ dưới ghi lead mới vào một sheet tên “Leads”.
function doPost(e) {
var body = JSON.parse(e.postData.contents);
if (body.event === 'lead.created' && body.data && body.data.lead) {
var lead = body.data.lead;
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Leads');
sheet.appendRow([new Date(), lead.fullName, lead.phone, lead.email]);
}
return ContentService.createTextOutput('OK');
}
Lưu ý: Google Apps Script không đọc được header tùy chỉnh, nên không kiểm tra được chữ ký X-Salezy-Signature. Chỉ dùng cách này cho dữ liệu không nhạy cảm, hoặc thêm bước xác minh riêng (ví dụ một tham số bí mật trong chính URL) nếu cần chắc chắn hơn.
Make / Zapier
Cả hai nền tảng đều có sẵn một khối “nhận webhook” chung (Make gọi là Custom webhook, Zapier gọi là Webhooks by Zapier – Catch Hook): tạo khối đó trước, lấy URL được cấp, dán vào ô URL khi tạo webhook trong Salezy. Từ lần sự kiện tiếp theo, kịch bản (scenario/zap) của bạn sẽ nhận được đúng envelope mô tả ở mục Webhook phía trên.
Ở chiều ngược lại — muốn Make/Zapier TẠO lead hoặc liên hệ trong Salezy — dùng khối gọi HTTP có sẵn của nền tảng (module “HTTP” ở Make, action “Webhooks by Zapier – POST” hoặc tương tự ở Zapier) để gọi thẳng endpoint POST https://api.salezy.vn/api/v1/open/leads với header x-api-key, đúng như mục Endpoint · Lead ở trên.