Đo lường sản phẩm · Product

Bộ sự kiện đo lường hiệu quả của tính năng cho sản phẩm

162 sự kiện cho ba sản phẩm, kèm ngưỡng để trả lời một câu duy nhất cho mỗi tính năng: đã đủ hiệu quả hay chưa. Kèm guồng vận hành, cách nghiệm thu, và vòng cải tiến sáu tuần.

Phạm vi
Ba sản phẩm: teacher.flyer.us · exam.flyer.us · ứng dụng giáo viên
Nội dung
162 sự kiện · vận hành · nghiệm thu · vòng cải tiến
Căn cứ
Rà soát mã nguồn partner-web, webs-exam, mobile-partner + read-replica, 19/09/2026
Ngày
19/09/2026
Bản đề xuất — để thảo luận, chưa phải quyết định
Xuất xứ / Prompt / Giới hạn

Tài liệu được viết để trả lời yêu cầu đặt ra ngày 19/09/2026, nguyên văn:

  • Đề xuất bộ event để anh setup toàn bộ event trên track, để tracking xem tính năng nào đã đủ hiệu quả chưa nhé https://teacher.flyer.us

Trợ lý AI soạn trong một phiên làm việc. Hiện trạng đo lường đọc từ mã nguồn partner-web, webs-exam, mobile-partner; số liệu nền từ read-replica, cùng ngày 19/09/2026. Mọi ngưỡng là đề xuất.

1 · Hiện trạng: sản phẩm gần như chưa đo gì

Rà soát mã nguồn partner-web ngày 19/09/2026: toàn ứng dụng chỉ phát đúng một sự kiện, là page_view bắn tự động mỗi lần đổi đường dẫn. Không có sự kiện nào mô tả hành vi của giáo viên.

Công cụ đã càiTrạng tháiGhi chú
Google Tag Manager
GTM-WNL6H6VM
Chỉ pageviewGắn cứng trong src/pages/_app.tsx, không đọc từ biến môi trường. Không có lệnh dataLayer.push nào trong mã.
Google Analytics 4
G-XWHVP4YV0E
Chỉ pageviewCũng gắn cứng. Không có lệnh gtag('event', …) nào. Vì gắn cứng nên cả bản chạy thử và bản thật đổ chung một tài khoản.
Datadog RUMChỉ bản thậtBản chạy thử và bản dev không có khoá nên không chạy. Có sẵn hàm trackAction(name, context) nhưng không một chỗ nào trong mã gọi tới.
Facebook PixelChỉ PageViewGắn cứng trong _document.tsx. Không có sự kiện chuyển đổi nào.
SentryĐang chạyChỉ bắt lỗi, không đo hành vi. Tỉ lệ lấy mẫu vết bằng 0.
FirebaseKhông dùng để đoChỉ dùng đăng nhập và cấu hình từ xa. Phần Analytics của Firebase chưa từng được gọi.
MixpanelĐã gỡCòn bốn đoạn mã bị chú thích, cho thấy từng có ý định đo: DashBoardPageView, PartnerCreateClassCompleted, Button Package.
Bốn điểm phải xử lý trước khi thêm sự kiện
  1. Mã GA4, GTM và Pixel gắn cứng trong mã nguồn. Ba môi trường đổ chung một chỗ nên số liệu hiện có lẫn dữ liệu thử nghiệm. Phải chuyển sang biến môi trường trước.
  2. Datadog chỉ chạy ở bản thật, nên không kiểm chứng được sự kiện ở môi trường thử. Phải cấp khoá cho bản thử trước khi cài.
  3. Chưa có nơi nhận phù hợp. Datadog RUM không dựng được phễu, không đo giữ chân theo nhóm, và lấy mẫu phát lại chỉ 20%. Xem mục 9.
  4. Không có nợ kỹ thuật về tên sự kiện. Điểm thuận lợi duy nhất: bắt đầu từ trang trắng nên đặt tên chuẩn được ngay.

Hệ quả: không ai trả lời được bao nhiêu giáo viên mở màn giao bài rồi bỏ giữa chừng hay Chấm điểm AI có bao nhiêu người dùng lần thứ hai. Số liệu hiện có chỉ thấy kết quả cuối, không thấy quá trình.

2 · Bốn câu hỏi bộ sự kiện phải trả lời

Một tính năng chỉ được coi là hiệu quả khi vượt cả bốn cửa dưới đây. Nhiều tính năng của FLYER hiện dừng ở cửa thứ nhất mà không ai biết, vì chỉ có số đếm tổng.

CửaCâu hỏiChỉ số
1 · Có ai biết khôngBao nhiêu giáo viên đủ điều kiện đã từng mở tính năng?Tỉ lệ tiếp cận = số giáo viên mở ít nhất một lần / số giáo viên được bật tính năng, trong 30 ngày
2 · Dùng có xong khôngTrong số đã mở, bao nhiêu người đi hết luồng và tạo ra kết quả?Tỉ lệ hoàn thành = số người phát sự kiện kết thúc / số người phát sự kiện bắt đầu
3 · Có quay lại khôngDùng một lần rồi thôi, hay thành thói quen?Tỉ lệ dùng lại = số người dùng ở tuần thứ hai / số người dùng lần đầu ở tuần thứ nhất
4 · Có tạo ra kết quả khôngGiáo viên dùng tính năng thì học sinh có học nhiều hơn, hay giáo viên ở lại lâu hơn?So sánh giờ học của học sinh và tỉ lệ giữ chân giáo viên giữa nhóm có dùng và nhóm không dùng
Mở luồng giao bàichưa đoTạo bài giao xong20.351 bài / 30 ngàyHọc sinh mở bàichưa đoHọc sinh bắt đầu làmchưa đoHọc sinh nộp49,9%
Phễu giao bài hôm nay: chỉ hai trong năm bước có số. Ba bước giữa hoàn toàn mù, nên không ai nói được một nửa số bài chết vì học sinh không bao giờ mở hay vì mở rồi bỏ dở.
Vì sao phải đủ bốn cửa 500 lượt dùng mỗi tháng nghe thì tốt, nhưng nếu quá nửa đến từ 10% giáo viên thì số tổng đang che mất sự thật là đa số không dùng. Không phải giả định: ở tính năng giao bài, 10% giáo viên tạo ra 54,2% tổng số bài giao trong 30 ngày qua.

3 · Quy ước đặt tên và tham số

Quy ước quan trọng hơn danh sách. Danh sách sẽ dài thêm theo thời gian; quy ước là thứ giữ cho nó đọc được sau hai năm.

Quy tắcNội dung
Dạng tên<đối_tượng>_<hành_động_đã_xảy_ra>, viết thường, nối bằng gạch dưới. Đối tượng đứng trước để mọi sự kiện cùng một tính năng tự đứng cạnh nhau khi sắp theo bảng chữ cái: assignment_created, assignment_edited, assignment_deleted.
Thì quá khứSự kiện ghi nhận việc đã xảy ra, nên luôn dùng thì quá khứ: assignment_created chứ không phải create_assignment. Riêng các sự kiện mở đầu một luồng dùng hậu tố _started.
Một luồng, ba mốcMọi luồng nhiều bước đều có đúng ba mốc bắt buộc: _started khi mở, _completed hoặc tên sự kiện chính khi thành công, và _failed khi lỗi. Thiếu mốc đầu thì không tính được tỉ lệ rơi rụng, mà đó chính là thứ cần biết nhất.
Không nhét dữ liệu cá nhânKhông gửi tên học sinh, số điện thoại, thư điện tử, nội dung bài làm. Chỉ gửi mã số và nhóm. Cần biết quy mô thì gửi khoảng thay vì số chính xác.
Số lượng gửi theo khoảngSĩ số, số bài, số ngày đều quy về khoảng: 1-5, 6-20, 21-50, 51+. Số thô làm bảng phân tích vỡ vụn và không thêm thông tin nào cho quyết định.
Tối đa tám tham số riêngNgoài bộ thuộc tính chung. Nhiều hơn tám nghĩa là một sự kiện đang cố kể hai câu chuyện, nên tách đôi.
Tên tham số dùng lạiCùng một khái niệm thì cùng một tên ở mọi sự kiện: class_id, assignment_id, source, step, duration_ms, error_code. Không có classId ở chỗ này và id_lop ở chỗ kia.
Nguồn vào luôn cóTham số source bắt buộc ở mọi sự kiện mở đầu, nhận giá trị trong danh sách đóng: sidebar, quick_start, whats_new, tour, deep_link, empty_state, notification, report_cta, class_detail. Đây là thứ cho biết lối vào nào thật sự dẫn người dùng tới tính năng.
Chỗ nối sẵn có trong mã partner-web đã có sẵn trackAction(name, context) trong src/lib/datadog.ts, xuất ra nhưng chưa nơi nào gọi. Giữ nguyên chữ ký, viết lại phần ruột để gửi tới nơi nhận chính. Đổi nơi nhận về sau chỉ sửa một tệp.

4 · Thuộc tính chung gắn vào mọi sự kiện

Gắn tự động ở tầng hàm gửi, không phải khai lại ở từng nơi gọi. Đây là phần quyết định khả năng cắt lớp: không có nó thì mọi sự kiện chỉ còn là một con số đếm.

Tham sốNguồn trong mãVì sao cần
teacher_profile_idPhiên đăng nhậpĐơn vị đếm của mọi chỉ số. Đếm theo người, không đếm theo lượt.
school_id, school_size_bucketcurrentSchoolTách trung tâm lớn khỏi giáo viên đơn lẻ. Hai nhóm này hành xử khác hẳn nhau và trộn vào là mất nghĩa.
roleisAdminSchoolChủ trường, quản lý chi nhánh hay giáo viên đứng lớp. Nhiều tính năng chỉ một vai trò thấy.
onboarding_goalTeacherOnboardingKey.ONBOARDING_GOALMục tiêu người dùng tự chọn lúc đăng ký: khám phá tài nguyên, dùng AI, số hoá, quản lý lớp. Cho biết tính năng có phục vụ đúng nhóm người đã khai nhu cầu đó không.
days_since_signupNgày tạo hồ sơPhân biệt hành vi tuần đầu với hành vi lâu dài. Vách rơi rụng của FLYER nằm ở tháng đầu tiên.
student_count_bucketSĩ số trườngKhoảng 0, 1-5, 6-50, 51+. Mốc 5 học sinh là ranh giới đã được chứng minh: giữ chân sau 12 tháng của nhóm trên 5 học sinh là 19,6% so với 0,8% của toàn bộ.
features_onteacherFeatureConfigsDanh sách cờ tính năng đang bật. Mẫu số của tỉ lệ tiếp cận phải là số người được bật, không phải tổng số giáo viên.
plan, is_trialGói đang dùngNối hành vi với doanh thu.
surfaceHost hiện tạiflyer, teado, teado_lite, white_label. Cùng một mã nguồn phục vụ nhiều thương hiệu.
device, viewport_bucketTrình duyệtBản điện thoại của ứng dụng giáo viên đang bị chấm 4,5/10. Không tách thiết bị thì không thấy được thiệt hại.
locale, app_versionNext.js, biến môi trườngPhân biệt trước và sau mỗi lần phát hành. Lưu ý NEXT_PUBLIC_APP_VERSION hiện chưa được khai ở bất kỳ tệp môi trường nào nên luôn trả về 1.0.0; phải sửa.

5 · Bộ sự kiện đề xuất

87 sự kiện, 13 khu vực. Đợt 1 là tối thiểu để trả lời bốn cửa ở mục 2, Đợt 2 thêm chiều sâu, Đợt 3 tinh chỉnh. Cột tham số chỉ liệt kê phần riêng; thuộc tính chung xem mục 4.

Chia theo đợt Đợt 1: 37 sự kiện · Đợt 2: 42 · Đợt 3: 8. Riêng đợt 1 đã đủ để dựng phễu giao bài, phễu kích hoạt và bảng tỉ lệ tiếp cận cho mọi tính năng.

A · Phiên và định danh

