FLYER Teacher · PRD · Nội dung sản phẩm · 10/09/2026

Content cho sản phẩm — marketing tự rà soát và cập nhật teacher.flyer.us

Một danh sách duy nhất liệt kê toàn bộ nội dung hiển thị cho giáo viên trên teacher.flyer.us và teacher.teado.ai. Đội marketing xem, đề xuất sửa, gửi duyệt và theo dõi lịch sử từng thay đổi; bản mới lên production mà không cần build lại mã nguồn.

Phiên bản
1.0 · 10/09/2026
Owner
Nam (PM) · Marketing
Sản phẩm
teacher.flyer.us · teacher.teado.ai
Trạng thái
Đề xuất — chờ duyệt
Hiện trạng 6.515 chuỗi giao diện tiếng Việt 3 ngôn ngữ (VI · EN · ES) 16 nhóm nội dung 100 commit chạm nội dung / 90 ngày, chỉ 2 commit thuần nội dung 69 popup phiên bản · 29 popup theo menu

1Vấn đề và mục tiêu

Nội dung mà giáo viên nhìn thấy trên teacher.flyer.us hiện nằm ở bốn nơi, với bốn cách sửa và bốn mức lịch sử khác nhau. Bảng dưới đây được đối chiếu trực tiếp với mã nguồn partner-web, cơ sở dữ liệu production và admin.flyer.vn ngày 10/09/2026.

Lớp nội dungĐang ở đâuKhối lượngAi sửa đượcLịch sửThời gian lên production
Chuỗi giao diện (nhãn nút, tiêu đề, hướng dẫn trong ứng dụng, mô tả gói, cẩm nang)16 file JSON trong mã nguồn (src/locales/vi|en|es), đóng gói lúc build6.515 VI
6.524 EN
6.524 ES
Chỉ devChỉ có trong git; marketing không đọc đượcChờ commit → build → deploy (57 phút) theo nhịp release, thường 7–14 ngày
Popup “Có gì mới” theo phiên bảnBảng version_notifications; admin.flyer.vn đã có màn nhập69 bản
(34 · 21 · 14 theo năm 2024–26)
Admin và marketing (linhpham 31 lần, nghiepbv 20, kallie 5, uyenemma 4)Chỉ ghi ai sửa lần cuối, khi nào; không giữ bản cũNgay
Popup giới thiệu theo menuBảng menu_notifications; admin.flyer.vn29 bản, toàn bộ đang tắt từ 06/08/2026Admin và marketingNhư trênNgay
Trung tâm trợ giúp help.flyer.vnGitBook35 bài cho giáo viênMarketingGitBook giữ lịch sử riêngNgay, nhưng không nối với màn hình sản phẩm

Trang giới thiệu khi chưa đăng nhập có tài liệu riêng: PRD trang giới thiệu teacher.flyer.us. Nội dung học liệu (đề, chương trình, video) thuộc đội Academic và không nằm trong phạm vi này.

Ba hệ quả đo được

Mục tiêu: một nơi liệt kê 100% nội dung sản phẩm, marketing tự rà soát và đề xuất sửa, PM duyệt, hệ thống giữ lịch sử từng mục (ai, khi nào, bản cũ, bản mới, lý do), và bản đã duyệt hiển thị trên production trong vòng một ngày mà không cần build lại mã.

2Giải pháp tổng quan

Xây một Kho nội dung (content registry) gom cả bốn lớp thành một danh sách phẳng. Mỗi mục có mã, màn hình xuất hiện, ba ngôn ngữ, trạng thái, ngày và người cập nhật gần nhất, và dòng lịch sử. Luồng làm việc duy nhất cho mọi lớp:

Marketing rà soát → đề xuất sửa (kèm lý do) → PM duyệt / trả lại → phát hành │ chuỗi giao diện: ghi bản ghi đè lên CDN, ứng dụng nạp trong ≤ 5 phút popup: ghi thẳng vào bảng đã có, kèm bản cũ vào lịch sử help: chỉ liệt kê và theo dõi ngày sửa từ GitBook

