Run Check-In
Configure a CheckInSession, scan credentials, interpret a duplicate, and handle the cases the product leaves manual
Admission is recorded per person and per checkpoint. A CheckInSession is the checkpoint; a CheckIn is one successful admission at it. The same Participant can be admitted at a main gate and a meal counter independently, but not twice at one checkpoint.
Checkpoint
CheckInSession
Organization-owned; may cover several Events
Admission
CheckIn
One per Participant per session, enforced in the database
Operating it needs
checkin_sessions.operate
At that session's Scope
Credentials
Participant QR, Account QR, LINK
Static signed values, team members included
Decide what the checkpoint is
Each session is a distinct place or moment: the main gate, the Friday gate, a workshop room, the kit desk, a meal counter. Name it after the door staff will recognise, not after the ticket type. A session belongs to the Organization and can cover one or more Events.
Fill in the session
Field Why it matters Covered Events A Participant from any other Event is rejected Accepted Passes, or accept-all The authoritative list here Open and close timestamps Scans outside the window are refused Location Shown to operators on the scan landing screen State: active, paused, closed Paused and closed stop admission without deleting history The wizard asks for Events, then Passes, then an optional window, then a name and location. Instructions exist in the API and are displayed when set, but the app has no field for them. Afterwards, change the covered Events and accepted Passes on the session page.
The accepted-Pass list is the part organizers get wrong. It is authoritative: a Pass not accepted here is rejected even when the person is fully valid, which is what a workshop-only checkpoint needs. Accepting all Passes is the right default for a main gate and usually wrong for a room.
Staff it
Operating a session requires
checkin_sessions.operateat that scope. Any number of devices can scan the same session at once, because the once-per-person rule is enforced by the database rather than by the device. There is no per-device registration, revocation, or rate limit to manage.Know which credential you are scanning
- Participant QR — a signed, static value per Participant. It can be printed or screenshotted, so the first successful scan wins.
- Account QR — one per Account. The scanner lists the Participants this session accepts, then admits exactly one or asks the operator to choose.
- LINK — a bearer URL rather than a QR value. Opening it renders the Participant's current credential and form.
Credentials are derived from an identifier and a version, never stored, so a leaked database yields nothing usable. The version advances automatically when a Participant is claimed, removed, or transferred, or when their Registration switches; there is no organizer action to rotate one.
Scan
The launch scanner is a web app and needs connectivity for every acceptance. It offers camera scan, manual lookup by email, phone, or name, audible accept and reject cues, auto-advance, and a live connection state.
Two things live elsewhere: live counts and recent scans are on the session page, and the scanner is bound to one session by its URL, so there is no session picker inside it.
Admission has no undo. A CheckIn recorded at the wrong checkpoint cannot be removed in the app, so confirm the session before the doors open.
Read a duplicate correctly
Diagram source
sequenceDiagram participant S as Scanner participant A as Ulsav API participant D as Database S->>A: Submit credential for the session A->>A: Validate the session window and the credential signature A->>D: Write CheckIn, unique per Participant and session alt no earlier CheckIn D-->>A: CheckIn created A-->>S: Accepted else CheckIn already recorded D-->>A: Existing CheckIn A-->>S: Duplicate with original time and operator endOne Participant may be admitted once per session, enforced in the database rather than by scanner memory: two devices scanning simultaneously resolve to exactly one CheckIn, and the loser sees the original time and the operator who recorded it.
A duplicate is information, not an error: it usually means the person already entered. If the venue genuinely wants two admissions at one door, configure a second CheckInSession.
A team check-in is a loop: each member has their own credential and gets their own CheckIn, and no member's admission implies another's.
Interpret a rejection
Result What to do Invalid QR Re-present, then look the person up manually. Every attempt is recorded either way. Wrong Event, or Pass not accepted Check the session's accepted-Pass list before overriding anything. Registration cancelled, Participant removed Do not admit. A replacement never inherits the old person's attendance. Requirements pending An approval is not approved, the Registration Form is unsubmitted, or a BEFORE_CHECKINrequirement is unmet. The Pass stays issued, admission stays blocked.Not open yet, paused, or closed Fix the window or resume the session before reopening. Multiple matches The search or Account resolution found several acceptable Participants; choose deliberately.
Wrong orientation and no connectivity
The specification defines no orientation-specific behaviour. A credential is either decoded and validated or it is not: a rotated, blurred, or partly covered code fails to parse and is recorded as an invalid QR, like a damaged printout. Re-present it, or use manual lookup.
Offline acceptance
Offline acceptance is postponed, not partly built. A device that cannot reach the server cannot admit anyone, and there is no local queue that reconciles later.
Related
- Check-In — the model behind the session
- Registrations — requirements that block admission
- Event status — what a cancelled Event does to admission