Chương 3: Spec chuyên sâu: Edge case, a11y, i18n & AI Spec
Bài kiểm tra của một khóa dạy kỹ năng này.
Làm bài này
Product Management
Viết, kiểm và dùng tracking plan trước ngày ra mắt: từ câu hỏi readout xuống event, property, quy ước đặt tên, QA và dashboard.
Đăng nhập để đánh dấu kỹ năng và theo dõi tiến độ.
Làm bài Đánh giá Kỹ năng Kỹ thuật cho PM/BA — 2 người đã làm. Một lần làm chấm điểm cho tất cả kỹ năng trong nhóm Technical, không chỉ kỹ năng này.
Làm bài đánh giáHiểu vì sao event phải có trước ngày ra mắt — dữ liệu không đo ngược được — và biết một tracking plan gồm tên event, thời điểm bắn, property, định danh và nơi bắn. Biết bắt đầu từ câu hỏi cần trả lời, không từ màn hình.
Đi ngược từ câu hỏi readout xuống chỉ số và từng event; viết tracking plan theo một quy ước đặt tên chung, có user_id và account_id, bắn event quan trọng từ server; đưa tracking vào tiêu chí chấp nhận và QA nó trên staging; và dựng dashboard readout có cả khối theo dõi chất lượng dữ liệu trước ngày ra mắt.
Trang này là bản thực hành của kỹ năng "Event tracking (khái niệm)". Nếu bạn chưa quen event và property là gì, đọc bài đó trước; ở đây giả định bạn đã biết, và đi vào cách viết, kiểm và dùng một tracking plan thật.
Event không đo ngược được quá khứ. Nếu ngày ra mắt chưa có event, hai tuần đầu — thời điểm có nhiều người thử nhất và nhiều điều để học nhất — sẽ mất vĩnh viễn. Không có cách nào lấy lại, dù đội data giỏi đến đâu.
| Đo trước ra mắt | Đo sau ra mắt |
|---|---|
| Readout 2 tuần có số thật | Readout 2 tuần bằng cảm giác và vài ảnh chụp màn hình |
| Thấy ngay bước nào người dùng bỏ | Phải đoán, rồi chờ thêm vài tuần để xác nhận |
| Tiêu chí rollback có thể đo được | Rollback dựa vào ticket support — luôn trễ |
| Event được viết trong ticket, dev làm cùng tính năng | Event là ticket riêng, xếp hàng sau việc mới, thường bị bỏ |
| So được nhóm bật và nhóm chưa bật trong rollout | Không còn nhóm chưa bật để so |
Dòng cuối thường bị quên: rollout theo nấc cho bạn một nhóm đối chứng miễn phí — người chưa được bật. Nếu không đo từ nấc đầu tiên, khi lên 100% bạn mất nó mãi mãi.
Ai làm việc này? Ở công ty có đội data, PM viết câu hỏi và chỉ số, data analyst cùng viết tracking plan, engineer cài đặt. Ở công ty nhỏ hơn, PM hoặc BA viết cả plan. Dù ở đâu, người sở hữu tracking plan là người sẽ phải trả lời câu hỏi "tính năng này có hiệu quả không" — thường là PM.
Sai lầm phổ biến nhất là bắt đầu từ màn hình: "màn hình này có ba nút, track cả ba". Làm vậy bạn sẽ có rất nhiều event và không trả lời được câu nào. Bắt đầu từ câu hỏi bạn sẽ phải trả lời sau ra mắt, rồi đi ngược xuống.
Ví dụ (giả định): một sàn thương mại điện tử thêm tính năng "Mua chung" — rủ bạn bè cùng mua để được giá thấp hơn.
| Câu hỏi | Chỉ số | Event cần | Property cần |
|---|---|---|---|
| Bao nhiêu người thấy? | Số người thấy nút Mua chung / người xem trang sản phẩm có hỗ trợ | group_buy_cta_viewed | product_id, category, source_screen |
| Bao nhiêu người mở nhóm? | Người tạo nhóm / người thấy nút | group_buy_created | group_id, product_id, group_size_target, price_tier |
| Rủ được bạn không? | Tỉ lệ nhóm có ít nhất 1 người tham gia trong 24 giờ | group_buy_invite_sent, group_buy_joined | group_id, channel (zalo, messenger, copy_link), is_new_user |
| Nhóm có thành công không? | Tỉ lệ nhóm đủ người trước hạn | group_buy_completed, group_buy_expired | group_id, members_count, hours_to_complete |
| Có tạo đơn thật không? | Đơn từ Mua chung / tổng đơn | order_placed (thêm property) | order_id, purchase_type (single, group_buy), group_id |
| Có ăn mất đơn mua lẻ không? | Đơn mua lẻ ở nhóm bật so với nhóm chưa bật | order_placed | purchase_type, rollout_group |
Để ý dòng cuối: nó không cần event mới, chỉ cần thêm property vào event đã có. Thêm property vào event cũ thường đáng giá hơn tạo event mới, vì nó giữ được khả năng so với dữ liệu trước đó.
Tracking plan là một bảng, mỗi event một dòng. Nó là hợp đồng giữa PM, data và engineer: engineer cài đúng như bảng, data dựng dashboard dựa trên bảng, và không ai phải đoán tên event lúc 10 giờ tối trước readout.
| Cột | Điền gì | Vì sao cần |
|---|---|---|
| Tên event | Theo quy ước đặt tên chung của công ty | Một sự kiện mang ba tên khác nhau là ba nguồn số liệu không khớp |
| Mô tả và thời điểm bắn | Bắn khi nào, chính xác: lúc bấm hay lúc server xác nhận? | "Đặt hàng" lúc bấm nút và lúc thanh toán xong có thể chênh nhau 20% |
| Property | Tên, kiểu dữ liệu, giá trị cho phép, ví dụ | Không ghi giá trị cho phép thì sẽ có "Zalo", "zalo", "ZALO" trong cùng một cột |
| Nơi bắn | Client (app, web) hay server | Event liên quan tiền và trạng thái nên bắn từ server — client mất event khi mạng yếu hoặc bị chặn quảng cáo |
| Định danh | user_id, anonymous_id, account_id (với B2B) | Không có, không nối được hành vi trước và sau đăng nhập, hay người dùng với công ty của họ |
| Chỉ số phục vụ | Câu hỏi hoặc chỉ số nào dùng event này | Event không phục vụ chỉ số nào là ứng viên để xoá |
| Chủ và trạng thái | Ai chịu trách nhiệm; đề xuất / đã cài / đã QA | Event không có chủ sẽ hỏng âm thầm và không ai biết |
Quy ước đặt tên. Chọn một kiểu và giữ nó ở mọi nơi. Kiểu phổ biến và dễ đọc là đối_tượng_hành_động ở thì quá khứ, chữ thường, gạch dưới: group_buy_created, invite_sent, order_placed. Quy tắc đi kèm:
Về định danh với sản phẩm B2B: với SaaS, người trả tiền là công ty, không phải từng người dùng. Mọi event cần cả user_id lẫn account_id; nếu không, bạn sẽ biết 400 người đã dùng tính năng mà không biết đó là 400 người ở 3 công ty hay ở 200 công ty — hai câu chuyện hoàn toàn khác nhau.
Bản trắng, dán vào bảng tính của bạn — mỗi event một dòng:
TRACKING PLAN — [Tính năng] — Chủ: [tên] — Phiên bản: [ngày] Câu hỏi readout: 1) ... 2) ... 3) ... Event | Bắn khi (chính xác) | Nơi bắn | Property: kiểu, giá trị cho phép | Định danh | Phục vụ câu hỏi số | Trạng thái
Ví dụ đã điền (giả định): một phần mềm SaaS kế toán cho doanh nghiệp nhỏ thêm tính năng "Xuất hoá đơn điện tử hàng loạt". Câu hỏi readout: (1) bao nhiêu công ty thử, (2) bao nhiêu lần xuất thành công, lỗi chủ yếu ở đâu, (3) công ty dùng có giảm thời gian xuất hoá đơn không, (4) có công ty nào quay lại xuất từng tờ không.
TRACKING PLAN — Xuất hoá đơn hàng loạt — Chủ: PM Hoá đơn — v1.1
1. bulk_invoice_started
Bắn khi: người dùng bấm "Xuất hàng loạt" và màn hình chọn hoá đơn mở ra
Nơi bắn: web client
Property: entry_point (string: invoice_list, dashboard_banner, menu)
Định danh: user_id, account_id Câu hỏi: 1
2. bulk_invoice_submitted
Bắn khi: server nhận yêu cầu xuất hợp lệ
Nơi bắn: server
Property: batch_id (string), invoice_count (int, 1–500),
template_type (string: standard, vat, sales)
Định danh: user_id, account_id Câu hỏi: 1, 2
3. bulk_invoice_completed
Bắn khi: server nhận phản hồi cuối cùng từ nhà cung cấp hoá đơn điện tử
Nơi bắn: server
Property: batch_id, invoice_count, success_count (int), failed_count (int),
top_error_code (string, null nếu không lỗi), duration_seconds (int)
Định danh: user_id, account_id Câu hỏi: 2, 3
4. invoice_issued (event có sẵn — chỉ thêm property)
Property mới: issue_mode (string: single, bulk), batch_id (null nếu single)
Câu hỏi: 3, 4
Không track: hover, mở/đóng bộ lọc, cuộn danh sách — không phục vụ câu hỏi nào.
QA: data analyst kiểm trên staging trước ngày 20/9.Ba điều đáng học từ ví dụ: event quan trọng (2, 3) bắn từ server vì liên quan trạng thái thật; câu hỏi 4 được trả lời bằng một property thêm vào event cũ chứ không phải event mới; và có hẳn một dòng "Không track" — ghi ra điều bạn cố ý không đo cũng quan trọng như ghi điều bạn đo.
Tracking hỏng là tracking hỏng âm thầm: không có màn hình lỗi, không có khách phàn nàn. Bạn chỉ phát hiện vào ngày readout, khi con số trông vô lý. Vì vậy tracking cần tiêu chí chấp nhận và được QA như mọi phần khác của tính năng.
| Kiểm gì | Cách kiểm | Lỗi hay gặp |
|---|---|---|
| Event có bắn không | Đi hết luồng trên staging, xem công cụ debug hoặc bảng sự kiện thô | Quên bắn ở một nhánh, ví dụ luồng đăng nhập bằng Google |
| Bắn đúng một lần | Bấm nhanh hai lần, tải lại trang, quay lại màn hình trước | Bắn trùng khi tải lại, làm số tăng gấp đôi |
| Property đúng kiểu, đúng giá trị | So với bảng: số là số, chuỗi đúng danh sách cho phép | Giá tiền gửi dạng chuỗi "150.000"; viết hoa lẫn lộn |
| Định danh đúng | Kiểm user_id và account_id trước và sau đăng nhập | user_id rỗng ở event đầu tiên sau đăng nhập |
| Khớp với nguồn thật | So số đơn trong công cụ phân tích với số đơn trong cơ sở dữ liệu cho cùng một ngày | Lệch 10–30% do event phía client bị chặn hoặc mất mạng |
| Trên thiết bị thật | Android tầm thấp, iOS, trình duyệt trong Zalo hoặc Facebook | Trình duyệt trong ứng dụng chặn script phân tích |
Đưa tracking vào tiêu chí chấp nhận của ticket: "Khi người dùng bấm Xuất hàng loạt, event bulk_invoice_started bắn một lần với entry_point đúng." Ticket chưa qua dòng này thì chưa xong, giống như chưa qua kiểm thử chức năng.
Sau ra mắt, kiểm lại trong 48 giờ đầu: so số event với số thật ở cơ sở dữ liệu. Lệch dưới 5% với event phía client thường chấp nhận được; lệch lớn hơn cần tìm nguyên nhân trước khi dùng số để quyết định.
Dashboard ra mắt không phải dashboard tổng của công ty. Nó trả lời đúng các câu hỏi readout, theo thứ tự, và nên dựng xong — với số liệu thử từ staging — trước ngày ra mắt.
| Khối | Hiển thị | Đọc thế nào |
|---|---|---|
| Tiếp cận | Số người hoặc công ty thấy tính năng theo ngày, chia theo nấc rollout | Thấp thì vấn đề là điểm chạm, chưa phải tính năng |
| Phễu | Từng bước từ thấy, thử, hoàn thành; tỉ lệ chuyển giữa các bước | Bước có tỉ lệ rơi lớn nhất là nơi điều tra đầu tiên |
| Quay lại | Tỉ lệ dùng lại sau 7 và 28 ngày, theo nhóm tuần bắt đầu | Đây là tín hiệu giá trị; số tuần đầu luôn đẹp vì tò mò |
| Chỉ số bảo vệ | Các chỉ số không được xấu đi: thanh toán, lỗi, ticket | So nhóm bật với nhóm chưa bật, không so trước với sau |
| Chất lượng dữ liệu | Số event mỗi ngày; tỉ lệ property rỗng | Một ngày bỗng về 0 nghĩa là tracking hỏng, không phải người dùng biến mất |
Khối cuối cùng hiếm ai làm và cứu được rất nhiều readout. Một biểu đồ nhỏ đếm số event mỗi ngày sẽ cho bạn biết ngay khi một bản cập nhật ứng dụng làm hỏng tracking — trước khi bạn trình bày một con số sai cho ban lãnh đạo.
| Lỗi | Vì sao xảy ra | Làm thay bằng |
|---|---|---|
| Track mọi thứ | Sợ thiếu; nghĩ dữ liệu càng nhiều càng tốt | Mỗi event phải phục vụ một câu hỏi; ghi rõ danh sách không track |
| Tên event không nhất quán | Mỗi đội, mỗi engineer đặt một kiểu | Một quy ước chung; tracking plan được review trước khi cài |
| Không có chủ | Tracking là việc "của data" hoặc "của dev" | PM sở hữu plan; mỗi event có chủ và trạng thái |
| Tracking là ticket riêng làm sau | Coi đo lường là phụ | Tracking nằm trong tiêu chí chấp nhận của ticket tính năng |
| Event tiền bắn từ client | Dễ cài hơn | Đơn hàng, thanh toán, trạng thái: bắn từ server |
| B2B mà không có account_id | Sao chép mẫu tracking của B2C | Mọi event có user_id và account_id |
| Phát hiện tracking hỏng ở buổi readout | Không có QA và không theo dõi số event mỗi ngày | QA trên staging; khối chất lượng dữ liệu trên dashboard |
| Đổi tên event giữa chừng | Muốn tên "đẹp hơn" | Giữ tên cũ; nếu buộc phải đổi, ghi ngày đổi và nối dữ liệu |
Bài kiểm tra của một khóa dạy kỹ năng này.
Làm bài nàyBài kiểm tra của một khóa dạy kỹ năng này.
Làm bài nàyBài kiểm tra của một khóa dạy kỹ năng này.
Làm bài nàyBài kiểm tra của một khóa dạy kỹ năng này.
Làm bài nàyHọc kỹ năng này ở đâu?
Có 2 khóa dạy đúng phần này, miễn phí và bằng tiếng Việt.
Thảo luận & tài liệu thêm 0
Chia sẻ kinh nghiệm, đặt câu hỏi, hoặc đính kèm tài liệu/YouTube giúp người khác học kỹ năng này.