FLYER · Product PRD · Đặc tả toàn sản phẩm
🇻🇳 Tiếng Việt · EN English

🎯 IELTS Guru — ieltsguru.ai

IELTS Guru là sản phẩm luyện thi IELTS AI-first của FLYER: mock test theo từng kỹ năng với chế độ thi thật, chấm AI Speaking và Writing với chi phí bằng một phần nhỏ kỳ thi thật, AI Mentor để chat và luyện nói, cùng mô hình kinh doanh kim cương + gói thuê bao. Trang PRD này đặc tả 100% sản phẩm đang chạy: toàn bộ routes, luồng, business rules, data model và các gap đã biết — từ việc quét trực tiếp codebase flyer/webs-ielts cộng số liệu mới từ database production.

Phiên bản
1.0
Ngày
24/08/2026
Owner
Tùng (Product)
Trạng thái
Đang chạy production
📈 Production (24/08/2026)207.767 lượt làm bài all-time28.195 học viên all-time11.612 lượt / 30 ngày661 học viên active / 30 ngàychạy từ 22/10/2024
📚 Nội dung1.789 parts3.550 câu hỏi4 kỹ năngđếm từ read replica production, các bảng ielts_*
🔗 Link sản phẩmieltsguru.ai ↗Đề Listening ↗Đề Reading ↗Đề Speaking ↗Đề Writing ↗Bảng giá ↗

1Bối cảnh, định vị & stack

IELTS Guru nhắm đến người học cần luyện IELTS sát đề thật không giới hạn và nhận phản hồi chất lượng chuyên gia ngay lập tức, không phải trả tiền thi thật hay thuê gia sư riêng. Câu định vị: "AI Mentor for smart IELTS preparation" — sản phẩm quảng bá chấm AI Speaking/Writing với chi phí bằng 1/50 kỳ thi thật. Phục vụ cùng lúc 3 nhóm: B2C tự học tại Việt Nam, B2C quốc tế (giá USD qua Polar), và B2B trường học qua white-label custom domain (có tenant riêng cho ACCA tại acca.teado.ai).

Mục tiêu. (1) Cho người học IELTS luyện sát đề thật không giới hạn theo từng kỹ năng. (2) Thay chấm tay đắt đỏ bằng AI chấm band + phản hồi hành động được. (3) Nuôi hệ sinh thái FLYER: tài khoản dùng chung, bài giao của giáo viên, kỳ thi trường học, gói thuê bao theo band.

2Người dùng & user stories

Vai tròUser storyƯu tiên
Người tự họcLàm mock test simulation đầy đủ một kỹ năng đúng điều kiện thi thật (đồng hồ, audio phát một lần, chống gian lận) và nhận band score.P0
Người tự họcNhận phản hồi AI Writing theo đúng 4 tiêu chí chấm band chính thức, sửa lỗi tới từng câu, kèm bài mẫu.P0
Người tự họcNhận phản hồi AI Speaking: transcript, phát âm từng từ (IPA, phoneme) và điểm fluency/grammar/vocab.P0
Người tự họcLuyện linh hoạt: chọn part, tự đặt giới hạn thời gian, làm lại câu hỏi, dùng từ điển/ghi chú trong lúc luyện.P0
Học viênNói chuyện với AI Mentor — chat tự do hoặc Topic Talk bằng giọng nói có learning outcomes — để luyện tiếng Anh giao tiếp.P0
Học viênTheo dõi tiến độ: đường band theo thời gian, radar kỹ năng, độ chính xác, thời gian học, band mục tiêu và số ngày tới kỳ thi.P1
Học viênÔn lại lỗi sai: câu trả lời sai kèm giải thích, từ phát âm sai được thu âm lại và chấm lại, sổ từ vựng.P1
Học sinh trườngVào phòng thi nhiều kỹ năng do trường tổ chức có giám sát, vi phạm được báo về giáo viên.P0 (B2B)
Giáo viên (qua teacher.flyer.us)Giao đề thành mission có deadline, ẩn đáp án, xem và chấm tay bài của học sinh.P1
Khách vãng laiXem toàn bộ thư viện đề, thậm chí làm bài bằng hồ sơ ẩn danh trước khi được mời đăng ký.P1 (funnel)