Nền của mọi chỉ số khác. Không có nhóm này thì không đếm được theo người, chỉ đếm được theo lượt.

Sự kiệnBắn khi nàoTham số riêngTrả lời câu hỏi gì
Đợt 1
session_started
Lần tương tác đầu tiên sau 30 phút không hoạt độngentry_path, referrer_typeSố người dùng hoạt động theo ngày và tuần
Đợt 1
screen_viewed
Mỗi lần đổi màn hình, thay cho page_view hiện cóscreen (khoá lấy từ hằng PATH), tab, params_hashMàn nào được xem, màn nào không ai vào
Đợt 1
login_succeeded
Đăng nhập thành côngmethod (password, google, otp)Cách đăng nhập nào đang được dùng
Đợt 2
login_failed
Đăng nhập thất bạimethod, error_codeMa sát ở cửa vào
Đợt 2
school_switched
Đổi trường ở cổng chọn trườngfrom_school_id, to_school_idTần suất người nhiều trường phải đổi qua lại

B · Kích hoạt người dùng mới

Trả lời câu hỏi đắt nhất của FLYER: vì sao 96,6% giáo viên đăng ký năm 2025 biến mất ngay trong tháng đầu.

Sự kiệnBắn khi nàoTham số riêngTrả lời câu hỏi gì
Đợt 1
signup_completed
Tạo xong tài khoản giáo viênmethod, how_do_you_know_usMẫu số của mọi phễu kích hoạt
Đợt 1
onboarding_goal_selected
Chọn mục tiêu ở bước 4 luồng đăng kýgoalNgười dùng tự khai nhu cầu, để đối chiếu với thứ họ thực sự dùng
Đợt 2
onboarding_step_completed
Xong mỗi bước trong luồng đăng kýstep_index, step_name, duration_msBước nào trong luồng làm người dùng bỏ cuộc
Đợt 1
onboarding_completed
Hoàn tất toàn bộ luồng đăng kýtotal_duration_ms, steps_skippedTỉ lệ đi hết luồng
Đợt 2
quick_start_opened
Mở màn Bắt đầu nhanhsource, items_total, items_doneDanh sách việc cần làm có được nhìn tới không
Đợt 2
quick_start_item_started
Nhấn vào một việc trong Bắt đầu nhanhitem_key, goalViệc nào hấp dẫn, việc nào bị bỏ qua
Đợt 1
quick_start_item_completed
Hoàn thành một việc trong Bắt đầu nhanhitem_key, goal, days_since_signupTiến độ kích hoạt theo từng mục tiêu
Đợt 1
activation_reached
Lần đầu đạt mốc kích hoạt: có ít nhất một lớp, năm học sinh và một bài giao đã có người nộpdays_since_signup, path_takenChỉ số bắc đẩu của toàn đội. Xem mục 6

C · Giao bài tập

Khu vực được đo sâu nhất: việc chính của giáo viên, đang nâng cấp lên bản 2.0. Luồng có bốn bước nên cần đủ bốn mốc.

Sự kiệnBắn khi nàoTham số riêngTrả lời câu hỏi gì
Đợt 1
assignment_create_started
Mở ngăn kéo giao bàisource, entry_screenMẫu số của phễu giao bài
Đợt 2
assignment_resource_searched
Tìm đề trong bước 1query_length, filters_used, results_countNgười dùng có tìm thấy đề không, hay tìm rồi bỏ
Đợt 1
assignment_resource_selected
Chọn xong đề hoặc dán liên kết ngoàiresource_type, level, skill, item_count, is_externalLoại nội dung nào thực sự được giao
Đợt 1
assignment_audience_selected
Chọn xong người nhận ở bước 2audience_type (class, student), class_count, student_count_bucketGiao cho cả lớp hay chọn từng học sinh
Đợt 2
assignment_options_set
Đổi bất kỳ tuỳ chọn nào ở bước 3has_deadline, deadline_days_ahead, exam_mode, hide_answers, allow_lateTuỳ chọn nào được dùng, tuỳ chọn nào nên bỏ
Đợt 1
assignment_created
Tạo bài giao thành côngassignment_id, resource_type, audience_type, recipient_count_bucket, has_deadline, duration_ms, step_backsThành công cuối phễu, kèm thời gian thao tác
Đợt 1
assignment_create_failed
Máy chủ trả lỗi khi tạoerror_code, stepBao nhiêu nỗ lực bị chặn vì lỗi
Đợt 1
assignment_create_abandoned
Đóng ngăn kéo khi chưa tạo xonglast_step, seconds_spent, had_resource, had_audienceBước nào làm người dùng bỏ giữa chừng
Đợt 1
assignment_list_viewed
Mở danh sách bài đã giaocount_visible, filter_stateNgười dùng có quay lại theo dõi bài đã giao không
Đợt 3
assignment_list_filtered
Dùng bộ lọc trên danh sáchfilter_type, valueBộ lọc nào đáng giữ trong bản 2.0
Đợt 1
assignment_detail_viewed
Mở chi tiết một bài giaoassignment_id, days_since_assigned, submitted_ratio_bucketGiáo viên có kiểm tra kết quả không
Đợt 2
assignment_edited
Sửa bài giao đã tạoassignment_id, fields_changedTrường nào hay bị sửa, tức là đặt sai từ đầu
Đợt 2
assignment_deleted
Xoá bài giaoassignment_id, age_hours, had_submissionsXoá ngay sau khi tạo là dấu hiệu tạo nhầm
Đợt 1
assignment_reminder_sent
Nhắc học sinh hoặc phụ huynhassignment_id, target (student, parent), is_bulk, recipient_count_bucketCông cụ nhắc có được dùng không, và có làm tăng tỉ lệ nộp không
Đợt 2
assignment_reassigned
Giao lại cho một học sinhassignment_idTần suất phải giao lại
Đợt 2
assignment_question_analysis_viewed
Mở phân tích theo từng câu hỏiassignment_idTính năng phân tích sâu có ai dùng không
Đợt 3
assignment_exported
Xuất dữ liệu bài giaoformat, row_countNhu cầu mang số liệu ra ngoài

D · Lớp học và học sinh

Hai việc đầu tiên mọi giáo viên phải làm. Rơi rụng ở đây là rơi rụng vĩnh viễn.

Sự kiệnBắn khi nàoTham số riêngTrả lời câu hỏi gì
Đợt 2
class_create_started
Mở biểu mẫu tạo lớpsourceMẫu số phễu tạo lớp
Đợt 1
class_created
Tạo lớp thành côngclass_id, level, has_schedule, duration_msBước kích hoạt thứ nhất
Đợt 2
student_create_started
Mở biểu mẫu thêm học sinhsource, method (manual, invite, import)Mẫu số phễu thêm học sinh
Đợt 1
student_created
Thêm học sinh thành côngmethod, count_added, class_idBước kích hoạt thứ hai
Đợt 2
student_invited
Gửi lời mời cho học sinh hoặc phụ huynhchannel, countKênh mời nào hiệu quả
Đợt 2
student_bulk_imported
Nhập danh sách hàng loạtrow_count, error_countNhập hàng loạt có chạy trơn không
Đợt 2
class_detail_viewed
Mở chi tiết lớpclass_id, tabTab nào trong chi tiết lớp thực sự được dùng
Đợt 2
student_profile_viewed
Mở hồ sơ một học sinhsource, days_since_last_viewGiáo viên có theo dõi từng học sinh không

E · Điểm danh

Tính năng mới. Toàn hệ thống mới có 221 lượt điểm danh học sinh, thuộc 32 buổi, do 12 giáo viên thực hiện. Cần biết ngay là chưa ai biết tới hay biết rồi mà không dùng.

Sự kiệnBắn khi nàoTham số riêngTrả lời câu hỏi gì
Đợt 1
attendance_tab_opened
Mở tab Điểm danh trong lớpclass_id, sourceTỉ lệ tiếp cận
Đợt 1
attendance_session_started
Bắt đầu đánh dấu một buổiclass_id, roster_size_bucketMẫu số của tỉ lệ hoàn thành
Đợt 1
attendance_saved
Lưu buổi điểm danhclass_id, marked_count, used_mark_all, duration_msHoàn thành, và mất bao lâu cho một buổi
Đợt 1
attendance_report_viewed
Mở báo cáo điểm danh chi nhánhrange_days, classes_shownChủ trường có xem báo cáo không
Đợt 2
attendance_at_risk_opened
Mở hồ sơ học sinh chuyên cần thấp từ báo cáostudent_id, rate_bucketBáo cáo có dẫn tới hành động không

F · Chấm bài bằng AI

Tính năng tốn tiền nhất mỗi lượt dùng. Cần đo cả độ tin cậy, không chỉ số lượt.

Sự kiệnBắn khi nàoTham số riêngTrả lời câu hỏi gì
Đợt 1
ai_grading_opened
Mở công cụ chấm AIskill (writing, speaking), sourceTỉ lệ tiếp cận
Đợt 1
ai_grading_submitted
Gửi bài cho AI chấmskill, input_type, word_count_bucketSố lượt dùng thật
Đợt 1
ai_grading_result_viewed
Xem kết quả chấmskill, seconds_to_result, score_bandThời gian chờ có chấp nhận được không
Đợt 1
ai_grading_edited_by_teacher
Giáo viên sửa điểm hoặc nhận xét của AIskill, score_delta, comment_changedChỉ số tin cậy. Sửa nhiều nghĩa là AI chấm chưa dùng được
Đợt 1
ai_grading_failed
Chấm lỗi hoặc quá hạn chờskill, error_code, seconds_waitedTỉ lệ hỏng của tính năng đắt tiền nhất
Đợt 1
ai_grading_credit_blocked
Bị chặn vì hết lượtskill, credits_leftHàng rào tính phí đang chặn bao nhiêu người
Đợt 2
manual_grading_started
Mở màn chấm tayskill, assignment_idSo sánh chấm tay với chấm AI
Đợt 2
manual_grading_saved
Lưu điểm chấm tayskill, duration_msChấm tay mất bao lâu, để tính thời gian AI tiết kiệm được

G · Kho nội dung và chương trình

Phần lớn nhất của sản phẩm tính theo số màn hình, nhưng chưa biết có bao nhiêu phần thực sự được dùng.

Sự kiệnBắn khi nàoTham số riêngTrả lời câu hỏi gì
Đợt 1
explore_searched
Tìm trong kho đềquery_length, filters_used, results_count, zero_resultsTìm không ra kết quả là lỗ hổng nội dung
Đợt 3
explore_filter_applied
Dùng bộ lọc trong kho đềfilter_type, valueBộ lọc nào đáng giữ
Đợt 2
explore_test_previewed
Xem trước một đềtest_id, level, sourceXem trước có dẫn tới giao bài không
Đợt 1
explore_test_assigned
Giao bài ngay từ kho đềtest_id, levelĐường ngắn nhất từ tìm thấy tới giao
Đợt 2
library_item_created
Tạo nội dung trong Thư viện của tôiitem_type, question_count, used_aiGiáo viên có tự soạn không
Đợt 2
program_opened
Mở một chương trình họcprogram_id, sourceTỉ lệ tiếp cận
Đợt 2
program_created
Tạo chương trình mớiprogram_id, unit_count, used_aiCó ai xây chương trình không
Đợt 2
program_schedule_assigned
Xếp lịch giao bài theo chương trìnhprogram_id, weeks, class_countGiao theo lịch có được dùng không

H · Báo cáo

Nhiều màn nhất trong sản phẩm. Câu hỏi thật là: báo cáo có dẫn tới hành động, hay chỉ để nhìn.

Sự kiệnBắn khi nàoTham số riêngTrả lời câu hỏi gì
Đợt 1
report_home_viewed
Mở trang Báo cáointerface_versionTỉ lệ tiếp cận
Đợt 2
report_drilldown_viewed
Mở một báo cáo conreport_keyTrong hơn 15 báo cáo con, bao nhiêu cái có người xem
Đợt 3
report_range_changed
Đổi khoảng thời gianreport_key, range_daysKhoảng mặc định có đúng không
Đợt 2
report_exported
Xuất báo cáoreport_key, format, row_countNhu cầu mang ra ngoài
Đợt 1
report_at_risk_action_taken
Từ báo cáo đi tới một hành động: nhắc, giao bài, mở hồ sơreport_key, actionChỉ số quan trọng nhất của mọi báo cáo
Đợt 2
daily_report_nudge_sent
Gửi nhắc nhở từ báo cáo học tập hằng ngàychannel, recipient_countVòng lặp nhắc nhở có được dùng không

