Students & families
Student promotion between grades
Record promote, retain, exclude, or passed-out decisions per student and apply them so class membership moves into the new academic year.
Students & families guide for day and boarding schools.
Last updated August 29, 2026
Promotion is decision-first. Rather than dragging students between classes, you record one PromotionDecision per student for the source academic year, then apply it. Each decision is unique per student and source year, so re-running the apply step updates the existing decision instead of creating a duplicate, which makes the whole operation safe to repeat after a partial failure.
Applying a decision does two writes inside one transaction: it closes the old class membership with a status of PROMOTED, RETAINED, or DROPPED, and it opens an ACTIVE membership for the target academic year. It also syncs the classGrade, section, and stream fields on the student user, which is what most list screens and capacity counts read.
Prerequisites
- The target academic year exists - create it at /academic-year or through /academic-year/rollover
- Target class sections exist and are active for the new year, at /classes
- Decisions are recorded for the source year, otherwise /students/promotions shows nothing to apply
- Every decision carries a target academic year and target class; the apply action refuses a decision missing either
What happens per decision
| Decision | Old membership | New membership |
|---|---|---|
| PROMOTED | Marked PROMOTED | ACTIVE in the mapped target class |
| RETAINED | Marked RETAINED | ACTIVE in the same class, new year |
| EXCLUDED | Marked DROPPED with an exit date | None created |
| PASSED_OUT | Recorded on the decision | None created |
Handoff
What crosses the boundary is class membership for the target year, and that is what almost everything else keys off. Teacher assignments are made per class and year, attendance and gradebook read the active roster for a class, exam seating pulls the active students of the classes with papers, and admissions seat maths counts the live roster when deciding whether a grade still has room. Apply promotions before anyone starts marking, and before the admissions committee reopens offers for that grade.
Limits
- Promotion does not generate fee instances. Run /fees/bulk-generate for the new year afterwards
- There is no automatic pass or fail rule from marks; a human sets each decision
- Leaving students still need a transfer certificate issued separately at /students/certificates, and deactivation is preferred over deletion
Common questions
Quick answers in plain language.
What are the four promotion decisions and what does each one do?+
PROMOTED moves the student into the mapped target class in the new year. RETAINED keeps them in the same class but in the new year. EXCLUDED closes their current class membership as DROPPED with an exit date. PASSED_OUT records a leaver decision for reporting.
Does promotion change grades, attendance, or fee history?+
No. The student user record is the same row throughout, so registration number, attendance marks, assessment marks, and paid fee history are untouched. Only class membership and the classGrade, section, and stream fields on the user move.
Who can run promotions?+
Platform Admin, Principal, or Vice Principal. /students/promotions returns an access-denied panel for every other role, and POST /api/students/promote returns 403.
Related searches
School leaders and IT teams often search for: class rollover end of year, and bulk student promotion.

