22 — Self Check-in Kiosk Specification
Surface: Lobby self-service kiosk (touchscreen, 21"–27" display, wall-mount or pedestal) Phase: P2 / R2 Shell: Kiosk shell (
08-runtime-shells-spec.md §Shell 3) Competitive reference: Mews Kiosk, Ariane, Civitatis, SALTO
1. Overview
The self-check-in kiosk allows guests to complete their arrival independently: retrieve their booking, complete the registration card, sign electronically, pay outstanding balances, and collect their room key — without interacting with front-desk staff.
Target personas: Walk-in guests, pre-booked guests, group check-in initiators, guests with mobility limitations.
Languages: Pashto (default), Dari, Arabic, English, French (Phase 2).
2. Hardware configuration
| Component | Requirement |
|---|---|
| Display | 21"–27" touchscreen; 1920×1080; PCAP multitouch |
| Mount | Wall-mount (900 mm center height) OR pedestal (adjustable) |
| Printer | Thermal receipt + key envelope printer (USB; see C6-native-api-capability-catalog.md) |
| Card reader | EMV chip + contactless (NFC) payment terminal (Adyen P400) |
| Key encoder | TTLock BLE encoder or RFID encoder (Mifare DESFire) |
| Passport / ID scanner | MRZ scanner (optical; see C6) |
| Camera | 1080p (for document capture + optional liveness check) |
| Biometric | Optional fingerprint reader (for returning guest recognition; Phase 3) |
| NFC | For Apple Wallet / Google Wallet key delivery |
3. Application architecture
apps/kiosk-checkin (React + Vite + Electron or Chromium kiosk mode)
├── Shell: Kiosk shell (common/08)
├── State: Zustand (session state); cleared on session reset
├── Offline: IndexedDB (booking cache, key pre-fetch) + outbox
├── Hardware bridge: IPC to Electron main process (printer, key encoder, payment terminal)
└── BFF: bff-tenant-booking-service (check-in APIs)
Deployment: Electron app on dedicated mini-PC (NUC or equivalent). Auto-update via Electron's built-in updater. No internet browser address bar exposed.
4. User flow
4.1 Attract loop (idle)
- Branded slideshow (property photos, amenity highlights, wifi password)
- "Check in" + "Check out" prominent CTA buttons
- Attract loop restarts after 60 s of inactivity
- Staff can access staff menu via hidden 3-tap gesture on logo
4.2 Language selection
Welcome / Xush Keldingiz / خوش آمدید / أهلاً
[🇬🇧 English] [پښتو] [دری] [عربي]
Large flag + script buttons; ≥ 60×60 px. Language selection persists for the session; not reset between guests (operator configuration).
4.3 Booking lookup
Option A — QR code scan: Guest scans QR from confirmation email. Camera reads QR; booking retrieved from check-in-service.
Option B — Booking reference + last name: Guest enters 6-character booking reference and last name. On-screen keyboard (QWERTY + Pashto/Dari/Arabic layouts switchable).
Option C — Walk-in: "I don't have a reservation" → front-desk call button or walk-in flow (collects name, phone, room preference; routes to front desk for room assignment).
4.4 Booking confirmation screen
Welcome back, Ahmad!
──────────────────────────────────────────
Reservation: 1 May – 3 May (2 nights)
Room: 201 — Standard Double
Guests: 2 adults
[Check-in details correct? ✓ Yes, continue] [✗ Something's wrong]
4.5 Guest registration (legal requirement in most jurisdictions)
- ID/passport scan via MRZ scanner or camera OCR
- Pre-filled from booking; guest confirms / edits
- Fields: Full name, nationality, passport number, date of birth, visa type (if applicable), purpose of visit
- Electronic signature pad (on-screen; finger or stylus)
- Submission:
check-in-service.completeRegistration()→ writes toguest-registration-authority-servicefor nightly submission
4.6 Additional guests (group check-in)
If reservation has multiple guests (e.g., 4-room group):
- Show "How many guests are checking in now?" step
- Allow partial check-in (remaining guests check in later)
4.7 Pre-authorization / payment
- Outstanding balance shown (e.g., city tax, pending charges)
- Pre-authorization amount per tenant config (e.g., $200 security deposit)
- Adyen P400 payment terminal prompt
- Apple Wallet / Google Wallet accepted for NFC payment
4.8 Upsell (optional, tenant-configurable)
- Single upsell screen: "Enhance your stay" (late checkout, breakfast, parking)
- Max 3 options; explicit "Not now" button
- No pre-checked upsells
4.9 Key issuance
- Kiosk shell calls
lock-integration-service.issueKey({ reservation_id, room_number }) - For RFID key: key encoder activated; guest inserts blank card into encoder slot; key programmed
- For BLE/Wallet: QR code displayed + "Add to Wallet" button; NFC tap option
- Key envelope printed (thermal printer; envelope has room number + wifi password)
4.10 Check-in complete
You're all set! 🎉
Room 201 — Floor 2
Checkout: 3 May 2026
[Collect your key card from the slot below]
[Wifi: MelmastoonPKAF — Password: 7721xK]
[Get directions to your room →]
[Done]
Auto-advance to attract loop after 30 s if guest doesn't tap "Done".
5. Check-out flow
Accessible from attract loop "Check out" button:
- Booking lookup (same as check-in, options A or B)
- Folio review (charges, payments, balance)
- If balance outstanding: payment step
- If balance zero: "Thank you for staying with us" + receipt print option
- Key return reminder (if RFID cards)
- Rate your stay (star rating; optional; 30 s timeout)
6. Walk-in flow
For guests without a reservation:
- "I don't have a reservation" screen
- Availability check: date picker + guest count (queries
search-aggregation-service) - If rooms available: room selection + rate → booking creation via BFF
- If no availability: "Sorry, we're fully booked tonight. Staff can help you find alternatives." + staff call button
- Proceeds to standard check-in flow on booking confirmation
7. Offline behaviour
| Scenario | Handling |
|---|---|
| Pre-booked guest, offline | Booking retrieved from IndexedDB cache (synced on startup) |
| Payment terminal offline | Cannot complete payment; prompt guest to visit front desk |
| Key encoder offline | Temporary key issued by staff; kiosk shows "Please see front desk for your key" |
| Registration submission offline | Queued in outbox; submitted when connectivity restored |
8. Accessibility requirements
- Wheelchair height: All essential elements within 900–1200 mm from floor (adjustable pedestal preferred)
- Low-literacy mode: Icon + large text; no dense paragraphs; progress bar visible at all times
- Screen reader: VoiceOver compatible (Electron Chromium); keyboard navigation for switch-access users
- TTS: Optional text-to-speech readout of all screen text via Web Speech API (activated by accessibility button in footer)
- Contrast: All text ≥ 4.5:1 (WCAG AA); kiosk background is typically bright (lobby lighting)
- Touch target minimum: 60×60 px everywhere
- Timeout warning: 15 s warning before session reset; guest can tap "I'm still here"
9. Security requirements
- Kiosk device behind firewall; only BFF ports open
- Auto-lock on idle (attract loop)
- No browser address bar; no right-click menu; no keyboard shortcut exposure
- Payment card data never touches app layer (Adyen P2PE terminal handles encryption)
- Passport scan data: processed in-memory; not logged; transmitted encrypted to
check-in-service - Staff mode requires PIN + property admin approval
10. Performance budgets
| Metric | Target |
|---|---|
| Cold start to attract loop | ≤ 3 s |
| Booking lookup response | ≤ 1.5 s (online) |
| Screen transition | ≤ 300 ms |
| Key encoding time | ≤ 5 s |
| Receipt print time | ≤ 8 s |