I · Thi tập trung

63 kỳ thi trong 30 ngày. Cần biết đây là tính năng ngách hay tính năng chưa ai biết.

Sự kiệnBắn khi nàoTham số riêngTrả lời câu hỏi gì
Đợt 2
exam_create_started
Mở luồng tạo kỳ thisourceMẫu số
Đợt 2
exam_created
Tạo kỳ thi thành côngexam_id, student_count_bucket, duration_msHoàn thành
Đợt 2
exam_published
Phát hành kỳ thi cho học sinhexam_idTạo xong có dùng thật không
Đợt 3
exam_monitor_opened
Mở màn giám sátexam_id, active_studentsGiám sát có ai dùng không
Đợt 3
exam_report_viewed
Xem báo cáo kỳ thiexam_idVòng đời khép kín hay dừng giữa chừng

J · Học phí và thanh toán

Nối hành vi với tiền. Đây là nhóm sự kiện duy nhất mà đội kinh doanh đọc trực tiếp.

Sự kiệnBắn khi nàoTham số riêngTrả lời câu hỏi gì
Đợt 2
tuition_setup_started
Bắt đầu thiết lập học phísourceMẫu số
Đợt 2
tuition_bank_linked
Liên kết xong tài khoản ngân hàngmethodBước khó nhất của luồng
Đợt 2
tuition_invoice_created
Tạo phiếu thuamount_bucket, student_countCó dùng thật không
Đợt 2
tuition_payment_received
Ghi nhận một khoản đã thuamount_bucket, method, days_to_payVòng đời khép kín

K · Trợ giảng AI và Bingo Co-Teacher

Tính năng mới nhất, chưa có số liệu nền nào.

Sự kiệnBắn khi nàoTham số riêngTrả lời câu hỏi gì
Đợt 2
coteacher_opened
Mở Bingo AI Co-Teachertab, sourceTỉ lệ tiếp cận
Đợt 2
coteacher_suggestion_viewed
Xem một đề xuấtstudent_id, suggestion_typeĐề xuất có được đọc không
Đợt 1
coteacher_suggestion_accepted
Chấp nhận và giao bài theo đề xuấtstudent_id, suggestion_typeChỉ số hiệu quả duy nhất đáng kể của tính năng này
Đợt 3
assistant_message_sent
Gửi câu hỏi cho trợ lý trò chuyệntopic_guess, message_length_bucketNgười dùng hỏi gì nhiều nhất

L · Hướng dẫn, Có gì mới và thông báo

Đo chính phần vừa xây, để biết hướng dẫn có tác dụng hay chỉ gây phiền.

Sự kiệnBắn khi nàoTham số riêngTrả lời câu hỏi gì
Đợt 1
feature_intro_shown
Hiện màn giới thiệu tính năngfeature_key, source (auto, whats_new, replay)Bao nhiêu người thực sự nhìn thấy
Đợt 2
feature_intro_dismissed
Đóng màn giới thiệu trước khi vào tourfeature_key, slide_indexBỏ ở slide nào
Đợt 1
tour_completed
Đi hết tour hướng dẫnfeature_key, steps_total, duration_msTour có được xem hết không
Đợt 2
whats_new_opened
Mở trang Có gì mớisource, unseen_countKênh công bố tính năng mới có ai đọc không
Đợt 2
notification_opened
Mở một thông báonotification_type, age_hoursLoại thông báo nào được mở, loại nào bị bỏ

M · Ma sát và lỗi

Nhóm rẻ nhất để cài và thường cho phát hiện lớn nhất.

Sự kiệnBắn khi nàoTham số riêngTrả lời câu hỏi gì
Đợt 1
action_failed
Bất kỳ thao tác nào bị máy chủ từ chốiaction, error_code, screenBản đồ lỗi theo màn hình, thứ Sentry không cho biết
Đợt 2
empty_state_shown
Hiện trạng thái rỗngscreen, reason (no_data, filtered_out)Người dùng gặp màn trống ở đâu nhiều nhất
Đợt 2
upgrade_prompt_shown
Hiện lời mời nâng cấp hoặc chặn vì hết lượttrigger, featureHàng rào tính phí đặt đúng chỗ chưa
Đợt 3
slow_screen
Màn hình mất hơn 3 giây mới dựng xongscreen, duration_msNối cảm nhận chậm với màn cụ thể

6 · Chỉ số và ngưỡng "đã đủ hiệu quả"

Mỗi tính năng cần đúng một chỉ số chính, một con số hiện tại và một ngưỡng. Thiếu ngưỡng thì cuộc họp nào cũng kết thúc bằng "số đang tăng", vốn luôn đúng và vô dụng.

Chỉ số bắc đẩu đề xuất cho toàn đội

Số giáo viên có ít nhất một bài giao được học sinh nộp, trong 7 ngày gần nhất.

Chỉ số này ép cả chuỗi phải chạy: có lớp, có học sinh thật, giao được bài, học sinh chịu làm. Từng mắt xích đẹp riêng lẻ mà chuỗi vẫn đứt. activation_reached đánh dấu lần đầu chạm mốc.

Tính năngChỉ số chínhHôm nayNgưỡng đề xuấtĐo bằng
Giao bài tậpTỉ lệ bài giao được nộp, tính trên các bài giao đã quá 30 ngày49,9%
126.798 trên 254.222 lượt
65%Có ngay từ cơ sở dữ liệu
Giao bài tậpTỉ lệ hoàn thành luồng tạo bài: tạo xong trên số lần mở ngăn kéoChưa biết80%assignment_create_started → assignment_created
Giao bài tậpMức độ tập trung: phần trăm bài giao đến từ 10% giáo viên tích cực nhất54,2%Dưới 40%Có ngay từ cơ sở dữ liệu
Nhắc nộp bàiChênh lệch tỉ lệ nộp giữa bài có nhắc và bài không nhắcChưa biếtHơn 10 điểm phần trămassignment_reminder_sent đối chiếu tỉ lệ nộp
Điểm danhTỉ lệ lớp có ít nhất một buổi điểm danh trong tháng, trong các trường được bật221 buổi toàn hệ thống, 30 ngày30% số lớpattendance_saved chia số lớp đang hoạt động
Chấm bài AITỉ lệ dùng lại trong 14 ngày sau lần chấm đầu tiênChưa biết40%ai_grading_submitted theo nhóm tuần
Chấm bài AIĐộ tin cậy: tỉ lệ kết quả bị giáo viên sửa điểmChưa biếtDưới 25%ai_grading_edited_by_teacher
Báo cáoTỉ lệ lượt xem báo cáo dẫn tới một hành động trong 10 phút sau đóChưa biết25%report_at_risk_action_taken chia report_home_viewed
Báo cáo conSố báo cáo con có dưới 20 lượt xem mỗi tháng, tức là nên gỡChưa biếtKhông quá 3report_drilldown_viewed
Thi tập trungTỉ lệ kỳ thi tạo xong được phát hành cho học sinh63 kỳ thi 30 ngày70% phát hànhexam_created → exam_published
Kho đềTỉ lệ lượt tìm không ra kết quả nàoChưa biếtDưới 8%explore_searched với zero_results
Học phíTỉ lệ đi hết từ bắt đầu thiết lập tới khoản thu đầu tiênChưa biết50%Bốn sự kiện nhóm J
Bingo Co-TeacherTỉ lệ đề xuất được chấp nhận và giao điChưa biết30%coteacher_suggestion_accepted
Hướng dẫn tính năngTỉ lệ xem hết tour, và tỉ lệ dùng tính năng trong 7 ngày sau khi xemChưa biết60% xem hết · 35% dùngtour_completed đối chiếu sự kiện của tính năng
Kích hoạt người mớiTỉ lệ giáo viên đăng ký mới đạt mốc kích hoạt trong 14 ngày3,4% còn hoạt động sau tháng đầu12%activation_reached
Cách đọc cột "Ngưỡng đề xuất" Mức đề xuất để đội tranh luận, không phải chỉ tiêu đã giao. Ngưỡng phải đủ cao để tính năng dưới ngưỡng bị coi là cần sửa, và đủ thấp để không tính năng nào đạt ngay tháng đầu.

7 · Phần A · Đo được ngay hôm nay, không cần lập trình

Sự kiện cần thời gian tích luỹ, sớm nhất bốn tuần mới có phễu đọc được. Trong lúc chờ, truy vấn trên bản sao cơ sở dữ liệu đã trả lời được một phần. Số dưới đây lấy ngày 19/09/2026.

Câu hỏiTrả lời hôm nayÝ nghĩa
Bao nhiêu giáo viên giao bài trong 30 ngày?641 người · 20.351 bàiTrên 2.465 giáo viên đăng ký năm 2025, đây là nhóm thực sự dùng sản phẩm.
Một giáo viên giao bao nhiêu bài mỗi tháng?Trung vị 12 · nhóm 10% cao nhất 83 · cao nhất 517Khoảng cách giữa trung vị và mức cao nhất là 43 lần. Thiết kế bản 2.0 phải phục vụ cả người giao 12 bài lẫn người giao 500 bài.
10% giáo viên tích cực nhất chiếm bao nhiêu phần tổng số bài giao?54,2%Mất một người trong nhóm này thiệt hại bằng mất hàng chục người khác.
Bài giao có được nộp không?49,9% lượt đã nộpMột nửa số bài giao ra không ai làm. Đây là con số quan trọng nhất của toàn tính năng.
Giao cho cả lớp hay từng học sinh?Lớp 97,1% · học sinh lẻ 2,9%Luồng chọn từng học sinh chiếm một nửa độ phức tạp của bước 2 nhưng phục vụ chưa tới 3% lượt dùng.
Tuỳ chọn nào thực sự được dùng?Cho nộp muộn 62,4% · có hạn nộp 40,6% · ẩn đáp án 7,9% · chế độ thi 4,8% · liên kết ngoài 0,14%Liên kết ngoài được dùng 28 lần trong 30 ngày, tức là gần như không ai dùng. Chế độ thi và ẩn đáp án cũng dưới 8%.
Điểm danh có ai dùng không?221 buổi trong 30 ngàyTính năng mới, cần biết là chưa ai biết tới hay biết rồi mà bỏ. Chỉ sự kiện mới phân biệt được hai trường hợp này.
Thi tập trung có ai dùng không?63 kỳ thi trong 30 ngàyQuy mô rất nhỏ so với công sức đã bỏ ra xây dựng.
Đề xuất cho Phần A Dựng một trang số liệu chạy tự động mỗi ngày tại data.flyer.vn, gồm tám dòng ở bảng trên cộng tỉ lệ nộp theo tuần. Chỉ cần một tập lệnh truy vấn và một tác vụ định giờ, làm được trong tuần này. Sau khi bộ sự kiện chạy, trang này vẫn là nguồn đối chiếu độc lập để phát hiện sự kiện cài sai.

Giới hạn của Phần A. Cơ sở dữ liệu chỉ lưu kết quả cuối, nên không biết được ai mở rồi bỏ, ai tìm mà không ra, màn nào bị rời ngay. Bốn nhóm câu hỏi đó bắt buộc phải có sự kiện.

8 · Phần B · Thứ tự cài đặt

Không cài cả 87 sự kiện một lượt. Mỗi đợt phải tự đứng được và trả lời xong một nhóm câu hỏi trước khi sang đợt sau.

