---
url: https://docs.nemo12.com/product/referral-and-credit.md
description: >-
  Rủ bạn cùng học và tài khoản ảo của member (chỉ đạo 22.09.2026): trang giới
  thiệu, link referral, ghi công người giới thiệu.
---

# Rủ bạn cùng học và tài khoản ảo của member

Chỉ đạo chủ dự án 2026-09-22: *"Tạo một page riêng, giúp learner có thể gửi link referral, để khi người khác nhận được link rồi login vào hệ thống, thì người đi giới thiệu sẽ được ghi nhận, và có thông tin. Nếu người được referral mà trở thành paid member, thì người đi giới thiệu cũng nhìn thấy thông tin. Người đi giới thiệu được 10%, người nhận giới thiệu được giảm 10% so với giá tiêu chuẩn. 10% hoa hồng đó được cộng thêm vào tài khoản ảo của mỗi member. Việc đổi từ con số đó ra tiền mặt là một tính năng riêng, tôi sẽ làm sau."*

## 1. Việc mà tài liệu này giải

Phần lớn thứ chỉ đạo trên mô tả **đã chạy trên production** từ SRC-450 và SRC-754: trang riêng, mã mỗi người, ghi công lúc đăng nhập, bảy mốc hoạt động, ba lá thư. Tài liệu này tồn tại vì hai lý do khác:

1. **Mô tả ấy chưa từng nằm ở một chỗ.** Nó rải trong một dòng bảng của PRD-001, một mục của [emails.md](../reference/emails/index.md), ba migration và một module code. Người muốn biết "referral của Nemo12 hoạt động thế nào" phải đọc bốn nơi và tự ghép. Một dòng bảng không đủ chỗ cho một tính năng có sáu luật chống gian lận.
2. **Chỉ đạo hôm nay mở một thứ thật sự mới: tài khoản ảo.** Trước hôm nay, hoa hồng là một dòng `pending` không đi đâu cả, vì Nemo12 chưa có cổng thanh toán và hứa tiền trước khi trả được là hứa suông. "Cộng vào tài khoản ảo" tháo đúng nút thắt đó: nó biến một lời hứa tiền mặt thành một **số dư nội bộ** — thứ Nemo12 tự phát hành, tự ghi sổ và tự tiêu được, không cần ngân hàng đứng giữa.

**Ngoài phạm vi, và cố ý:** quy đổi số dư ra tiền mặt (chủ dự án nói rõ "sẽ làm sau"), cổng thanh toán online, và mô hình thu phí (Q-014/Q-015 vẫn mở).

## 2. Bốn người trong câu chuyện

| Vai | Họ muốn gì | Họ sợ gì |
| --- | --- | --- |
| **Người đi giới thiệu** | Biết người mình rủ có dùng thật không, và mình được gì | Rủ xong rơi vào im lặng, không biết có được ghi công |
| **Người được giới thiệu** | Vào học, và biết mình đang được giảm giá | Bị coi như một món hàng ai đó vừa bán được |
| **Chủ dự án** | Người học mới, với chi phí thấp hơn quảng cáo | Trả 10% cho những lượt không mang ai mới vào |
| **Phụ huynh của learner** | Con mình không bị người lạ thu thập thông tin | Tên thật của con hiện trên màn hình người không quen |

Hai nỗi sợ cuối là nguồn của phần lớn luật trong §5 và §6. Chúng không phải rủi ro lý thuyết: cả hai đã được chỉ ra bằng kịch bản cụ thể khi rà soát SRC-754.

## 3. Yêu cầu — trang giới thiệu

| # | Yêu cầu | Trạng thái |
| --- | --- | --- |
| R-01 | Trang riêng có URL riêng, sau đăng nhập: `learn.nemo12.com/referral` cho learner, cùng một trang trên `marlins.nemo12.com` cho phụ huynh. Vào được từ menu chính ("Rủ bạn") | ✅ đang chạy |
| R-02 | Mỗi người **một mã cố định trọn đời**, sinh lần đầu họ mở trang. Không có chuyện mỗi lần bấm sinh một mã mới | ✅ đang chạy |
| R-03 | Mã viết **CHỮ HOA**, và lúc tra thì chuẩn hoá: bỏ dấu cách, bỏ gạch nối, đổi về hoa. Người gõ tay `nem-7k2` vẫn vào đúng | ✅ đang chạy |
| R-04 | Trang hiện link đầy đủ, nút chép một chạm, và tỷ lệ ưu đãi **hiện hành** đọc từ bảng giá chứ không viết cứng trong giao diện | ✅ đang chạy |
| R-05 | Trang hiện: số người đã vào qua link, danh sách từng người, và số dư quyền lợi gom theo trạng thái | ✅ đang chạy |

