Scanners and check-in
Purpose
Put people on the door to check attendees in — each on a named scanner seat, with no Sotillion account — and know what happens when a code is scanned.
Before you start
- The event should be published, and ideally close to or during its window.
scanner.manageto add, reset or revoke scanner seats. Door staff do not need a Sotillion account: each phone joins with a single-use code you give it.- A seat belongs to one event, works on one phone, and stops working 24 hours after the event ends.
- Scanning is online-only — the scanner app needs a working connection to Sotillion. There is no offline mode yet.
Steps
- Add a scanner. On Staff & scanners (
/scanners), type a Label — the door position or the person, for example "Gate 2 – Ravi" — and press Add scanner. You can do the same from your phone: in the scanner app's admin mode, open More, then Scanners, and press Add scanner. - Show the code. The seat appears with an 8-character join code (shown in two groups of four, like
K7QM 3XRAon the web orK7QM-3XRAin the app — the app ignores the space or dash) and a QR code. The code works once: give it to the operator in person or privately, because anyone who enters it first claims the seat. A seat that has not been claimed yet reads Waiting for a phone, and Show code (in the app, Show code and QR) brings its code and QR back on screen. - The operator joins. On their phone they open the Sotillion scanner app and, on the Join screen, either type the code or press Scan the admin's QR and scan yours, check the Device name, and press Join. The app opens this event's scan screen directly — no sign-in. Back on your screen the seat now reads Active with the phone's name and when it was last seen.
- At the door, the operator scans each ticket's QR code. They can only check people in for the event the seat belongs to.
- Move a seat to another phone, or replace a lost code: press Reset code on that seat. It gets a new code, and the phone that was using it is refused at its next scan with "This scanner was removed or reset. Ask your event admin for a new code." Give the new code to the new phone.
- Remove a seat: press Revoke on it and confirm. The phone is refused at its next scan, and the seat stays in the list as Revoked.
- Leave this event on the operator's phone only clears the phone — the seat stays active until you reset or revoke it. If a phone leaves your control, revoke its seat.
- If you have a Sotillion account and an event role on this event (owner, admin, manager or staff), sign in to the scanner app with it instead of joining with a code. The app switches into admin mode automatically, with five tabs: Dashboard, Events, Check-in, Attendees, and More (which holds Scanners and Announcements). A seat operator sees the scan screen only.
- On the web, Check-in (
/check-in) shows live numbers while the event is running — checked in, still to arrive, check-in rate — refreshing every 10 seconds. Outside the event's window, it reads once with a manual Refresh.
Decision guide
| Scan result | What it means | What to do |
|---|---|---|
VALID | Ticket accepted; moved ISSUED → CHECKED_IN. | Let them in. |
ALREADY_USED | Someone already checked this exact ticket in. | Ask for ID and the ticket number; do not double-admit off a screenshot. |
INVALID | Not a recognised code, or it was rotated/revoked (e.g. after a transfer). | Ask the holder to open their current ticket in the app — an old screenshot after a transfer or rotation always fails. |
WRONG_EVENT | The ticket is for a different event. | Refuse entry to this event. |
CANCELLED_OR_REFUNDED | The ticket was refunded or the order cancelled. | Refuse entry. |
EXPIRED | The credential expired. | Ask the holder to reopen their ticket for a fresh code. |
Two scanners hitting the same ticket at once: exactly one gets VALID, the other gets ALREADY_USED — never two admits.
| Seat state | What you see | What to do |
|---|---|---|
| Not claimed yet | Waiting for a phone, with the code | Give the operator the code, or Show code to bring it and the QR back. If it was shared by mistake, Reset code. |
| In use | Active, the phone's name, when it was last seen | Nothing. To change phones, Reset code. |
| Operator typed the code and the app said "That code isn't valid. Ask your event admin for a new one." | The code was already used, mistyped, expired or its seat was revoked | Check the seat's state; Reset code and give the operator the new one. |
| Operator's phone says "This scanner was removed or reset." | The seat was reset or revoked while the phone was in use | Give the operator a new code from Reset code, or add a new seat. |
| Revoked | The seat no longer scans | Add a new seat if the position still needs one. |
Escalate when
- The Sotillion API is unreachable and the door can't scan at all: fall back to a manual list. Export attendees.csv ahead of doors (from Attendees, or
GET /events/:id/attendees.csv), check each arrival by ticket number and name, and record who you admitted by hand. Once the connection is back, enter those ticket numbers through the scanner's manual entry so the tickets are properly markedCHECKED_INand can't be reused. - Attendees are showing forged or copied codes: slow the door to manual ticket-number checks against photo ID, and tell Sotillion — do not delete anything, the scan history is needed for the investigation.
- A join code reached someone it was not meant for before the operator used it: Reset code at once, and check the seat's phone name matches the person you expect.
- Beyond that, there is no in-app support case system for organizers yet; use the contact channel Sotillion gave you directly.
Record
- Adding, resetting or revoking a scanner seat: audit labels
event.scanner.create,event.scanner.resetandevent.scanner.revoke, written by the server. - Every scan is recorded server-side with its result and the seat (or account) and phone that made it; check-in counts on
/check-inare read from that record, not from anything you keep yourself. - A seat is identified by the label you typed and its phone's name, not by a person's account — give each operator their own labelled seat if you need to know who worked which door, and keep your own note of shifts for events where you use the manual fallback.
Related
- Attendees and orders
- Create an event
- ../../devops/runbooks/scanning-runbook.md