ĐợtNội dungSố sự kiệnXong thì trả lời được
Đợt 0
Trước tiên
Sửa nền: đưa mã GA4, GTM, Pixel ra biến môi trường; cấp khoá Datadog cho bản thử; khai NEXT_PUBLIC_APP_VERSION; viết lại ruột trackAction; gắn bộ thuộc tính chung0Chưa trả lời gì, nhưng mọi thứ sau đó mới đáng tin. Bỏ qua bước này thì số liệu ba môi trường trộn lẫn.
Đợt 137 sự kiện mức Đợt 137Phễu giao bài, phễu kích hoạt, tỉ lệ tiếp cận của mọi tính năng, bản đồ lỗi theo màn hình. Đủ để quyết định tính năng nào cần sửa, tính năng nào nên gỡ.
Đợt 242 sự kiện mức Đợt 242Chiều sâu trong từng tính năng: bước nào chậm, tuỳ chọn nào thừa, kênh nhắc nào hiệu quả, nội dung nào được tìm nhiều.
Đợt 38 sự kiện còn lại8Tinh chỉnh bộ lọc, khoảng thời gian mặc định, hiệu năng theo màn.
Hai quy tắc giữ cho bộ sự kiện không mục nát
  1. Không nhận yêu cầu kéo mã cho tính năng mới nếu chưa kèm sự kiện. Bổ sung sau luôn bị đẩy lùi vô hạn. Đưa thẳng vào bảng kiểm xét duyệt mã.
  2. Mỗi quý rà một lần. Sự kiện không ai truy vấn trong ba tháng thì gỡ. Một bộ 87 sự kiện mà 30 cái chết là bộ không ai tin nữa.

9 · Chọn nơi nhận sự kiện

Đây là quyết định phải chốt trước Đợt 1, vì nó ảnh hưởng tới cách viết hàm gửi. Ba phương án thực tế:

Chỉ dùng GA4

Ưu: đã cài sẵn, không tốn thêm tiền, đội marketing quen dùng.

Nhược: giới hạn 25 tham số, dựng phễu theo người rất yếu, không đo giữ chân theo nhóm, bị lấy mẫu khi khối lượng lớn. Không trả lời được cửa 3 và 4.

Phù hợp nếu chỉ cần biết màn nào được xem.

GA4 cộng một công cụ phân tích sản phẩm

Ưu: phễu, giữ chân theo nhóm, cắt lớp, xem lại phiên. Trả lời được cả bốn cửa. PostHog có bản tự vận hành; Mixpanel miễn phí tới một triệu sự kiện mỗi tháng.

Nhược: thêm một nơi phải quản, và phải quyết định dữ liệu đặt ở đâu.

Đề xuất chọn phương án này. Ước tính khối lượng: khoảng 600 giáo viên hoạt động, 87 loại sự kiện, nằm gọn trong gói miễn phí.

Tự dựng trên hạ tầng sẵn có

Ưu: dữ liệu nằm hoàn toàn trong nhà, nối thẳng với bản sao cơ sở dữ liệu nên ghép được hành vi với kết quả học tập.

Nhược: phải tự xây bảng phân tích, tức là một dự án riêng. Đội hiện chưa có người chuyên trách dữ liệu.

Để dành cho giai đoạn sau, khi đã biết chắc cần đo gì.

Dù chọn phương án nào, hàm gửi vẫn chỉ có một: mọi nơi gọi trackAction(name, context). Đổi công cụ về sau chỉ sửa một tệp.

10 · Kiểm chứng: thế nào là cài xong

Sự kiện cài sai tệ hơn không cài, vì nó tạo ra con số trông như thật. Mỗi sự kiện chỉ xong khi qua đủ bốn mục:

MụcYêu cầu
Bắn đúng một lầnThao tác một lần thì có đúng một sự kiện. Lỗi hay gặp nhất là sự kiện nằm trong một hàm dựng lại nhiều lần nên bắn ba bốn lần cho một cú nhấn.
Đủ tham sốKhông có trường nào trống hoặc bằng undefined. Thêm một lần kiểm ở tầng hàm gửi: thiếu tham số bắt buộc thì ghi cảnh báo ra bảng điều khiển ở môi trường thử.
Đối chiếu được với cơ sở dữ liệuSố lượng assignment_created trong một ngày phải khớp số dòng thêm vào bảng assign_tests ngày đó, sai lệch dưới 5%. Đây là phép thử mạnh nhất và chỉ làm được với các sự kiện có bản ghi tương ứng.
Có người đọcMỗi sự kiện phải xuất hiện trong ít nhất một biểu đồ hoặc một câu hỏi ở mục 6. Sự kiện không ai đọc là mã chết. Guồng đọc số nằm ở tab Nghiệm thu hiệu quả.

Lập một trang kiểm kê sự kiện: tên, đợt, ngày cài, nơi gọi trong mã, biểu đồ đang dùng, lần cuối có dữ liệu. Dùng khi rà soát hằng quý.

11 · Những gì cố tình không đo

Phần này quan trọng ngang phần đo, vì nó ngăn bộ sự kiện phình ra tới mức không ai đọc.

  • Không đo từng cú nhấn. Datadog đã tự ghi mọi thao tác nhấn để gỡ lỗi. Sự kiện sản phẩm chỉ dành cho việc có nghĩa với người dùng.
  • Không gửi nội dung người dùng nhập: câu tìm kiếm nguyên văn, nhận xét bài làm, tên học sinh. Cần biết người dùng tìm gì thì gửi độ dài và có ra kết quả hay không.
  • Không đo thời gian ở lại màn hình như chỉ số thành công. Ở lâu có thể là đang cân nhắc, cũng có thể là đang lạc. Chỉ dùng thời gian kèm kết quả, ví dụ từ lúc mở tới lúc tạo xong.
  • Không dựng bảng số liệu thời gian thực. Không quyết định sản phẩm nào cần dữ liệu theo giây. Cập nhật hằng ngày là đủ và rẻ hơn nhiều.
  • Không đo học sinh trong bộ này. Phạm vi tài liệu là ứng dụng giáo viên. Hành vi học sinh đã có trong bảng bài làm và nên đo riêng.

Tài liệu do trợ lý AI soạn ngày 19/09/2026. Số liệu nền từ read-replica, hiện trạng đo lường từ mã nguồn. Mọi ngưỡng là đề xuất để đội sản phẩm chốt lại.

1 · Hiện trạng: sáu công cụ đo, không một sự kiện sản phẩm

Sản phẩm dành cho học sinh, 113 đường dẫn. Kho mã hiện hành là gitea.flyer.vn/flyer/webs-exam nhánh dev; kho đơn khối webs cũ đã tách nên apps/exam trong đó không còn là bản chạy thật.

Công cụTrạng tháiGhi chú
Google Tag Manager
GTM-MWCH4JVL
Chỉ pageviewGắn cứng. Không có lệnh dataLayer.push nào trong toàn bộ mã, tức là thùng chứa được nạp nhưng không ai đổ gì vào.
Hotjar
6382847
Đang chạyGắn cứng trong _document.tsx. Ghi phiên và bản đồ nhiệt.
Microsoft Clarity
n8orfkthqt
Đang chạyGắn cứng. Trùng chức năng với Hotjar.
Meta Pixel
312045711855258
Sáu sự kiện rờiGắn cứng. Sáu lời gọi rải rác, đều là sự kiện quảng cáo.
TikTok Pixel
CQJNA2JC77UE89C5KM9G
Chỉ pageviewGắn cứng trong _app.tsx.
Firebase AnalyticsKhởi tạo, bỏ trốnggetAnalytics(app) có chạy, nhưng mọi lời gọi logEvent đều bị chú thích.
Google Analytics 4Đã tắtDòng khai báo bị chú thích ngay dưới dòng GTM.
SentryĐã tắtSentry.init bị chú thích, nên các lời gọi setUser còn lại không có tác dụng.
Hai kết luận
  1. Sáu công cụ tải trên mỗi lượt truy cập, không công cụ nào nhận được một sự kiện học tập. Toàn bộ sự kiện tự viết là sáu lời gọi Meta Pixel thuộc phễu quảng cáo (ExamSignUpView, ExamSignupComplete, ExamHomePageView…). Không có gì đo việc bắt đầu bài, trả lời, nộp, xem kết quả, tự luyện hay chuỗi ngày.
  2. Cách đặt tên hiện tại không dùng lại được. ExamSignupCompleteNewDesign gắn cứng một lần đổi giao diện vào tên sự kiện. Giữ nguyên cho đội quảng cáo, nhưng không tính là bộ sự kiện sản phẩm.

Khi nộp một câu trả lời thất bại, mã nguồn gửi thông báo vào Slack. Đó là toàn bộ hệ thống đo lỗi của luồng làm bài.

2 · Năm điểm khác so với ứng dụng giáo viên

Khác biệtHệ quả với bộ sự kiện
Năm bộ mã làm bài riêng biệtViệc "làm một bài" được viết năm lần: bài thi, luyện tập, bài học kiểu Duolingo, bản điện thoại, bài viết. Đặt năm bộ tên riêng thì không bao giờ cộng lại được. Dùng một bộ tên chung với tham số engine. Đây cũng là lý do việc gắn sự kiện ở đây tốn công gấp năm lần bên giáo viên.
Người dùng là trẻ emTuyệt đối không gửi tên, thư điện tử, ngày sinh hay nội dung bài làm. Đơn vị đếm là hồ sơ học, không phải tài khoản, vì một nhà nhiều con dùng chung một tài khoản.
Bốn loại phần thưởng song songKim cương, xu và sao, đá tri thức, chuỗi ngày. Bốn loại có nguồn thu và nơi tiêu khác nhau. Gộp chung vào một sự kiện với tham số reward_type, nếu không bảng sẽ có bốn cột không so được với nhau.
Không có cơ chế giới hạn lượt làmRà mã không thấy hệ thống đếm lượt hay số dư lượt. Hàng rào duy nhất là quyền truy cập theo gói. Đừng thiết kế sự kiện cho thứ không tồn tại.
Nối trực tiếp với ứng dụng giáo viênBài giao bên kia là bài nhận bên này. Dùng chung assignment_id để ghép hai đầu; nhờ đó mới biết trong 49,9% bài không được nộp, bao nhiêu phần là không bao giờ mở, bao nhiêu phần là mở rồi bỏ dở.
Bài thiexam-old · 129 tệpLuyện tậppractice_v2 · 109Bài họcexam-lesson · 139Điện thoạiDoExamMobile · 35Bài viếtwriting_v2 · 50attempt_startedengine = exam | practice | study |mobile | writing
Việc “làm một bài” được viết năm lần trong mã nguồn, mỗi lần có bộ ba riêng. Vừa là lý do gắn sự kiện ở đây tốn công gấp năm lần, vừa là lý do bắt buộc dùng một tên chung.

3 · Bộ 45 sự kiện cho exam.flyer.us

Đợt 1: 27 sự kiện · Đợt 2: 17 · Đợt 3: 1. Quy ước đặt tên và thuộc tính chung dùng lại mục 3 và 4 của tab teacher.flyer.us, thêm bốn thuộc tính riêng: learner_profile_id, level, is_school_learner (tách học sinh trung tâm khỏi người tự học), is_subscribing.

A · Phiên và định danh

Học sinh hay dùng chung máy với anh chị em, nên đơn vị đếm là hồ sơ học chứ không phải tài khoản.

Sự kiệnBắn khi nàoTham số riêngTrả lời câu hỏi gì
Đợt 1
session_started
Tương tác đầu tiên sau 30 phút nghỉentry_path, referrer_type, is_returningSố học sinh hoạt động theo ngày
Đợt 1
screen_viewed
Mỗi lần đổi mànscreen, params_hashTrong 113 đường dẫn hiện có, bao nhiêu cái thật sự có người vào
Đợt 1
login_succeeded
Đăng nhập xongmethod, account_age_daysCách đăng nhập nào học sinh dùng được
Đợt 2
profile_switched
Đổi hồ sơ học trên cùng tài khoảnfrom_profile_id, to_profile_idMột nhà nhiều con dùng chung tới mức nào
Đợt 2
access_blocked
Bị chặn vì chưa có quyền hoặc hết hạnreason, from_screen, checkpoint_idHàng rào chặn học sinh ở đâu, hiện đang chặn im lặng

