@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.
Files changed (45) hide show
  1. package/api.md +1284 -0
  2. package/compiled_src/bot.js +1 -7
  3. package/compiled_src/chatbox/ChatButton.js +19 -16
  4. package/compiled_src/chatbox/MessageInput.js +1 -0
  5. package/compiled_src/chatbox/Widget.js +1 -0
  6. package/compiled_src/chatbox/main.js +28 -3
  7. package/compiled_src/lib.js +16 -1
  8. package/compiled_src/store/api.js +36 -4
  9. package/compiled_src/store/store.js +14 -1
  10. package/compiled_src/util/common.js +18 -18
  11. package/dist/{19d6b530a9c.app.js → 19df158c2ea.app.js} +1 -1
  12. package/dist/{19d6b530a9c.chat.html → 19df158c2ea.chat.html} +1 -1
  13. package/dist/{19d6b530a9c.chat.js → 19df158c2ea.chat.js} +1 -1
  14. package/dist/{19d6b530a9c.form.html → 19df158c2ea.form.html} +1 -1
  15. package/dist/19df158c2ea.form.js +1 -0
  16. package/dist/{19d6b530a9c.index.html → 19df158c2ea.index.html} +1 -1
  17. package/dist/{19d6b530a9c.library.html → 19df158c2ea.library.html} +1 -1
  18. package/dist/{19d6b530a9c.library.js → 19df158c2ea.library.js} +1 -1
  19. package/dist/{19d6b530a9c.preview.html → 19df158c2ea.preview.html} +1 -1
  20. package/dist/{19d6b530a9c.preview.js → 19df158c2ea.preview.js} +1 -1
  21. package/dist/{19d6b530a9c.webview.js → 19df158c2ea.webview.js} +1 -1
  22. package/dist/HASH +1 -1
  23. package/dist/screenshoot.js +88 -39
  24. package/package.json +8 -8
  25. package/src/bot.js +1 -7
  26. package/src/chatbox/ChatButton.js +20 -15
  27. package/src/chatbox/MessageInput.js +1 -0
  28. package/src/chatbox/Widget.js +1 -1
  29. package/src/chatbox/main.js +24 -4
  30. package/src/lib.js +16 -1
  31. package/src/store/api.js +41 -3
  32. package/src/store/store.js +17 -2
  33. package/src/util/common.js +22 -21
  34. package/dist/19d6b530a9c.form.js +0 -1
  35. package/examples/track.js +0 -41
  36. /package/dist/{19d6b530a9c.127.js → 19df158c2ea.127.js} +0 -0
  37. /package/dist/{19d6b530a9c.132.js → 19df158c2ea.132.js} +0 -0
  38. /package/dist/{19d6b530a9c.185.js → 19df158c2ea.185.js} +0 -0
  39. /package/dist/{19d6b530a9c.27.js → 19df158c2ea.27.js} +0 -0
  40. /package/dist/{19d6b530a9c.278.js → 19df158c2ea.278.js} +0 -0
  41. /package/dist/{19d6b530a9c.339.js → 19df158c2ea.339.js} +0 -0
  42. /package/dist/{19d6b530a9c.459.js → 19df158c2ea.459.js} +0 -0
  43. /package/dist/{19d6b530a9c.490.js → 19df158c2ea.490.js} +0 -0
  44. /package/dist/{19d6b530a9c.74.js → 19df158c2ea.74.js} +0 -0
  45. /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
+ ```