Trường Số PRD/00 Overview
Trường Số · Product Requirements · 09/2026

PRD 00 · Overview and architecture

Product vision for Trường Số as a center-management platform, the personas it serves, the tenancy and role model, the information architecture, and a precise map of what the current CRM codebase already provides versus what each PRD adds.

Key facts, origin and limits
Status
Draft v1
Owner
Product
Codebase
center-crm-frontend (Next.js 16)
API
staging /v3 · 182 paths
Phase plan
P1 Q4/2026 · P2 Q1/2027 · P3 Q2/2027

Drafted by an AI assistant in a single session on 10/09/2026, from the original request quoted verbatim on the hub page; the Proposed design section was added on 16/09/2026. A proposal for team discussion, not a decision of the product team.

Sources

  • Public competitor research (PSE ONE, pse4.one), the center-crm-frontend codebase and the staging /v3 OpenAPI specification (182 paths), as of 10/09/2026.
  • Section 6 current state comes from a read of center-crm-frontend on 10/09/2026 and the live staging OpenAPI (182 paths). The generated client in the repo is built at dev time from the same spec.

Limits

  • Verification pending in-app survey, because automated login to the reference product was not authorised in the drafting session:
    • Competitor's exact navigation tree and module names as shown to a logged-in admin.
    • Whether their branch model is a switcher or a merged view, and whether a user can belong to several branches.
    • Which roles they ship by default and whether permissions are per screen or per action.
    • Their student lifecycle statuses and the trigger for "sắp hết hạn" (sessions remaining vs date).

Proposed design

This set is the shell every other PRD sits in: one top bar with the branch switcher, one sidebar shared by every module, and a Dashboard whose content changes with the signed-in role; parents and teachers get their own mobile surfaces instead of reusing the sidebar.

1 · Application shell · owner dashboard

/dashboard · desktop

Application shell with the full sidebar and the owner dashboard
The 292 px sidebar keeps the grouping from section 5: Dashboard, Tasks, Admissions, Academics, Finance, Staff and reports. The owner works in the "All branches" scope, so the KPI row aggregates three branches, the Alerts block lists debt over 30 days, sessions left unmarked past the 24-hour mark and classes below minimum size, and My tasks holds the approvals waiting on the owner. The bottom table compares each branch against its monthly target.

2 · Branch switcher and data scope

/dashboard · desktop

Branch switcher open on the top bar
Implements decision D1 (tenant = Center, branch = School): the existing accessible_schools list becomes the branch menu on the top bar. "All branches" appears only for owner-level roles and is currently selected; the three branches below show their student counts so the scope is recognisable. The choice applies to every page until changed.

3 · Role-based home · branch manager

/dashboard · desktop

Dashboard for the branch manager
A branch manager sees one branch and has no "All branches" entry. The Awaiting my approval block shows the three approvals the matrix in section 4 assigns to this role: discounts above the self-approval limit, teacher timesheets and debt write-offs. The weekly lead funnel and class fill rate are the two figures this role tracks daily, with Flyers 1C flagged as below minimum size.

4 · Role-based home · accountant

/dashboard · desktop

Dashboard for the accountant
The same shell, with content scoped to branch finance (section 4, PRD 05). The focus is the list of SePay transfers awaiting reconciliation in four states: matched to a receipt, several receipts with the same amount, an amount mismatch to record as a partial payment, and no receipt yet. The right column buckets debt by age, with a reminder about the payroll cut-off tied to the timesheets still pending approval.

5 · Parent portal

/parent · mobile

6 · Teacher today

/teach · mobile

Parent portal entry screen on a phone
Teacher Today screen on a phone
Two separate mobile-first surfaces from the navigation map in section 5. The parent portal (/parent, PRD 07) opens on the selected child, this week's attendance including the make-up session, tuition due with a QR payment button, and the weekly report drawn from FLYER data. The teacher flow (/teach, PRD 04) lists the day's sessions across two branches, the session in progress gets the prominent attendance button, and a banner flags yesterday's session left unmarked past the 24-hour mark.

1Product vision

Trường Số (truongso.net) is FLYER's operating system for English centers and small private schools in Vietnam. It starts from the admissions CRM that exists today at b2c.truongso.net and grows into the daily tool for the whole center: the receptionist who enrolls a child, the academic admin who builds the timetable, the teacher who marks attendance on a phone, the accountant who collects tuition and chases debt, and the owner who reads one dashboard across branches.