B · Vào lớp và nhận bài

Cầu nối giữa hai sản phẩm. Mỗi lần đứt ở đây là một bài giao chết bên phía giáo viên.

Sự kiệnBắn khi nàoTham số riêngTrả lời câu hỏi gì
Đợt 1
join_class_opened
Mở màn vào lớpsource (link, code, qr)Kênh nào đưa học sinh vào lớp
Đợt 1
join_class_succeeded
Vào lớp thành côngclass_id, seconds_from_openTỉ lệ hoàn thành của bước nối hai sản phẩm
Đợt 1
join_class_failed
Vào lớp thất bạierror_codeMã sai, lớp đầy, hay đã ở trong lớp
Đợt 1
assignment_received_opened
Mở một bài được giaoassignment_id, hours_since_assigned, from (notification, home, mission)Ghép với sự kiện giao bài bên giáo viên để đo độ trễ từ giao tới mở
Đợt 2
assignment_list_viewed
Xem danh sách bài được giaopending_count, overdue_countHọc sinh có chủ động kiểm tra không, hay chỉ vào khi bị nhắc

C · Làm bài

Lõi sản phẩm. Trong mã có năm bộ mã làm bài riêng biệt, mỗi bộ một bộ ba riêng. Phải dùng chung tên, phân biệt bằng engine và mode.

Sự kiệnBắn khi nàoTham số riêngTrả lời câu hỏi gì
Đợt 1
attempt_started
Bắt đầu một lượt làmengine, mode, checkpoint_id, is_assigned, question_count, is_resumeMẫu số của mọi tỉ lệ hoàn thành
Đợt 1
attempt_question_answered
Trả lời xong một câuengine, question_type, question_index, seconds_on_question, is_correct, changed_answerCâu nào tốn thời gian, loại câu nào hay bị đổi đáp án
Đợt 2
attempt_question_skipped
Bỏ qua một câuengine, question_type, question_indexLoại câu hỏi nào hay bị bỏ
Đợt 1
attempt_paused
Rời khỏi bài giữa chừngengine, progress_pct, reason (navigate, background, close)Bỏ dở ở mốc phần trăm nào
Đợt 1
attempt_resume_offered
Hiện hộp thoại hỏi có làm tiếp khôngengine, hours_since_pause, is_expiredCơ chế làm tiếp có được đề nghị đúng lúc không
Đợt 1
attempt_resumed
Chấp nhận làm tiếpengine, hours_since_pauseCứu được bao nhiêu bài dở dang
Đợt 1
attempt_submitted
Nộp bàiengine, mode, duration_ms, answered_count, skipped_count, is_assignedThành công cuối phễu
Đợt 1
attempt_abandoned
Bỏ hẳn: quá 24 giờ không quay lạiengine, progress_pct, last_question_indexTỉ lệ rơi rụng thật, hiện hoàn toàn mù
Đợt 1
attempt_failed
Lỗi khi bắt đầu, nộp câu, hoặc kết thúcengine, error_code, stageHiện lỗi nộp câu chỉ được gửi vào Slack, không ai tổng hợp
Đợt 2
audio_playback_failed
Không phát được âm thanh bài nghecheckpoint_id, error_codeLỗi này giết trọn một bài nghe mà không ai biết
Đợt 2
speaking_record_failed
Ghi âm thất bạierror_code, permission_stateQuyền micrô hay lỗi thiết bị
Đợt 2
exam_security_violation
Bị tính là vi phạm chống gian lậnviolation_type, countRời tab cũng bị tính là vi phạm, nên cần biết tỉ lệ báo nhầm

D · Kết quả và xem lại

Làm xong mà không xem lại thì bài tập chỉ là chấm điểm, không phải học.

Sự kiệnBắn khi nàoTham số riêngTrả lời câu hỏi gì
Đợt 1
result_viewed
Mở màn kết quảengine, score_band, is_assignedBao nhiêu phần trăm lượt làm dẫn tới xem kết quả
Đợt 1
result_explanation_opened
Mở lời giải một câuquestion_type, was_correctChỉ số học thật: có đọc lời giải của câu trả lời sai không
Đợt 2
result_explanation_blocked
Lời giải bị chặn vì chưa nâng cấpcheckpoint_idHàng rào này chặn đúng chỗ học sinh cần nhất, phải biết quy mô
Đợt 2
retry_started
Làm lại bài đã làmengine, previous_score_band, attempt_numberLàm lại có nâng điểm không

E · Tự luyện

Phần học sinh tự tìm tới. Đây là thứ giữ chân khi lớp nghỉ hè.

Sự kiệnBắn khi nàoTham số riêngTrả lời câu hỏi gì
Đợt 1
library_opened
Mở kho nội dungsourceTỉ lệ tiếp cận phần tự học
Đợt 2
library_searched
Tìm nội dungquery_length, filters_used, results_count, zero_resultsTìm không ra là lỗ hổng nội dung
Đợt 1
self_study_started
Bắt đầu nội dung tự chọncontent_type, levelTự học so với bài được giao, tỉ lệ bao nhiêu
Đợt 2
conversation_started
Vào hội thoại với AItopic, mode (call, chat, free_talk)Tính năng tốn tiền nhất mỗi lượt, cần biết mức dùng

F · Trò chơi hoá

Bốn loại phần thưởng song song: kim cương, xu và sao, đá tri thức, chuỗi ngày, trải trên chín khu vực. Câu hỏi không phải có ai chơi không, mà cái nào làm học sinh học thêm giờ.

Sự kiệnBắn khi nàoTham số riêngTrả lời câu hỏi gì
Đợt 1
reward_earned
Nhận thưởngreward_type (diamond, coin, star, wisdom_stone), amount_bucket, source_actionNguồn thưởng nào đang chi nhiều nhất
Đợt 1
reward_spent
Tiêu thưởngitem_type, currency, amount_bucketThưởng có đường ra không, hay chỉ tích rồi để đó
Đợt 2
store_opened_empty
Mở cửa hàng nhưng không có gì để muahas_class, balance_nullHọc sinh không thuộc lớp nào thấy kệ hàng trống và số dư rỗng
Đợt 1
mission_completed
Hoàn thành nhiệm vụ ngàymission_key, levelNhiệm vụ nào dẫn tới hành vi học thật
Đợt 2
streak_extended
Nối dài chuỗi ngày họcstreak_countChuỗi ngày có giữ chân không
Đợt 2
challenge_joined
Tham gia thử tháchchallenge_id, sourceTỉ lệ lời mời biến thành người chơi
Đợt 2
ranking_viewed
Xem bảng xếp hạngscope, own_rank_bucketXếp hạng tạo động lực hay áp lực, đối chiếu với tỉ lệ quay lại

G · Gói và thanh toán

Sự kiệnBắn khi nàoTham số riêngTrả lời câu hỏi gì
Đợt 1
paywall_shown
Gặp hàng rào trả phítrigger, feature, from_screenHàng rào đặt đúng chỗ chưa
Đợt 1
package_viewed
Xem bảng góisourceMẫu số phễu mua
Đợt 2
checkout_started
Bắt đầu thanh toánplan, price_bucket, methodBước rơi nhiều nhất
Đợt 1
checkout_completed
Thanh toán xongplan, price_bucket, method, days_since_signupDoanh thu nối với hành vi
Đợt 2
checkout_failed
Thanh toán thất bạierror_code, methodCổng nào hay hỏng

H · Ma sát và lỗi

Sự kiệnBắn khi nàoTham số riêngTrả lời câu hỏi gì
Đợt 1
action_failed
Thao tác bị máy chủ từ chốiaction, error_code, screenBản đồ lỗi theo màn
Đợt 1
offline_blocked
Màn chặn vì mất mạng hiện lênscreen, engine, progress_pctBao nhiêu bài dở dang là do mạng. Hiện mất mạng giữa bài là mất luôn phần chưa gửi
Đợt 3
slow_screen
Màn mất hơn 3 giây mới dựng xongscreen, duration_msNối cảm nhận chậm với màn cụ thể

4 · Chỉ số và ngưỡng đề xuất

Tính năngChỉ số chínhNgưỡngGhi chú
Làm bài được giaoTỉ lệ lượt bắt đầu dẫn tới nộp85%Nửa sau của con số 49,9% bên giáo viên. Tỉ lệ này cao mà bên kia vẫn thấp nghĩa là học sinh không bao giờ bắt đầu, chứ không phải bỏ dở. Hai khả năng cần hai cách sửa khác nhau.
Mở bài sau khi được giaoPhần trăm bài được mở trong 48 giờ70%Chỉ số bản lề giữa hai sản phẩm
Làm tiếp bài dởTỉ lệ nhận lời mời làm tiếp và hoàn thành60%Hiện không có lưu nháp phía máy khách; mất mạng hoặc hết giờ phần là mất trắng
Vào lớp bằng mãTỉ lệ hoàn thành từ mở tới vào được lớp80%Đứt ở đây là mất học sinh ngay từ đầu
Xem lời giảiTỉ lệ lượt làm có mở ít nhất một lời giải câu sai40%Chỉ số phân biệt làm bài với học
Tự họcTỉ lệ học sinh có ít nhất một lượt tự chọn nội dung trong tháng35%Thứ giữ chân khi lớp nghỉ
Trò chơi hoáChênh lệch số giờ học giữa nhóm có nhận thưởng và nhóm khôngHơn 20%Nếu không chênh thì chín khu vực kia đang tiêu công sức mà không đổi được hành vi
Chống gian lậnTỉ lệ vi phạm bị ghi nhận nhưng học sinh vẫn nộp bình thườngDưới 5%Rời tab cũng bị tính là vi phạm, nên cần biết mức báo nhầm trước khi siết thêm

1 · Hiện trạng: đã cài sẵn công cụ, chưa gọi lần nào

Thông tinGiá trị
Tên trên App StoreTeacher Assistant AI · id6449689901
Mã góicom.flyer.partner
Kho mãgitea.flyer.vn/flyer/mobile-partner, nhánh dev. Đây là kho cần tìm; ba kho tên gần giống là mobile-student, mobile-study và mobile-ielts, đều là ứng dụng cho học sinh.
Nền tảngReact Native bản thuần, có thư mục ios và android riêng, không dùng Expo
Phiên bản hiện tại1.7.1, phát hành 03/09/2026 · yêu cầu iOS 15.1 trở lên · 4,5 sao trên 13 lượt đánh giá
Quy mô27 nhóm màn hình, khoảng 60 màn khai báo trong bộ điều hướng
Công cụ đã càiTrạng tháiGhi chú
Firebase Analytics
23.8.6
Cài rồi, không gọiCó trong danh sách phụ thuộc nhưng không một lời gọi logEvent nào trong toàn bộ mã nguồn.
Firebase CrashlyticsĐang chạyBắt sự cố. Không đo hành vi, và không nối được sự cố với việc người dùng đang làm gì.
Firebase MessagingĐang chạyHạ tầng thông báo đẩy đã có. Gửi được nhưng không đo được ai nhận, ai mở.
Firebase Remote ConfigĐang chạyBật tắt tính năng từ xa. Dùng được để chia nhóm thử nghiệm.
AppsFlyerĐã tắtCó tệp src/utils/appsFlyer.ts nhưng lời gọi logEvent bị chú thích.
Tin tốt so với hai bản web Ứng dụng đã có sẵn Firebase Analytics: không phải chọn công cụ, thêm thư viện hay xin ngân sách, chỉ cần viết một hàm bọc rồi gọi. Đây là bề mặt rẻ nhất để bắt đầu.

2 · Nguyên tắc: cùng tính năng thì cùng tên sự kiện

Đây là quyết định quan trọng nhất của cả tab này, và nếu làm sai thì sửa rất đắt về sau.

Không đặt tiền tố theo nền tảng

Đừng đặt app_assignment_created hay mobile_class_created. Giao bài trên điện thoại và trên máy tính là cùng một hành vi; tách tên ra thì không bao giờ cộng được tổng.

