Command Center Help for this page →

These figures are not updating. Last successful update at {{events.liveLastGoodText()}}, {{events.liveStaleMinutes()}} minute(s) ago. Everything below is what the fleet looked like then, not what it looks like now. The page keeps trying by itself. Try now
Reading this event's sectors… This event's sectors could not be read, so a limit cannot be set. Try again, or reload the page. {{model.selectedEntrance ? 'No ticket at ' + model.selectedEntrance + ' names a sector, so there is nothing to limit here.' : 'This event has no sectors on its tickets.'}} {{s}}×
{{model.eventList.length}} event(s) · ended greyed{{model.selectedEventId ? ' · showing #' + model.selectedEventId : ' · showing all'}}
{{model.broker == null ? '—' : (model.broker.connected ? (model.broker.intakeSilent ? 'SILENT' : 'ONLINE') : 'OFFLINE')}}
Broker
{{model.summary.total != null ? (model.summary.total | number) : '—'}}
Devices
{{model.summary.active != null ? (model.summary.active | number) : '—'}}
Active
{{model.summary.pending != null ? (model.summary.pending | number) : '—'}}
Pending
{{model.summary.inactive != null ? (model.summary.inactive | number) : '—'}}
Inactive
{{model.summary.decommissioned | number}}
Decommissioned
{{model.summary.online != null ? (model.summary.online | number) : '—'}}
Online
{{model.stats.scannedTickets != null ? (model.stats.scannedTickets | number) : '—'}}/{{model.stats.activeTickets != null ? (model.stats.activeTickets | number) : '—'}}
Scanned / valid · {{model.selectedEntrance}}
{{model.stats.activeTickets != null ? (remaining() | number) : '—'}}
Still to come
{{model.stats.cancelledTickets | number}}
Cancelled
{{fmtRate(model.stats.scansPerMinute)}}
Scans/min today
Scan progress - {{selectedEventTitle()}} (bar, still to come and cancelled are the whole event; scanned and scans/min are {{model.selectedEntrance}}) {{model.stats.eventScannedTickets || 0 | number}}/{{model.stats.activeTickets | number}} valid ({{progressPct()}}%) · {{remaining() | number}} still to come · {{model.stats.cancelledTickets | number}} cancelled, not counted —
Scan progressselect an event above to see its progress
{{model.status.text}}

Devices ↔ widen →← narrow Approve all pending ({{model.summary.pending}})

