Check-in
Under Check-in, when somebody arrives for a class.
- Choose the student — they have to be connected to this device
- Check the course and the date
- Redeem
The app shows the balance and, next to it, when this device last saw anything new. That second line matters: it does not say "this is up to date", it says "this is all I know". With no server, no device can honestly claim the first.

Why the order matters
As soon as the student's phone is connected it brings along everything that has happened since last time — including redemptions from the other location. The student is the courier. That is why the desk at West sees the check-in from the old town as soon as the same person walks in, without the two counters ever talking to each other.
When it is refused
| Message | Means |
|---|---|
| No units left | the pass is used up |
| Outside its validity | the pass has expired or is not valid yet |
| Wrong course | a series ticket that belongs to another course |
| Voided | the pass was cancelled, after a refund for example |
The fork alarm
When two counters redeem the same class without a connection, the app shows a contradiction on the pass — with both entries, each with date, location, device and signature.

That is not a failure of the app, it is its purpose. Preventing it without a server is not possible; showing it is. The balance is charged exactly once, never twice — a contradiction never costs more than one class, and never gives one away.
What you do about it is yours to decide. The app does not resolve it.