Dùng đúng tên như bản web, phân biệt bằng thuộc tính surface: web_teacher, app_teacher, web_exam. Khi đó so sánh điện thoại với máy tính chỉ là một phép cắt lớp.

teacher.flyer.ussurface = web_teacherỨng dụng giáo viênsurface = app_teacherexam.flyer.ussurface = web_examassignment_createdmột tên duy nhất cho cả ba nơiMột con số cộng đượcvà cắt lớp được theo bề mặt
Nguyên tắc quan trọng nhất của tab này: ba bề mặt gửi cùng một tên sự kiện, phân biệt bằng thuộc tính bề mặt. Nhờ vậy tổng số giáo viên đã giao bài chỉ cần một con số, còn so sánh điện thoại với máy tính chỉ là một phép cắt lớp.
Loại sự kiệnCách đặt tên
Tính năng có ở cả hai nơiGiao bài, tạo lớp, thêm học sinh, chấm AI, báo cáo, thông báo. Dùng lại nguyên tên của tab teacher.flyer.us. Bảng ở mục 3, nhóm C.
Chỉ có trên di độngVòng đời ứng dụng, thông báo đẩy, quyền thiết bị, liên kết sâu, sự cố. Đặt tên mới. Nhóm A, B, D, E.
Chỉ có trên webKhông cần làm gì. Thiếu vắng trên di động tự nó là một dữ kiện: nếu một tính năng chỉ có trên web mà giáo viên vẫn phải dùng hằng ngày, đó là lý do họ phải mở máy tính.

Thuộc tính chung dùng lại mục 4 của tab teacher.flyer.us, thay ba mục cho hợp di động: device tách thành device_model và os_version, app_version lấy từ bản dựng, thêm push_enabled.

3 · Bộ 30 sự kiện cho ứng dụng giáo viên

Đợt 1: 19 sự kiện · Đợt 2: 10 · Đợt 3: 1. Số ít hơn hai bản web vì phần lớn tính năng dùng lại tên đã định nghĩa ở đó.

A · Vòng đời ứng dụng

Nhóm chỉ có trên di động. Đây là phần web không bao giờ trả lời được, nên phải làm trước.

Sự kiệnBắn khi nàoTham số riêngTrả lời câu hỏi gì
Đợt 1
app_installed
Lần mở đầu tiên sau khi càiinstall_source, os_version, device_modelMẫu số của mọi phễu trên di động
Đợt 1
app_opened
Mỗi lần đưa ứng dụng ra trướcfrom (icon, notification, deeplink), seconds_since_last_openTần suất mở thật, thứ số lượt tải về không nói được
Đợt 2
app_backgrounded
Đưa ứng dụng ra sauscreen, session_secondsPhiên dài bao lâu và kết thúc ở màn nào
Đợt 1
app_updated
Mở lần đầu sau khi cập nhậtfrom_version, to_versionTốc độ người dùng lên bản mới, cần cho mọi so sánh trước sau
Đợt 2
app_version_outdated
Đang chạy bản cũ hơn bản khuyến nghịcurrent_version, min_supportedBao nhiêu người kẹt ở bản cũ

B · Thông báo đẩy

Kênh duy nhất bản web không có, và là lý do lớn nhất để giáo viên cài ứng dụng. Hạ tầng gửi đã sẵn, nhưng không đo được gì.

Sự kiệnBắn khi nàoTham số riêngTrả lời câu hỏi gì
Đợt 1
push_permission_requested
Hiện hộp xin quyền thông báotrigger_screen, days_since_installXin quyền đúng lúc hay quá sớm
Đợt 1
push_permission_result
Người dùng trả lờigranted, days_since_installTỉ lệ đồng ý nhận thông báo, trần của cả kênh này
Đợt 1
push_received
Thiết bị nhận được thông báonotification_type, in_foregroundMẫu số thật, tách khỏi số đã gửi ở máy chủ
Đợt 1
push_opened
Nhấn vào thông báonotification_type, hours_since_sent, destination_screenLoại thông báo nào đáng gửi, loại nào chỉ gây phiền
Đợt 2
push_disabled_detected
Phát hiện quyền thông báo đã bị tắtdays_since_grantedBao nhiêu người tắt sau khi từng đồng ý

C · Tính năng dùng chung với bản web

Đây là nhóm quan trọng nhất về mặt thiết kế. Xem ghi chú ngay dưới bảng trước khi đặt tên.

Sự kiệnBắn khi nàoTham số riêngTrả lời câu hỏi gì
Đợt 1
assignment_create_started
Mở luồng giao bàisource, entry_screenCùng tên với bản web, so sánh được trực tiếp
Đợt 1
assignment_created
Giao bài thành côngassignment_id, resource_type, audience_type, recipient_count_bucket, has_deadline, duration_msGiáo viên giao bài trên điện thoại nhanh hơn hay chậm hơn trên máy tính
Đợt 1
assignment_create_abandoned
Đóng luồng khi chưa xonglast_step, seconds_spentLuồng ba bước trên màn nhỏ rơi ở đâu
Đợt 1
class_created
Tạo lớp thành côngclass_id, level, duration_msBước kích hoạt thứ nhất
Đợt 1
student_created
Thêm học sinh thành côngmethod, count_addedBước kích hoạt thứ hai
Đợt 1
ai_grading_submitted
Gửi bài cho AI chấmskill, input_typeChấm bài trên điện thoại có khả thi không
Đợt 2
report_home_viewed
Mở màn báo cáointerface_versionBáo cáo trên màn nhỏ có ai đọc không
Đợt 2
class_detail_viewed
Mở chi tiết lớpclass_id, tabTab nào dùng được trên di động
Đợt 2
notification_opened
Mở một thông báo trong ứng dụngnotification_type, age_hoursSo với bản web để biết kênh nào hiệu quả hơn
Đợt 1
search_performed
Dùng tìm kiếm chungquery_length, results_count, zero_resultsTrên di động tìm kiếm thường thay cho điều hướng
Mười sự kiện ở nhóm C không phải sự kiện mới. Chúng đã định nghĩa ở tab teacher.flyer.us, liệt kê lại để đội làm ứng dụng biết phải gắn cái nào. Tên, tham số và ý nghĩa giữ nguyên tuyệt đối.

D · Chỉ có trên ứng dụng

Sự kiệnBắn khi nàoTham số riêngTrả lời câu hỏi gì
Đợt 1
onboarding_step_completed
Xong một bước trong luồng làm quenstep_name, step_index, duration_msỨng dụng có luồng làm quen riêng ba bước: thông tin, tạo lớp, mời học sinh
Đợt 1
onboarding_completed
Xong toàn bộ luồng làm quentotal_duration_ms, steps_skippedTỉ lệ đi hết
Đợt 2
role_selected
Chọn vai trò giáo viên hoặc phụ huynhroleỨng dụng phục vụ cả hai; cần biết tỉ lệ
Đợt 2
teacher_verify_submitted
Gửi hồ sơ xác minh giáo viênmethodBước chặn nhiều người ở cửa vào
Đợt 2
permission_requested
Xin quyền micrô, máy ảnh hoặc thư viện ảnhpermission, granted, trigger_screenQuyền nào bị từ chối nhiều nhất
Đợt 2
deeplink_opened
Mở từ một liên kết sâulink_type, destination_screen, is_cold_startLiên kết từ thư điện tử và Zalo có dẫn đúng chỗ không

E · Ma sát, lỗi và thiết bị

Sự kiệnBắn khi nàoTham số riêngTrả lời câu hỏi gì
Đợt 1
action_failed
Thao tác bị máy chủ từ chốiaction, error_code, screenBản đồ lỗi theo màn
Đợt 1
app_crashed
Ứng dụng thoát đột ngộtscreen, os_version, app_versionCrashlytics đã ghi, nhưng không nối được với hành vi; sự kiện này nối hai đầu
Đợt 1
offline_detected
Mất mạng khi đang thao tácscreen, pending_actionDi động mất mạng nhiều hơn web rất nhiều
Đợt 3
slow_screen
Màn mất hơn 3 giây mới dựng xongscreen, duration_msNối cảm nhận chậm với màn cụ thể

4 · Chỉ số và ngưỡng đề xuất

Câu hỏi lớn nhất chưa phải tính năng nào hiệu quả, mà là ứng dụng có đáng tồn tại song song với bản web không. Bốn chỉ số đầu trả lời câu đó.

Câu hỏiChỉ sốNgưỡngGhi chú
Có ai dùng khôngSố giáo viên mở ứng dụng ít nhất một lần trong 30 ngày, chia tổng giáo viên hoạt động25%13 lượt đánh giá trên App Store gợi ý quy mô còn rất nhỏ, nhưng lượt đánh giá không phải lượt dùng. Cần số thật trước khi kết luận.
Dùng thay hay dùng thêmTỉ lệ giáo viên dùng cả hai nền tảng trong cùng một tuầnChỉ để quan sátNếu gần như không ai dùng cả hai thì đây là hai nhóm người khác nhau, và ứng dụng cần lộ trình riêng chứ không phải bản thu nhỏ của web.
Làm được việc gìTỉ lệ bài giao được tạo từ ứng dụng15%Giao bài là việc chính. Nếu ứng dụng chỉ để xem mà không giao được thì đó là ứng dụng đọc báo cáo, nên đặt kỳ vọng khác.
Có giữ chân khôngTỉ lệ quay lại tuần thứ hai sau lần cài đặt40%Chỉ số sống còn của mọi ứng dụng di động
Thông báo đẩyTỉ lệ đồng ý nhận thông báo60%Trần của cả kênh. Dưới mức này thì lý do chính để cài ứng dụng biến mất.
Thông báo đẩyTỉ lệ thông báo được mở20%Dưới 10% nghĩa là đang gửi sai loại hoặc sai giờ
Ổn địnhTỉ lệ phiên không có sự cốTrên 99,5%Crashlytics đã có số này; việc cần làm là nối nó với màn hình cụ thể
Giao bài trên màn nhỏTỉ lệ hoàn thành luồng giao bài, so với bản webChênh dưới 15 điểmChênh nhiều hơn nghĩa là luồng ba bước không hợp màn nhỏ, đúng như bản PRD 2.0 đã nêu
Thứ tự đề xuất Ứng dụng nên làm trước hai bản web, dù nhỏ hơn: công cụ đã cài sẵn, số màn ít nên gắn nhanh, và nhóm A cùng nhóm B trả lời được câu hỏi đắt tiền nhất hiện nay là ứng dụng có đáng tồn tại không.

1 · Phễu dùng để làm gì

Hai mươi nghìn bài giao mỗi tháng nghe rất khả quan, cho tới khi biết một nửa không ai nộp. Phễu cho thấy người dùng rơi ở bước nào, thay vì chỉ đếm số người tới đích.

Đây là bản mô phỏng thứ đội sẽ đọc hằng tuần sau khi bộ sự kiện chạy.

Đọc con số trong tab này thế nào cho đúng Thanh tô đặc là số thật, truy vấn từ bản sao cơ sở dữ liệu ngày 20/09/2026 theo đúng khoảng thời gian đang chọn. Thanh nét đứt là bước chưa có sự kiện nên chưa đo được, con số bên cạnh là số mô phỏng chỉ để minh hoạ hình dáng phễu, không được trích ra khỏi tài liệu. Trong 23 bước của năm phễu, hiện mới có 7 bước là số thật.

2 · Phễu mẫu

Chọn khoảng thời gian rồi chọn tính năng. Những bước có số thật sẽ truy vấn lại theo đúng khoảng đã chọn; bốn ô cuối mỗi phễu là bốn cửa hiệu quả ở mục 2 của tab teacher.flyer.us.

Khoảng thời gian

3 · Cách đọc một phễu