Ba nguyên tắc thiết kế:

  1. Mã nguồn vẫn là gốc, kho chỉ ghi đè. Không đưa nội dung ra khỏi git; dev vẫn làm việc như cũ. Kho giữ một lớp override phủ lên trên, và tự thu hồi khi dev đã đưa bản mới vào mã.
  2. Mọi thay đổi đều có bản cũ. Không có thao tác nào ghi đè mà không lưu phiên bản trước; khôi phục về bất kỳ phiên bản nào bằng một thao tác.
  3. Danh sách phẳng, lọc theo màn hình. Công cụ nội bộ dùng bảng và bộ lọc, không dùng bảng kéo thả.

Kho được triển khai theo hai phần: Phần A chạy ngay bằng Google Sheet và một script, không cần dev, để đo nhu cầu thật của marketing trong bốn tuần; Phần B xây màn hình trong admin.flyer.vn nếu Phần A chứng minh được giá trị.

3Hành động ngay — không chờ hệ thống mới

Đội marketing đã dùng Google Sheet để đề xuất sửa nhãn nút và nội dung popup. Phần còn thiếu chỉ là đường đưa những đề xuất đó lên production. Khảo sát mã nguồn ngày 10/09/2026 cho thấy hạ tầng cần thiết đã có sẵn trong sản phẩm, chia làm hai nhóm với hai mức sẵn sàng khác nhau.

3.1 Nội dung popup — đã làm được ngay hôm nay, không cần dev

Hai bảng version_notifications (69 bản) và menu_notifications (29 bản) đã có màn nhập trong admin.flyer.vn, và marketing đang thao tác trực tiếp trên đó: lịch sử sửa ghi nhận linhpham 31 lần, nghiepbv 20 lần, kallie 5 lần, uyenemma 4 lần. Nội dung lưu ở cơ sở dữ liệu nên hiển thị ngay sau khi lưu, không qua build.

Ba việc cần bổ sung, làm được trong tuần mà không cần lập trình:

3.2 Nhãn nút và chữ trong giao diện — cần đúng một thay đổi nhỏ

Đây là nhóm đang phải chờ release. Điểm mấu chốt tìm được: sản phẩm đã tích hợp sẵn Firebase Remote Config và đang chạy trên production.

Thành phần đã cóTrạng thái trong mã nguồn
Thư viện firebase 12.11.0 kèm firebase/remote-configĐã cài, đang dùng
RemoteConfigProvider bọc toàn ứng dụngGắn tại src/pages/_app.tsx, bao ngoài mọi màn hình
Tự động tải và kích hoạt giá trị mớifetchAndActivate chạy mỗi lần khởi tạo; giá trị dạng JSON được tự phân giải
Nhịp làm mớiProduction 6 giờ, môi trường phát triển 20 giây; đổi bằng biến môi trường, không cần sửa mã
Dự án Firebasemover-online-english cho production

Nghĩa là đã có sẵn một kênh đẩy dữ liệu từ ngoài vào ứng dụng đang chạy. Việc còn lại là nối kênh đó vào lớp ngôn ngữ.

3.3 Thay đổi cần làm

Thư viện next-translate 3.1.1 cho phép lồng I18nProvider, và bản lồng bên trong ghi đè lên bản bên ngoài. Vì vậy chỉ cần thêm một thành phần đọc giá trị từ Remote Config, trộn lên bộ chuỗi hiện có, rồi bọc quanh nội dung trang.