The competitive baseline is the category of Vietnamese center-management suites (PSE ONE and peers) that advertise seven modules: admissions, students, training, reports, inventory, finance and the parent contact book, sold per student tier from roughly 199,000 to 1,000,000 VND per month. Trường Số covers the same operational surface, but with three differences that the market leaders do not have:

  1. Learning data inside the operations record. Every student is a FLYER learner. Placement scores, assigned homework, completion rates and AI-graded speaking and writing results already exist in the FLYER platform and appear in the student profile without integration work.
  2. Money flows through verified bank transfer. The existing SePay bank-account link and payment QR make receipts self-reconciling; cash is the exception, not the default.
  3. One design system. The Cloud theme used across FLYER teacher products is the UI language, so a center that already uses teacher.flyer.us recognises every screen.

Success measures (12 months after P1 launch)

MeasureTargetSource
Centers using Trường Số for enrollment and attendance weekly150 tenants, 60% weekly activeTenant activity events
Tuition collected through the product (receipts issued)70% of active tenants issue at least one receipt per monthFinance events
Teacher attendance marked within 24 h of session90% of held sessionsAttendance events
Guardians reached by the contact book60% of active students have a verified guardian channel (Zalo or app)Parent communication
Excel migration completed without support ticket80% of new tenantsImport jobs

2Personas

Owner (Chủ trung tâm)

Runs one to five branches, 200 to 2,000 students. Checks revenue, debt, enrollment and teacher utilisation weekly. Wants numbers without asking staff. Uses a laptop and a phone.

Branch manager (Quản lý chi nhánh)

Owns one branch's targets. Approves discounts, timesheets and write-offs. Watches the lead pipeline and class fill rates daily.

Admissions consultant (Tư vấn tuyển sinh)

Handles 30 to 80 leads a week from Facebook, Zalo and walk-ins. Calls, books trials and placement tests, closes and hands over. Today's CRM user.

Academic admin / front desk (Giáo vụ)

Enrolls students, builds classes and timetables, assigns teachers, handles make-ups and transfers, prints attendance sheets, answers parents at the desk.

Accountant (Kế toán)

Issues receipts, records cash, reconciles bank transfers, chases overdue balances, books expenses, prepares payroll and e-invoices.

Teacher (Giáo viên)

Teaches 10 to 25 sessions a week, often at more than one branch. Marks attendance on a phone in class, writes a two-line session note, assigns homework on FLYER.

Guardian (Phụ huynh)

Receives attendance and fee messages on Zalo, sees the weekly learning report, pays by QR, asks for make-ups. Never installs a separate app if a Zalo link works.

Student (Học viên)

Learns on FLYER apps. In Trường Số the student is a record, not a user, except for adult learners who receive the parent-portal role for themselves.

3Multi-branch tenancy

The existing backend already has two containers: the CRM Center (center_id, string id, created at onboarding) and the FLYER School (school_id, int64, the unit that owns classes, students, tuition and teacher membership). The CRM Customer carries both ids, and GET /v3/crm/me/accessible-schools already returns several schools per CRM user.

Decision D1: Tenant = Center, Branch = School

A tenant is one CRM Center. Each physical branch is one FLYER School under that Center. The existing accessible_schools list becomes the user's branch scope, and the existing school filter dropdown becomes the branch switcher. No new "branch" table is required for phase 1; a branch_profile record (address, phone, rooms, bank account defaults) extends the School.

Consequences: students, classes, tuition and attendance are per branch (per school) as the backend already models them; leads are per center and are assigned a target branch when they convert; reports aggregate across schools of the center.

LevelExisting identifierOwnsSwitcher UI
TenantCenter (center_id)Users and roles, pipelines, sources, channels, tags, packages, custom fields, leads, settings, integrationsNone (one per login); account switcher if the user belongs to several centers
BranchSchool (school_id)Students, classes, sessions, attendance, tuition, bank accounts, staff assignment, inventory, roomsBranch dropdown in the top bar: "Tất cả chi nhánh" for owner-level roles, otherwise the user's branches

4Roles and permission matrix

The CRM already has tenant-defined roles with a permission catalog (GET /v3/crm/permissions-catalog, codes grouped by module) and per-user scope own | team | all. School membership uses the fixed SchoolRole enum OWNER / ADMIN / TEACHER. Decision D2: one role catalog. The CRM role model is extended with the new modules' permission codes; school membership role is derived (teacher flag, admin flag) when a Trường Số role is assigned, so the FLYER teacher apps keep working.

