19 — Staff Mobile Companion Specification
Surface: iOS + Android (React Native / Expo) — personal devices for housekeeping, maintenance, F&B runners, and concierge staff Phase: P2 / R2 Competitive reference: hotelkit, Cloudbeds housekeeping, Operto, Whistle for Hoteliers
1. Overview
The staff mobile companion is a lightweight Expo React Native app for non-front-desk operational staff. It is deliberately scope-limited — it does not replicate the full operator desktop. It focuses on:
- Housekeeping: Room cleaning queue, claim rooms, mark clean, log issues, photo evidence
- Maintenance: Receive work orders, update status, photo evidence, request parts
- F&B runners: See delivery orders, mark delivered, communicate with kitchen
- Concierge: Guest messages, service requests, request routing
Differentiator vs hotelkit/Cloudbeds: Native to the Melmastoon platform — charges post directly to folios, room statuses update the front-desk desktop in real-time, push notifications from the same Pub/Sub pipeline.
2. Tech stack
| Layer | Technology |
|---|---|
| Framework | React Native (Expo SDK 51+) |
| Navigation | React Navigation (stack + bottom tabs) |
| State | Zustand + TanStack Query |
| Offline | MMKV (fast storage) + outbox pattern |
| Push | Expo Notifications → FCM (Android) / APNs (iOS) |
| Auth | Biometric (Face ID / fingerprint) + PIN fallback |
| Camera | expo-camera (photo evidence) |
| Geolocation | expo-location (geo-fenced clock-in) |
3. User personas and access
| Persona | Modules available |
|---|---|
| Housekeeping attendant | Cleaning queue, room claim, photo evidence, issue log |
| Housekeeping supervisor | All attendant + assign rooms, approve inspection, shift report |
| Maintenance technician | Work order queue, status updates, parts request |
| F&B runner | Delivery order queue, route map, mark delivered |
| Concierge | Guest messages, service requests, escalation |
Role assigned by operator in the desktop app (Settings → Staff → [staff member] → Mobile app role).
4. Authentication
- Staff member downloads app from App Store / Play Store
- Operator sends invite link (one-time token, 48h expiry)
- Staff sets up biometric + PIN on first launch
- Daily: biometric or PIN to unlock (no re-auth on each use during shift)
- Auto-lock after 10 min idle
Geo-fenced clock-in (optional, tenant-configurable): Staff can only access their room list after clocking in within the property's GPS geofence (radius: 200 m from property GPS coordinates). Uses expo-location.
5. Housekeeping flow
5.1 My rooms (attendant)
[Avatar + Name] Today's shift: 08:00 – 16:00
────────────────────────────────────────────
Assigned rooms:
201 🟡 Checkout — Clean [Start] [Skip]
202 🟡 Stayover — Due today [Start] [Skip]
205 🔴 Priority — VIP arrival [Start] [Skip]
Unassigned (tap to claim):
203 🟡 Checkout
204 🟡 Checkout
5.2 Clean a room
- Tap "Start" → timer starts
- Cleaning in-progress indicator
- Tap "Done" → opens completion screen:
- Photo evidence (required if
tenant.housekeeping.require_photo = true) - "Any issues?" → category picker (Plumbing, Furniture, Electrical, Other)
- Notes (optional voice-to-text via
expo-speech)
- Photo evidence (required if
- Submit → room status → "Awaiting inspection"
- Notification sent to supervisor
5.3 Supervisor assignment
Supervisor sees all rooms with unassigned status. Drag (or tap) to assign to a staff member. Push notification sent to assigned staff member's device.
6. Maintenance flow
6.1 Work order queue
My work orders (Karim — Maintenance)
────────────────────────────────────
Room 305 — Bathroom faucet dripping 🔴 Urgent
Room 201 — TV remote not working 🟡 Normal
Lobby — AC unit noise 🟡 Normal
6.2 Work order detail
- Description + photos from reporter
- Parts needed: checklist (technician marks parts used from inventory)
- Status: Acknowledged → In Progress → Resolved / Needs parts / Escalate
- Resolution photo: required for completion
- Time logged: auto-tracked (start/stop timer)
7. Push notifications
| Event | Notification |
|---|---|
| New room assigned | "Room 201 assigned to you — checkout clean" |
| Priority room alert | "⚠️ VIP arriving in 2h — Room 205 needs urgent clean" |
| New maintenance work order | "New work order: Room 305 — plumbing" |
| Maintenance escalated | "Escalation: Room 305 plumbing — needs parts order" |
| Guest message (concierge) | "Guest in Room 201: 'Can I get extra towels?'" |
Notification tap → opens directly to relevant screen (deep link).
8. Offline behaviour
| Scenario | Handling |
|---|---|
| No connectivity | Room list from MMKV cache; actions queued in outbox |
| Reconnect | Outbox synced; push notifications delivered when online |
| Push notification offline | iOS/Android OS delivers when device comes online |
9. Geo-fenced clock-in
When tenant enables geo_fenced_clock_in:
- App requests
expo-location"always" permission on first launch - Clock-in screen shows: "You must be within [property name] to clock in"
- GPS checked; if within 200 m: clock-in allowed
- If not within range: "You appear to be [X km] from the property. Please see your manager."
- Manager override: manager PIN bypasses geo-fence check
10. Panic button (optional, Phase 3)
A persistent "SOS" button in the app header (hidden behind 3-second press to prevent accidental trigger):
- Sends immediate push notification to all supervisors on duty
- Shares GPS location
- Logs a timestamped panic event in
safety-service
11. Walkie-talkie-style chat (Phase 3)
Press-to-talk audio messages between staff members via notification-service:
- Low-latency audio clip (≤ 10 s)
- Group channels: "Housekeeping Floor 2", "Maintenance", "F&B Team"
- Auto-transcribed for Deaf/HoH staff members
12. Performance budgets
| Metric | Target |
|---|---|
| App launch to room list | ≤ 2 s (cached) |
| Photo capture + upload | ≤ 5 s on 3G |
| Push notification delivery | ≤ 5 s from event |
| Outbox sync on reconnect | ≤ 10 s |