Marketing sửa trong Google Sheet → script đọc dòng "Đã duyệt", ghi vào tham số Remote Config (JSON theo ngôn ngữ và nhóm) → ứng dụng đang chạy nhận giá trị mới → I18nProvider lồng trong trộn đè lên chuỗi gốc → giáo viên thấy chữ mới, không cần build lại
ViệcKhối lượngRủi ro
Thành phần trộn chuỗi ghi đè, bọc quanh <Component /> trong _app.tsxMột file mới khoảng 25 dòng, sửa 2 dòng ở _app.tsxThấp. Không đụng tới 779 file đang gọi useTranslation; không có giá trị ghi đè thì mọi thứ chạy y như hiện tại
Tham số contentOverrides trên Firebase consoleTạo một lầnKhông
Script đọc sheet, ghi vào Remote Config qua Firebase Admin SDKNửa ngàyThấp. Có thể bỏ qua ở giai đoạn đầu, marketing dán JSON thẳng vào console
Thời gian lên production sau khi hoàn tất: người mở phiên mới thấy ngay; phiên đang mở nhận trong vòng 6 giờ theo nhịp làm mới hiện tại. Nếu cần nhanh hơn, hạ biến NEXT_PUBLIC_REMOTE_CONFIG_FETCH_INTERVAL_MILLIS xuống 15 phút, chỉ là đổi biến môi trường.
Hai điểm cần lưu ý khi thiết kế chi tiết. Thứ nhất, I18nProvider ghi đè theo cả nhóm chứ không theo từng khoá, nên thành phần trộn phải giữ lại toàn bộ chuỗi gốc của nhóm rồi mới đắp phần sửa lên. Thứ hai, đây là lớp tạm: khi dev đưa bản mới vào mã nguồn, cần gỡ giá trị ghi đè tương ứng để tránh chữ cũ đè lên chữ mới. Quy ước gỡ nằm ở mục 5.

3.4 Thứ tự đề nghị

  1. Tuần này: chốt phạm vi được phép sửa qua kênh này. Đề nghị giới hạn ở nhãn nút, tiêu đề, mô tả gói và chuỗi cẩm nang; loại trừ thông báo lỗi và chuỗi có biến nội suy.
  2. Tuần này: áp dụng ba việc ở mục 3.1 cho nhóm popup.
  3. Tuần sau: dev làm thay đổi ở mục 3.3, thử với đúng một chuỗi trước, ví dụ partner_package.plan_desc_1 đang ghi “hơn 6000 đề” trong khi trang giới thiệu và email đã dùng số 20.000.
  4. Sau khi chạy ổn hai tuần: quyết định có xây màn quản lý ở Phần B hay giữ nguyên sheet cộng Remote Config.

4Phần A — quy trình trên Google Sheet

Đội marketing đã dùng Google Sheet cho việc đề xuất sửa. Phần này chuẩn hoá lại sheet đó để phủ đủ 6.515 chuỗi và nối được với kênh phát hành ở mục 3.

A1. Xuất toàn bộ nội dung ra một Google Sheet

Script đọc 16 file JSON của ba ngôn ngữ, gắn mỗi chuỗi với màn hình bằng bảng route → namespace sẵn có trong i18n.js (ví dụ /programprogram.json, /flyer-aiflyer_ai.json, /tuition-managementtuition_management.json) và nhóm cấp một trong common.json (partner_package, home_new, user_guide…). Kết quả là sheet “Kho nội dung teacher.flyer.us”:

CộtNội dungAi điền
common.partner_package.plan_desc_1Script
Màn hìnhGói dịch vụ · /partner-packageScript
VI · EN · ESBản đang chạy trên productionScript; marketing sửa trực tiếp vào ô
Trạng tháiGiữ nguyên · Đề xuất sửa · Đã duyệt · Đã lên productionMarketing đổi sang “Đề xuất sửa”; PM đổi sang “Đã duyệt”
Lý doMột câu vì sao cần sửaMarketing
Người · NgàyTự điền bằng công thức khi ô thay đổiSheet

A2. Marketing rà soát trên sheet

Lọc theo cột Màn hình để rà từng khu vực. Sửa chữ ngay trong ô VI/EN, đổi trạng thái sang “Đề xuất sửa”, ghi lý do. Google Sheet giữ lịch sử phiên bản của từng ô, nên yêu cầu “ghi lại ngày cập nhật” được đáp ứng mà không cần xây gì thêm.

A3. Nhịp duyệt hằng tuần

A4. Popup và trung tâm trợ giúp

Giữ nguyên admin.flyer.vn và GitBook. Sheet có thêm tab Popup & Help liệt kê 69 popup phiên bản, 29 popup theo menu và 35 bài help kèm link và ngày sửa gần nhất, để marketing rà soát cùng một chỗ. Khi sửa popup trên admin, marketing dán bản cũ vào tab Nhật ký trước khi ghi đè.