## 4. Yêu cầu — ghi công

| # | Yêu cầu | Lý do |
| --- | --- | --- |
| R-10 | Ghi công **ngay khi người được giới thiệu đăng nhập lần đầu**, không đợi mốc nào khác | Đây là thời điểm duy nhất biết được ai giới thiệu ai; để muộn là mất |
| R-11 | Link mời phải **sống sót qua vòng Google OAuth** — mã lưu lại trước khi rời trang, đọc lại sau khi quay về | Vòng OAuth đưa người dùng qua tên miền khác rồi trả về một URL sạch; không giữ thì mã bốc hơi. Lỗ này đã từng làm **mất trắng** mọi lượt giới thiệu phía learn cho tới 16.09.2026 |
| R-12 | **First touch thắng, trọn đời.** Mỗi người chỉ được ghi công đúng một lần và không ai đổi được người giới thiệu của mình về sau | Ghi công là nền của tiền; một nền sửa được là một nền tranh chấp được |
| R-13 | Cửa sổ ghi công **30 ngày** kể từ lúc bấm link | Bấm hôm nay đăng nhập sang năm thì lượt giới thiệu ấy không còn là nguyên nhân của việc đăng nhập nữa |

## 5. Yêu cầu — chống gian lận

Sáu luật, mỗi luật đóng một lỗ đã chỉ ra được bằng kịch bản có thật. Bốn luật đầu đặt ở **tầng dữ liệu** (ràng buộc trong schema), không ở tầng code — vì một luật mà code phải nhớ đi kiểm là một luật sẽ có ngày quên.

| # | Luật | Kịch bản nó chặn |
| --- | --- | --- |
| R-20 | Mã phải có thật | — |
| R-21 | Không tự giới thiệu chính mình | Lập email thứ hai để tự ăn cả hai đầu ưu đãi |
| R-22 | Mỗi người được ghi công một lần trọn đời | Đổi người giới thiệu sau khi thấy ai trả cao hơn |
| R-23 | **Không giới thiệu chéo hai chiều** | Hai phụ huynh đã dùng Nemo12 nửa năm đổi mã cho nhau: mỗi người ăn cả giảm giá lẫn hoa hồng, mà không mang người mới nào vào. Đây là mất tiền trực tiếp |
| R-24 | Người được giới thiệu phải là **người mới** | Cùng lý lẽ với R-23, cho vòng dài hơn hai người |
| R-25 | **Hai bên phải cùng vai**: phụ huynh giới thiệu phụ huynh, learner giới thiệu learner | Một người lớn bất kỳ rải link `learn.nemo12.com/?ref=…` vào nhóm chat của trẻ con; mọi đứa đang đăng nhập mà bấm vào đều bị ghi công, và trang giới thiệu của người lạ ấy liệt kê **họ tên thật trên Google** của từng đứa kèm ngày tham gia. Bố mẹ không được hỏi, không được báo |

R-25 là luật đắt nhất trong danh sách và cũng là luật dễ bỏ sót nhất, vì nó không bảo vệ tiền — nó bảo vệ trẻ con.

## 6. Yêu cầu — người giới thiệu được biết gì

Đây là chỗ hai mong muốn cắn nhau: người rủ muốn biết người mình rủ có học thật không; người được rủ không đăng ký để bị theo dõi. Đường phân ranh:

| Được thấy | Không bao giờ thấy |
| --- | --- |
| Tên hiển thị, ngày tham gia | Email, số điện thoại, trường lớp |
| Danh sách **mốc** đã đi qua, mỗi mốc một câu viết sẵn + một ngày | Điểm số, bài làm, nội dung học, lịch học |
| Trạng thái quyền lợi của chính mình | Bất kỳ thứ gì người kia không tự nói ra |

Bảy mốc, chọn theo đúng một tiêu chí: **đọc được từ dữ liệu đã có**. Một mốc đòi thêm chỗ ghi mới ở nơi khác là một mốc sẽ mãi mãi bằng không.

| Mốc | Nghĩa |
| --- | --- |
| `joined` | Đã được ghi công |
| `learner_linked` | Đã có hồ sơ học thật |
| `diagnostic_done` | Xong một bài chẩn đoán đầu vào |
| `first_lesson` | Có bằng chứng học đầu tiên |
| `active_week` | Học từ 3 ngày trở lên trong một tuần |
| `course_enrolled` | Vào một khoá có lịch |
| **`paid`** | **Có quyền học mua bằng tiền** (không phải admin cấp tay) |

