Skip to main content
Version: Next

Session Management

A Registration Session is the container for a data-collection campaign. You create one per school (or per class/grade where appropriate), configure what data is required, generate codes, and then open it when you are ready for participants to submit.


Session lifecycle

StatusParticipants can submit?Staff can edit session?
draftNoYes
openYesLimited
pausedNoLimited
closedNoNo
archivedNoNo

Creating a session

Navigate to Foundation -> Self-Service Registration -> Sessions -> New Session.

Session creation form - showing mode selector, title, school, and date fields

The New Session form. Select a mode first - it controls which fields are required and what the participant form will look like.

Required fields

FieldTypeNotes
modeenumteacher_self_registration, student_intake, or student_verification
schoolIdUUIDThe school this session belongs to
titlestringDisplayed to participants on the registration form

Optional configuration

FieldTypePurpose
descriptionstringShown on the public form below the title
classDivisionIdUUIDLocks all participants to one class division
gradeLevelIdUUIDLocks all participants to one grade level
academicYearIdUUIDAssociates submissions with a specific academic year
termIdUUIDAssociates submissions with a specific term
startsAtISO datetimeWhen the session automatically becomes available (informational)
endsAtISO datetimeDeadline shown to participants
expectedCountnumberUsed for progress percentage calculations
rosterPolicyenumControls who can be assigned a code (see below)
requiredFieldsJSON objectField-level validation rules
approvalPolicyJSON objectApproval workflow configuration

Roster policies

PolicyMeaning
preloaded_onlyCodes may only be assigned to people already on the roster
open_with_codeAny code holder can submit (open intake)
mixedSome codes are pre-assigned; unassigned codes remain open

Scoping a session

School-wide session (no class/grade lock)

Leave classDivisionId and gradeLevelId blank. Any participant with a valid code can submit. This is typical for teacher self-registration where teachers self-select their subjects and classes.

Grade-locked session

Set gradeLevelId only. All participants are placed in that grade; the class division field on the public form may remain open for them to choose.

Class-locked session

Set classDivisionId. Both the grade and the class are locked - the system derives the gradeLevelId from the class division automatically. Participants cannot change their placement.

Placement lock behaviour

When classDivisionId is set on a session, the public registration form disables the grade and class dropdowns. The selectionContext still returns the full list of classes for other UI purposes, but the locked IDs are enforced server-side on every save and submit.


Session transitions

Session detail view showing status badge, transition action buttons, and progress counters

Session detail view: the status badge shows the current lifecycle state. Action buttons (Open / Pause / Close / Archive) appear according to valid transitions.

Call Open session (or use the status action button in the session detail view). Only sessions in draft or paused status can be opened.

Participants can now enter their codes at /register and begin submitting.

API: POST /registrations/sessions/{sessionId}/open
Hook: useOpenRegistrationSession()


Editing a session

You can update title, description, startsAt, endsAt, expectedCount, requiredFields, and approvalPolicy at any point before closing. The mode and schoolId fields are immutable after creation.

API: PATCH /registrations/sessions/{sessionId}
Hook: useUpdateRegistrationSession()


Session progress summary

Session progress panel showing expected count, submitted, approved, and completion percent bar

Progress panel on the session detail view. The bars update in real time as participants submit and staff approve.

Every session exposes a live RegistrationProgressSummary attached to the session object (or via the dedicated progress endpoint). Key fields:

FieldDescription
expectedCountTotal participants expected
codesGeneratedHow many codes have been issued
unusedCodes not yet started
startedCodes where the participant has begun but not submitted
submittedAwaiting staff review
needsCorrectionSent back to participant
approvedAccepted and imported
rejectedRejected by staff
importedSuccessfully written to the roster
completionPercent(submitted + approved + imported) / expectedCount * 100
approvalPercentapproved / submitted * 100

API: GET /registrations/sessions/{sessionId}/progress
Hook: useRegistrationSessionProgress(sessionId)


Listing sessions

Use the sessions list with optional filters:

const { data } = useRegistrationSessions({
mode: "student_intake",
status: "open",
});

For a tenant-wide view (across all schools), pass tenantWide: true:

const { data } = useRegistrationSessions({}, { tenantWide: true });

API quick reference

OperationMethod + PathHook
List sessionsGET /registrations/sessionsuseRegistrationSessions()
Get sessionGET /registrations/sessions/{id}useRegistrationSession(id)
Create sessionPOST /registrations/sessionsuseCreateRegistrationSession()
Update sessionPATCH /registrations/sessions/{id}useUpdateRegistrationSession()
OpenPOST /registrations/sessions/{id}/openuseOpenRegistrationSession()
PausePOST /registrations/sessions/{id}/pauseusePauseRegistrationSession()
ClosePOST /registrations/sessions/{id}/closeuseCloseRegistrationSession()
ArchivePOST /registrations/sessions/{id}/archiveuseArchiveRegistrationSession()
ProgressGET /registrations/sessions/{id}/progressuseRegistrationSessionProgress(id)