Sau bốn tuần Phần A trả lời được ba câu hỏi quyết định có xây Phần B hay không: marketing đề xuất bao nhiêu dòng mỗi tuần; thời gian trung bình từ đề xuất đến lên production; và tỉ lệ đề xuất được duyệt không phải sửa lại.
Giới hạn của Phần A vẫn phụ thuộc release để lên production (tối đa 7 ngày), không xem trước được trên màn hình thật, và dễ lệch khi dev đổi tên hoặc xoá mã của chuỗi giữa hai lần xuất. Đây là những điểm Phần B giải quyết.

5Phần B — Kho nội dung trong admin.flyer.vn

Xây khi Phần A cho thấy nhu cầu ổn định (gợi ý: từ 20 đề xuất mỗi tuần trở lên, hoặc thời gian chờ lên production là điểm nghẽn chính).

4.1 Vị trí và phân quyền

Mục Nội dung sản phẩm trong admin.flyer.vn, đặt cạnh mục Thông báo hiện có (nơi popup đang được sửa). Ba vai trò:

Vai tròĐược làmKhông được làm
MarketingXem toàn bộ, đề xuất sửa, xem lịch sử, khôi phục đề xuất do chính người đó tạoPhát hành
PMDuyệt, trả lại, phát hành, khôi phục bất kỳ phiên bản
DevXem trạng thái đồng bộ mã nguồn, thu hồi bản ghi đè

4.2 Màn hình danh sách

Một bảng phẳng, mỗi dòng là một mục nội dung. Bộ lọc: màn hình, ngôn ngữ, trạng thái, ngày sửa, người sửa; ô tìm kiếm theo chữ hoặc theo mã. Nút Mở trên sản phẩm nhảy tới đúng trang teacher.flyer.us nhờ bảng route → namespace.

Tất cả 6.515Gói dịch vụ 339Trang chủ 118Cẩm nang 148Onboarding 229Chấm AI 661Trạng thái: Chờ duyệt (7)Tìm…
Mã · Màn hìnhVITrạng tháiSửa lần cuối
partner_package.plan_desc_1
Gói dịch vụ
Truy cập vào kho tài nguyên với hơn 6000 đềChờ duyệt10/09 · Linh
home_new.all_classes_performance
Trang chủ
Hiệu suất học tập của các lớpĐang chạy02/07 · dev
user_guide.guid_61
Cẩm nang
Bài tập sẽ được tự động gửi cho học sinh khi đến giờ đã hẹnĐang chạy15/05 · dev
v4.goals.title
Onboarding
Bạn muốn bắt đầu với mục tiêu nào?Mới — chưa rà03/07 · dev

partner_package.plan_desc_1 · Gói dịch vụ

Bản đang chạyTruy cập vào kho tài nguyên với hơn 6000 đề
Đề xuất (VI)Kho học liệu hơn 20.000 bài tập và đề thi, từ Pre A1 đến IELTS
Lý doSố 6000 đã cũ; landing và email đang dùng 20.000
10/09 · Linh đề xuất · chờ duyệt
02/07 · dev cập nhật khi thêm gói Teado
18/03 · bản gốc
Duyệt và phát hànhTrả lạiXem trên sản phẩm

Mô phỏng bố cục màn hình danh sách; số liệu trong bảng lấy từ production ngày 10/09/2026.

4.3 Sửa một mục

4.4 Duyệt và phát hành

PM thấy hàng chờ, so sánh bản cũ và bản mới cạnh nhau, chọn Duyệt hoặc Trả lại kèm ghi chú. Phát hành ghi bản ghi đè lên kho phân phối; ứng dụng nạp bản mới trong tối đa năm phút, không cần build. Có nút Phát hành thử cho tôi để người duyệt thấy bản mới trên tài khoản của người duyệt trước khi phát hành cho tất cả.

4.5 Lịch sử

4.6 Popup và trung tâm trợ giúp trong cùng danh sách