3Kiến trúc thông tin & routes

App một khung sidebar trái (không có footer). Ngôn ngữ: en (mặc định, không prefix) và /vi. Chặn đăng nhập kiểu mềm: không có middleware hay chặn phía server — khách vãng lai nhận toast "mời đăng ký" tắt được ở mọi trang trừ một danh sách loại trừ nhỏ, còn sidebar chặn click vào các mục cần tài khoản để mở modal đăng nhập.

RouteChức năngTruy cập
//homeDashboard: lời chào, ô "Personal AI Teacher" nhập tự do (tạo phiên AI chat), thẻ kỹ năng kèm số mock test/đề, lối vào Speaking Topics, popup kỳ thi trường sắp diễn ra.Công khai
/librariesThư viện học liệu gộp. Hai hàng: Study (đề luyện IELTS do FLYER biên soạn) và Quiz (đề cộng đồng/đối tác). Tab All / FLYER / Community / My school; filter lưu trên URL (tìm kiếm, kỹ năng, band, dạng câu, sắp xếp).Công khai
/ielts/{skill} ×4Danh sách mock test theo kỹ năng (listening, reading, writing, speaking) với filter topic/dạng câu/sắp xếp/part và cuộn vô hạn.Công khai
/ielts/{skill}/[id] ×4Chi tiết đề + màn làm bài trong cùng một route: preview → chọn chế độ → (kiểm tra loa/mic) → làm bài. SSR cho SEO meta.Công khai → gate khi bắt đầu
/ielts/{skill}/result/[id] ×4Màn điểm sau khi nộp; poll 3 giây/lần trong lúc AI đang chấm.Đăng nhập
/ielts/{skill}/report/[id] ×4Báo cáo chi tiết: đáp án + giải thích (L/R), phản hồi tiêu chí V2 (W), transcript + phát âm (S). Báo cáo Speaking cố tình để công khai, share được.Đăng nhập (S: công khai)
/practice/[id] + result/reviewEngine quiz: 13 dạng câu hỏi gồm kéo-thả, nối, flashcard, video tương tác, thu âm trả lời, câu mở chấm bằng AI.Công khai → đăng nhập
/test-results/[id]Xem lại bài Listening/Reading trong đúng giao diện lúc thi, chỉ đọc.Đăng nhập
/real-time-conversation{,/chat,/chat/[id],/topic,/topic/[id]}Hub AI Mentor: chat streaming và Topic Talk giọng nói với avatar nhép môi.Đăng nhập
/missionBài tập giáo viên giao: danh sách đang làm và đã xong, deadline, luật nộp muộn.Đăng nhập
/mistakes (+ ?currentTabMistakes=notes)Luyện phát âm từ sai + Sổ từ vựng (hai tab trong một route).Đăng nhập
/historyBảng toàn bộ lượt làm bài (desktop) / thẻ (mobile) kèm filter; mỗi dòng mở đúng trang kết quả/báo cáo.Đăng nhập
/learning-profileDashboard phân tích: 6 thẻ chỉ số, biểu đồ đường band trung bình, radar kỹ năng, modal đặt band mục tiêu.Đăng nhập
/packages · /diamonds-previewBảng giá gói thuê bao · nạp kim cương.Công khai
/login /signup /recover /logout /join-class /join-placementest /active-accountTrang đăng nhập/đăng ký, vào lớp bằng mã, form placement ACCA, nhập mã kích hoạt.Hỗn hợp
/profiles /create-profile /settings/profiles /settings/themeChuyển hồ sơ người học (tối đa 20/tài khoản), form hồ sơ, giao diện (8 màu + dark) và ngôn ngữ.Đăng nhập
/api/*ping (health), cookies, link-preview, bug-report (→ Google Apps Script), imgproxy, polar-link-payment, student-chat/[id] + student-call/[id] (proxy SSE trên edge), file well-known cho Apple/Android.

Sidebar (desktop = drawer mobile): Mock tests → /, Study → /libraries, Missions, Mistakes, Vocabulary book, Learning profile, History; khối dưới: Teacher role (mở teacher.flyer.us), popup Thông báo, số kim cương → /diamonds-preview, popup avatar (Upgrade → /packages, Đổi giao diện, Mã kích hoạt, Đổi hồ sơ, Sửa hồ sơ, Đăng xuất).

4Mô hình nội dung & kho đề

Toàn bộ nội dung nằm trong container CheckPoint dùng chung giữa các sản phẩm FLYER, với các cạnh part riêng cho IELTS theo kỹ năng. Mọi dạng câu hỏi hiển thị (MCQ, T/F/NG, nối, chọn heading, điền form…) đều được ghép từ đúng 3 primitive, điều khiển bằng placeholder <blank id> trong contentHtml:

CheckPoint (đề) ── time · maxGrade · diamond (giá chấm AI) · isPremium · ieltsBand · topics
 ├─ IeltsListeningPart { audio, audioSubtitle (tapescript), expiredTime, questions[] }
 ├─ IeltsReadingPart   { contentHtml (bài đọc), expiredTime, questions[] }
 ├─ IeltsWritingPart   { contentHtml, images[], sampleAnswerHtml, learnFromSampleHtml }
 ├─ IeltsSpeakingPart  { info{introductionText,audio}, questions[]{ timeToThink, timeToSpeak,
 │                       sampleAnswerHtml, sampleAnswerAudio } }
 └─ Question → details[] { detailType: GAP_FILL | SELECT | OPTION,
                           options[{label,text,correctAnswer}], explainHtml/En }

Kho đề & usage production (read replica, 24/08/2026)

Kỹ năngPartsCâu hỏiLượt làm partLượt trả lời câu
Listening48885796.011165.128
Reading4611.25860.770150.434
Speaking3421.36137.917149.311
Writing4987438.5854.122
Tổng1.7893.550233.283468.995

Writing ít "câu hỏi" vì phần lớn writing task là đề bài luận cấp part, không chia câu. Ghi chú học viên lưu trong bài: 3.564 dòng (ielts_notes).

5Luồng mock test & practice

Hai chế độ trên mọi đề

Chế độ PracticeChế độ Simulation (thi thử)
PartsHọc viên chọn tuỳ ý (Speaking: đúng 1 part)Toàn bộ parts, thứ tự cố định
Đồng hồTự chọn 15/30/45/60 phútΣ thời gian các part, hết giờ tự nộp
AudioTua/dừng/nghe lại tự doPhát một lần, ẩn nút điều khiển; đề Speaking được nghe lại tối đa 2 lần
Đề bàiHiện theo cài đặt nội dungSpeaking: ẩn trừ Part 2
Công cụTừ điển, dịch, highlight, ghi chúTắt từ điển/dịch; chặn copy/paste
Chống gian lậnÉp fullscreen; chuyển tab/thoát fullscreen tính là vi phạm, modal cảnh báo, ẩn popup extension; violationCount nộp kèm bài

Luồng từng kỹ năng

  1. Listening / Reading: Preview (thẻ chọn chế độ + giá kim cương + chọn chấm AI hay giáo viên) → kiểm tra loa (chỉ Listening) → màn làm bài với state react-hook-form, đồng hồ đếm từng giây, bảng câu hỏi theo part, trình phát Howler (Listening) hoặc splitter bài đọc/câu hỏi kéo được (Reading) → mỗi câu trả lời tự lưu qua submitPartAttempt → Nộp hoặc hết giờ → endAttempt(violationCount) → trang kết quả.
  2. Writing: Preview với radio chọn cách chấm (Giáo viên — chỉ khi có canRequestTeacher — hoặc FLYER AI) → màn chia đôi: đề + hình bên trái, ô luận bên phải có đếm từ trực tiếp (cảnh báo mềm ở 500 từ, chặn cứng kèm toast) → tự lưu khi blur → nộp → trang kết quả poll trong lúc AI chấm.
  3. Speaking: Preview (practice 1 part hoặc simulation đủ) → kiểm tra loa + mic (thu âm chỉ tại máy) → mỗi part: intro chạy chữ → mỗi câu: audio đề → đếm ngược suy nghĩ (timeToThink) → tự động bắt đầu thu, vòng tròn chạy theo timeToSpeak, tự dừng → upload (RecordRTC mono 16 kHz → /recordrecordId) → nộp từng câu (+ ghi chú tuỳ chọn ở simulation) → đồng hồ part có thể ép nộp câu đang dở → kết thúc bài → kết quả.
  4. Kỳ thi trường học (B2B, feature flag student_school_exam): popup chặn liệt kê các phiên thi theo kỹ năng kèm trạng thái; "Enter exam" mở đề với ?examId&sessionId&examMode=1 — ẩn hẳn chế độ Practice, attempt được nối vào phiên thi qua REST (link-attempt), vi phạm còn được báo trực tiếp về POST /v3/learner/exams/cheats.
Tính band. Tính phía server. Bài đủ → band 0–9 hiển thị X.X/9.0 (trang report làm tròn nửa band gần nhất); bài lẻ/practice → hiện số câu đúng/tổng thay vì band; Speaking ưu tiên teacherGrade hơn điểm AI khi có cả hai. Không có bài thi gộp 4 kỹ năng trong app — thi nhiều kỹ năng được tổ chức dưới dạng phiên thi trường học.

6Chấm AI — Writing & Speaking

Writing

Speaking

7AI Mentor (Bingo)

8Tiến độ, báo cáo & công cụ học

Công cụHành vi
Màn kết quảBand hoặc điểm thô kèm pháo hoa; 4 trạng thái: đã có điểm / chờ AI (loader Rive, poll 3s) / chờ giáo viên / không yêu cầu chấm (mời "Làm lại với FLYER AI"). L/R tự mở phần xem đáp án; ẩn toàn bộ khi giáo viên giao bài đặt isHiddenAnswer.
Report chi tiết L/RCột điểm: số câu đúng/tổng, thời gian làm, band nửa điểm, lưới đáp án 2 cột (bài làm vs đáp án, nối bằng "or"). Cột chi tiết: audio theo part + tapescript bật/tắt (Listening), câu hỏi hiển thị lại chỉ đọc với ✅/❌, accordion giải thích (EN/VI).
HistoryBảng phân trang cursor, tìm kiếm debounce, filter kỹ năng/loại/trạng thái; mỗi dòng mở đúng trang kết quả/report ở tab mới kèm ?url_back. Badge cho mã thách đấu và placement test.
Learning profileChọn kỳ (hôm nay → toàn thời gian); 6 thẻ chỉ số (bài hoàn thành, thời gian học, độ chính xác, band mục tiêu, ngày thi, số ngày còn lại); biểu đồ đường band trung bình; radar 4 kỹ năng có nhãn "cần cải thiện"; modal mục tiêu ép bước .0/.5 và điểm vào < mục tiêu.
Luyện từ saiTừ phát âm sai kèm TTS chuẩn vs bản thu của học viên; thu âm lại và chấm lại (phản hồi IPA từng phoneme) trong hạn mức chấm lại; filter theo CEFR và trạng thái.
Sổ từ vựngGhi chú gộp theo đề, sửa được định nghĩa, có TTS, tạo từ tooltip highlight trong bài (Note / Highlight / Dictionary trên đoạn text bôi chọn).

9Tài khoản, đăng nhập & multi-tenant

10Monetization & các lớp gate

Gói thuê bao (FLYER IELTS PRO)

GóiGiá VN (VND)Giá gốcGiá USCheckout
3 tháng790.0001.000.000$49VN → checkout trên exam.flyer.us (VNPay); US → Polar (product ID hardcode); mặc định chọn gói 6 tháng
6 tháng1.550.0002.400.000$89
12 tháng2.320.0003.900.000$149

Nạp kim cương (tiền tệ chấm AI)

GóiKim cươngGiá (VND)
Trial2525.000
Basic5050.000
Pro Learner ⭐12599.000 (gốc 125.000)

Ví = diamond (mua) + freeIeltsDiamond (thưởng), có popover tách hai nguồn. Kênh thứ ba: mã kích hoạt nhập tại /active-account (cộng ngày gói + kim cương, có lịch sử mã đã dùng).

Bốn lớp gate độc lập

  1. Quyền gói — đề khoá (isPremium / viewerCanAccess) chuyển user đã đăng nhập chưa mua sang /packages.
  2. Quyền theo band — gói mang khoảng bandFrom–bandTo; filter band và kho đề nhìn thấy bị giới hạn trong khoảng đó (gói cũ = toàn bộ band 0–10).
  3. Kim cương theo lượt — chấm AI Speaking/Writing trừ giá kim cương của đề; kiểm soát phía server (NOT_ENOUGH_DIAMOND).
  4. Chấm giáo viên — lựa chọn "Request scoring from teacher" chỉ hiện khi hồ sơ có canRequestTeacher.

Attribution: cookie UTM (TTL 24h), referral_code (member-get-member, mới chỉ ghi nhận — chưa có UI giới thiệu), ?ref domain nguồn vào đăng ký. Analytics: GTM + GA4, Firebase Analytics, Meta Pixel; Sentry bắt lỗi. Banner smart-app iOS + universal links về com.flyer.ielts.

11Data, API & hạ tầng

Bề mặt API

Thực thể chính

CheckPoint (container nội dung dùng chung, ~80 trường) → parts theo kỹ năng → câu hỏi → 3 primitive; UserAttempt (~55 trường — một thực thể attempt cho mọi sản phẩm FLYER, gồm part attempts theo kỹ năng, các trường band/điểm, chấm AI + giáo viên, số vi phạm, thưởng gamification); User (ví, gói + quyền band) → tối đa 20 LearnerProfile (band mục tiêu, ngày thi, streak, quota AI speaking, trường/lớp, custom domain). Bảng production: 22 bảng ielts_* trên read replica (parts/câu hỏi/attempts theo kỹ năng + ghi chú).

Hạ tầng

12Edge cases & xử lý lỗi

Tình huốngXử lý
Thiếu kim cương lúc bắt đầuBackend trả NOT_ENOUGH_DIAMOND; modal điều hướng nâng cấp (hiện đang trỏ /packages — xem gap #5).
Lỗi attempt nói chungBảng phân loại 16 mã lỗi trên hai kênh, mỗi mã map sang toast-hay-modal, khoá i18n và hành động (login / result / diamond / back / restart / retry); độ chặn tuỳ pha — start chặn hẳn, submit chủ yếu toast, end luôn cho lối ra.
Đồng hồ về 0Tự nộp; Speaking còn dừng máy thu, ép nộp câu đang dở với lưới an toàn 20 giây.
Thoát fullscreen / chuyển tab trong simulationĐếm vi phạm + modal cảnh báo + nháy tiêu đề tab; nuốt phím ESC và vào lại fullscreen; số vi phạm gửi kèm end-attempt và (trong kỳ thi trường) báo gian lận trực tiếp.
Đăng nhập nơi khácSự kiện subscription trực tiếp → toast chặn "đã bị đăng xuất từ X" kèm đăng nhập lại.
Bỏ dở câu SpeakingGuard theo thế hệ upload loại các audio upload muộn thuộc câu học viên đã rời đi.
AI chấm chậm/lỗiPoll 3 giây; Speaking dừng lịch sự sau 2 phút; Writing giữ skeleton đến khi có phản hồi.
Giáo viên ẩn đáp ánisHiddenAnswer ẩn toàn bộ phần xem đáp án và đẩy route review về trang chủ.
Khách vãng lai vào trang cần tài khoảnSidebar chặn bằng modal đăng nhập; gõ thẳng URL thì trang hiện khung rỗng (query bị skip) thay vì redirect.
imgproxy sập307 fallback về trình tối ưu ảnh của Next, không vỡ ảnh.

13Gaps & nợ kỹ thuật đã biết

Phát hiện trong đợt quét toàn bộ codebase — mỗi mục hoặc là quyết định product cần chốt, hoặc là việc cần xếp lịch sửa.

#Phát hiệnLoại
1Chưa có placement test, bộ câu hỏi onboarding hay lộ trình học sinh tự động. "Personalized roadmap" mới chỉ nằm trong mô tả SEO; placementLevel, onboardingInfo và flag STUDENT_ONBOARDING chỉ có ở data model. Band mục tiêu được lưu nhưng chưa dùng để gợi ý nội dung.Gap product
2Tiếng Việt bị tắt cứng lúc runtime: cả hai nhánh của check IP đều gọi setLanguage("en"), đè cả lựa chọn tay ở lần tải sau.Bug
3Khách quốc tế chưa đăng nhập thấy giá sai: isFlyerUs trả false cho mọi người chưa đăng nhập, nên khách US thấy giá VND và checkout VN.Bug
4Chưa có đường Polar cho kim cương — người dùng quốc tế mua được gói nhưng không nạp được kim cương (tiền tệ chấm AI).Gap product
5NOT_ENOUGH_DIAMOND điều hướng về /packages (bán gói) thay vì /diamonds-preview (bán kim cương).UX
6Chưa có luồng xoá tài khoản (chỉ còn chuỗi lỗi mồ côi) — rủi ro App Store 5.1.1(v) vì app iOS nối thẳng vào đây.Compliance
7DetailedFeedbackSpeaking (phản hồi Speaking theo band descriptors kiểu Writing V2) đã có trong schema nhưng web chưa dùng.Roadmap
8Chế độ "Free talk / Call Bingo" đã dịch và làm một phần nhưng chưa nối vào màn chọn chế độ; /v3/learner/journey/continue sinh hook nhưng chưa gọi.Roadmap
9Thương hiệu/domain chưa nhất quán: canonical, robots.txt, sitemap và success URL của Polar đều trỏ ielts.flyer.us; SEO title từng trang vẫn ghi "FLYER IELTS Virtual Testing Platform". Chuyển hẳn sang ieltsguru.ai động tới ~7 file đã xác định.Brand
10Sitemap là 12 URL tĩnh hardcode — không có trang chi tiết đề, không có /packages; phần sinh động đã bị comment.SEO
11Secrets commit trong repo: token Polar thật, config Firebase, mật khẩu Redis và nhiều key khác nằm trong các file .env* đã commit — cần xoay vòng và chuyển vào secret store.Bảo mật
12Redirect premium chỉ chạy với user đã đăng nhập — paywall gói lách được bằng cách đăng xuất (làm bài ẩn danh vốn là chủ đích).Cần chốt
13Route chết còn được tham chiếu (màn thách đấu, /verify-account, /update-profile, /checkout…), ô SĐT disabled gắn console.log, daily reward nối dở, các tab settings (general/notifications/privacy) dịch rồi nhưng chưa build, theme GAMIFICATION đã nghỉ = cây code lớn không chạy tới.Nợ kỹ thuật
14Feedback của học viên đổ vào Google Sheet qua Apps Script (widget báo lỗi), không vào database sản phẩm; kênh hỗ trợ là Zalo.Vận hành

14Acceptance criteria & tương lai

Acceptance criteria (đã kiểm chứng trên production, 24/08/2026)

  1. Cả 4 kỹ năng đều có chế độ Practice và Simulation với các khác biệt ở §5; simulation ép fullscreen chống gian lận và nộp violationCount.
  2. Report AI Writing trả phân tích band 4 tiêu chí với feedback tiêu chí con song ngữ và sửa lỗi tới từng câu; report AI Speaking trả transcript + phát âm từng từ với IPA/phoneme; cả hai poll 3 giây.
  3. Trừ kim cương kiểm soát phía server, tính cả quota miễn phí; ví = kim cương mua + kim cương thưởng.
  4. Gói theo band giới hạn kho đề nhìn thấy qua quyền bandFrom–bandTo.
  5. Phiên thi trường học ẩn chế độ Practice, nối attempt vào phiên thi và báo gian lận trực tiếp.
  6. Khách vãng lai xem và làm bài được trên hồ sơ ẩn danh; một tài khoản tối đa 20 hồ sơ với ép một phiên duy nhất.
  7. Số liệu production trên trang này tái lập được từ read replica (bảng ielts_*; usage = user_attempts.type_attempt='IELTS').

Đề xuất bước tiếp theo (từ danh sách gaps)


← Danh mục PRD · Nguồn: quét trực tiếp flyer/webs-ielts nhánh dev (24/08/2026) + read replica production của FLYER · Nội bộ FLYER.