Mốc `paid` chính là "trở thành paid member" trong chỉ đạo. Nó phân biệt được **mua bằng tiền** với **admin cấp tay** — cần phân biệt vì chỉ trường hợp đầu mới sinh hoa hồng.

**R-30:** mỗi mốc ghi lại **một lần, trọn đời**, kèm thời điểm chuyện *xảy ra* — không phải thời điểm hệ *nhìn thấy* nó. Tính lại từ dữ liệu thô mỗi lần đọc thì "lần đầu tiên" trôi theo dữ liệu: một learner bị lưu trữ, một dòng bằng chứng bị xoá, và cái mốc đã báo cho người giới thiệu tuần trước biến mất khỏi màn hình tuần này. Câu chuyện kể cho người giới thiệu không được tự sửa sau lưng họ.

**R-31:** người được giới thiệu, ngay khi được ghi công, thấy một lời chào nói rõ ai mời mình và ưu đãi đã ghi. Vào bằng link của A mà màn hình im lặng thì A không có gì để nói tiếp, và người mới không biết mình đang được giảm giá.

## 7. Yêu cầu — ưu đãi và tài khoản ảo

### 7.0 Học phí, chốt 25.09.2026

Nemo12 bán **một thứ**: thành viên học không giới hạn, **giá như nhau bất kể learner tăng bao
nhiêu band**.

| | |
| --- | --- |
| Đơn giá | **1.800.000đ / tháng** |
| Chu kỳ đóng | **3 tháng một lần** |
| Một đợt, trong 2026 | **5.400.000đ** |
| Một đợt, từ 01.01.2027 | **8.400.000đ** |
| Số đợt tối thiểu mỗi learner | **2 đợt** |

**Hai điều bổ sung 25.09.2026 (SRC-1039), và cả hai đều đổi con số hoa hồng:**

1. **Mỗi learner đóng tối thiểu HAI đợt**, cách nhau 3 tháng. Nên người giới thiệu nhận hoa hồng ở **mỗi lần đóng**, không chỉ lần đầu. Tính một đợt là báo thiếu khoảng một nửa.
2. **Đợt từ 2027 đắt hơn**: 8.400.000 thay vì 5.400.000. Một ví dụ 12 tháng bắc qua mốc ấy mà dùng một giá duy nhất thì sai ở hơn nửa số dòng.

Hoa hồng của một đợt thuộc về **tháng đóng tiền**, không phải tháng vào học: dồn cả hai đợt vào tháng vào học là hứa tiền tới sớm hơn thực tế.

Chỉ đạo chủ dự án 25.09.2026 (SRC-1036). Đây là lần thứ ba đơn vị bán đổi, và ghi lại cả ba là
cách duy nhất để người đọc sau không tưởng mình đang nhìn một con số gõ nhầm:

| | Đơn vị bán | Mức |
| --- | --- | --- |
| tới 22.09.2026 | mỗi 1.0 band tăng thêm | nhân theo mức band learner muốn tăng |
| 22.09 → 25.09.2026 | một kỳ 6 tháng trọn gói | 20.000.000, giảm còn 10 / 15 / 18 triệu theo đợt |
| từ 25.09.2026 | một tháng, đóng 3 tháng | 1.800.000 / tháng |

**Kỳ 6 tháng không còn**, và ba mức của nó (10, 15, 18 triệu) đã hạ cờ trong migration 0293 — giữ
lại làm lịch sử giá, không bán nữa. Dòng nguy hiểm nhất là mức 18 triệu từ 01.01.2027: nó không có
hạn kết thúc, nên sót một dòng `active` là tới đầu 2027 trang lặng lẽ quay về bán kỳ 6 tháng mà
không ai đụng vào gì.

**Trang công khai hiện hai con số, và cả hai đều từ API.** Đơn giá tháng là con số PHÁI SINH
(`amount_vnd ÷ months`), tính ở đúng một chỗ trong `showcase/membershipPricing.ts`; chia không hết
thì API trả `null` và trang bỏ dòng ấy đi, thay vì hiện một đơn giá làm tròn mà không ai trả đúng
bằng nó.

Đợt giảm giá vẫn **tự rụng theo ngày**, không chờ ai hạ cờ — cơ chế ấy giữ nguyên, chỉ là hiện
không có đợt nào đang chạy.