Hai bảng version_notificationsmenu_notifications được đọc và ghi qua các mutation đã có của admin; kho chỉ thêm lớp lịch sử và bước duyệt. Bài trên help.flyer.vn được liệt kê kèm ngày sửa từ GitBook, có thể gắn với màn hình tương ứng để marketing thấy chỗ nào của sản phẩm đang thiếu bài hướng dẫn.

4.7 Đồng bộ với mã nguồn

Một tác vụ đọc nhánh dev mỗi giờ. Mục mới trong JSON được gắn nhãn Mới — chưa rà; mục đã xoá khỏi mã được gắn Đã xoá khỏi mã và bản ghi đè của nó tự vô hiệu. Nếu dev sửa chính chuỗi đang có bản ghi đè, kho báo xung đột cho PM chọn giữ bản nào.

6Cơ chế kỹ thuật

Thành phầnThiết kếGhi chú
Lưu trữcontent_items (mã, namespace, màn hình, ngôn ngữ, bản gốc, bản ghi đè, trạng thái, người và thời điểm sửa) và content_versions (mục, phiên bản, nội dung, tác giả, lý do, thời điểm)Cùng Postgres và Hasura đang dùng; không thêm hạ tầng
Phân phốiSau khi phát hành, tác vụ xuất bản ghi đè thành file tĩnh /overrides/<lang>/<namespace>.json lên CDN, cache 5 phútDùng statics.flyer.us hiện có hoặc R2
Ứng dụng nạploadLocaleFrom trong i18n.js đã là hàm bất đồng bộ và đã có mergeWithBase để trộn ES lên EN; thêm một bước tải file ghi đè rồi trộn lên JSON gốc theo cùng hàmLỗi mạng hoặc file trống → dùng bản gốc, không bao giờ chặn trang
Màn hình của mỗi mụcSuy từ bảng route → namespace trong i18n.js và nhóm cấp một của khoá; bảng ánh xạ do PM chỉnh tay cho các nhóm chung của common.json120 nhóm cấp một trong common.json cần gán tay một lần
PopupDùng mutation sẵn có của admin cho version_notificationsmenu_notifications; thêm ghi phiên bản trước khi cập nhậtTrường show_domain đã có, dùng để tách flyer.us và teado.ai
Đồng bộ mãTác vụ đọc src/locales trên nhánh dev qua Gitea API mỗi giờ, so khoáKhông chạm vào quy trình build hiện tại

Rủi ro cần xử lý trong thiết kế chi tiết: chuỗi chứa HTML hoặc biến nội suy (kiểm tra cú pháp trước khi phát hành); một khoá dùng ở nhiều màn hình (hiển thị mọi nơi dùng); xung đột khi dev và marketing cùng sửa một khoá (quy ước bản ghi đè có hiệu lực cho đến khi dev merge và kho tự thu hồi); tiếng Tây Ban Nha hiện dùng bản EN khi thiếu khoá, cần giữ nguyên hành vi đó với lớp ghi đè.

7Lộ trình

Giai đoạnPhạm viNguồn lựcĐiều kiện lên tiếp
P0 — tuần 15–19/09Phần A: script xuất sheet, tab Nhật ký, nhịp duyệt thứ Tư, PR đầu tiên0,5 ngày dev hoặc PM chạy script; marketing bắt đầu rà từ màn Gói dịch vụ và Trang chủChạy đủ 4 tuần, có số đo ở mục 7
P1 — Sprint 115Danh sách, sửa, duyệt, lịch sử cho tiếng Việt; lớp ghi đè và nạp trên ứng dụngKhoảng 2 tuần dev (1 backend, 1 frontend admin)Marketing tự phát hành được 1 tuần không cần dev can thiệp
P2 — Sprint 116EN và ES; popup vào cùng kho; đồng bộ khoá tự động; xem trước với biến thậtKhoảng 1,5 tuần dev
P3Liệt kê bài help.flyer.vn theo màn hình; trang giới thiệu khi chưa đăng nhậpTheo PRD trang giới thiệu

8Chỉ số thành công

