Tickets
A ticket is an entry in a queue issued to a customer when they join. It is the core unit of the queue system — everything from the display screen to the desk interface revolves around tickets.
What a ticket contains
Section titled “What a ticket contains”- Ticket number — a sequential integer visible to the customer, displayed on the kiosk receipt, shown on the display screen, and visible in the desk waiting list. Numbers are scoped to a queue and increment monotonically — they never reset.
- Ticket hash — a 22-character random string with 128 bits of entropy. This hash is the customer’s anonymous bearer credential (see below).
- State — one of five values (see below).
- Queue — the queue the ticket belongs to.
- Timestamps — when the ticket was created, called, completed, etc.
Ticket states
Section titled “Ticket states”A ticket moves through the following states during its lifecycle:
| State | Meaning |
|---|---|
WAITING | The customer is in the queue, waiting to be called. |
CALLED | A desk has called this ticket; the customer should approach the counter. |
COMPLETED | The desk marked the service as done. Terminal state. |
SKIPPED | The desk skipped this ticket (customer didn’t respond). Terminal state. |
CANCELED | The customer cancelled their own place in the queue. Terminal state. |
State transitions
Section titled “State transitions”WAITING → CALLED → COMPLETED ↘ SKIPPEDWAITING → CANCELED (customer-initiated)CALLED → CANCELED (customer-initiated)Skipped and cancelled tickets are not re-queued automatically. If a customer wants to queue again after being skipped or cancelling, they must join the queue again.
The ticket hash as a credential
Section titled “The ticket hash as a credential”Customers are anonymous — there is no login or account required to join a queue. Instead, the 22-character ticket hash serves as the customer’s proof of ownership. It is embedded in the ticket page URL:
https://customer.jonot.io/{org}/{location}/{queue}/{ticket-hash}Knowing the hash proves you own that ticket. The API uses the hash to authorise:
ticketByHash— look up your ticket and positioncancelTicket— cancel your own ticket
This design is intentional: it removes all friction from joining a queue. No account, no app, no password — just a URL.
The hash has 128 bits of entropy (equivalent to a UUID v4), making it computationally infeasible to guess another customer’s ticket hash.
Customer experience
Section titled “Customer experience”- Customer joins via QR code or kiosk → ticket issued in
WAITINGstate. - Customer opens the ticket page → sees their position in the queue in real time.
- When the desk calls their number, the ticket moves to
CALLED→ the customer’s page updates immediately. - Customer approaches the counter. After service, the desk marks it
COMPLETED. - If the customer doesn’t respond, the desk can
SKIP→ ticket moves toSKIPPEDand the queue advances.