"Không giới hạn" được neo bằng một con số đo được: learner học cao điểm thường **20–30 giờ mỗi
tuần**, học vừa phải **10–15 giờ mỗi tuần**. Không có câu ấy thì mỗi người đọc ra một kỳ vọng khác.

**R-39 — Hai tầng: 10% trực tiếp, 2% gián tiếp** (chỉ đạo chủ dự án 24.09.2026).

| Ai | Tôi nhận |
| --- | --- |
| Người tôi **trực tiếp** rủ | **10%** học phí họ thực trả |
| Người do **họ** rủ tiếp | thêm **2%** |
| Người do tầng hai rủ tiếp nữa | **không có gì** |

**Đúng hai tầng, và đây là một ranh giới nằm trong dữ liệu chứ không trong trí nhớ ai.** Mỗi tầng thêm vào là một lớp chi phí mới trên cùng một khoản thu, và một cây không đáy thì không còn là chương trình giới thiệu nữa. Hai tầng cộng lại đã là **12%** của một khoản thu đã giảm 10% cho người mới.

Cả hai tỷ lệ sống trong bảng giá (`pricing_items`: `referral-bonus`, `referral-bonus-l2`), sửa được từ admin. Mỗi tầng rơi về hằng số **riêng** khi dòng của nó bị tắt: dùng chung một phép kiểm thì một dòng tắt sẽ kéo cả chính sách về mặc định, ở chỗ không ai đụng vào.

**R-40 — Tỷ lệ 10%, hai chiều.** Người giới thiệu nhận 10% số tiền người mới trả; người được giới thiệu giảm 10% trên tổng phải trả. Con số đọc từ **bảng giá** (`pricing_items`, mã `referral-bonus`), không viết cứng trong code. *(Hệ đang đặt 15% từ SRC-450; chỉ đạo 22.09.2026 hạ xuống 10%.)*

**R-40.1 — Gốc tính: giá THỰC TRẢ, và CỘNG DỒN với ưu đãi đang chạy.** Người mới trả
5.400.000 − 10% = **4.860.000**; người giới thiệu nhận **486.000** vào tài khoản ảo. Không tính
trên giá niêm yết 5.400.000 — làm vậy là trả 540.000 hoa hồng trên một khoản thu 4.860.000.

**R-41 — Đổi tỷ lệ không hồi tố.** Mỗi dòng quyền lợi chụp lại tỷ lệ tại thời điểm ghi công. Hạ từ 15% xuống 10% hôm nay không được rút bớt của người đã giới thiệu từ tháng trước — cùng một lý lẽ với R-30.

**R-42 — Hoa hồng cộng vào tài khoản ảo.** Khi người được giới thiệu thật sự trả tiền, 10% vào **số dư nội bộ** của người giới thiệu. Không phải tiền mặt, không phải lời hứa tiền mặt: một đơn vị Nemo12 tự phát hành.

**R-43 — Số dư là tổng của một sổ, không phải một con số lưu sẵn.** Không có cột "số dư" nào được cập nhật tại chỗ. Số dư = cộng dồn các dòng ghi sổ. Lý do ở [SDD-041 §3](../architecture/sdd-041-member-credit.md).

**R-44 — Giảm giá cho người được giới thiệu KHÔNG đi qua tài khoản ảo.** Nó là một khoản trừ trên hoá đơn. Hai thứ khác nhau về bản chất: giảm giá là tiền chưa bao giờ thu, số dư là tiền đã thu rồi trả lại dưới dạng khác. Gộp chúng làm sổ sách không đối soát được.

**R-45 — Số dư tiêu được vào học phí Nemo12.** Chưa có cổng thanh toán nên bước áp số dư vào hoá đơn hiện là thao tác của admin, có ghi vết.

**R-46 — Quy đổi ra tiền mặt: ngoài phạm vi**, theo đúng chỉ đạo. Nhưng sổ phải được dựng từ đầu sao cho thêm việc rút tiền sau này **không phải viết lại sổ** — xem [SDD-041 §6](../architecture/sdd-041-member-credit.md).

**R-47 — Hoa hồng bị thu hồi khi khoản thu bị hoàn.** Người mới trả tiền rồi đòi lại trong 7 ngày thì 10% đã cộng phải bị rút. Không có luật này, hoàn tiền trở thành cách rút tiền khỏi Nemo12 mà không cần học gì.

## 7b. Yêu cầu — khu "chính sách và ví dụ" trên trang Referral

Chỉ đạo chủ dự án 24.09.2026: *"Có một khu vực kiểu như là dữ liệu giả... để khi click vào đó thì xem được chính sách hoa hồng, và cả xem được các dữ liệu ví dụ, để learner dễ hiểu... Cụm dữ liệu giả này cần mặc định là collapsed."*