Chỉ sốHiện tạiSau Phần ASau Phần B
Thời gian từ đề xuất sửa đến lên productionMột chu kỳ release, 7–14 ngày, nếu dev nhận≤ 7 ngày≤ 1 ngày
Tỉ lệ nội dung đã được marketing rà soát0%Màn Gói dịch vụ, Trang chủ, Onboarding: 100%100% trong 2 tháng
Số lần dev phải sửa nội dung thay marketing mỗi thángKhông đo được; ước từ 100 commit chạm nội dung / 90 ngàyCó số đoTiến về 0
Mục có lịch sử từ 2 phiên bản trở lênChỉ có với chuỗi giao diện, trong gitToàn bộ dòng đã sửa100% mục đã sửa, kể cả popup

9Câu hỏi mở

  1. Người duyệt cuối là PM hay trưởng nhóm marketing? Có cho phép marketing tự phát hành với các mục không phải nhãn nút và tiêu đề chính không?
  2. teacher.teado.ai dùng chung mã nguồn: một kho chung với cột tên miền, hay hai kho tách biệt? Bảng popup đã có trường show_domain, gợi ý dùng một kho chung.
  3. Tiếng Tây Ban Nha đang dùng bản EN khi thiếu khoá. Có cho marketing dịch ES trực tiếp trong kho không, hay ES vẫn đi qua đội dịch?
  4. Lịch sử trước ngày kho ra đời: nhập lại từ git log (có thể tới 2022) hay bắt đầu từ ngày phát hành?
  5. Có cần luồng “sửa khẩn” bỏ qua duyệt cho lỗi chính tả trên trang đăng nhập không, và ai được dùng?

10Phụ lục — mẫu danh sách từ dữ liệu thật

Mười dòng dưới đây lấy trực tiếp từ src/locales/vi/common.json ngày 10/09/2026, theo đúng định dạng sheet của Phần A. Đây là những nhóm marketing nhiều khả năng muốn sửa trước: mô tả gói dịch vụ, chỉ số trên trang chủ, và cẩm nang trong ứng dụng.

Màn hìnhVI đang chạyTrạng thái
partner_package.plan_descGói dịch vụMở khoá tính năng không giới hạn của Trợ giảng AI, bao gồmGiữ nguyên
partner_package.plan_desc_1Gói dịch vụTruy cập vào kho tài nguyên với hơn 6000 đềĐề xuất sửa (số đã cũ)
partner_package.plan_desc_2Gói dịch vụQuản lý lớp học lên đến 50 học sinh với đầy đủ các tính năngGiữ nguyên
home_new.test_level_detailsTrang chủThông tin chi tiết theo cấp độ bài thiGiữ nguyên
home_new.all_classes_performanceTrang chủHiệu suất học tập của các lớpGiữ nguyên
home_new.total_number_of_assign_testsTrang chủSố lượng bài tập giáo viên đã giaoGiữ nguyên
user_guide.guid_61Cẩm nang trong ứng dụngBài tập sẽ được tự động gửi cho học sinh khi đến giờ đã hẹnGiữ nguyên
user_guide.guid_63Cẩm nang trong ứng dụngHệ thống tự động đánh dấu những bài nộp muộn thời hạnGiữ nguyên
user_guide.guid_66Cẩm nang trong ứng dụngđể hoàn thành việc giao bàiĐề xuất sửa (câu cụt)
v4.goals.titleOnboardingBạn muốn bắt đầu với mục tiêu nào?Mới — chưa rà

Quy mô đầy đủ theo nhóm file: common 3.607 · my_exam 770 · flyer_ai 661 · centralized_exam 264 · tuition_management 249 · onboarding 229 · program 168 · challenge 121 · auth 106 · title 82 · bank_account 58 · modal 50 · course 47 · student_info_modal 47 · và 2 file nhỏ còn lại.


Nguồn: mã nguồn partner-web nhánh dev (i18n.js, src/locales), read-replica production (version_notifications, menu_notifications), admin.flyer.vn (mục Thông báo), help.flyer.vn · Tài liệu liên quan: PRD trang giới thiệu · PRD email onboarding · Danh mục PRD · Roadmap