Default roles shipped with every tenant (cloneable, not deletable):

Module permission groupownerbranch_manageradmissionsacademic_adminaccountantteacherparent
Leads and pipeline (PRD 01)allbranchown / teamreadnonenonenone
Students (PRD 02)allbranchcreate via convertbranchreadown classesown children
Classes and scheduling (PRD 03)allbranchreadbranchreadown classes readown children's classes
Attendance (PRD 04)allbranchnonebranch (edit any)readown sessions markown children read
Tuition and finance (PRD 05)allbranch + approve discountsread balanceissue receipts (if granted)branch fullnoneown invoices, pay
Teachers and staff (PRD 06)allbranchnonedirectorycontracts, pay, timesheetsselfnone
Parent communication (PRD 07)allbranchnonesendfee remindersown classesreceive, reply
Inventory (PRD 08)allbranchnoneissuemanagereadnone
Reports (PRD 09)allbranchown funnelacademicfinanceown classesnone
Settings (PRD 10)allbranch profilenonecatalogsfinance settingsnonenone

The full code list per module is in each PRD's Permissions section and consolidated in PRD 10.

5Information architecture and navigation map

The current sidebar shows Tổng quan, Khách hàng, Nhập dữ liệu and Cài đặt trung tâm. The constants file already declares routes for students, classes, attendance and tuition with Vietnamese nav labels, grouped as Tổng quan / CRM & Hiệu suất / Quản lý trường học / Tài chính / Cài đặt. The target navigation keeps that grouping and adds the new modules.