| # | Yêu cầu | Lý do |
| --- | --- | --- |
| R-59 | Ví dụ tính **mọi đợt đóng** của mỗi người, mỗi đợt theo giá của tháng nó rơi vào; đợt rơi ra ngoài khung thời gian thì không tính | Đây là lý do ví dụ 12 tháng không ra gấp đôi con số một đợt |
| R-60 | **Gập sẵn**, bấm mới mở | Việc của trang là đưa cái link. Một bảng 12 dòng mở sẵn biến một trang một-việc thành một trang phải đọc |
| R-61 | Mở ra thì thấy **chính sách** (hai tầng, gốc tính, tiền đi đâu, ghi công một lần) | |
| R-62 | Và một **ví dụ 12 tháng bằng số thật**: 35 người trực tiếp, tăng dần, **hai tháng không ra ai**; 15 người trong số đó tự rủ tiếp | Đúng tình huống chủ dự án nêu |
| R-63 | Học phí trong ví dụ **đổi theo tháng** (10tr → 15tr → 18tr) | Dùng một giá cho cả 12 tháng là một con số gọn gàng và sai |
| R-64 | Ví dụ **tự khai là số giả** ở chỗ mắt chạm đầu tiên, và **viết ra mọi giả định** | Đây là bảng nói về tiền; người đọc rất dễ đọc nó thành lời hứa. Một ví dụ giấu giả định là một ví dụ không kiểm lại được |
| R-65 | Tỷ lệ đọc từ API, không viết cứng trong giao diện | Chép vào giao diện là dựng một bảng giá thứ hai, và nó lệch đúng vào ngày chủ dự án đổi tỷ lệ |
| R-66 | **Toàn bộ trang này nói tiếng Việt** | Chỉ đạo trực tiếp. Đây là chữ Nemo giải thích một chương trình TIỀN BẠC cho learner, đúng vế SRC-953 — và hiểu lỗ chỗ về tiền thì tệ hơn hiểu lỗ chỗ về một bài đọc |

Người tầng hai **rơi ra ngoài 12 tháng thì không được cộng vào**. Dồn họ vào tháng cuối cho "đỡ phí" là làm ví dụ nói dối đúng ở chỗ nó hứa nhiều nhất.

## 8. Yêu cầu — thư

Ba lá, đã chạy (chi tiết ở [emails.md](../reference/emails/referral-and-reports.md)):

| Thư | Gửi cho | Khi nào |
| --- | --- | --- |
| `referral-invited` | Người được giới thiệu | Vừa được ghi công. Một đời một thư |
| `referral-joined` | Người giới thiệu | Có người mới vào. Gộp mọi người trong ngày vào một lá |
| `referral-progress` | Người giới thiệu | Người được giới thiệu đạt mốc mới. **Trần riêng 1 thư/7 ngày** |

**R-50:** thư chỉ mang tên hiển thị + câu mốc viết sẵn. Không mang bài vở, không mang liên lạc (QG-008).

**R-51 (mới):** khi hoa hồng thật sự vào tài khoản ảo, người giới thiệu được báo — kèm số tiền và số dư mới. Đây là lá thư duy nhất trong cụm mang một con số tiền, nên nó phải đọc được từ sổ chứ không tính lại trong lúc soạn thư.

## 9. Điều chưa chốt

| Câu hỏi | Vì sao chưa trả lời được |
| --- | --- |
| Số dư có hạn dùng không? | Đề xuất: **không**. Hạn dùng biến một khoản đã hứa thành một khoản có thể lặng lẽ biến mất |
| Trần số dư một người? | Đề xuất: không trần, nhưng có ngưỡng cảnh báo để rà gian lận |
| Số dư có chuyển cho người khác được không? | Đề xuất: **không**. Chuyển được thì nó thành tiền tệ, và kéo theo cả một lớp nghĩa vụ pháp lý |
| Mô hình thu phí | Q-014/Q-015 vẫn mở — và mọi con số trong §7 chỉ có nghĩa khi có giá |

## Trace

| Yêu cầu | Thiết kế |
| --- | --- |
| R-01..R-05, R-10..R-13, R-20..R-25, R-30..R-31 | REQ-GRW-02 — đã chạy, xem [emails.md](../reference/emails/referral-and-reports.md) và `workers/api/src/modules/referral/` |
| R-39, R-40..R-47, R-51, R-59..R-66 | REQ-GRW-03 → [SDD-041](../architecture/sdd-041-member-credit.md) |