Thành phầnÝ nghĩa và cách dùng
Chiều dài thanhSố người, hoặc số lượt, còn lại ở bước đó so với bước đầu tiên. Thanh ngắn dần là bình thường; điều đáng quan tâm là chỗ nó ngắn lại đột ngột.
Dòng rơi rụng giữa hai thanhSố người mất đi giữa hai bước liền kề, kèm tỉ lệ phần trăm. Bước rơi nhiều nhất được tô đậm, và đó chính là chỗ đáng sửa trước tiên.
Thanh nét đứtBước chưa có sự kiện nên chưa đo được. Trong bốn phễu đầu tiên, phần lớn khoảng giữa đều là nét đứt, và đó là lý do tài liệu này tồn tại.
Bốn ô cuối phễuBốn cửa hiệu quả. Một tính năng chỉ được coi là đủ hiệu quả khi cả bốn ô đều đạt; đỏ một ô là đủ để tính năng đó cần được bàn trong cuộc họp tuần.
Bộ lọc thời gianBốn mốc 7 ngày, 30 ngày, 90 ngày và 12 tháng. Cửa sổ càng ngắn thì tỉ lệ hoàn thành càng thấp một cách giả tạo, vì bài vừa giao chưa tới hạn nộp. Đọc tỉ lệ đã ổn định thì chọn 90 ngày trở lên; xem tình hình tuần này thì chọn 7 ngày.
Dải kết luậnMột câu duy nhất nói rõ nên làm gì tiếp theo. Nếu không viết được câu này thì phễu chưa có tác dụng, dù hình vẽ có đẹp tới đâu.
Một phễu chỉ trả lời được câu hỏi của chính nó Phễu giao bài phía giáo viên và phễu làm bài phía học sinh là hai phễu riêng, dù nối nhau. Gộp lại sẽ che mất chỗ nối, mà chỗ nối chính là nơi một nửa số bài giao biến mất.

4 · Dựng thật mất bao lâu

ViệcThời gianGhi chú
Phễu đầu tiênMột tuần sau khi đợt 1 chạyChỉ cần ba sự kiện là dựng được phễu giao bài: mở luồng, tạo xong, và bài được nộp. Không cần chờ đủ 162 sự kiện.
Đủ bốn phễu chínhBốn tuầnKích hoạt người mới, giao bài, làm bài, và chấm bài bằng AI. Bốn phễu này phủ phần lớn giá trị sản phẩm.
So sánh theo nhómTám tuầnCắt phễu theo quy mô trường, theo mục tiêu người dùng đã chọn, hoặc theo bề mặt. Cần đủ hai tháng dữ liệu thì các nhóm nhỏ mới đủ mẫu.
Phễu tự cập nhậtCùng lúc với thẻ điểmDựng trên cùng tác vụ định giờ đã mô tả ở tab Nghiệm thu, nên không phát sinh thêm công vận hành.
Hiện trạng đo lường của ba sản phẩm, tính tới ngày 19 tháng 9 năm 2026teacher.flyer.usMột sự kiệnToàn bộ ứng dụng chỉ phát một lượtxem trang được ghi nhận tự động.exam.flyer.usSáu công cụ, không sự kiệnSáu công cụ đo cùng chạy nhưng khôngcông cụ nào nhận được sự kiện học tập.Ứng dụng giáo viênĐã cài, chưa gọiThư viện đo lường đã có sẵn trong mãnguồn nhưng chưa được gọi lần nào.Bốn bước được đề xuất, tương ứng với bốn tab của tài liệu này1Cài đặt 162 sự kiệnChia làm ba đợt, cho cả basản phẩm.2Dựng ba bảng số liệuĐọc theo ba nhịp cố định:hằng ngày, tuần và quý.3Đo hiệu quả qua bốn cửaCó ai dùng, dùng có xong,có quay lại, có ra kết quả.4Kết luận theo bốn mứcĐạt, đúng hướng, đứng yên,hoặc đi lùi.Mọi kết luận chưa đạt đều quay lại thành một vòng cải tiến kéo dài sáu tuần.Đích đến duy nhất được cam kếtTỉ lệ bài giao được học sinh nộp, tăng từ49,9%lên65%trong hai quý.Hiện tại có 16,8% số bài giao ra không một học sinh nào nộp, nên đây là khoản lãng phí lớn nhất mà bộ sự kiện cần chỉ ra.
Hình tóm tắt toàn bộ tài liệu, dùng khi trình bày. Hàng trên là hiện trạng ba sản phẩm, đọc trực tiếp từ mã nguồn ngày 19/09/2026. Hàng giữa là bốn bước đề xuất. Dải cuối là đích đến duy nhất đáng cam kết, vì đây là chỉ số đã có số liệu nền thật.
Tab này dùng khi nào Tab Bộ sự kiện trả lời câu hỏi đo cái gì và cài ra sao. Tab này trả lời câu hỏi tiếp theo: sau khi sự kiện đã chảy về thì đọc ở đâu, dựa vào đâu để kết luận một tính năng đã đủ hiệu quả, và làm gì khi câu trả lời là chưa.

1 · Vận hành: ba bảng, ba nhịp

Cài xong sự kiện mới là nửa việc. Nửa còn lại là một guồng đọc số cố định; thiếu nó thì dữ liệu vẫn chảy về đều đặn và không ai mở ra xem.

1.1 · Bốn tuần đầu chưa đọc kết luận nào

Giai đoạn hiệu chuẩn: đối chiếu sự kiện với cơ sở dữ liệu, số assignment_created phải khớp số dòng thêm vào assign_tests, lệch dưới 5%. Lệch hơn là cài sai. Thêm lý do thời gian: chỉ số dùng lại cần hai tuần dữ liệu, nhóm theo tháng cần tám tuần.

1.2 · Ba bảng, không hơn

BảngAi đọcNội dung và cách dùng
Sức khoẻ sự kiệnKỹ sưChạy tự động hằng ngày, không ai phải mở. Chỉ cảnh báo khi một sự kiện ngừng bắn quá 24 giờ, lệch quá 5% so với cơ sở dữ liệu, hoặc thiếu tham số bắt buộc vượt 1%. Bảng này bảo vệ độ tin cậy của hai bảng kia.
Thẻ điểm tính năngSản phẩm15 dòng tính năng × 4 cửa ở mục 2 của tab Bộ sự kiện, ô dưới ngưỡng tô đỏ. Đây là bảng duy nhất trong cuộc họp tuần; phải mở bảng thứ hai để hiểu bảng thứ nhất là thẻ điểm thiết kế sai.
PhễuSản phẩm, khi cầnBốn luồng: kích hoạt người mới, giao bài, chấm bài AI, học phí. Chỉ mở khi thẻ điểm báo đỏ, để tìm bước nào làm rơi người dùng. Không đọc định kỳ.

1.3 · Ba nhịp

NhịpAiXem gìRa quyết định gì
Hằng ngày
Tự động
Không ai, trừ khi có cảnh báoSức khoẻ sự kiệnSửa lỗi đo trong ngày. Sự kiện hỏng quá 48 giờ là mất dữ liệu không lấy lại được.
Hằng tuần
30 phút
Một người sản phẩm, một kỹ sưThẻ điểmTuần này sửa gì. Chỉ bàn những ô vừa đổi màu, không đọc lại toàn bảng.
Hằng quý
90 phút
Cả đội sản phẩmThẻ điểm đầy đủ và xu hướng 12 tuầnGiữ, thu hẹp hay gỡ từng tính năng. Đây là cuộc họp duy nhất được phép kết luận về số phận một tính năng.

1.4 · Dựng ở đâu

Không cần dự án mới. data.flyer.vn đã có sẵn đường ray: tác vụ định giờ, trang tĩnh, cổng đăng nhập. Bảng sức khoẻ và thẻ điểm đi theo khuôn đó. Riêng phễu và chỉ số dùng lại theo nhóm cần công cụ phân tích sản phẩm, xem mục 9.

Mỗi chỉ số phải có tên một người Chỉ số không có người chịu trách nhiệm đọc thì xoá khỏi thẻ điểm. Bảng 15 dòng mà 6 dòng không ai nhìn sẽ kéo cả bảng thành đồ trang trí.

2 · Tự động hoá

Guồng ở mục 1 chỉ chạy được nếu số tự tìm tới người. Năm luồng dưới đây thay toàn bộ thao tác tay, và đều dựng được trên hạ tầng sẵn có của data.flyer.vn.

teacher.flyer.usexam.flyer.usỨng dụng giáo viêntrackAction()một hàm duy nhấtNơi nhận sự kiệnSức khoẻ sự kiệnmỗi ngàyThẻ điểmmỗi tuầnPhễukhi cầnCảnh báoSlack, trong ngàyHọp tuần30 phútHọp quý90 phút Quyết định quay lại thành thay đổi trong sản phẩm
Từ ba sản phẩm tới quyết định: một hàm gửi, một nơi nhận, ba bảng, ba nhịp đọc. Mũi tên đứt phía dưới là phần hay bị bỏ quên, vì quyết định phải quay lại thành thay đổi trong sản phẩm.
#LuồngChạy khi nàoLàm gì, và gửi cho ai
1Canh sức khoẻ sự kiệnMỗi ngày, 6 giờĐối chiếu sự kiện hôm qua với số dòng trong cơ sở dữ liệu. Lệch quá 5%, sự kiện đứng im quá 24 giờ, hoặc thiếu tham số bắt buộc vượt 1% thì cảnh báo vào Slack. Im lặng khi bình thường, đó là điều kiện để cảnh báo còn được đọc.
2Dựng thẻ điểmMỗi tuần, sáng thứ HaiSinh lại trang thẻ điểm tĩnh, tính đủ bốn cửa cho 15 tính năng, đánh dấu ô vừa đổi màu so với tuần trước. Gửi vào Slack một ảnh kèm đúng một dòng: số ô chuyển xấu và số ô chuyển tốt.
3Báo vượt ngưỡngCùng lúc với luồng 2Khi một chỉ số vượt lên hoặc tụt xuống khỏi ngưỡng đã khai trong phiếu nghiệm thu, nhắn riêng người ký của tính năng đó. Cảnh báo gửi cho tất cả là cảnh báo không của ai.
4Nhắc tới hạn nghiệm thuMỗi ngàyPhiếu nghiệm thu đã khai sẵn ngày. Trước bảy ngày nhắc người ký chuẩn bị; đúng ngày mở sẵn một mục trong chương trình họp quý kèm số liệu. Thiếu luồng này thì ngày nghiệm thu trôi qua mà không ai nhớ.
5Ghi sổ quyết địnhSau mỗi cuộc họp tuần và họp quýMột biểu mẫu bảy ô, nộp xong tự thêm một dòng vào sổ và đóng mục nhắc tương ứng. Bắt buộc với cả kết luận là bỏ.
Ba quy tắc giữ cho cảnh báo không bị vô hiệu hoá
  1. Im lặng là mặc định. Luồng gửi tin mỗi ngày kể cả khi bình thường sẽ bị tắt tiếng trong hai tuần, kéo theo cả cảnh báo thật.
  2. Mỗi cảnh báo có một người nhận có tên. Gửi vào kênh chung thì ai cũng nghĩ người khác xử lý.
  3. Mỗi cảnh báo kèm một việc cụ thể. "Tỉ lệ nộp giảm 4 điểm" là thông tin; "Tỉ lệ nộp giảm 4 điểm, xem phễu giao bài tuần này" mới là cảnh báo.

2.1 · Những gì không nên tự động

ViệcVì sao giữ cho người làm
Kết luận đạt hay chưa đạtMáy tính được con số, không đọc được bối cảnh. Một tính năng tụt vì đang nghỉ hè khác hẳn một tính năng tụt vì vừa đổi giao diện.
Gỡ một tính năngLuôn là quyết định của người, trong cuộc họp quý, có ghi sổ.
Đổi ngưỡngNgưỡng tự động điều chỉnh theo số thực tế là ngưỡng luôn đạt, tức là vô dụng.
Gửi tin cho phụ huynh hoặc học sinhThuộc phạm vi sản phẩm, không thuộc phạm vi đo lường. Xem mục nhắc tự động trong PRD Giao bài tập 2.0.

3 · Nghiệm thu hiệu quả

Nghiệm thu là lúc kết luận một tính năng đã đủ hiệu quả hay chưa. Muốn kết luận có nghĩa thì phải khai tiêu chí trước khi phát hành, không phải nhìn số rồi mới đặt ngưỡng.

