@subiz/widget-v4 4.1.201 → 4.1.203
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/api.md +1284 -0
- package/compiled_src/bot.js +1 -7
- package/compiled_src/chatbox/ChatButton.js +19 -16
- package/compiled_src/chatbox/MessageInput.js +1 -0
- package/compiled_src/chatbox/Widget.js +1 -0
- package/compiled_src/chatbox/main.js +28 -3
- package/compiled_src/lib.js +16 -1
- package/compiled_src/store/api.js +36 -4
- package/compiled_src/store/store.js +14 -1
- package/compiled_src/util/common.js +18 -18
- package/dist/{19d6b530a9c.app.js → 19df158c2ea.app.js} +1 -1
- package/dist/{19d6b530a9c.chat.html → 19df158c2ea.chat.html} +1 -1
- package/dist/{19d6b530a9c.chat.js → 19df158c2ea.chat.js} +1 -1
- package/dist/{19d6b530a9c.form.html → 19df158c2ea.form.html} +1 -1
- package/dist/19df158c2ea.form.js +1 -0
- package/dist/{19d6b530a9c.index.html → 19df158c2ea.index.html} +1 -1
- package/dist/{19d6b530a9c.library.html → 19df158c2ea.library.html} +1 -1
- package/dist/{19d6b530a9c.library.js → 19df158c2ea.library.js} +1 -1
- package/dist/{19d6b530a9c.preview.html → 19df158c2ea.preview.html} +1 -1
- package/dist/{19d6b530a9c.preview.js → 19df158c2ea.preview.js} +1 -1
- package/dist/{19d6b530a9c.webview.js → 19df158c2ea.webview.js} +1 -1
- package/dist/HASH +1 -1
- package/dist/screenshoot.js +88 -39
- package/package.json +8 -8
- package/src/bot.js +1 -7
- package/src/chatbox/ChatButton.js +20 -15
- package/src/chatbox/MessageInput.js +1 -0
- package/src/chatbox/Widget.js +1 -1
- package/src/chatbox/main.js +24 -4
- package/src/lib.js +16 -1
- package/src/store/api.js +41 -3
- package/src/store/store.js +17 -2
- package/src/util/common.js +22 -21
- package/dist/19d6b530a9c.form.js +0 -1
- package/examples/track.js +0 -41
- /package/dist/{19d6b530a9c.127.js → 19df158c2ea.127.js} +0 -0
- /package/dist/{19d6b530a9c.132.js → 19df158c2ea.132.js} +0 -0
- /package/dist/{19d6b530a9c.185.js → 19df158c2ea.185.js} +0 -0
- /package/dist/{19d6b530a9c.27.js → 19df158c2ea.27.js} +0 -0
- /package/dist/{19d6b530a9c.278.js → 19df158c2ea.278.js} +0 -0
- /package/dist/{19d6b530a9c.339.js → 19df158c2ea.339.js} +0 -0
- /package/dist/{19d6b530a9c.459.js → 19df158c2ea.459.js} +0 -0
- /package/dist/{19d6b530a9c.490.js → 19df158c2ea.490.js} +0 -0
- /package/dist/{19d6b530a9c.74.js → 19df158c2ea.74.js} +0 -0
- /package/dist/{19d6b530a9c.997.js → 19df158c2ea.997.js} +0 -0
package/api.md
ADDED
|
@@ -0,0 +1,1284 @@
|
|
|
1
|
+
# Subiz CDP Event API
|
|
2
|
+
|
|
3
|
+
Tài liệu này hướng dẫn website gửi sự kiện người dùng về Subiz CDP bằng client library đã được cài trên website.
|
|
4
|
+
|
|
5
|
+
## Tổng quan
|
|
6
|
+
|
|
7
|
+
API chính để gửi sự kiện là:
|
|
8
|
+
|
|
9
|
+
```js
|
|
10
|
+
subiz('event', {
|
|
11
|
+
type: 'product_viewed',
|
|
12
|
+
payload: {
|
|
13
|
+
id: 'pd2345',
|
|
14
|
+
sku: 's5345',
|
|
15
|
+
name: 'Bàn phím cơ không dây',
|
|
16
|
+
price: 1500000,
|
|
17
|
+
currency: 'VND',
|
|
18
|
+
},
|
|
19
|
+
})
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
`subiz('event', ...)` trả về `Promise`.
|
|
23
|
+
|
|
24
|
+
```js
|
|
25
|
+
subiz('event', {
|
|
26
|
+
type: 'add_to_cart',
|
|
27
|
+
payload: {
|
|
28
|
+
id: 'pd2345',
|
|
29
|
+
sku: 's5345',
|
|
30
|
+
quantity: 1,
|
|
31
|
+
price: 1500000,
|
|
32
|
+
currency: 'VND',
|
|
33
|
+
},
|
|
34
|
+
}).then(function (result) {
|
|
35
|
+
console.log('Đã gửi event', result)
|
|
36
|
+
}).catch(function (error) {
|
|
37
|
+
console.error('Không gửi được event', error)
|
|
38
|
+
})
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Cấu trúc event
|
|
42
|
+
|
|
43
|
+
```js
|
|
44
|
+
subiz('event', {
|
|
45
|
+
type: 'event_name',
|
|
46
|
+
event_source_id: 'evt_1234',
|
|
47
|
+
payload: {},
|
|
48
|
+
})
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
| Trường | Bắt buộc | Mô tả |
|
|
52
|
+
| --- | --- | --- |
|
|
53
|
+
| `type` | Có | Tên sự kiện. Dùng `snake_case`, chỉ gồm chữ thường, số và `_`, tối đa 64 ký tự. |
|
|
54
|
+
| `payload` | Không | Dữ liệu chi tiết của event. Giá trị là object JSON. |
|
|
55
|
+
| `event_source_id` | Không | ID duy nhất của event ở hệ thống của website, dùng để chống gửi trùng. |
|
|
56
|
+
|
|
57
|
+
Ví dụ chống trùng event:
|
|
58
|
+
|
|
59
|
+
```js
|
|
60
|
+
subiz('event', {
|
|
61
|
+
type: 'content_viewed',
|
|
62
|
+
event_source_id: 'evt_1234',
|
|
63
|
+
payload: {
|
|
64
|
+
url: 'https://example.com/products/pd2345',
|
|
65
|
+
title: 'Bàn phím cơ không dây',
|
|
66
|
+
},
|
|
67
|
+
})
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Quy ước đặt tên
|
|
71
|
+
|
|
72
|
+
Tên event nên mô tả hành động đã xảy ra, ở dạng quá khứ hoặc trạng thái hoàn tất.
|
|
73
|
+
|
|
74
|
+
Nên dùng:
|
|
75
|
+
|
|
76
|
+
```txt
|
|
77
|
+
product_viewed
|
|
78
|
+
product_searched
|
|
79
|
+
add_to_cart
|
|
80
|
+
checkout_started
|
|
81
|
+
order_completed
|
|
82
|
+
form_submitted
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Không nên dùng:
|
|
86
|
+
|
|
87
|
+
```txt
|
|
88
|
+
ProductViewed
|
|
89
|
+
productViewed
|
|
90
|
+
product-viewed
|
|
91
|
+
view product
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Common fields
|
|
95
|
+
|
|
96
|
+
Subiz tự thu thập một số thông tin ngữ cảnh như URL hiện tại, referrer, thiết bị, trình duyệt, session và nguồn truy cập nếu có thể. Website vẫn có thể gửi các trường này trong `payload` khi muốn override hoặc bổ sung dữ liệu chính xác hơn.
|
|
97
|
+
|
|
98
|
+
Các field thường dùng:
|
|
99
|
+
|
|
100
|
+
| Trường | Mô tả |
|
|
101
|
+
| --- | --- |
|
|
102
|
+
| `url` | URL nơi event xảy ra. |
|
|
103
|
+
| `title` | Tiêu đề trang hoặc tên nội dung. |
|
|
104
|
+
| `referrer` | Trang giới thiệu người dùng tới URL hiện tại. |
|
|
105
|
+
| `utm_source` | UTM source nếu website muốn gửi chủ động. |
|
|
106
|
+
| `utm_medium` | UTM medium. |
|
|
107
|
+
| `utm_campaign` | UTM campaign. |
|
|
108
|
+
| `utm_content` | UTM content. |
|
|
109
|
+
| `utm_term` | UTM term. |
|
|
110
|
+
| `source` | Nguồn nội bộ của website, ví dụ `homepage`, `landing_page`, `email_campaign`. |
|
|
111
|
+
|
|
112
|
+
Ví dụ:
|
|
113
|
+
|
|
114
|
+
```js
|
|
115
|
+
subiz('event', {
|
|
116
|
+
type: 'product_viewed',
|
|
117
|
+
payload: {
|
|
118
|
+
id: 'pd2345',
|
|
119
|
+
name: 'Bàn phím cơ không dây',
|
|
120
|
+
url: 'https://example.com/products/pd2345',
|
|
121
|
+
utm_campaign: 'summer_2026',
|
|
122
|
+
},
|
|
123
|
+
})
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## Dữ liệu cá nhân
|
|
127
|
+
|
|
128
|
+
Chỉ gửi các thông tin cần thiết cho mục đích chăm sóc khách hàng, phân tích hành vi và cá nhân hóa trải nghiệm. Không gửi mật khẩu, mã OTP, thông tin thẻ thanh toán, token đăng nhập hoặc dữ liệu nhạy cảm không cần thiết vào `payload`.
|
|
129
|
+
|
|
130
|
+
Các field như `email`, `phone`, `fullname`, `customer_id`, `user_id` có thể được gửi khi website đã có quyền sử dụng dữ liệu đó trong hệ thống của mình.
|
|
131
|
+
|
|
132
|
+
## Định danh khách hàng
|
|
133
|
+
|
|
134
|
+
## Pageview
|
|
135
|
+
|
|
136
|
+
Dùng `pageview` khi website muốn ghi nhận lượt xem trang thủ công, đặc biệt trong Single Page App khi URL thay đổi nhưng browser không reload trang.
|
|
137
|
+
|
|
138
|
+
```js
|
|
139
|
+
subiz('pageview', {
|
|
140
|
+
url: 'https://example.com/blog/cdp-architecture',
|
|
141
|
+
title: 'CDP Architecture',
|
|
142
|
+
referrer: 'https://google.com',
|
|
143
|
+
})
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
`pageview` là wrapper của event `content_viewed`. Website nên dùng `subiz('pageview', ...)` thay vì tự gửi `content_viewed` cho các lượt xem trang thông thường.
|
|
147
|
+
|
|
148
|
+
Ví dụ cho Single Page App:
|
|
149
|
+
|
|
150
|
+
```js
|
|
151
|
+
function onRouteChange(route) {
|
|
152
|
+
subiz('pageview', {
|
|
153
|
+
url: window.location.href,
|
|
154
|
+
title: document.title,
|
|
155
|
+
referrer: document.referrer,
|
|
156
|
+
})
|
|
157
|
+
}
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
## Cập nhật thông tin khách hàng
|
|
161
|
+
|
|
162
|
+
```js
|
|
163
|
+
subiz('event', {
|
|
164
|
+
type: 'user_updated',
|
|
165
|
+
payload: {
|
|
166
|
+
email: 'alice@example.com',
|
|
167
|
+
phone: '85345345535',
|
|
168
|
+
fullname: 'Thanh',
|
|
169
|
+
},
|
|
170
|
+
})
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
## Thương mại điện tử
|
|
174
|
+
|
|
175
|
+
Các event bên dưới là ví dụ khuyến nghị. Website có thể gửi thêm custom event bằng cùng cấu trúc `subiz('event', { type, payload })`.
|
|
176
|
+
|
|
177
|
+
Các field trong ví dụ không bắt buộc toàn bộ. Website nên gửi những field mình có và giữ tên field ổn định giữa các lần gửi. Giá trị tiền tệ dùng số theo đơn vị tiền thực tế, ví dụ `{price: 1500000, currency: 'VND'}`.
|
|
178
|
+
|
|
179
|
+
Nên ưu tiên các event có thể dùng trực tiếp cho marketing segmentation, funnel và recommendation:
|
|
180
|
+
|
|
181
|
+
| Câu hỏi marketing | Event nên dùng |
|
|
182
|
+
| --- | --- |
|
|
183
|
+
| Sản phẩm nào đang hot trend? | `product_viewed`, `product_searched`, `add_to_wishlist`, `add_to_cart`, `order_completed` |
|
|
184
|
+
| User quan tâm sản phẩm nào nhưng chưa mua? | `product_viewed`, `add_to_wishlist`, `add_to_cart`, `checkout_started`, `order_completed` |
|
|
185
|
+
| User bỏ giỏ hàng? | `add_to_cart`, `checkout_started`, `payment_completed`, `order_completed` |
|
|
186
|
+
| Sản phẩm nào có nhu cầu cao nhưng chuyển đổi thấp? | `product_viewed`, `product_inquired`, `add_to_cart`, `order_completed` |
|
|
187
|
+
| Sản phẩm nào đang thiếu hàng nhưng vẫn có nhu cầu? | `back_in_stock_subscribed`, `product_inquired`, `product_viewed` |
|
|
188
|
+
| User nào nhạy cảm với giá? | `price_drop_subscribed`, `coupon_applied`, `add_to_wishlist` |
|
|
189
|
+
| Campaign/coupon nào tạo doanh thu? | `coupon_applied`, `order_completed` |
|
|
190
|
+
| Sản phẩm nào hay bị trả/hủy? | `order_cancelled`, `order_refunded`, `return_requested` |
|
|
191
|
+
|
|
192
|
+
Để query marketing dễ hơn, các event liên quan đến một sản phẩm nên gửi ổn định các field `id`, `sku`, `name`, `category`, `brand` trong `payload`. Với `order_completed`, luôn gửi danh sách `items` và mỗi item nên có `id`, `sku`, `name`, `category`, `quantity`, `price`.
|
|
193
|
+
|
|
194
|
+
### Xem sản phẩm
|
|
195
|
+
|
|
196
|
+
```js
|
|
197
|
+
subiz('event', {
|
|
198
|
+
type: 'product_viewed',
|
|
199
|
+
payload: {
|
|
200
|
+
id: 'pd2345',
|
|
201
|
+
sku: 's5345',
|
|
202
|
+
name: 'Bàn phím cơ không dây',
|
|
203
|
+
category: 'electronics',
|
|
204
|
+
brand: 'Keychron',
|
|
205
|
+
price: 1500000,
|
|
206
|
+
currency: 'VND',
|
|
207
|
+
},
|
|
208
|
+
})
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### Xem danh mục sản phẩm
|
|
212
|
+
|
|
213
|
+
```js
|
|
214
|
+
subiz('event', {
|
|
215
|
+
type: 'product_category_viewed',
|
|
216
|
+
payload: {
|
|
217
|
+
id: 'cat_electronics',
|
|
218
|
+
name: 'Electronics',
|
|
219
|
+
url: 'https://example.com/categories/electronics',
|
|
220
|
+
},
|
|
221
|
+
})
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### Xem danh sách sản phẩm
|
|
225
|
+
|
|
226
|
+
```js
|
|
227
|
+
subiz('event', {
|
|
228
|
+
type: 'product_list_viewed',
|
|
229
|
+
payload: {
|
|
230
|
+
list_id: 'homepage_featured',
|
|
231
|
+
list_name: 'Sản phẩm nổi bật',
|
|
232
|
+
category: 'electronics',
|
|
233
|
+
items: [
|
|
234
|
+
{id: 'pd2345', sku: 's5345', name: 'Bàn phím cơ không dây', category: 'electronics', position: 1, price: 1500000},
|
|
235
|
+
{id: 'pd9876', sku: 's1234', name: 'Chuột không dây', category: 'electronics', position: 2, price: 450000},
|
|
236
|
+
],
|
|
237
|
+
currency: 'VND',
|
|
238
|
+
},
|
|
239
|
+
})
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
### Tìm kiếm sản phẩm
|
|
243
|
+
|
|
244
|
+
```js
|
|
245
|
+
subiz('event', {
|
|
246
|
+
type: 'product_searched',
|
|
247
|
+
payload: {
|
|
248
|
+
keyword: 'bàn phím cơ không dây',
|
|
249
|
+
category_filter: 'electronics',
|
|
250
|
+
sort_by: 'price_asc',
|
|
251
|
+
},
|
|
252
|
+
})
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
### Lọc hoặc sắp xếp sản phẩm
|
|
256
|
+
|
|
257
|
+
```js
|
|
258
|
+
subiz('event', {
|
|
259
|
+
type: 'product_list_filtered',
|
|
260
|
+
payload: {
|
|
261
|
+
category: 'electronics',
|
|
262
|
+
filters: {
|
|
263
|
+
brand: ['logitech', 'keychron'],
|
|
264
|
+
price_min: 500000,
|
|
265
|
+
price_max: 2000000,
|
|
266
|
+
},
|
|
267
|
+
sort_by: 'price_asc',
|
|
268
|
+
result_count: 24,
|
|
269
|
+
},
|
|
270
|
+
})
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
### Hỏi về sản phẩm
|
|
274
|
+
|
|
275
|
+
```js
|
|
276
|
+
subiz('event', {
|
|
277
|
+
type: 'product_inquired',
|
|
278
|
+
payload: {
|
|
279
|
+
id: 'pd2345',
|
|
280
|
+
sku: 's5345',
|
|
281
|
+
channel: 'zalo_oa',
|
|
282
|
+
inquiry_type: 'stock_check',
|
|
283
|
+
message: 'Bàn phím này còn sẵn hàng ở kho không shop?',
|
|
284
|
+
has_agent_replied: false,
|
|
285
|
+
agent_id: null,
|
|
286
|
+
},
|
|
287
|
+
})
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
### Đăng ký nhận thông báo còn hàng
|
|
291
|
+
|
|
292
|
+
```js
|
|
293
|
+
subiz('event', {
|
|
294
|
+
type: 'back_in_stock_subscribed',
|
|
295
|
+
payload: {
|
|
296
|
+
id: 'pd2345',
|
|
297
|
+
sku: 's5345',
|
|
298
|
+
name: 'Bàn phím cơ không dây',
|
|
299
|
+
category: 'electronics',
|
|
300
|
+
brand: 'Keychron',
|
|
301
|
+
price: 1500000,
|
|
302
|
+
currency: 'VND',
|
|
303
|
+
},
|
|
304
|
+
})
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
### Đăng ký nhận thông báo giảm giá
|
|
308
|
+
|
|
309
|
+
```js
|
|
310
|
+
subiz('event', {
|
|
311
|
+
type: 'price_drop_subscribed',
|
|
312
|
+
payload: {
|
|
313
|
+
id: 'pd2345',
|
|
314
|
+
sku: 's5345',
|
|
315
|
+
name: 'Bàn phím cơ không dây',
|
|
316
|
+
category: 'electronics',
|
|
317
|
+
brand: 'Keychron',
|
|
318
|
+
current_price: 1500000,
|
|
319
|
+
target_price: 1200000,
|
|
320
|
+
currency: 'VND',
|
|
321
|
+
},
|
|
322
|
+
})
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
### Thêm vào giỏ hàng
|
|
326
|
+
|
|
327
|
+
```js
|
|
328
|
+
subiz('event', {
|
|
329
|
+
type: 'add_to_cart',
|
|
330
|
+
payload: {
|
|
331
|
+
id: 'pd2345',
|
|
332
|
+
sku: 's5345',
|
|
333
|
+
name: 'Bàn phím cơ không dây',
|
|
334
|
+
price: 1500000,
|
|
335
|
+
currency: 'VND',
|
|
336
|
+
quantity: 1,
|
|
337
|
+
category: 'electronics',
|
|
338
|
+
brand: 'Keychron',
|
|
339
|
+
},
|
|
340
|
+
})
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
### Xem giỏ hàng
|
|
344
|
+
|
|
345
|
+
```js
|
|
346
|
+
subiz('event', {
|
|
347
|
+
type: 'cart_viewed',
|
|
348
|
+
payload: {
|
|
349
|
+
id: 'cart_12345',
|
|
350
|
+
total: 3000000,
|
|
351
|
+
currency: 'VND',
|
|
352
|
+
cart_size: 2,
|
|
353
|
+
items: [
|
|
354
|
+
{id: 'pd2345', sku: 's5345', name: 'Bàn phím cơ không dây', category: 'electronics', quantity: 1, price: 1500000},
|
|
355
|
+
{id: 'pd9876', sku: 's1234', name: 'Chuột không dây', category: 'electronics', quantity: 1, price: 1500000},
|
|
356
|
+
],
|
|
357
|
+
},
|
|
358
|
+
})
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
### Xóa khỏi giỏ hàng
|
|
362
|
+
|
|
363
|
+
```js
|
|
364
|
+
subiz('event', {
|
|
365
|
+
type: 'remove_from_cart',
|
|
366
|
+
payload: {
|
|
367
|
+
id: 'pd2345',
|
|
368
|
+
sku: 's5345',
|
|
369
|
+
name: 'Bàn phím cơ không dây',
|
|
370
|
+
price: 1500000,
|
|
371
|
+
currency: 'VND',
|
|
372
|
+
quantity: 1,
|
|
373
|
+
category: 'electronics',
|
|
374
|
+
},
|
|
375
|
+
})
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
### Thêm vào danh sách yêu thích
|
|
379
|
+
|
|
380
|
+
```js
|
|
381
|
+
subiz('event', {
|
|
382
|
+
type: 'add_to_wishlist',
|
|
383
|
+
payload: {
|
|
384
|
+
id: 'pd2345',
|
|
385
|
+
sku: 's5345',
|
|
386
|
+
name: 'Bàn phím cơ không dây',
|
|
387
|
+
price: 1500000,
|
|
388
|
+
currency: 'VND',
|
|
389
|
+
quantity: 1,
|
|
390
|
+
category: 'electronics',
|
|
391
|
+
brand: 'Keychron',
|
|
392
|
+
},
|
|
393
|
+
})
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
### Xóa khỏi danh sách yêu thích
|
|
397
|
+
|
|
398
|
+
```js
|
|
399
|
+
subiz('event', {
|
|
400
|
+
type: 'remove_from_wishlist',
|
|
401
|
+
payload: {
|
|
402
|
+
id: 'pd2345',
|
|
403
|
+
sku: 's5345',
|
|
404
|
+
name: 'Bàn phím cơ không dây',
|
|
405
|
+
price: 1500000,
|
|
406
|
+
currency: 'VND',
|
|
407
|
+
category: 'electronics',
|
|
408
|
+
},
|
|
409
|
+
})
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
### Áp dụng mã giảm giá
|
|
413
|
+
|
|
414
|
+
```js
|
|
415
|
+
subiz('event', {
|
|
416
|
+
type: 'coupon_applied',
|
|
417
|
+
payload: {
|
|
418
|
+
coupon_code: 'SUMMER2026',
|
|
419
|
+
discount_amount: 150000,
|
|
420
|
+
currency: 'VND',
|
|
421
|
+
cart_id: 'cart_12345',
|
|
422
|
+
},
|
|
423
|
+
})
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
### Xóa mã giảm giá
|
|
427
|
+
|
|
428
|
+
```js
|
|
429
|
+
subiz('event', {
|
|
430
|
+
type: 'coupon_removed',
|
|
431
|
+
payload: {
|
|
432
|
+
coupon_code: 'SUMMER2026',
|
|
433
|
+
cart_id: 'cart_12345',
|
|
434
|
+
},
|
|
435
|
+
})
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
### Bắt đầu thanh toán
|
|
439
|
+
|
|
440
|
+
```js
|
|
441
|
+
subiz('event', {
|
|
442
|
+
type: 'checkout_started',
|
|
443
|
+
payload: {
|
|
444
|
+
checkout_id: 'chk_556677',
|
|
445
|
+
total_value: 3000000,
|
|
446
|
+
currency: 'VND',
|
|
447
|
+
cart_size: 2,
|
|
448
|
+
},
|
|
449
|
+
})
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
### Thêm thông tin giao hàng
|
|
453
|
+
|
|
454
|
+
```js
|
|
455
|
+
subiz('event', {
|
|
456
|
+
type: 'shipping_info_added',
|
|
457
|
+
payload: {
|
|
458
|
+
checkout_id: 'chk_556677',
|
|
459
|
+
shipping_method: 'standard',
|
|
460
|
+
shipping_fee: 30000,
|
|
461
|
+
currency: 'VND',
|
|
462
|
+
},
|
|
463
|
+
})
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
### Thêm thông tin thanh toán
|
|
467
|
+
|
|
468
|
+
```js
|
|
469
|
+
subiz('event', {
|
|
470
|
+
type: 'payment_info_added',
|
|
471
|
+
payload: {
|
|
472
|
+
checkout_id: 'chk_556677',
|
|
473
|
+
payment_method: 'credit_card',
|
|
474
|
+
total_value: 3000000,
|
|
475
|
+
currency: 'VND',
|
|
476
|
+
},
|
|
477
|
+
})
|
|
478
|
+
```
|
|
479
|
+
|
|
480
|
+
### Khởi tạo thanh toán
|
|
481
|
+
|
|
482
|
+
```js
|
|
483
|
+
subiz('event', {
|
|
484
|
+
type: 'payment_initiated',
|
|
485
|
+
payload: {
|
|
486
|
+
transaction_id: 'txn_12345',
|
|
487
|
+
order_id: 'ord_99482',
|
|
488
|
+
amount: 3000000,
|
|
489
|
+
currency: 'VND',
|
|
490
|
+
},
|
|
491
|
+
})
|
|
492
|
+
```
|
|
493
|
+
|
|
494
|
+
### Thanh toán thất bại
|
|
495
|
+
|
|
496
|
+
```js
|
|
497
|
+
subiz('event', {
|
|
498
|
+
type: 'payment_failed',
|
|
499
|
+
payload: {
|
|
500
|
+
transaction_id: 'txn_12345',
|
|
501
|
+
order_id: 'ord_99482',
|
|
502
|
+
amount: 3000000,
|
|
503
|
+
currency: 'VND',
|
|
504
|
+
error_code: 'card_declined',
|
|
505
|
+
error_message: 'Thẻ bị từ chối',
|
|
506
|
+
},
|
|
507
|
+
})
|
|
508
|
+
```
|
|
509
|
+
|
|
510
|
+
### Hoàn tất thanh toán
|
|
511
|
+
|
|
512
|
+
```js
|
|
513
|
+
subiz('event', {
|
|
514
|
+
type: 'payment_completed',
|
|
515
|
+
payload: {
|
|
516
|
+
transaction_id: 'txn_12345',
|
|
517
|
+
order_id: 'ord_99482',
|
|
518
|
+
amount: 3000000,
|
|
519
|
+
currency: 'VND',
|
|
520
|
+
status: 'success',
|
|
521
|
+
},
|
|
522
|
+
})
|
|
523
|
+
```
|
|
524
|
+
|
|
525
|
+
### Hoàn tất đơn hàng
|
|
526
|
+
|
|
527
|
+
```js
|
|
528
|
+
subiz('event', {
|
|
529
|
+
type: 'order_completed',
|
|
530
|
+
event_source_id: 'order_completed_ord_99482',
|
|
531
|
+
payload: {
|
|
532
|
+
id: 'ord_99482',
|
|
533
|
+
total: 3000000,
|
|
534
|
+
shipping_fee: 30000,
|
|
535
|
+
discount_amount: 0,
|
|
536
|
+
currency: 'VND',
|
|
537
|
+
payment_method: 'credit_card',
|
|
538
|
+
items: [
|
|
539
|
+
{id: 'pd2345', sku: 's5345', name: 'Bàn phím cơ không dây', category: 'electronics', quantity: 1, price: 1500000},
|
|
540
|
+
{id: 'pd9876', sku: 's1234', name: 'Chuột không dây', category: 'electronics', quantity: 1, price: 1500000},
|
|
541
|
+
],
|
|
542
|
+
},
|
|
543
|
+
})
|
|
544
|
+
```
|
|
545
|
+
|
|
546
|
+
### Đặt hàng thất bại
|
|
547
|
+
|
|
548
|
+
```js
|
|
549
|
+
subiz('event', {
|
|
550
|
+
type: 'order_failed',
|
|
551
|
+
payload: {
|
|
552
|
+
checkout_id: 'chk_556677',
|
|
553
|
+
error_code: 'out_of_stock',
|
|
554
|
+
error_message: 'Một sản phẩm trong giỏ hàng đã hết hàng',
|
|
555
|
+
total_value: 3000000,
|
|
556
|
+
currency: 'VND',
|
|
557
|
+
},
|
|
558
|
+
})
|
|
559
|
+
```
|
|
560
|
+
|
|
561
|
+
### Xác nhận đơn hàng
|
|
562
|
+
|
|
563
|
+
```js
|
|
564
|
+
subiz('event', {
|
|
565
|
+
type: 'order_confirmed',
|
|
566
|
+
payload: {
|
|
567
|
+
id: 'ord_99482',
|
|
568
|
+
expected_delivery_date: '2026-05-15',
|
|
569
|
+
status: 'confirmed',
|
|
570
|
+
},
|
|
571
|
+
})
|
|
572
|
+
```
|
|
573
|
+
|
|
574
|
+
### Hủy đơn hàng
|
|
575
|
+
|
|
576
|
+
```js
|
|
577
|
+
subiz('event', {
|
|
578
|
+
type: 'order_cancelled',
|
|
579
|
+
payload: {
|
|
580
|
+
id: 'ord_99482',
|
|
581
|
+
cancel_reason: 'customer_changed_mind',
|
|
582
|
+
},
|
|
583
|
+
})
|
|
584
|
+
```
|
|
585
|
+
|
|
586
|
+
### Hoàn tiền đơn hàng
|
|
587
|
+
|
|
588
|
+
```js
|
|
589
|
+
subiz('event', {
|
|
590
|
+
type: 'order_refunded',
|
|
591
|
+
event_source_id: 'order_refunded_ord_99482',
|
|
592
|
+
payload: {
|
|
593
|
+
id: 'ord_99482',
|
|
594
|
+
refund_id: 'rf_12345',
|
|
595
|
+
refund_amount: 3000000,
|
|
596
|
+
reason: 'customer_returned_items',
|
|
597
|
+
currency: 'VND',
|
|
598
|
+
},
|
|
599
|
+
})
|
|
600
|
+
```
|
|
601
|
+
|
|
602
|
+
### Yêu cầu đổi trả
|
|
603
|
+
|
|
604
|
+
```js
|
|
605
|
+
subiz('event', {
|
|
606
|
+
type: 'return_requested',
|
|
607
|
+
payload: {
|
|
608
|
+
id: 'ord_99482',
|
|
609
|
+
return_id: 'ret_12345',
|
|
610
|
+
reason: 'wrong_size',
|
|
611
|
+
items: [
|
|
612
|
+
{id: 'pd2345', sku: 's5345', name: 'Bàn phím cơ không dây', category: 'electronics', quantity: 1, price: 1500000},
|
|
613
|
+
],
|
|
614
|
+
currency: 'VND',
|
|
615
|
+
},
|
|
616
|
+
})
|
|
617
|
+
```
|
|
618
|
+
|
|
619
|
+
### Hoàn tất đổi trả
|
|
620
|
+
|
|
621
|
+
```js
|
|
622
|
+
subiz('event', {
|
|
623
|
+
type: 'return_completed',
|
|
624
|
+
payload: {
|
|
625
|
+
id: 'ord_99482',
|
|
626
|
+
return_id: 'ret_12345',
|
|
627
|
+
refund_amount: 1500000,
|
|
628
|
+
currency: 'VND',
|
|
629
|
+
},
|
|
630
|
+
})
|
|
631
|
+
```
|
|
632
|
+
|
|
633
|
+
### Bắt đầu giao hàng
|
|
634
|
+
|
|
635
|
+
```js
|
|
636
|
+
subiz('event', {
|
|
637
|
+
type: 'order_shipped',
|
|
638
|
+
payload: {
|
|
639
|
+
id: 'ord_99482',
|
|
640
|
+
shipping_method: 'standard',
|
|
641
|
+
tracking_code: 'VNPOST_88374',
|
|
642
|
+
estimated_delivery_date: '2026-05-15',
|
|
643
|
+
},
|
|
644
|
+
})
|
|
645
|
+
```
|
|
646
|
+
|
|
647
|
+
### Giao hàng thành công
|
|
648
|
+
|
|
649
|
+
```js
|
|
650
|
+
subiz('event', {
|
|
651
|
+
type: 'order_delivered',
|
|
652
|
+
payload: {
|
|
653
|
+
id: 'ord_99482',
|
|
654
|
+
tracking_code: 'VNPOST_88374',
|
|
655
|
+
},
|
|
656
|
+
})
|
|
657
|
+
```
|
|
658
|
+
|
|
659
|
+
### Đánh giá sản phẩm
|
|
660
|
+
|
|
661
|
+
```js
|
|
662
|
+
subiz('event', {
|
|
663
|
+
type: 'product_reviewed',
|
|
664
|
+
payload: {
|
|
665
|
+
id: 'pd2345',
|
|
666
|
+
sku: 's5345',
|
|
667
|
+
name: 'Bàn phím cơ không dây',
|
|
668
|
+
rating: 5,
|
|
669
|
+
review_id: 'rv_12345',
|
|
670
|
+
has_comment: true,
|
|
671
|
+
},
|
|
672
|
+
})
|
|
673
|
+
```
|
|
674
|
+
|
|
675
|
+
### Chia sẻ sản phẩm
|
|
676
|
+
|
|
677
|
+
```js
|
|
678
|
+
subiz('event', {
|
|
679
|
+
type: 'product_shared',
|
|
680
|
+
payload: {
|
|
681
|
+
id: 'pd2345',
|
|
682
|
+
sku: 's5345',
|
|
683
|
+
name: 'Bàn phím cơ không dây',
|
|
684
|
+
channel: 'facebook',
|
|
685
|
+
url: 'https://example.com/products/pd2345',
|
|
686
|
+
},
|
|
687
|
+
})
|
|
688
|
+
```
|
|
689
|
+
|
|
690
|
+
## Dịch vụ
|
|
691
|
+
|
|
692
|
+
### Đặt lịch dịch vụ
|
|
693
|
+
|
|
694
|
+
```js
|
|
695
|
+
subiz('event', {
|
|
696
|
+
type: 'service_booked',
|
|
697
|
+
payload: {
|
|
698
|
+
booking_id: 'bk_77362',
|
|
699
|
+
service_id: 'srv_massage_01',
|
|
700
|
+
scheduled_time: '2026-05-20T14:00:00Z',
|
|
701
|
+
},
|
|
702
|
+
})
|
|
703
|
+
```
|
|
704
|
+
|
|
705
|
+
### Hoàn thành dịch vụ
|
|
706
|
+
|
|
707
|
+
```js
|
|
708
|
+
subiz('event', {
|
|
709
|
+
type: 'service_completed',
|
|
710
|
+
payload: {
|
|
711
|
+
booking_id: 'bk_77362',
|
|
712
|
+
service_id: 'srv_massage_01',
|
|
713
|
+
actual_duration_minutes: 65,
|
|
714
|
+
},
|
|
715
|
+
})
|
|
716
|
+
```
|
|
717
|
+
|
|
718
|
+
## Tương tác
|
|
719
|
+
|
|
720
|
+
### Gửi form
|
|
721
|
+
|
|
722
|
+
```js
|
|
723
|
+
subiz('event', {
|
|
724
|
+
type: 'form_submitted',
|
|
725
|
+
payload: {
|
|
726
|
+
form_id: 'frm_newsletter_01',
|
|
727
|
+
form_name: 'Đăng ký nhận bản tin',
|
|
728
|
+
campaign_id: 'camp_summer_2026',
|
|
729
|
+
},
|
|
730
|
+
})
|
|
731
|
+
```
|
|
732
|
+
|
|
733
|
+
### Đăng nhập và đăng xuất
|
|
734
|
+
|
|
735
|
+
```js
|
|
736
|
+
subiz('event', {
|
|
737
|
+
type: 'login',
|
|
738
|
+
})
|
|
739
|
+
|
|
740
|
+
subiz('event', {
|
|
741
|
+
type: 'logout',
|
|
742
|
+
})
|
|
743
|
+
```
|
|
744
|
+
|
|
745
|
+
### Giới thiệu khách hàng mới
|
|
746
|
+
|
|
747
|
+
```js
|
|
748
|
+
subiz('event', {
|
|
749
|
+
type: 'customer_referred',
|
|
750
|
+
payload: {
|
|
751
|
+
referral_code: 'THANH2026',
|
|
752
|
+
referred_user_id: 'usr_new_999',
|
|
753
|
+
},
|
|
754
|
+
})
|
|
755
|
+
```
|
|
756
|
+
|
|
757
|
+
### Cập nhật khách hàng thân thiết
|
|
758
|
+
|
|
759
|
+
```js
|
|
760
|
+
subiz('event', {
|
|
761
|
+
type: 'customer_loyalty_updated',
|
|
762
|
+
payload: {
|
|
763
|
+
action: 'earn',
|
|
764
|
+
points: 500,
|
|
765
|
+
current_tier: 'platinum',
|
|
766
|
+
},
|
|
767
|
+
})
|
|
768
|
+
```
|
|
769
|
+
|
|
770
|
+
## B2B và hợp đồng
|
|
771
|
+
|
|
772
|
+
Các event B2B nên giúp marketing và sales trả lời các câu hỏi như: lead nào có intent cao, công ty nào đang active, deal nào có khả năng close, chiến dịch nào tạo pipeline, khách hàng nào sắp renew hoặc có nguy cơ churn.
|
|
773
|
+
|
|
774
|
+
Nên giữ ổn định các field định danh như `company_id`, `company_name`, `contact_id`, `deal_id`, `contract_id`, `plan`, `industry`, `company_size`, `estimated_value`, `currency`.
|
|
775
|
+
|
|
776
|
+
| Câu hỏi marketing/sales | Event nên dùng |
|
|
777
|
+
| --- | --- |
|
|
778
|
+
| Lead nào vừa phát sinh? | `lead_created`, `form_submitted`, `customer_registered` |
|
|
779
|
+
| Lead nào có intent cao? | `demo_requested`, `meeting_booked`, `quote_requested`, `pricing_viewed` |
|
|
780
|
+
| Campaign nào tạo pipeline? | `lead_created`, `demo_requested`, `quote_requested`, `deal_created` |
|
|
781
|
+
| Deal nào đang tiến triển? | `deal_created`, `deal_stage_changed`, `proposal_sent`, `quote_requested` |
|
|
782
|
+
| Deal nào bị mất? | `deal_lost`, `contract_cancelled` |
|
|
783
|
+
| Khách hàng nào có khả năng mở rộng? | `subscription_upgraded`, `seat_added`, `feature_activated` |
|
|
784
|
+
| Khách hàng nào sắp renew? | `renewal_started`, `invoice_paid`, `contract_signed` |
|
|
785
|
+
| Khách hàng nào có nguy cơ churn? | `subscription_downgraded`, `invoice_failed`, `customer_churned` |
|
|
786
|
+
|
|
787
|
+
### Tạo lead
|
|
788
|
+
|
|
789
|
+
```js
|
|
790
|
+
subiz('event', {
|
|
791
|
+
type: 'lead_created',
|
|
792
|
+
payload: {
|
|
793
|
+
lead_id: 'lead_10293',
|
|
794
|
+
contact_id: 'ct_10293',
|
|
795
|
+
company_id: 'com_9981',
|
|
796
|
+
company_name: 'Tech Corp VN',
|
|
797
|
+
email: 'alice@techcorp.vn',
|
|
798
|
+
phone: '0987654321',
|
|
799
|
+
source: 'landing_page_summer',
|
|
800
|
+
campaign_id: 'camp_summer_2026',
|
|
801
|
+
industry: 'software',
|
|
802
|
+
company_size: '51-200',
|
|
803
|
+
},
|
|
804
|
+
})
|
|
805
|
+
```
|
|
806
|
+
|
|
807
|
+
### Đăng ký tài khoản
|
|
808
|
+
|
|
809
|
+
```js
|
|
810
|
+
subiz('event', {
|
|
811
|
+
type: 'customer_registered',
|
|
812
|
+
payload: {
|
|
813
|
+
customer_id: 'usr_new_10293',
|
|
814
|
+
company_id: 'com_9981',
|
|
815
|
+
company_name: 'Tech Corp VN',
|
|
816
|
+
registration_method: 'google',
|
|
817
|
+
source: 'landing_page_summer',
|
|
818
|
+
is_verified: false,
|
|
819
|
+
},
|
|
820
|
+
})
|
|
821
|
+
```
|
|
822
|
+
|
|
823
|
+
### Xem trang giá
|
|
824
|
+
|
|
825
|
+
```js
|
|
826
|
+
subiz('event', {
|
|
827
|
+
type: 'pricing_viewed',
|
|
828
|
+
payload: {
|
|
829
|
+
company_id: 'com_9981',
|
|
830
|
+
company_name: 'Tech Corp VN',
|
|
831
|
+
plan: 'business',
|
|
832
|
+
billing_cycle: 'annual',
|
|
833
|
+
url: 'https://example.com/pricing',
|
|
834
|
+
},
|
|
835
|
+
})
|
|
836
|
+
```
|
|
837
|
+
|
|
838
|
+
### Bắt đầu dùng thử
|
|
839
|
+
|
|
840
|
+
```js
|
|
841
|
+
subiz('event', {
|
|
842
|
+
type: 'trial_started',
|
|
843
|
+
payload: {
|
|
844
|
+
trial_id: 'trial_12345',
|
|
845
|
+
company_id: 'com_9981',
|
|
846
|
+
company_name: 'Tech Corp VN',
|
|
847
|
+
plan: 'business',
|
|
848
|
+
start_date: '2026-05-12',
|
|
849
|
+
end_date: '2026-05-26',
|
|
850
|
+
source: 'pricing_page',
|
|
851
|
+
},
|
|
852
|
+
})
|
|
853
|
+
```
|
|
854
|
+
|
|
855
|
+
### Yêu cầu demo
|
|
856
|
+
|
|
857
|
+
```js
|
|
858
|
+
subiz('event', {
|
|
859
|
+
type: 'demo_requested',
|
|
860
|
+
payload: {
|
|
861
|
+
demo_id: 'demo_12345',
|
|
862
|
+
contact_id: 'ct_10293',
|
|
863
|
+
company_id: 'com_9981',
|
|
864
|
+
company_name: 'Tech Corp VN',
|
|
865
|
+
plan_interest: 'business',
|
|
866
|
+
estimated_users: 50,
|
|
867
|
+
preferred_time: '2026-05-20T14:00:00Z',
|
|
868
|
+
},
|
|
869
|
+
})
|
|
870
|
+
```
|
|
871
|
+
|
|
872
|
+
### Đặt lịch họp
|
|
873
|
+
|
|
874
|
+
```js
|
|
875
|
+
subiz('event', {
|
|
876
|
+
type: 'meeting_booked',
|
|
877
|
+
payload: {
|
|
878
|
+
meeting_id: 'mt_12345',
|
|
879
|
+
contact_id: 'ct_10293',
|
|
880
|
+
company_id: 'com_9981',
|
|
881
|
+
company_name: 'Tech Corp VN',
|
|
882
|
+
meeting_type: 'sales_demo',
|
|
883
|
+
scheduled_time: '2026-05-20T14:00:00Z',
|
|
884
|
+
owner_id: 'sale_001',
|
|
885
|
+
},
|
|
886
|
+
})
|
|
887
|
+
```
|
|
888
|
+
|
|
889
|
+
### Hoàn thành cuộc họp
|
|
890
|
+
|
|
891
|
+
```js
|
|
892
|
+
subiz('event', {
|
|
893
|
+
type: 'meeting_completed',
|
|
894
|
+
payload: {
|
|
895
|
+
meeting_id: 'mt_12345',
|
|
896
|
+
contact_id: 'ct_10293',
|
|
897
|
+
company_id: 'com_9981',
|
|
898
|
+
company_name: 'Tech Corp VN',
|
|
899
|
+
meeting_type: 'sales_demo',
|
|
900
|
+
outcome: 'qualified',
|
|
901
|
+
next_step: 'send_proposal',
|
|
902
|
+
},
|
|
903
|
+
})
|
|
904
|
+
```
|
|
905
|
+
|
|
906
|
+
### Tạo deal
|
|
907
|
+
|
|
908
|
+
```js
|
|
909
|
+
subiz('event', {
|
|
910
|
+
type: 'deal_created',
|
|
911
|
+
payload: {
|
|
912
|
+
deal_id: 'deal_556677',
|
|
913
|
+
company_id: 'com_9981',
|
|
914
|
+
company_name: 'Tech Corp VN',
|
|
915
|
+
stage: 'qualified',
|
|
916
|
+
estimated_value: 50000000,
|
|
917
|
+
currency: 'VND',
|
|
918
|
+
owner_id: 'sale_001',
|
|
919
|
+
source: 'demo_requested',
|
|
920
|
+
},
|
|
921
|
+
})
|
|
922
|
+
```
|
|
923
|
+
|
|
924
|
+
### Đổi trạng thái deal
|
|
925
|
+
|
|
926
|
+
```js
|
|
927
|
+
subiz('event', {
|
|
928
|
+
type: 'deal_stage_changed',
|
|
929
|
+
payload: {
|
|
930
|
+
deal_id: 'deal_556677',
|
|
931
|
+
company_id: 'com_9981',
|
|
932
|
+
company_name: 'Tech Corp VN',
|
|
933
|
+
from_stage: 'qualified',
|
|
934
|
+
to_stage: 'proposal_sent',
|
|
935
|
+
estimated_value: 50000000,
|
|
936
|
+
currency: 'VND',
|
|
937
|
+
owner_id: 'sale_001',
|
|
938
|
+
},
|
|
939
|
+
})
|
|
940
|
+
```
|
|
941
|
+
|
|
942
|
+
### Gửi proposal
|
|
943
|
+
|
|
944
|
+
```js
|
|
945
|
+
subiz('event', {
|
|
946
|
+
type: 'proposal_sent',
|
|
947
|
+
payload: {
|
|
948
|
+
proposal_id: 'pr_2026_05_01',
|
|
949
|
+
deal_id: 'deal_556677',
|
|
950
|
+
company_id: 'com_9981',
|
|
951
|
+
company_name: 'Tech Corp VN',
|
|
952
|
+
total_value: 48000000,
|
|
953
|
+
currency: 'VND',
|
|
954
|
+
valid_until: '2026-06-01',
|
|
955
|
+
},
|
|
956
|
+
})
|
|
957
|
+
```
|
|
958
|
+
|
|
959
|
+
### Yêu cầu báo giá
|
|
960
|
+
|
|
961
|
+
```js
|
|
962
|
+
subiz('event', {
|
|
963
|
+
type: 'quote_requested',
|
|
964
|
+
payload: {
|
|
965
|
+
quote_id: 'qt_2026_05_01',
|
|
966
|
+
deal_id: 'deal_556677',
|
|
967
|
+
company_id: 'com_9981',
|
|
968
|
+
company_name: 'Tech Corp VN',
|
|
969
|
+
estimated_budget: 50000000,
|
|
970
|
+
currency: 'VND',
|
|
971
|
+
},
|
|
972
|
+
})
|
|
973
|
+
```
|
|
974
|
+
|
|
975
|
+
### Chấp nhận báo giá
|
|
976
|
+
|
|
977
|
+
```js
|
|
978
|
+
subiz('event', {
|
|
979
|
+
type: 'quote_accepted',
|
|
980
|
+
payload: {
|
|
981
|
+
quote_id: 'qt_2026_05_01',
|
|
982
|
+
deal_id: 'deal_556677',
|
|
983
|
+
company_id: 'com_9981',
|
|
984
|
+
company_name: 'Tech Corp VN',
|
|
985
|
+
total_value: 48000000,
|
|
986
|
+
currency: 'VND',
|
|
987
|
+
},
|
|
988
|
+
})
|
|
989
|
+
```
|
|
990
|
+
|
|
991
|
+
### Từ chối báo giá
|
|
992
|
+
|
|
993
|
+
```js
|
|
994
|
+
subiz('event', {
|
|
995
|
+
type: 'quote_rejected',
|
|
996
|
+
payload: {
|
|
997
|
+
quote_id: 'qt_2026_05_01',
|
|
998
|
+
deal_id: 'deal_556677',
|
|
999
|
+
company_id: 'com_9981',
|
|
1000
|
+
company_name: 'Tech Corp VN',
|
|
1001
|
+
reason: 'price_too_high',
|
|
1002
|
+
total_value: 48000000,
|
|
1003
|
+
currency: 'VND',
|
|
1004
|
+
},
|
|
1005
|
+
})
|
|
1006
|
+
```
|
|
1007
|
+
|
|
1008
|
+
### Ký hợp đồng
|
|
1009
|
+
|
|
1010
|
+
```js
|
|
1011
|
+
subiz('event', {
|
|
1012
|
+
type: 'contract_signed',
|
|
1013
|
+
event_source_id: 'contract_signed_ctr_09876',
|
|
1014
|
+
payload: {
|
|
1015
|
+
contract_id: 'ctr_09876',
|
|
1016
|
+
deal_id: 'deal_556677',
|
|
1017
|
+
quote_id: 'qt_2026_05_01',
|
|
1018
|
+
company_id: 'com_9981',
|
|
1019
|
+
company_name: 'Tech Corp VN',
|
|
1020
|
+
total_value: 48000000,
|
|
1021
|
+
plan: 'business',
|
|
1022
|
+
billing_cycle: 'annual',
|
|
1023
|
+
start_date: '2026-06-01',
|
|
1024
|
+
end_date: '2027-05-31',
|
|
1025
|
+
currency: 'VND',
|
|
1026
|
+
},
|
|
1027
|
+
})
|
|
1028
|
+
```
|
|
1029
|
+
|
|
1030
|
+
### Hủy hợp đồng
|
|
1031
|
+
|
|
1032
|
+
```js
|
|
1033
|
+
subiz('event', {
|
|
1034
|
+
type: 'contract_cancelled',
|
|
1035
|
+
payload: {
|
|
1036
|
+
contract_id: 'ctr_09876',
|
|
1037
|
+
company_id: 'com_9981',
|
|
1038
|
+
company_name: 'Tech Corp VN',
|
|
1039
|
+
cancel_reason: 'budget_cut',
|
|
1040
|
+
cancelled_at: '2026-10-01',
|
|
1041
|
+
remaining_value: 24000000,
|
|
1042
|
+
currency: 'VND',
|
|
1043
|
+
},
|
|
1044
|
+
})
|
|
1045
|
+
```
|
|
1046
|
+
|
|
1047
|
+
### Mất deal
|
|
1048
|
+
|
|
1049
|
+
```js
|
|
1050
|
+
subiz('event', {
|
|
1051
|
+
type: 'deal_lost',
|
|
1052
|
+
payload: {
|
|
1053
|
+
deal_id: 'deal_556677',
|
|
1054
|
+
company_id: 'com_9981',
|
|
1055
|
+
company_name: 'Tech Corp VN',
|
|
1056
|
+
lost_reason: 'chose_competitor',
|
|
1057
|
+
estimated_value: 50000000,
|
|
1058
|
+
currency: 'VND',
|
|
1059
|
+
},
|
|
1060
|
+
})
|
|
1061
|
+
```
|
|
1062
|
+
|
|
1063
|
+
### Hoàn thành onboarding
|
|
1064
|
+
|
|
1065
|
+
```js
|
|
1066
|
+
subiz('event', {
|
|
1067
|
+
type: 'onboarding_completed',
|
|
1068
|
+
payload: {
|
|
1069
|
+
company_id: 'com_9981',
|
|
1070
|
+
company_name: 'Tech Corp VN',
|
|
1071
|
+
plan: 'business',
|
|
1072
|
+
onboarding_duration_days: 14,
|
|
1073
|
+
owner_id: 'cs_001',
|
|
1074
|
+
},
|
|
1075
|
+
})
|
|
1076
|
+
```
|
|
1077
|
+
|
|
1078
|
+
### Kích hoạt tính năng quan trọng
|
|
1079
|
+
|
|
1080
|
+
```js
|
|
1081
|
+
subiz('event', {
|
|
1082
|
+
type: 'feature_activated',
|
|
1083
|
+
payload: {
|
|
1084
|
+
company_id: 'com_9981',
|
|
1085
|
+
company_name: 'Tech Corp VN',
|
|
1086
|
+
feature_key: 'automation_workflow',
|
|
1087
|
+
plan: 'business',
|
|
1088
|
+
activated_by: 'usr_10293',
|
|
1089
|
+
},
|
|
1090
|
+
})
|
|
1091
|
+
```
|
|
1092
|
+
|
|
1093
|
+
### Nâng cấp gói
|
|
1094
|
+
|
|
1095
|
+
```js
|
|
1096
|
+
subiz('event', {
|
|
1097
|
+
type: 'subscription_upgraded',
|
|
1098
|
+
payload: {
|
|
1099
|
+
subscription_id: 'sub_12345',
|
|
1100
|
+
company_id: 'com_9981',
|
|
1101
|
+
company_name: 'Tech Corp VN',
|
|
1102
|
+
from_plan: 'starter',
|
|
1103
|
+
to_plan: 'business',
|
|
1104
|
+
mrr_delta: 3000000,
|
|
1105
|
+
currency: 'VND',
|
|
1106
|
+
},
|
|
1107
|
+
})
|
|
1108
|
+
```
|
|
1109
|
+
|
|
1110
|
+
### Hạ cấp gói
|
|
1111
|
+
|
|
1112
|
+
```js
|
|
1113
|
+
subiz('event', {
|
|
1114
|
+
type: 'subscription_downgraded',
|
|
1115
|
+
payload: {
|
|
1116
|
+
subscription_id: 'sub_12345',
|
|
1117
|
+
company_id: 'com_9981',
|
|
1118
|
+
company_name: 'Tech Corp VN',
|
|
1119
|
+
from_plan: 'business',
|
|
1120
|
+
to_plan: 'starter',
|
|
1121
|
+
mrr_delta: -3000000,
|
|
1122
|
+
reason: 'budget_cut',
|
|
1123
|
+
currency: 'VND',
|
|
1124
|
+
},
|
|
1125
|
+
})
|
|
1126
|
+
```
|
|
1127
|
+
|
|
1128
|
+
### Thêm người dùng vào tài khoản
|
|
1129
|
+
|
|
1130
|
+
```js
|
|
1131
|
+
subiz('event', {
|
|
1132
|
+
type: 'seat_added',
|
|
1133
|
+
payload: {
|
|
1134
|
+
subscription_id: 'sub_12345',
|
|
1135
|
+
company_id: 'com_9981',
|
|
1136
|
+
company_name: 'Tech Corp VN',
|
|
1137
|
+
seat_count: 5,
|
|
1138
|
+
mrr_delta: 1500000,
|
|
1139
|
+
currency: 'VND',
|
|
1140
|
+
},
|
|
1141
|
+
})
|
|
1142
|
+
```
|
|
1143
|
+
|
|
1144
|
+
### Bắt đầu gia hạn
|
|
1145
|
+
|
|
1146
|
+
```js
|
|
1147
|
+
subiz('event', {
|
|
1148
|
+
type: 'renewal_started',
|
|
1149
|
+
payload: {
|
|
1150
|
+
contract_id: 'ctr_09876',
|
|
1151
|
+
company_id: 'com_9981',
|
|
1152
|
+
company_name: 'Tech Corp VN',
|
|
1153
|
+
renewal_date: '2027-05-31',
|
|
1154
|
+
current_value: 48000000,
|
|
1155
|
+
currency: 'VND',
|
|
1156
|
+
},
|
|
1157
|
+
})
|
|
1158
|
+
```
|
|
1159
|
+
|
|
1160
|
+
### Gia hạn thành công
|
|
1161
|
+
|
|
1162
|
+
```js
|
|
1163
|
+
subiz('event', {
|
|
1164
|
+
type: 'renewal_completed',
|
|
1165
|
+
event_source_id: 'renewal_completed_ctr_09876_2027',
|
|
1166
|
+
payload: {
|
|
1167
|
+
contract_id: 'ctr_09876',
|
|
1168
|
+
company_id: 'com_9981',
|
|
1169
|
+
company_name: 'Tech Corp VN',
|
|
1170
|
+
renewal_value: 60000000,
|
|
1171
|
+
start_date: '2027-06-01',
|
|
1172
|
+
end_date: '2028-05-31',
|
|
1173
|
+
currency: 'VND',
|
|
1174
|
+
},
|
|
1175
|
+
})
|
|
1176
|
+
```
|
|
1177
|
+
|
|
1178
|
+
### Thanh toán hóa đơn thành công
|
|
1179
|
+
|
|
1180
|
+
```js
|
|
1181
|
+
subiz('event', {
|
|
1182
|
+
type: 'invoice_paid',
|
|
1183
|
+
event_source_id: 'invoice_paid_inv_12345',
|
|
1184
|
+
payload: {
|
|
1185
|
+
invoice_id: 'inv_12345',
|
|
1186
|
+
company_id: 'com_9981',
|
|
1187
|
+
company_name: 'Tech Corp VN',
|
|
1188
|
+
amount: 48000000,
|
|
1189
|
+
billing_cycle: 'annual',
|
|
1190
|
+
currency: 'VND',
|
|
1191
|
+
},
|
|
1192
|
+
})
|
|
1193
|
+
```
|
|
1194
|
+
|
|
1195
|
+
### Thanh toán hóa đơn thất bại
|
|
1196
|
+
|
|
1197
|
+
```js
|
|
1198
|
+
subiz('event', {
|
|
1199
|
+
type: 'invoice_failed',
|
|
1200
|
+
payload: {
|
|
1201
|
+
invoice_id: 'inv_12345',
|
|
1202
|
+
company_id: 'com_9981',
|
|
1203
|
+
company_name: 'Tech Corp VN',
|
|
1204
|
+
amount: 48000000,
|
|
1205
|
+
error_code: 'card_declined',
|
|
1206
|
+
currency: 'VND',
|
|
1207
|
+
},
|
|
1208
|
+
})
|
|
1209
|
+
```
|
|
1210
|
+
|
|
1211
|
+
### Rời bỏ dịch vụ
|
|
1212
|
+
|
|
1213
|
+
```js
|
|
1214
|
+
subiz('event', {
|
|
1215
|
+
type: 'customer_churned',
|
|
1216
|
+
payload: {
|
|
1217
|
+
company_id: 'com_9981',
|
|
1218
|
+
company_name: 'Tech Corp VN',
|
|
1219
|
+
churn_type: 'voluntary',
|
|
1220
|
+
reason: 'switched_to_competitor',
|
|
1221
|
+
lifetime_days: 345,
|
|
1222
|
+
lifetime_value: 25000000,
|
|
1223
|
+
currency: 'VND',
|
|
1224
|
+
},
|
|
1225
|
+
})
|
|
1226
|
+
```
|
|
1227
|
+
|
|
1228
|
+
## Custom event
|
|
1229
|
+
|
|
1230
|
+
Website có thể gửi event riêng ngoài các ví dụ phía trên.
|
|
1231
|
+
|
|
1232
|
+
```js
|
|
1233
|
+
subiz('event', {
|
|
1234
|
+
type: 'coupon_copied',
|
|
1235
|
+
payload: {
|
|
1236
|
+
coupon_code: 'SUMMER2026',
|
|
1237
|
+
campaign_id: 'camp_summer_2026',
|
|
1238
|
+
location: 'product_detail',
|
|
1239
|
+
},
|
|
1240
|
+
})
|
|
1241
|
+
```
|
|
1242
|
+
|
|
1243
|
+
Quy tắc:
|
|
1244
|
+
|
|
1245
|
+
- `type` phải dùng `snake_case`.
|
|
1246
|
+
- `type` chỉ gồm chữ thường, số và `_`.
|
|
1247
|
+
- `type` tối đa 64 ký tự.
|
|
1248
|
+
- `payload` nên là object JSON, không gửi function, DOM node hoặc object có vòng lặp tham chiếu.
|
|
1249
|
+
- Dùng `event_source_id` cho các event quan trọng như `order_completed`, `payment_completed`, `form_submitted` để tránh ghi nhận trùng.
|
|
1250
|
+
|
|
1251
|
+
## Xử lý lỗi
|
|
1252
|
+
|
|
1253
|
+
Vì `subiz('event', ...)` trả về `Promise`, website có thể dùng `await` hoặc `.then/.catch`.
|
|
1254
|
+
|
|
1255
|
+
```js
|
|
1256
|
+
async function sendOrderCompleted(order) {
|
|
1257
|
+
try {
|
|
1258
|
+
await subiz('event', {
|
|
1259
|
+
type: 'order_completed',
|
|
1260
|
+
event_source_id: 'order_completed_' + order.id,
|
|
1261
|
+
payload: {
|
|
1262
|
+
id: order.id,
|
|
1263
|
+
total: order.total,
|
|
1264
|
+
currency: order.currency,
|
|
1265
|
+
items: order.items,
|
|
1266
|
+
},
|
|
1267
|
+
})
|
|
1268
|
+
} catch (error) {
|
|
1269
|
+
console.error('Không gửi được order_completed', error)
|
|
1270
|
+
}
|
|
1271
|
+
}
|
|
1272
|
+
```
|
|
1273
|
+
|
|
1274
|
+
Với event không quan trọng, website có thể gửi theo kiểu fire-and-forget:
|
|
1275
|
+
|
|
1276
|
+
```js
|
|
1277
|
+
subiz('event', {
|
|
1278
|
+
type: 'product_viewed',
|
|
1279
|
+
payload: {
|
|
1280
|
+
id: 'pd2345',
|
|
1281
|
+
name: 'Bàn phím cơ không dây',
|
|
1282
|
+
},
|
|
1283
|
+
})
|
|
1284
|
+
```
|