← All notes

Hotel Management

Housekeeping status is a real-time problem disguised as a CRUD screen

A room marked clean twenty minutes ago is not information. During checkout rush the front desk needs the state now, not the state at last refresh.

  • Invexa Technologies
  • 2 min read

Housekeeping modules are usually built as a list of rooms with a status dropdown. It looks like a simple CRUD screen. It behaves like one until 11am, when forty rooms change state in an hour and the front desk is refreshing a page to find out whether they can check someone in early.

The read pattern is the whole design

The write side is trivial — a housekeeper marks a room clean, one row updates. The read side is what matters: several people watching the same board, needing to see changes within seconds, on cheap Android handsets over hotel wifi.

Polling every thirty seconds is the default and it is wrong in both directions. Too slow when it matters, and forty devices hammering the endpoint all day when nothing is happening.

Push the delta, not the board

Server-sent events are enough here. One long-lived connection per device, and the server pushes room-state changes as they happen. No client library, no websocket infrastructure, and it reconnects on its own when the wifi drops behind a lift shaft — which it will.

event: room_status
data: {"room":"412","status":"clean","by":"housekeeper_7","at":"..."}

The client applies the delta to what it already has. A full board refresh happens on connect and never again.

Status is not one field

“Clean” is at least three independent facts: physically serviced, inspected, and released to the front desk. Collapsing them into one enum means a supervisor cannot mark a room inspected without overwriting who cleaned it, and the front desk cannot tell “cleaned but not checked” from “ready”.

service_state     dirty | in_progress | serviced
inspection_state  pending | passed | failed
release_state     held | released

Three small fields, each owned by a different role, each with its own audit trail. One combined enum, and every transition needs a rule about who is allowed to overwrite whom.

Offline is normal, not exceptional

Housekeeping happens in stairwells and corridors. Queue writes locally and flush on reconnect, with the timestamp captured at the device, not at the server. A room marked clean at 10:42 that syncs at 10:51 should read 10:42, or the productivity reports are wrong and the housekeepers know it before you do.

Next step

Have a project in mind?

A 30-minute call is usually enough to know whether we are the right team for it. If we are not, we will say so.

Start a project

Replies within one working day