Scenario matrix
This is the live-event playbook. Expected is what the current Home laser path (processBadgeScan) does, unless a row says otherwise.
Camera scan (SCANQR/useBadgeScanner) and unused DashBoardScreen do not always match. Those mismatches are called out. Do not tell a lead “the app always does X” if they scanned with the camera.
Base URL: selected at launch from src/config/clients.ts
ADNEC https://registration.xporience.com/v2/scan/api · DMG https://dmg-reg.xporience.com/v2/scan/api · Xporience https://reg.xporience.com/v2/scan/api · Terrapinn https://terrapinn.xporience.com/v2/scan/api
Every call is POST to that URL with { operation, EPTOKEN }.
Client selection
Login — operation: userLogin
Login QR is only a credential capture. It still runs the same userLogin API.
Space list — operation: getSpaceList
Space list is not persisted as its own store. After kill, space comes back from persisted userDetails.
Badge scan flow (Home laser)
Floor source of truth: processBadgeScan (Zebra DataWedge / Home laser). Camera path can differ — see the matrix below.
Tree form (same path):
Zebra / tap scan (DataWedge or Camera)
└─ Same badge < 1.2s ago? ──yes──► Ignore (hardware dedupe)
└─ no ──► Badge format OK? ──no──► Invalid Badge (error sound)
└─ yes ──► Space selected? ──no──► “Please select a space first”
└─ yes ──► Visitor + already scanned today (same space)?
└─ yes ──► “Successful Re-checkin” (no second save)
└─ no ──► Online? ──no──► Success toast + save offline (synced=false)
└─ yes ──► generateLead (JWT)
├─ 200/201 + sync_status=1 ──► Success + save online (synced=true)
├─ 200/201 + sync_status ≠ 1 / missing ──► Restricted (no save)
├─ 801 ──► “Select another Space” (no save)
├─ 403 ──► Restricted (no save)
├─ 404 ──► Invalid badge (no save)
├─ 409 ──► Logout
└─ 400/401/408/5xx/timeout/network ──► Success toast + save offline
Badge scan — operation: generateLead (Home laser = source of truth for “what we claim”)
JWT payload: badge_number, event_id, badge_type (Visitor if type === '1' else Conference), visited_date (event timezone), sync_date (device ISO), user_id, space_id, device_id.
Operator-facing copy “Successfully Checked in” is used for both online-valid and offline-queued scans on the Home path. That is why “the phone said success” is not proof the server stored the lead.
Sync unsynced (header refresh / space switch)
Bulk sync is not a single transaction. Kill mid-loop can leave a mix of synced and unsynced rows. There is no rollback.
Export Excel / send report
There is no “upload report to server” API in this app.
Logout
How to fill a hole in this matrix
If a status appears that is not in the table:
- Capture HTTP status, body
code, bodymessage,sync_status. - Do not guess. Add a row here after the incident.
- Note which scan path produced it (Home laser vs camera).