Skip to main content
Schoolyi
School librarian arranging books and planning cards in a bright library

Browse docs

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

DecisionOld membershipNew membership
PROMOTEDMarked PROMOTEDACTIVE in the mapped target class
RETAINEDMarked RETAINEDACTIVE in the same class, new year
EXCLUDEDMarked DROPPED with an exit dateNone created
PASSED_OUTRecorded on the decisionNone 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.