3.1 · Phiếu nghiệm thu, khai trước khi phát hành

Mỗi tính năng khi đưa vào sprint phải kèm một phiếu bảy dòng. Phiếu này dán vào chính tài liệu yêu cầu của tính năng đó.

DòngNội dungVí dụ: Nhắc nộp bài
Chỉ số chínhĐúng một, không được haiTỉ lệ bài giao được nộp
Mốc xuất phátĐo trước khi phát hành, ghi rõ ngày49,9% · 19/09/2026
Ngưỡng đạtCon số cụ thể, không phải "tăng"57% sau một quý
Ngày nghiệm thuChốt trước, ghi vào lịch20/12/2026
Chỉ số bảo vệThứ không được phép xấu đi khi chỉ số chính đẹp lênSố lời nhắc mỗi học sinh mỗi tuần không quá 2; tỉ lệ phụ huynh tắt thông báo không tăng
Cách so sánh.">Nhóm đối chứng, hoặc trước và sau, hoặc theo đợt mở dầnMở dần theo trường: 20% trường trong 3 tuần đầu
Người kýMột tên cụ thểQuản lý sản phẩm của khu vực

3.2 · Bốn kết luận, không phải hai

Chỉ số bảo vệ có vượt trần không?CóKhôngĐã vượt ngưỡng và giữ qua hai kỳ đo?CóKhôngCó cải thiện đều qua ba kỳ đo?CóĐi lùiTắt tính năng trong một tuầnĐạtChốt, chuyển sang duy trìChưa đạt nhưng đúng hướngGia hạn đúng một quý, giữ nguyên ngưỡngKhôngĐứng yênChạy trình tự bốn bước loại trừ ở mục 3.4
Trình tự kết luận: đọc từ trên xuống, dừng ở câu trả lời “Có” đầu tiên. Chỉ số bảo vệ đặt ở nhánh trên cùng có chủ ý, vì nó vượt trần thì tắt tính năng bất kể chỉ số chính đẹp tới đâu.

Đạt hay không đạt là cách chia quá thô, dễ dẫn tới bỏ sớm một thứ đang đi đúng hướng. Dùng bốn mức:

Kết luậnDấu hiệuLàm gì tiếp
ĐạtVượt ngưỡng và giữ được qua hai kỳ đo liên tiếp, chỉ số bảo vệ không xấu điChốt, chuyển sang duy trì. Đưa xuống nhóm chỉ theo dõi hằng quý.
Chưa đạt nhưng đúng hướngChưa tới ngưỡng nhưng cải thiện đều qua ba kỳ đoGia hạn đúng một quý, giữ nguyên ngưỡng. Không được hạ ngưỡng cho vừa số hiện có.
Đứng yênDao động quanh mốc xuất phát, không có xu hướngGiả thuyết sai. Dừng cải tiến theo hướng cũ, quay lại mục 3.4 để tìm nguyên nhân khác.
Đi lùiChỉ số chính xấu đi, hoặc chỉ số bảo vệ vượt trầnTắt tính năng trong vòng một tuần. Chỉ số bảo vệ vượt trần là lý do tắt ngay, kể cả khi chỉ số chính đang đẹp.

3.3 · Ba cái bẫy khi đọc kết quả

BẫyBiểu hiện ở FLYER và cách tránh
Mẫu quá nhỏChỉ khoảng 640 giáo viên hoạt động mỗi tháng. Chia đôi thì mỗi nhánh hơn 300 người, đủ bắt chênh lệch lớn nhưng không đủ cho chênh lệch dưới 5 điểm phần trăm. Với thay đổi nhỏ, dùng so sánh trước sau trên toàn bộ người dùng và kéo dài cửa sổ đo, đừng cố chia nhóm.
Tính thời vụ theo năm họcTháng 6 tới tháng 8 nghỉ hè, tháng 9 vào năm học, tháng 12 và tháng 1 thi và nghỉ Tết. So tháng 9 với tháng 7 luôn cho kết quả đẹp mà không liên quan tới tính năng. Luôn so cùng kỳ năm trước, hoặc so hai nhóm trong cùng một khoảng thời gian.
Đổi nhiều thứ cùng lúcPhát hành gộp năm thay đổi trong một tuần thì không quy được kết quả cho thay đổi nào. Nếu buộc phải gộp, chấp nhận rằng kết luận chỉ ở mức cả gói, và ghi rõ như vậy trong phiếu nghiệm thu.

3.4 · Khi kết luận là "đứng yên"

Trường hợp hay gặp nhất và hay bị xử lý sai nhất, vì phản xạ tự nhiên là làm thêm tính năng. Trình tự đúng là loại trừ từ ngoài vào trong, dừng ở chỗ đầu tiên hỏng:

BướcCâu hỏiNếu hỏng ở đây thì sửa gì
1Người dùng có nhìn thấy tính năng không?Vấn đề ở lối vào và khả năng phát hiện, không phải ở bản thân tính năng. Sửa vị trí, sửa điều hướng, dùng trang Có gì mới.
2Nhìn thấy rồi có mở không?Vấn đề ở cách diễn đạt. Người dùng không hiểu tính năng giải quyết việc gì. Sửa chữ, không sửa mã.
3Mở rồi có đi hết luồng không?Vấn đề ở ma sát trong luồng. Xem phễu để tìm bước rơi. Đây mới là lúc sửa giao diện.
4Đi hết rồi có quay lại không?Vấn đề ở giá trị thật. Tính năng chạy được nhưng không đủ hữu ích. Đây là lúc phải xem lại giả thuyết gốc, và có thể là lúc gỡ.

Bốn bước này ánh xạ thẳng vào bốn cửa ở mục 2 của tab Bộ sự kiện, nên thẻ điểm đã chứa sẵn câu trả lời cho ba bước đầu.

4 · Vòng cải tiến

Nghiệm thu trả lời câu hỏi đã đủ hiệu quả chưa. Vòng cải tiến là thứ chạy khi câu trả lời là chưa.

4.1 · Một vòng sáu tuần

Tuần 1Đặt giả thuyếtmột câu, có vế “vì”Tuần 2–3Làm thay đổi nhỏkèm sự kiện đoTuần 4–5Đokhông sửa gì thêmTuần 6Quyếtmột trong bốn kết luận Ghi vào sổ quyết định
Sáu tuần một vòng: đủ dài để 640 giáo viên hoạt động tạo khác biệt đọc được, đủ ngắn để mỗi khu vực chạy hai vòng một quý. Hai tuần đo ở giữa là phần kỷ luật nhất, mỗi lần sửa thêm là đặt lại đồng hồ.
Giai đoạnViệc phải xong
Tuần 1 · Giả thuyếtViết đúng một câu theo khuôn: Nếu chúng ta [thay đổi gì], thì [chỉ số nào] sẽ [tăng hay giảm bao nhiêu], vì [lý do dựa trên bằng chứng nào]. Không có vế "vì" dựa trên dữ liệu thì chưa phải giả thuyết, mới là ý tưởng.
Tuần 2–3 · LàmThay đổi nhỏ nhất đủ để kiểm giả thuyết. Kèm sự kiện đo ngay trong cùng lần phát hành, không để lại sau.
Tuần 4–5 · ĐoKhông sửa gì thêm trong khu vực đó. Đây là kỷ luật khó giữ nhất: mỗi lần sửa thêm là đặt lại đồng hồ đo từ đầu.
Tuần 6 · QuyếtMột trong bốn kết luận ở mục 3.2. Ghi vào sổ quyết định kể cả khi kết luận là bỏ.

Sáu tuần chọn theo quy mô FLYER: đủ dài để 640 giáo viên hoạt động tạo khác biệt đọc được, đủ ngắn để mỗi khu vực chạy hai vòng một quý.

4.2 · Chỉ số bảo vệ, thứ hay bị quên

Mọi thay đổi đều đánh đổi. Chỉ số bảo vệ là con số không được phép xấu đi trong lúc chỉ số chính đẹp lên, và phải khai từ đầu chứ không phải phát hiện sau khi khách phàn nàn.

Thay đổiChỉ số chínhChỉ số bảo vệ bắt buộc
Nhắc nộp bài tự độngTỉ lệ bài giao được nộpSố lời nhắc mỗi học sinh mỗi tuần; tỉ lệ tắt nhận thông báo; số khiếu nại từ phụ huynh
Rút gọn luồng giao bàiTỉ lệ hoàn thành luồngTỉ lệ bài giao bị sửa hoặc xoá trong 24 giờ đầu, tức là dấu hiệu tạo nhầm vì đi quá nhanh
Tự động gợi ý đềThời gian từ mở tới giao xongĐộ đa dạng nội dung được giao; tỉ lệ nộp của bài giao theo gợi ý so với bài tự chọn
Mở rộng chấm bài bằng AISố lượt chấmTỉ lệ kết quả bị giáo viên sửa điểm; chi phí mỗi lượt chấm
Thêm màn hình hoặc mục menu mớiTỉ lệ tiếp cận màn mớiTỉ lệ tiếp cận của các màn cũ cùng khu vực, để biết là thu hút thêm người hay chỉ chia lại lượng cũ

4.3 · Chọn cách so sánh

Loại thay đổiCách đoLý do
Sửa chữ, đổi vị trí, sửa lỗiTrước và sau, toàn bộ người dùngTác động thường lớn và nhanh, không đáng chia nhóm.
Tính năng hoàn toàn mớiĐường cong tiếp cận theo tuần kể từ ngày phát hànhKhông có mốc trước để so. Điều cần biết là tốc độ lan, không phải mức tuyệt đối.
Thay đổi rủi ro, có gửi ra ngoàiMở dần theo trường: 10%, 30%, toàn bộGiới hạn thiệt hại nếu sai, và cho một nhóm đối chứng tự nhiên. Phù hợp với cấu trúc nhiều trường của FLYER hơn là chia ngẫu nhiên từng người.
Thay đổi lớn về luồngHai bản chạy song song sau một cờ bật tắt, tối thiểu ba tuầnNgười dùng cũ cần thời gian thích nghi; đo quá sớm sẽ thấy số xấu đi do thói quen chứ không do thiết kế.

4.4 · Sổ quyết định

Một trang duy nhất, mỗi vòng cải tiến một dòng: ngày, giả thuyết, thay đổi đã làm, số trước, số sau, kết luận, việc tiếp theo. Ghi cả những vòng thất bại.

Giá trị lộ ra sau khoảng sáu tháng: sổ chặn việc tranh luận lại một ý tưởng đã thử và đã hỏng, và cho người mới hiểu vì sao sản phẩm đang như hiện nay. Đặt cạnh thẻ điểm.

4.5 · Ví dụ đầy đủ một vòng

Khu vực Giao bài tập · Xuất phát tỉ lệ nộp 49,9% ngày 19/09/2026

Giả thuyết Nếu màn theo dõi đưa bài chưa ai mở sau 48 giờ lên đầu kèm nút nhắc một chạm, thì tỉ lệ nộp tăng ít nhất 5 điểm phần trăm trong một quý, vì hiện có 16,8% bài giao không ai nộp mà giáo viên không biết.

Chỉ số chính Tỉ lệ bài giao được nộp · Ngưỡng 55% · Ngày nghiệm thu sau 12 tuần

Chỉ số bảo vệ Không quá 2 lời nhắc mỗi học sinh mỗi tuần; tỉ lệ tắt thông báo của phụ huynh không tăng quá 1 điểm phần trăm

Cách so sánh Mở dần theo trường, 20% trong ba tuần đầu, so với nhóm chưa mở trong cùng khoảng thời gian

Kết luận có thể xảy ra Vượt 55% và chỉ số bảo vệ sạch thì mở toàn bộ. Tăng nhưng chưa tới ngưỡng thì gia hạn một quý. Đứng yên thì chạy trình tự bốn bước ở mục 3.4. Tỉ lệ tắt thông báo vượt trần thì tắt tính năng ngay, bất kể tỉ lệ nộp.