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.
Bản đề xuất — để thảo luận, chưa phải quyết địnhTà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.
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ài | Trạng thái | Ghi chú |
|---|---|---|
| Google Tag Manager GTM-WNL6H6VM | Chỉ pageview | Gắ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ỉ pageview | Cũ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 RUM | Chỉ bản thật | Bả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 Pixel | Chỉ PageView | Gắn cứng trong _document.tsx. Không có sự kiện chuyển đổi nào. |
| Sentry | Đang chạy | Chỉ bắt lỗi, không đo hành vi. Tỉ lệ lấy mẫu vết bằng 0. |
| Firebase | Không dùng để đo | Chỉ 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. |
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.
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ửa | Câu hỏi | Chỉ số |
|---|---|---|
| 1 · Có ai biết không | Bao 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ông | Trong 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ông | Dù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ông | Giá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 |
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ắc | Nộ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ốc | Mọ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ân | Khô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ảng | Sĩ 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êng | Ngoà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ại | Cù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. |
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.
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_id | Phiê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_bucket | currentSchool | Tá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. |
role | isAdminSchool | Chủ 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_goal | TeacherOnboardingKey.ONBOARDING_GOAL | Mụ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_signup | Ngà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_bucket | Sĩ số trường | Khoả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_on | teacherFeatureConfigs | Danh 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_trial | Gói đang dùng | Nối hành vi với doanh thu. |
surface | Host hiện tại | flyer, teado, teado_lite, white_label. Cùng một mã nguồn phục vụ nhiều thương hiệu. |
device, viewport_bucket | Trình duyệt | Bả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_version | Next.js, biến môi trường | Phâ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. |
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.
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ện | Bắn khi nào | Tham số riêng | Trả 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 động | entry_path, referrer_type | Số 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_hash | Màn nào được xem, màn nào không ai vào |
| Đợt 1 login_succeeded | Đăng nhập thành công | method (password, google, otp) | Cách đăng nhập nào đang được dùng |
| Đợt 2 login_failed | Đăng nhập thất bại | method, error_code | Ma sát ở cửa vào |
| Đợt 2 school_switched | Đổi trường ở cổng chọn trường | from_school_id, to_school_id | Tần suất người nhiều trường phải đổi qua lạ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ện | Bắn khi nào | Tham số riêng | Trả lời câu hỏi gì |
|---|---|---|---|
| Đợt 1 signup_completed | Tạo xong tài khoản giáo viên | method, how_do_you_know_us | Mẫ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ý | goal | Ngườ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_ms | Bướ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_skipped | Tỉ lệ đi hết luồng |
| Đợt 2 quick_start_opened | Mở màn Bắt đầu nhanh | source, items_total, items_done | Danh 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 nhanh | item_key, goal | Việ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 nhanh | item_key, goal, days_since_signup | Tiế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ộp | days_since_signup, path_taken | Chỉ số bắc đẩu của toàn đội. Xem mục 6 |
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ện | Bắn khi nào | Tham số riêng | Trả lời câu hỏi gì |
|---|---|---|---|
| Đợt 1 assignment_create_started | Mở ngăn kéo giao bài | source, entry_screen | Mẫu số của phễu giao bài |
| Đợt 2 assignment_resource_searched | Tìm đề trong bước 1 | query_length, filters_used, results_count | Ngườ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ài | resource_type, level, skill, item_count, is_external | Loạ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 2 | audience_type (class, student), class_count, student_count_bucket | Giao 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 3 | has_deadline, deadline_days_ahead, exam_mode, hide_answers, allow_late | Tuỳ 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ông | assignment_id, resource_type, audience_type, recipient_count_bucket, has_deadline, duration_ms, step_backs | Thà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ạo | error_code, step | Bao 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 xong | last_step, seconds_spent, had_resource, had_audience | Bướ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 đã giao | count_visible, filter_state | Ngườ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ách | filter_type, value | Bộ lọc nào đáng giữ trong bản 2.0 |
| Đợt 1 assignment_detail_viewed | Mở chi tiết một bài giao | assignment_id, days_since_assigned, submitted_ratio_bucket | Giáo viên có kiểm tra kết quả không |
| Đợt 2 assignment_edited | Sửa bài giao đã tạo | assignment_id, fields_changed | Trường nào hay bị sửa, tức là đặt sai từ đầu |
| Đợt 2 assignment_deleted | Xoá bài giao | assignment_id, age_hours, had_submissions | Xoá 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ụ huynh | assignment_id, target (student, parent), is_bulk, recipient_count_bucket | Cô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 sinh | assignment_id | Tầ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ỏi | assignment_id | Tí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 giao | format, row_count | Nhu cầu mang số liệu ra ngoài |
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ện | Bắn khi nào | Tham số riêng | Trả lời câu hỏi gì |
|---|---|---|---|
| Đợt 2 class_create_started | Mở biểu mẫu tạo lớp | source | Mẫu số phễu tạo lớp |
| Đợt 1 class_created | Tạo lớp thành công | class_id, level, has_schedule, duration_ms | Bước kích hoạt thứ nhất |
| Đợt 2 student_create_started | Mở biểu mẫu thêm học sinh | source, 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ông | method, count_added, class_id | Bước kích hoạt thứ hai |
| Đợt 2 student_invited | Gửi lời mời cho học sinh hoặc phụ huynh | channel, count | Kênh mời nào hiệu quả |
| Đợt 2 student_bulk_imported | Nhập danh sách hàng loạt | row_count, error_count | Nhập hàng loạt có chạy trơn không |
| Đợt 2 class_detail_viewed | Mở chi tiết lớp | class_id, tab | Tab 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 sinh | source, days_since_last_view | Giáo viên có theo dõi từng học sinh không |
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ện | Bắn khi nào | Tham số riêng | Trả lời câu hỏi gì |
|---|---|---|---|
| Đợt 1 attendance_tab_opened | Mở tab Điểm danh trong lớp | class_id, source | Tỉ lệ tiếp cận |
| Đợt 1 attendance_session_started | Bắt đầu đánh dấu một buổi | class_id, roster_size_bucket | Mẫu số của tỉ lệ hoàn thành |
| Đợt 1 attendance_saved | Lưu buổi điểm danh | class_id, marked_count, used_mark_all, duration_ms | Hoà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ánh | range_days, classes_shown | Chủ 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áo | student_id, rate_bucket | Báo cáo có dẫn tới hành động không |
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ện | Bắn khi nào | Tham số riêng | Trả lời câu hỏi gì |
|---|---|---|---|
| Đợt 1 ai_grading_opened | Mở công cụ chấm AI | skill (writing, speaking), source | Tỉ lệ tiếp cận |
| Đợt 1 ai_grading_submitted | Gửi bài cho AI chấm | skill, input_type, word_count_bucket | Số lượt dùng thật |
| Đợt 1 ai_grading_result_viewed | Xem kết quả chấm | skill, seconds_to_result, score_band | Thờ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 AI | skill, score_delta, comment_changed | Chỉ 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_waited | Tỉ 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ượt | skill, credits_left | Hàng rào tính phí đang chặn bao nhiêu người |
| Đợt 2 manual_grading_started | Mở màn chấm tay | skill, assignment_id | So sánh chấm tay với chấm AI |
| Đợt 2 manual_grading_saved | Lưu điểm chấm tay | skill, duration_ms | Chấm tay mất bao lâu, để tính thời gian AI tiết kiệm được |
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ện | Bắn khi nào | Tham số riêng | Trả lời câu hỏi gì |
|---|---|---|---|
| Đợt 1 explore_searched | Tìm trong kho đề | query_length, filters_used, results_count, zero_results | Tì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, value | Bộ lọc nào đáng giữ |
| Đợt 2 explore_test_previewed | Xem trước một đề | test_id, level, source | Xem 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ôi | item_type, question_count, used_ai | Giáo viên có tự soạn không |
| Đợt 2 program_opened | Mở một chương trình học | program_id, source | Tỉ lệ tiếp cận |
| Đợt 2 program_created | Tạo chương trình mới | program_id, unit_count, used_ai | Có 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ình | program_id, weeks, class_count | Giao theo lịch có được dùng không |
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ện | Bắn khi nào | Tham số riêng | Trả lời câu hỏi gì |
|---|---|---|---|
| Đợt 1 report_home_viewed | Mở trang Báo cáo | interface_version | Tỉ lệ tiếp cận |
| Đợt 2 report_drilldown_viewed | Mở một báo cáo con | report_key | Trong 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 gian | report_key, range_days | Khoảng mặc định có đúng không |
| Đợt 2 report_exported | Xuất báo cáo | report_key, format, row_count | Nhu 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, action | Chỉ 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ày | channel, recipient_count | Vòng lặp nhắc nhở có được dùng không |
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ện | Bắn khi nào | Tham số riêng | Trả lời câu hỏi gì |
|---|---|---|---|
| Đợt 2 exam_create_started | Mở luồng tạo kỳ thi | source | Mẫu số |
| Đợt 2 exam_created | Tạo kỳ thi thành công | exam_id, student_count_bucket, duration_ms | Hoàn thành |
| Đợt 2 exam_published | Phát hành kỳ thi cho học sinh | exam_id | Tạo xong có dùng thật không |
| Đợt 3 exam_monitor_opened | Mở màn giám sát | exam_id, active_students | Giám sát có ai dùng không |
| Đợt 3 exam_report_viewed | Xem báo cáo kỳ thi | exam_id | Vòng đời khép kín hay dừng giữa chừng |
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ện | Bắn khi nào | Tham số riêng | Trả lời câu hỏi gì |
|---|---|---|---|
| Đợt 2 tuition_setup_started | Bắt đầu thiết lập học phí | source | Mẫu số |
| Đợt 2 tuition_bank_linked | Liên kết xong tài khoản ngân hàng | method | Bước khó nhất của luồng |
| Đợt 2 tuition_invoice_created | Tạo phiếu thu | amount_bucket, student_count | Có dùng thật không |
| Đợt 2 tuition_payment_received | Ghi nhận một khoản đã thu | amount_bucket, method, days_to_pay | Vòng đời khép kín |
Tính năng mới nhất, chưa có số liệu nền nào.
| Sự kiện | Bắn khi nào | Tham số riêng | Trả lời câu hỏi gì |
|---|---|---|---|
| Đợt 2 coteacher_opened | Mở Bingo AI Co-Teacher | tab, source | Tỉ lệ tiếp cận |
| Đợt 2 coteacher_suggestion_viewed | Xem một đề xuất | student_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ất | student_id, suggestion_type | Chỉ 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ện | topic_guess, message_length_bucket | Người dùng hỏi gì nhiều nhất |
Đ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ện | Bắn khi nào | Tham số riêng | Trả lời câu hỏi gì |
|---|---|---|---|
| Đợt 1 feature_intro_shown | Hiện màn giới thiệu tính năng | feature_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 tour | feature_key, slide_index | Bỏ ở slide nào |
| Đợt 1 tour_completed | Đi hết tour hướng dẫn | feature_key, steps_total, duration_ms | Tour có được xem hết không |
| Đợt 2 whats_new_opened | Mở trang Có gì mới | source, unseen_count | Kê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áo | notification_type, age_hours | Loại thông báo nào được mở, loại nào bị bỏ |
Nhóm rẻ nhất để cài và thường cho phát hiện lớn nhất.
| Sự kiện | Bắn khi nào | Tham số riêng | Trả 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ối | action, error_code, screen | Bả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ỗng | screen, 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ượt | trigger, feature | Hà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 xong | screen, duration_ms | Nối cảm nhận chậm với màn cụ thể |
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.
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ăng | Chỉ số chính | Hôm nay | Ngưỡng đề xuất | Đo bằng |
|---|---|---|---|---|
| Giao bài tập | Tỉ lệ bài giao được nộp, tính trên các bài giao đã quá 30 ngày | 49,9% 126.798 trên 254.222 lượt | 65% | Có ngay từ cơ sở dữ liệu |
| Giao bài tập | Tỉ lệ hoàn thành luồng tạo bài: tạo xong trên số lần mở ngăn kéo | Chưa biết | 80% | assignment_create_started → assignment_created |
| Giao bài tập | Mức độ tập trung: phần trăm bài giao đến từ 10% giáo viên tích cực nhất | 54,2% | Dưới 40% | Có ngay từ cơ sở dữ liệu |
| Nhắc nộp bài | Chênh lệch tỉ lệ nộp giữa bài có nhắc và bài không nhắc | Chưa biết | Hơn 10 điểm phần trăm | assignment_reminder_sent đối chiếu tỉ lệ nộp |
| Điểm danh | Tỉ lệ lớp có ít nhất một buổi điểm danh trong tháng, trong các trường được bật | 221 buổi toàn hệ thống, 30 ngày | 30% số lớp | attendance_saved chia số lớp đang hoạt động |
| Chấm bài AI | Tỉ lệ dùng lại trong 14 ngày sau lần chấm đầu tiên | Chưa biết | 40% | 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ểm | Chưa biết | Dưới 25% | ai_grading_edited_by_teacher |
| Báo cáo | Tỉ 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ết | 25% | report_at_risk_action_taken chia report_home_viewed |
| Báo cáo con | Số 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ết | Không quá 3 | report_drilldown_viewed |
| Thi tập trung | Tỉ lệ kỳ thi tạo xong được phát hành cho học sinh | 63 kỳ thi 30 ngày | 70% phát hành | exam_created → exam_published |
| Kho đề | Tỉ lệ lượt tìm không ra kết quả nào | Chưa biết | Dướ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ên | Chưa biết | 50% | Bốn sự kiện nhóm J |
| Bingo Co-Teacher | Tỉ lệ đề xuất được chấp nhận và giao đi | Chưa biết | 30% | coteacher_suggestion_accepted |
| Hướng dẫn tính năng | Tỉ lệ xem hết tour, và tỉ lệ dùng tính năng trong 7 ngày sau khi xem | Chưa biết | 60% xem hết · 35% dùng | tour_completed đối chiếu sự kiện của tính năng |
| Kích hoạt người mới | Tỉ lệ giáo viên đăng ký mới đạt mốc kích hoạt trong 14 ngày | 3,4% còn hoạt động sau tháng đầu | 12% | activation_reached |
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ỏi | Trả 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ài | Trê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 517 | Khoả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ộp | Mộ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ày | Tí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ày | Quy mô rất nhỏ so với công sức đã bỏ ra xây dựng. |
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.
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.
| Đợt | Nội dung | Số sự kiện | Xong 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 chung | 0 | Chư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 1 | 37 sự kiện mức Đợt 1 | 37 | Phễ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 2 | 42 sự kiện mức Đợt 2 | 42 | Chiề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 3 | 8 sự kiện còn lại | 8 | Tinh chỉnh bộ lọc, khoảng thời gian mặc định, hiệu năng theo mà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ế:
Ư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.
Ư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í.
Ư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.
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ục | Yêu cầu |
|---|---|
| Bắn đúng một lần | Thao 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ệu | Số 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 đọc | Mỗ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ý.
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.
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.
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ái | Ghi chú |
|---|---|---|
| Google Tag Manager GTM-MWCH4JVL | Chỉ pageview | Gắ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ạy | Gắn cứng trong _document.tsx. Ghi phiên và bản đồ nhiệt. |
| Microsoft Clarity n8orfkthqt | Đang chạy | Gắn cứng. Trùng chức năng với Hotjar. |
| Meta Pixel 312045711855258 | Sáu sự kiện rời | Gắ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ỉ pageview | Gắn cứng trong _app.tsx. |
| Firebase Analytics | Khởi tạo, bỏ trống | getAnalytics(app) có chạy, nhưng mọi lời gọi logEvent đều bị chú thích. |
| Google Analytics 4 | Đã tắt | Dòng khai báo bị chú thích ngay dưới dòng GTM. |
| Sentry | Đã tắt | Sentry.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. |
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.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.
| Khác biệt | Hệ quả với bộ sự kiện |
|---|---|
| Năm bộ mã làm bài riêng biệt | Việ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ẻ em | Tuyệ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 song | Kim 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àm | Rà 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ên | Bà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ở. |
Đợ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.
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ện | Bắn khi nào | Tham số riêng | Trả 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_returning | Số học sinh hoạt động theo ngày |
| Đợt 1 screen_viewed | Mỗi lần đổi màn | screen, params_hash | Trong 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 xong | method, account_age_days | Cá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ản | from_profile_id, to_profile_id | Mộ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ạn | reason, from_screen, checkpoint_id | Hàng rào chặn học sinh ở đâu, hiện đang chặn im lặng |
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ện | Bắn khi nào | Tham số riêng | Trả lời câu hỏi gì |
|---|---|---|---|
| Đợt 1 join_class_opened | Mở màn vào lớp | source (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ông | class_id, seconds_from_open | Tỉ 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ại | error_code | Mã sai, lớp đầy, hay đã ở trong lớp |
| Đợt 1 assignment_received_opened | Mở một bài được giao | assignment_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 giao | pending_count, overdue_count | Học sinh có chủ động kiểm tra không, hay chỉ vào khi bị nhắc |
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ện | Bắn khi nào | Tham số riêng | Trả lời câu hỏi gì |
|---|---|---|---|
| Đợt 1 attempt_started | Bắt đầu một lượt làm | engine, mode, checkpoint_id, is_assigned, question_count, is_resume | Mẫu số của mọi tỉ lệ hoàn thành |
| Đợt 1 attempt_question_answered | Trả lời xong một câu | engine, question_type, question_index, seconds_on_question, is_correct, changed_answer | Câ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âu | engine, question_type, question_index | Loại câu hỏi nào hay bị bỏ |
| Đợt 1 attempt_paused | Rời khỏi bài giữa chừng | engine, 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ông | engine, hours_since_pause, is_expired | Cơ chế làm tiếp có được đề nghị đúng lúc không |
| Đợt 1 attempt_resumed | Chấp nhận làm tiếp | engine, hours_since_pause | Cứu được bao nhiêu bài dở dang |
| Đợt 1 attempt_submitted | Nộp bài | engine, mode, duration_ms, answered_count, skipped_count, is_assigned | Thành công cuối phễu |
| Đợt 1 attempt_abandoned | Bỏ hẳn: quá 24 giờ không quay lại | engine, progress_pct, last_question_index | Tỉ 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úc | engine, error_code, stage | Hiệ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 nghe | checkpoint_id, error_code | Lỗ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ại | error_code, permission_state | Quyền micrô hay lỗi thiết bị |
| Đợt 2 exam_security_violation | Bị tính là vi phạm chống gian lận | violation_type, count | Rời tab cũng bị tính là vi phạm, nên cần biết tỉ lệ báo nhầm |
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ện | Bắn khi nào | Tham số riêng | Trả lời câu hỏi gì |
|---|---|---|---|
| Đợt 1 result_viewed | Mở màn kết quả | engine, score_band, is_assigned | Bao 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âu | question_type, was_correct | Chỉ 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ấp | checkpoint_id | Hà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àm | engine, previous_score_band, attempt_number | Làm lại có nâng điểm không |
Phần học sinh tự tìm tới. Đây là thứ giữ chân khi lớp nghỉ hè.
| Sự kiện | Bắn khi nào | Tham số riêng | Trả lời câu hỏi gì |
|---|---|---|---|
| Đợt 1 library_opened | Mở kho nội dung | source | Tỉ lệ tiếp cận phần tự học |
| Đợt 2 library_searched | Tìm nội dung | query_length, filters_used, results_count, zero_results | Tìm không ra là lỗ hổng nội dung |
| Đợt 1 self_study_started | Bắt đầu nội dung tự chọn | content_type, level | Tự 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 AI | topic, 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 |
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ện | Bắn khi nào | Tham số riêng | Trả lời câu hỏi gì |
|---|---|---|---|
| Đợt 1 reward_earned | Nhận thưởng | reward_type (diamond, coin, star, wisdom_stone), amount_bucket, source_action | Nguồn thưởng nào đang chi nhiều nhất |
| Đợt 1 reward_spent | Tiêu thưởng | item_type, currency, amount_bucket | Thưở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ì để mua | has_class, balance_null | Họ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ày | mission_key, level | Nhiệ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ọc | streak_count | Chuỗi ngày có giữ chân không |
| Đợt 2 challenge_joined | Tham gia thử thách | challenge_id, source | Tỉ lệ lời mời biến thành người chơi |
| Đợt 2 ranking_viewed | Xem bảng xếp hạng | scope, own_rank_bucket | Xếp hạng tạo động lực hay áp lực, đối chiếu với tỉ lệ quay lại |
| Sự kiện | Bắn khi nào | Tham số riêng | Trả lời câu hỏi gì |
|---|---|---|---|
| Đợt 1 paywall_shown | Gặp hàng rào trả phí | trigger, feature, from_screen | Hàng rào đặt đúng chỗ chưa |
| Đợt 1 package_viewed | Xem bảng gói | source | Mẫu số phễu mua |
| Đợt 2 checkout_started | Bắt đầu thanh toán | plan, price_bucket, method | Bước rơi nhiều nhất |
| Đợt 1 checkout_completed | Thanh toán xong | plan, price_bucket, method, days_since_signup | Doanh thu nối với hành vi |
| Đợt 2 checkout_failed | Thanh toán thất bại | error_code, method | Cổng nào hay hỏng |
| Sự kiện | Bắn khi nào | Tham số riêng | Trả lời câu hỏi gì |
|---|---|---|---|
| Đợt 1 action_failed | Thao tác bị máy chủ từ chối | action, error_code, screen | Bản đồ lỗi theo màn |
| Đợt 1 offline_blocked | Màn chặn vì mất mạng hiện lên | screen, engine, progress_pct | Bao 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 xong | screen, duration_ms | Nối cảm nhận chậm với màn cụ thể |
| Tính năng | Chỉ số chính | Ngưỡng | Ghi chú |
|---|---|---|---|
| Làm bài được giao | Tỉ lệ lượt bắt đầu dẫn tới nộp | 85% | 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 giao | Phầ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ành | 60% | 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ớp | 80% | Đứt ở đây là mất học sinh ngay từ đầu |
| Xem lời giải | Tỉ lệ lượt làm có mở ít nhất một lời giải câu sai | 40% | Chỉ số phân biệt làm bài với học |
| Tự học | Tỉ lệ học sinh có ít nhất một lượt tự chọn nội dung trong tháng | 35% | 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ông | Hơ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ận | Tỉ lệ vi phạm bị ghi nhận nhưng học sinh vẫn nộp bình thường | Dướ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 |
| Thông tin | Giá trị |
|---|---|
| Tên trên App Store | Teacher Assistant AI · id6449689901 |
| Mã gói | com.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ảng | React 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ại | 1.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ài | Trạng thái | Ghi chú |
|---|---|---|
| Firebase Analytics 23.8.6 | Cài rồi, không gọi | Có 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ạy | Bắ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ạy | Hạ 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ạy | Bật tắt tính năng từ xa. Dùng được để chia nhóm thử nghiệm. |
| AppsFlyer | Đã tắt | Có tệp src/utils/appsFlyer.ts nhưng lời gọi logEvent bị chú thích. |
Đâ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.
Đừ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.
| Loại sự kiện | Cách đặt tên |
|---|---|
| Tính năng có ở cả hai nơi | Giao 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 động | Vò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 web | Khô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.
Đợ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 ở đó.
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ện | Bắn khi nào | Tham số riêng | Trả lời câu hỏi gì |
|---|---|---|---|
| Đợt 1 app_installed | Lần mở đầu tiên sau khi cài | install_source, os_version, device_model | Mẫ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ước | from (icon, notification, deeplink), seconds_since_last_open | Tầ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 sau | screen, session_seconds | Phiê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ật | from_version, to_version | Tố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_supported | Bao nhiêu người kẹt ở bản cũ |
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ện | Bắn khi nào | Tham số riêng | Trả lời câu hỏi gì |
|---|---|---|---|
| Đợt 1 push_permission_requested | Hiện hộp xin quyền thông báo | trigger_screen, days_since_install | Xin quyền đúng lúc hay quá sớm |
| Đợt 1 push_permission_result | Người dùng trả lời | granted, days_since_install | Tỉ 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áo | notification_type, in_foreground | Mẫ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áo | notification_type, hours_since_sent, destination_screen | Loạ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ắt | days_since_granted | Bao nhiêu người tắt sau khi từng đồng ý |
Đâ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ện | Bắn khi nào | Tham số riêng | Trả lời câu hỏi gì |
|---|---|---|---|
| Đợt 1 assignment_create_started | Mở luồng giao bài | source, entry_screen | Cù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ông | assignment_id, resource_type, audience_type, recipient_count_bucket, has_deadline, duration_ms | Giá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 xong | last_step, seconds_spent | Luồng ba bước trên màn nhỏ rơi ở đâu |
| Đợt 1 class_created | Tạo lớp thành công | class_id, level, duration_ms | Bước kích hoạt thứ nhất |
| Đợt 1 student_created | Thêm học sinh thành công | method, count_added | Bước kích hoạt thứ hai |
| Đợt 1 ai_grading_submitted | Gửi bài cho AI chấm | skill, input_type | Chấ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áo | interface_version | Báo cáo trên màn nhỏ có ai đọc không |
| Đợt 2 class_detail_viewed | Mở chi tiết lớp | class_id, tab | Tab nào dùng được trên di động |
| Đợt 2 notification_opened | Mở một thông báo trong ứng dụng | notification_type, age_hours | So 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 chung | query_length, results_count, zero_results | Trên di động tìm kiếm thường thay cho điều hướng |
| Sự kiện | Bắn khi nào | Tham số riêng | Trả lời câu hỏi gì |
|---|---|---|---|
| Đợt 1 onboarding_step_completed | Xong một bước trong luồng làm quen | step_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 quen | total_duration_ms, steps_skipped | Tỉ lệ đi hết |
| Đợt 2 role_selected | Chọn vai trò giáo viên hoặc phụ huynh | role | Ứ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ên | method | Bướ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 ảnh | permission, granted, trigger_screen | Quyền nào bị từ chối nhiều nhất |
| Đợt 2 deeplink_opened | Mở từ một liên kết sâu | link_type, destination_screen, is_cold_start | Liên kết từ thư điện tử và Zalo có dẫn đúng chỗ không |
| Sự kiện | Bắn khi nào | Tham số riêng | Trả lời câu hỏi gì |
|---|---|---|---|
| Đợt 1 action_failed | Thao tác bị máy chủ từ chối | action, error_code, screen | Bản đồ lỗi theo màn |
| Đợt 1 app_crashed | Ứng dụng thoát đột ngột | screen, os_version, app_version | Crashlytics đã 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ác | screen, pending_action | Di độ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 xong | screen, duration_ms | Nối cảm nhận chậm với màn cụ thể |
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ỏi | Chỉ số | Ngưỡng | Ghi chú |
|---|---|---|---|
| Có ai dùng không | Số 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 động | 25% | 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êm | Tỉ lệ giáo viên dùng cả hai nền tảng trong cùng một tuần | Chỉ để quan sát | Nế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ụng | 15% | 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ông | Tỉ lệ quay lại tuần thứ hai sau lần cài đặt | 40% | Chỉ số sống còn của mọi ứng dụng di động |
| Thông báo đẩy | Tỉ lệ đồng ý nhận thông báo | 60% | 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 đẩy | Tỉ 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 định | Tỉ 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 web | Chênh dưới 15 điểm | Chê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 |
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.
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.
| Thành phần | Ý nghĩa và cách dùng |
|---|---|
| Chiều dài thanh | Số 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 thanh | Số 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 đứt | Bướ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ễu | Bố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 gian | Bố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ận | Mộ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. |
| Việc | Thời gian | Ghi chú |
|---|---|---|
| Phễu đầu tiên | Một tuần sau khi đợt 1 chạy | Chỉ 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ính | Bốn tuần | Kí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óm | Tám tuần | Cắ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ật | Cùng lúc với thẻ điểm | Dự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. |
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.
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.
| Bảng | Ai đọc | Nội dung và cách dùng |
|---|---|---|
| Sức khoẻ sự kiện | Kỹ 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ăng | Sản phẩm | 15 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ễu | Sản phẩm, khi cần | Bố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ỳ. |
| Nhịp | Ai | Xem gì | Ra quyết định gì |
|---|---|---|---|
| Hằng ngày Tự động | Không ai, trừ khi có cảnh báo | Sức khoẻ sự kiện | Sử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ểm | Tuầ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ẩm | Thẻ điểm đầy đủ và xu hướng 12 tuần | Giữ, 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. |
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.
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.
| # | Luồng | Chạy khi nào | Làm gì, và gửi cho ai |
|---|---|---|---|
| 1 | Canh sức khoẻ sự kiện | Mỗ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. |
| 2 | Dựng thẻ điểm | Mỗi tuần, sáng thứ Hai | Sinh 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. |
| 3 | Báo vượt ngưỡng | Cùng lúc với luồng 2 | Khi 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. |
| 4 | Nhắc tới hạn nghiệm thu | Mỗi ngày | Phiế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ớ. |
| 5 | Ghi sổ quyết định | Sau 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ỏ. |
| Việc | Vì sao giữ cho người làm |
|---|---|
| Kết luận đạt hay chưa đạt | Má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ăng | Luôn là quyết định của người, trong cuộc họp quý, có ghi sổ. |
| Đổi ngưỡng | Ngưỡ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 sinh | Thuộ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. |
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.
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òng | Nội dung | Ví dụ: Nhắc nộp bài |
|---|---|---|
| Chỉ số chính | Đúng một, không được hai | Tỉ lệ bài giao được nộp |
| Mốc xuất phát | Đo trước khi phát hành, ghi rõ ngày | 49,9% · 19/09/2026 |
| Ngưỡng đạt | Con số cụ thể, không phải "tăng" | 57% sau một quý |
| Ngày nghiệm thu | Chốt trước, ghi vào lịch | 20/12/2026 |
| Chỉ số bảo vệ | Thứ không được phép xấu đi khi chỉ số chính đẹp lên | Số 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ần | Mở 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 |
Đạ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ận | Dấu hiệu | Làm gì tiếp |
|---|---|---|
| Đạt | Vượt ngưỡng và giữ được qua hai kỳ đo liên tiếp, chỉ số bảo vệ không xấu đi | Chố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ướng | Chưa tới ngưỡng nhưng cải thiện đều qua ba kỳ đo | Gia 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ên | Dao động quanh mốc xuất phát, không có xu hướng | Giả 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ùi | Chỉ số chính xấu đi, hoặc chỉ số bảo vệ vượt trần | Tắ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. |
| Bẫy | Biể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ọc | Thá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úc | Phá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. |
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ước | Câu hỏi | Nếu hỏng ở đây thì sửa gì |
|---|---|---|
| 1 | Ngườ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. |
| 2 | Nhì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ã. |
| 3 | Mở 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.
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.
| Giai đoạn | Việc phải xong |
|---|---|
| Tuần 1 · Giả thuyết | Viế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àm | Thay đổ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 · Đo | Khô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ết | Mộ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ý.
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 đổi | Chỉ số chính | Chỉ số bảo vệ bắt buộc |
|---|---|---|
| Nhắc nộp bài tự động | Tỉ lệ bài giao được nộp | Số 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ài | Tỉ lệ hoàn thành luồng | Tỉ 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 AI | Số lượt chấm | Tỉ 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ới | Tỉ lệ tiếp cận màn mới | Tỉ 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ũ |
| Loại thay đổi | Cách đo | Lý do |
|---|---|---|
| Sửa chữ, đổi vị trí, sửa lỗi | Trước và sau, toàn bộ người dùng | Tá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ành | Khô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ài | Mở 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ồng | Hai bản chạy song song sau một cờ bật tắt, tối thiểu ba tuần | Ngườ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ế. |
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.
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.