Sidebar (292 px, Cloud theme) Route PRD ───────────────────────────────────────────────────────────────────────────────── Tổng quan /dashboard 09 TUYỂN SINH Khách hàng (pipeline + table) /crm/customers 01 Lịch hẹn & cuộc gọi /crm/schedules 01 Học thử /crm/trials 01 Kiểm tra xếp lớp /crm/placement-tests 01 Nhập dữ liệu /crm/imports 11 HỌC VỤ Học viên /students 02 Lớp học /classes 03 Thời khoá biểu /timetable 03 Điểm danh /attendance 04 Sổ liên lạc /communication 07 TÀI CHÍNH Học phí /finance/tuition 05 Công nợ /finance/debt 05 Thu chi /finance/cashbook 05 Kho /inventory 08 NHÂN SỰ Nhân sự /staff 06 Bảng công /staff/timesheets 06 BÁO CÁO /reports 09 CÀI ĐẶT /crm/settings/* → /settings 10 ───────────────────────────────────────────────────────────────────────────────── Top bar: branch switcher · pipeline selector (CRM pages only) · ⌘K search · bell · user Parent portal (separate shell, mobile-first) /parent/* 07 Teacher mobile flow (PWA) /teach/* 04

Route prefix note: existing CRM routes stay under /crm/* so links in notifications and bookmarks keep working. New modules live at the root (/students, /classes ...) inside the same (dashboard) layout. Settings consolidates under /settings with a redirect from /crm/settings/*.

Object model at a glance

Lead (Customer)StudentEnrollmentClass Placement testGuardianTuition / ReceiptSession Staff / TeacherAttendanceRoom existingexisting + extendnewexisting + extend existingexisting (StudentParent) + extendexisting (Tuition)new existing (TeacherProfile) + new HRnewnew convertenrolls inmember ofgenerates
Core objects and their origin. Arrows read left to right or top to bottom as "produces" or "belongs to".

6What exists today versus what the PRDs add

AreaFrontend todayBackend today (/v3)PRD adds
Auth and onboardingLogin (password, Google), register with OTP, onboarding (sale profile, create or join center)GraphQL v2 viewer mutations; /v3/crm/onboarding/*, /v3/crm/meRole-aware onboarding (first owner sets branches), parent OTP login (07)
Leads / customersKanban + table, filters, drawer create/edit, detail shell with timeline, products, discussions, attachments, assignments, linked learners; bulk archive and reassign; column config; xlsx exportCustomers (60+ endpoints), pipelines, stages, statuses, sources, channels, tags, custom fields, packages, interactions, quick actions, search, notifications, today plan, dashboard01: trial bookings, callback queue, conversion wizard to enrolled student, lead retention rules; fixes: sources/channels settings pages use the API instead of localStorage mocks
Placement testsList, create, submit result modal/v3/crm/placement-tests, /v3/teacher/placement-test/send, FLYER report schema01: status labels aligned to API enum, result to class-level suggestion
StudentsNone (route constant only)school-finance/students list and detail, StudentProfile, StudentParent, StudentStats, StudentScoreEntry, learner search02: student record with status lifecycle, guardians (multiple), enrollment history, documents, notes, consent
ClassesNone/v3/teacher/classes, ClassSchedule (recurrence + program lessons), class-schedules/{id}/remind, Course (price, lessons, pricing method)03: rooms, physical sessions calendar, capacity, teacher and substitute assignment, make-up, timetable views, conflict checks
AttendanceNoneNone04: entire module
TuitionNoneTuition (cost, amount, discount, VAT, status, transactions CASH/BANK_TRANSFER, SePay), GroupInvoice, stats, notify (app/email/zalo), bank accounts, company legal profile, payment QR, parent tuition views05: fee plans and session packages, session balance, discounts and vouchers, receipts numbering, partial payment, debt aging, refunds and credit notes, expenses, e-invoice hook, revenue reports
Teachers and staffUsers page (CRM sale profiles) with mock school-access callTeacherProfile, school membership, rollup KPIs, sale profiles and roles06: staff directory, contracts, pay rules, timesheets, evaluations
Parent communicationNoneParent tuition list, learner report, weekly report; notify channels app/email/zalo on tuition and class reminders07: announcements, contact-book messages, Zalo OA/ZNS configuration, parent portal, consent
InventoryNoneNone08: entire module
ReportsSales dashboard (sale and manager cards, funnel, trend, top sales), drill-down page5 dashboard endpoints09: executive dashboard across modules, academic and finance reports, exports
SettingsUsers, roles (update only), sale permissions, tags (API), sources and channels (mock), tenant (not persisted)Roles, permissions catalog, sale profiles, view configs, custom fields, school config10: branch profiles, rooms, catalogs for the new modules, integrations, audit log viewer, notification templates
Imports3-step wizard for leads with xlsx template and error reportImportJob for customers11: import for students, guardians, classes, enrollments, opening balances, staff

Known inconsistencies to resolve in P1

7Phasing

PhaseScopeExit criterion
P1 (Q4/2026)00, 01 (conversion, trials), 02, 03 (classes, timetable, sessions), 04, 05 (fee plans, receipts, debt), 07 (Zalo ZNS attendance and fee messages), 09 (executive dashboard v1), 10 (branches, roles, catalogs), 11 (imports), 12 baselineThree pilot centers run enrollment, attendance and tuition for one full month without Excel
P2 (Q1/2027)05 (vouchers, refunds, expenses, e-invoice), 06 (contracts, pay, timesheets), 07 (parent portal, announcements), 08, 09 (academic and finance reports), 12 hardening (2FA, PDPD tooling)Payroll sheet and e-invoice used by pilot accountants
P3 (Q2/2027)06 evaluations, leave; 07 two-way chat; 09 custom report builder; Vietnam data regionFeature parity with the category baseline plus learning data differentiators

8Decisions to ratify

  1. D1 Tenant = Center, Branch = School (section 3).
  2. D2 One role catalog extending CRM roles; school role derived (section 4).
  3. D3 Lists over boards: the pipeline keeps its Kanban as an option, but every new module ships a table view first and no board.
  4. D4 The enrolled student is the FLYER learner profile; conversion always creates or links a learner account so learning data is attached from day one.
  5. D5 Sessions are materialised rows generated from the class schedule, and attendance and timesheets hang off sessions, not off the schedule template.
  6. D6 Finance reuses the Tuition and GroupInvoice models; session packages are a fee plan type, and the student session balance is a maintained summary.
  7. D7 Guardians are contacted through Zalo ZNS first, in-app second, email third; SMS is not built.
  8. D8 Existing CRM routes stay under /crm; new modules are root routes in the same shell.
  9. D9 Vietnamese is the product language; English is a full second locale from day one, and all strings live in message files.
  10. D10 Inventory, staff pay and e-invoice are phase 2; phase 1 ships the daily loop of enroll, schedule, attend, collect, report.

Trường Số (truongso.net) · FLYER internal