Find ✕ Show within min batt ≤ % {{filterMatchCount()}} / {{model.devices.length}} shown
Device name Status Online? Battery I Event Tickets Scanned Rate Last scan
Actions{{model.refreshing ? 'updating…' : model.countdown + 's'}}
{{d.expanded ? '▾' : '▸'}} {{d.name || d.selfName || '—'}} ({{d.selfName}})✓!{{d.guid || '—'}} {{d.statusLabel}} ● {{d.isOnline ? 'online' : 'offline'}} ⚠
{{d.battery}}%⚡
—
{{d.integrationId}} {{events.lockIcon(d,'event')}}{{events.assignedValue(d,'event')}}/{{events.lockIcon(d,'entrance')}}{{events.assignedValue(d,'entrance')}}/{{events.lockIcon(d,'sector')}}{{events.assignedValue(d,'sector')}}
{{ticketPct(d)}}%
{{d.reportedCount != null ? (d.reportedCount | number) : 'not reported'}} —
{{d.scanned != null ? (d.scanned | number) : '—'}} {{d.scanRate != null ? fmtRate(d.scanRate) + '/min' : '—'}} {{d.lastScan ? (d.lastScan | date:'dd.MM HH:mm') : '—'}} Approve Push Refresh Scans Identify ⋯
Log operator out Wipe tickets Deactivate Reject Approve to enable actions
Reported telemetry {{reportAge(d.report.lastSeenUtc)}}
No enriched status frame yet. This device hasn't reported detailed telemetry (battery, model, OS, network, GPS, operator, counts…).
It appears here automatically once the updated app sends its status frame. The event, GUID and integration on the row itself are unaffected.
Device name (self-reported){{d.report.selfReportedName || '— (use Identify)'}}
GUID{{d.guid}}
Operator{{d.report.operatorUsername || d.operator || '— none logged in'}}
Loaded event / entrance / sector {{events.lockIcon(d,'event')}} {{events.assignedValue(d,'event')}} / {{events.lockIcon(d,'entrance')}} {{events.assignedValue(d,'entrance')}} / {{events.lockIcon(d,'sector')}} {{events.assignedValue(d,'sector')}}
Tickets on this device (its own copy of the set, as it reports it)
Held {{d.reportedCount != null ? (d.reportedCount | number) : 'not reported'}} {{tkNote(d, 'held')}}
Cancelled {{numOrUnknown(d.deviceCancelled)}} {{tkNote(d, 'cancelled')}}
Valid {{numOrUnknown(deviceValid(d))}} {{tkNote(d, 'valid')}}
Already used {{numOrUnknown(d.deviceUsed)}} {{tkNote(d, 'used')}}
Left to scan {{numOrUnknown(deviceRemaining(d))}} {{tkNote(d, 'left')}}
Outbox {{d.report.unpublishedActivities != null ? (d.report.unpublishedActivities | number) : 'not reported'}}
Awaiting confirmation {{d.report.unackedActivities != null ? (d.report.unackedActivities | number) : 'not reported'}}
Admitted by this device {{d.report.admittedByThisDevice != null ? (d.report.admittedByThisDevice | number) : 'not reported'}}
Ticket set {{d.report.ticketSetFingerprint ? d.report.ticketSetFingerprint.substring(0, 12) : 'not reported'}} differs from the other scanners on this event
Battery{{d.report.batteryLevel != null ? d.report.batteryLevel + '%' : '—'}}{{d.report.isCharging ? ' ⚡ charging' : ''}}
Battery optimisationnot exempt
Dozeidle
App version{{d.report.appVersion || '—'}}{{d.report.appBuild ? ' (' + d.report.appBuild + ')' : ''}}
Device model{{d.report.deviceModel || '—'}}
OS{{d.report.osVersion || '—'}}
Network{{d.report.networkType || '—'}}
Last scan{{hasStamp(d.report.lastScanAt) ? (d.report.lastScanAt | date:'dd.MM HH:mm:ss') : '—'}}
Last sync{{hasStamp(d.report.lastSyncAt) ? (d.report.lastSyncAt | date:'dd.MM HH:mm:ss') : '—'}}
Reported at{{hasStamp(d.report.reportedAt) ? (d.report.reportedAt | date:'dd.MM HH:mm:ss') : '—'}}
Last seen (server clock){{hasStamp(d.report.lastSeenUtc) ? (d.report.lastSeenUtc | date:'dd.MM HH:mm:ss') : '—'}}
Presence{{d.isOnline ? 'online' : 'offline'}}{{d.unstable ? ' · ⚠ unstable (flapping)' : ''}}
{{d.journalOpen ? '▾' : '▸'}} What happened to this device its own record, newest first
Reading it…
The journal could not be read. That is this page failing, not the device.
Nothing here apart from routine entries - the connection coming and going, the scan head being set up - which this panel leaves out; the Device journal page shows them. A handset on a build older than 2026-08-05 keeps no journal at all.
{{it.first.occurredAt | date:'dd.MM HH:mm:ss'}} {{it.first.kind}} {{it.first.detail}}×{{it.count}} {{it.open ? '▾' : '▸'}} {{it.first.operatorName || ''}}
{{j.occurredAt | date:'dd.MM HH:mm:ss'}}+{{it.gapText[$index]}} {{j.kind}} {{j.detail}} {{j.operatorName || ''}}
Routine entries - the connection coming and going, the scan head being set up - are left out here; the Device journal page shows them. An entry repeated word for word is shown once, with how many times it came; click the row to see every one.
No devices registered yet.
No devices match “{{model.deviceSearch}}” - show all.

Event tools

Operate on the event selected at the top, no device selection needed.

Selected devices ({{selectedCount()}})

Each command applies to every ticked device it's valid for. Tick devices in the list first, offline devices can't be ticked.

A command only reaches a device that is online. {{selectedOfflineCount()}} ticked device(s) are offline right now and will be skipped. They rejoin the selection on their own when they come back. Untick them

A command only reaches a ticked device you can see in the list. {{selectedHiddenCount()}} ticked device(s) are hidden by the filter or search and will be skipped. They rejoin the selection when the list shows them again. Untick them

Assign
Scans
Status
Session
Operator may change
Event {{events.permLabel('event')}} 🔒Lock 🔓Unlock Entrance {{events.permLabel('entrance')}} 🔒Lock 🔓Unlock Sector {{events.permLabel('sector')}} 🔒Lock 🔓Unlock
Maintenance
Danger

Ticket lookup

The whole code from the QR, exactly as it is, for the selected event. From Adriaticket that includes the purchase prefix; from a custom import it is the bare code.

{{model.lookup.result.Status === 'Cancelled' ? 'Cancelled' : 'Found'}} {{model.lookup.result.Id}} ↗ · refunded or withdrawn, so a scanner turns it away · scanned {{model.lookup.result.ScannedAt | date:'dd.MM HH:mm'}} by {{fn.deviceLabel(model.lookup.result.ScannedBy)}} · not yet scanned
Not found for this event
↻ refreshing… next refresh in {{model.countdown}}s not updating · Refresh now