@subiz/widget-v4 4.1.203 → 4.1.205

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