User guide · Handbook

Hotel Management System: Maintenance handbook

13 chapters on one page. Use Print to save a PDF; each chapter starts on a new page.
Chapter view

Welcome

What this system does, who each part is for, and how to get the most out of this guide.

What the Hotel Management System is

One operations platform for the whole property: front desk, rooms, housekeeping, maintenance, guests, staff, money, restaurant and reports.

The system runs the daily life of your hotel from a single screen set. A reservation made at the front desk becomes a room to prepare for housekeeping, a folio for accounts, a guest profile for the CRM and a line on tonight's night audit, without anyone re-typing anything.

  • Operations: Bookings, Rooms, Housekeeping and Maintenance keep the house running.
  • Guests & team: Guests (CRM), Staff (rota, attendance, leave) and User Roles (who may do what).
  • Revenue: Payments & invoices, the POS terminal, Restaurant & kitchen, and Inventory.
  • Insights & system: Reports & exports, Notifications, the Audit log and Settings.

Everything is multi-tenant: your hotel's data is isolated at the database level, and each person signs in with a role that decides which modules they see and whether they can view, edit or fully manage them.

How to read this guide

Chapters follow the sidebar. Module chapters share one template so you always know where to look.

The guide has four parts:

  1. 1
    Start here
    Signing in, moving around quickly, and what your role can do.
  2. 2
    Your day
    One walk-through per kind of job, in the order a real shift runs: the front desk, the till, the pass, the rooms, and the manager's week. Signed in, you see the one written for you.
  3. 3
    Modules
    One chapter per sidebar entry, in sidebar order. Each covers purpose, who uses it, the screen, workflows, statuses, fields, permissions, tips and the errors you may see.
  4. 4
    Reference
    Offline mode, speed tips, troubleshooting for every error message, and a glossary.

Conventions used throughout:

  • ⌘K / Ctrl K style keys mean “press together”. The shortcuts that exist: ⌘K / Ctrl K focuses global search, ? opens this guide, Esc closes what is open, and inside the guide / focuses the guide search while [ and ] page between chapters.
  • Role tags next to a heading show who the section is mainly for. Anything marked Full needs full access to that module.
  • Status diagrams show every state and the arrows between them, if an arrow is not drawn, the system will refuse that move.

Getting help from anywhere

The guide is one keystroke away on every screen and works even when you are signed out.

  • Press ? on any screen, click the book icon in the top bar, or choose User guide at the bottom of the sidebar.
  • Every chapter has its own address, for example /guide/bookings. Use the link icon next to a heading to copy a link to that exact section and paste it to a colleague.
  • The guide is public: share /guide with new staff before their account exists. Signed-in users see it inside the app; everyone else gets a light frame with a Sign in button.
  • Use Print in the chapter header to save a chapter as PDF for the staff room, the layout switches to a clean single column.

Getting started

Signing in with email or PIN, what your role means, trying the demo sandbox, dark mode and installing the app on a phone or desk PC.

Signing in

Two ways in: your email and password, or the shared front-desk PIN plus your name.

The sign-in screen
123467
  1. 1
    Method switch
    Email & password or Staff PIN.
  2. 2
    Email
    The address your administrator created the account with.
  3. 3
    Password
    Case-sensitive. Ten failed attempts in fifteen minutes lock the address for a while.
  4. 4
    Forgotten your password?
    Shows who to ask. Nothing is emailed from this system: an administrator sets you a new password in Staff, Accounts, and it works straight away.
  5. 6
    Sign in
    Lands on your screen: the dashboard for the desk and the managers, the till for waiters, the kitchen display for the kitchen, the housekeeping board for room attendants.
  6. 7
    Demo role (demo host only)
    Below the form: pick a role in the dropdown and press Enter demo to open a private sandbox, or use Prefill as to fill the form with that role's demo account.

Email and password

  1. 1
    Open the app address
    The address your administrator gave you for your hotel, e.g. operations.yourhotel.com. On the public demo the sign-in form is at the top and the demo role dropdown sits below it.
  2. 2
    Enter email and password
    Passwords are set by an administrator in Staff → Accounts, and you can change yours later in Settings → Account.
  3. 3
    You land on your screen
    The desk and the managers open on the Dashboard; a waiter opens on the till, the kitchen on the kitchen display, a room attendant on the housekeeping board. The sidebar shows only the screens your role can open, and a one-screen role has no dashboard at all.

Staff PIN

Busy front desks share a hotel PIN of 4 to 8 digits. Pick your name from the staff list, type the PIN on the keypad and you are in. The PIN can never sign in as a Super Admin or Hotel Manager, those accounts always use email and password, and only a Settings-Full user can change the PIN.

Your first sign-in: the product tour

New accounts get a short guided tour of the screen, their role and their first tasks. Skip it or replay it any time.

The first time you sign in, a welcome card offers a three-minute tour written for your job. It walks your own screen control by control, spotlighting the real buttons: the shift pill, the menu grid, Send and Pay for a waiter; the shelves and station tabs for the kitchen; the board and the checklist for housekeeping; the pipeline, the folio and the reports for the desk and the managers. It moves between screens as it goes and ends with a short practice list.

  1. 1
    Start the tour, or Skip the tour
    Skipping records that you have seen it; nothing else changes.
  2. 2
    Move with Next and Back, or → ←
    Press Esc at any point to skip the rest. Each module card has an Open link that takes you straight there.
  3. 3
    Finish
    The last card lists practice tasks for your job, such as opening an order on the first table and taking cash for it, or creating a walk-in and checking them in.

Roles and access levels

Your role sets a level per module: none, view, edit or full. The sidebar and every button respect it.

There are 13 standard roles. Each one has a level for each of the 13 permission modules; the matrix below is the default; administrators can adjust it in User Roles.

Default access matrix (User Roles can change it)
RoleDashboardBookingsRoomsGuestsPaymentsStaffReportsSettingsInventoryRestaurantKitchenFinancesAnalytics
Super AdminFullFullFullFullFullFullFullFullFullFullFullFullFull
Hotel ManagerFullFullFullFullFullFullFullEditFullFullFullFullFull
ReceptionistViewFullEditEditEditNoneNoneNoneNoneEditNoneNoneNone
AccountantViewViewNoneViewFullNoneEditNoneFullViewNoneFullView
Housekeeping MgrViewViewFullNoneNoneEditViewNoneViewNoneNoneNoneNone
MaintenanceViewNoneEditNoneNoneNoneNoneNoneNoneNoneNoneNoneNone
Restaurant MgrViewViewNoneViewViewViewViewNoneEditFullFullNoneView
HR ManagerViewNoneNoneNoneViewFullEditViewNoneNoneNoneNoneNone
SecurityViewViewViewViewNoneViewNoneNoneNoneNoneNoneNoneNone
WaiterViewNoneNoneNoneNoneNoneNoneNoneNoneEditViewNoneNone
ChefViewNoneNoneNoneNoneNoneNoneNoneViewViewEditNoneNone
HousekeeperViewNoneEditNoneNoneNoneNoneNoneNoneNoneNoneNoneNone
CashierViewNoneNoneNoneNoneNoneNoneNoneViewFullViewNoneNone
None No accessView View onlyEdit Can editFull Full access
  • View: open the module, read everything, export nothing. A small lock icon marks view-only modules in the sidebar.
  • Edit: create and change records (new booking, mark a room clean, add a menu item).
  • Full: also delete, approve, refund, export and change configuration.

Some screens map to a module you might not expect: Housekeeping and Maintenance sit under Rooms; POS, Restaurant and Inventory under Payments; User Roles, the Audit log and hotel-wide Settings under Settings. Security officers can always read the Audit log.

Trying the demo sandbox

On the public demo, every browser gets its own private copy of a fully seeded hotel for 24 hours.

On the demo host the sign-in page shows a Demo role dropdown under the form. Pick a role and pressEnter demo to sign in as that role inside a sandbox that only your browser can see, pre-loaded with rooms, guests, hundreds of bookings, invoices, POS tickets and stock. Change anything, nobody else sees it. A purple Demo chip in the top bar shows how long the sandbox has left; Reset throws it away and starts a fresh one.

Dark mode and installing the app

Toggle the theme from the top bar; install the app for a fullscreen, offline-capable front desk.

  • Dark mode: click the moon/sun icon in the top bar, or Settings → Account. The choice is remembered per browser.
  • Install as an app: in Chrome or Edge choose Install app from the address-bar menu; on a phone use Add to Home Screen. Installed, the app opens without browser chrome and keeps the front-desk screens available when the connection drops (see the Offline chapter).
  • Device alerts: Settings → Notifications → Device alerts asks for permission to show system notifications for new alerts even when the tab is in the background.

Keyboard: ⌘K global search, ? this guide, Esc closes any drawer or dialog.

A day on the rooms

For room attendants and the housekeeping supervisor: the morning list, taking a room, the checklist, inspection, releasing the room to reception, reporting a fault, and what the board does when the internet drops.

Morning to hand-over

HousekeeperHousekeeping Mgr

Follow the timeline. The board is the only screen you need; every move on it is one tap.

  1. Morning
    Open the board
    Sign in with your name and the PIN. The housekeeping board opens straight away. The numbers at the top are today's tasks, completed, in progress and overdue. Switch to Board to see the rooms as columns: Dirty, Assigned, In progress, Inspection, Ready for guest.
  2. Morning
    Where the tasks come from
    A room turns Dirty the moment reception checks a guest out, and every morning the system adds a stayover clean for each room with a guest staying on. The supervisor can add a task by hand (a deep clean, a public area). Nobody types a room status: the room is Cleaning until its task is done.
  3. Room
    Take a room
    Open a Dirty card and press Assign to me and start, or drag it to In progress. A card cannot sit in Assigned with nobody's name on it; the board asks who is cleaning. Take rooms with a guest arriving today first: the card shows the due time, and an overdue card turns red.
  4. Room
    Tick the checklist
    Every task carries the room checklist: bed, bathroom, towels, minibar, floor, and whatever your hotel added. Open Cleaning checklist and tick each item as you finish it. The room cannot be released while a line is still open.
  5. Room
    Found something broken?
    A leaking tap, a dead bulb, a broken lock: press Report a fault on the task (or open Maintenance) and say which room and what is wrong, for example “lamp broken in 204”. A fault that makes the room unsafe blocks it, so reception does not sell it until it is fixed.
  6. Room
    Inspection, then Ready for guest
    Move the finished room to Inspection if the supervisor checks rooms, or straight to Ready for guest where they do not. Ready is what reception waits for: the room turns green on their grid and can be sold that second. A room that fails inspection goes back to In progress with a note.
  7. Any time
    When the internet drops
    The board keeps working. Ticks and moves you make offline are saved on this device and sent when the connection returns; an Offline pill shows in the top bar meanwhile. Do not clear the browser or sign out while it shows.
  8. End
    Hand over
    Nothing to write up: the board is the hand-over. What is still Dirty or In progress is the next shift's list, and the supervisor and the manager see the same board from their own screens.

Supervising the day

Housekeeping Mgr

For the housekeeping supervisor: assigning, inspecting, adding tasks, leave and the rota.

  • Assign: open any card to give it to a colleague, change its priority or add a note. The board refuses a colleague who is on approved leave, and warns about one who is off duty.
  • Inspect: Inspection is your column. Check the room, then Pass: release the room or Fail: send back to clean again. Releasing a room with checklist lines still open is allowed for you and written to the audit log.
  • Add a task: New task creates a clean the system did not: pick the room, the kind of clean and who does it.
  • Rooms out of service: on Rooms, Mark out of service takes a room off sale for repairs; Return to service puts it back.
  • Leave and the rota: on Staff you see who is on today, approve leave and fill the rota; the board and the rota both refuse days inside approved leave.

Words used on this page

Housekeeping vocabulary as the system uses it.

Checkout clean
The task created when a guest checks out. High priority, due by the check-in time.
Stayover
A guest staying another night; their room gets a lighter clean each morning.
Board
The tasks as columns from Dirty to Ready for guest. Dragging a card is the same as pressing its button.
Checklist
The list of things to do in the room, ticked one by one. The room is not released until it is complete.
Inspection
The supervisor's check between cleaning and release. Pass releases the room; Fail sends it back.
Ready for guest
The room is released: reception's grid turns green and the room can be sold.
Out of service
A room taken off sale by the supervisor or a manager until repairs are done.

Rooms

The room inventory: room types and their nightly rates, the rooms themselves, a live status grid projected from bookings, housekeeping and maintenance, out-of-service handling and the availability search behind every booking.

Purpose and who uses it

ReceptionistHousekeeping MgrHotel Manager

One screen shows the state of every room right now; managers also maintain the inventory and rates here.

Rooms is where the house is defined and watched. A room type (Standard, Deluxe, Suite…) carries the base nightly rate, bed description and size; a room is a number on a floor that belongs to one type. Bookings are sold by type and assigned to a room; the room's status on this screen tells the desk whether a guest can walk into it.

  • Receptionists (Rooms = Edit) watch the grid, take a room out of service and raise housekeeping or maintenance tasks from it.
  • Housekeeping Managers and Hotel Managers (Rooms = Full) also add and delete rooms and manage room types and rates.
  • Maintenance (Edit) uses the grid to report issues; Security sees it read-only.

Screen anatomy

Status tiles that double as filters, a filter bar, and the List table (the default) with Grid and By floor as the other views of the same rooms.

Rooms, List view (the default)
12347
  1. 1
    Page head
    “Rooms · N rooms · X% occupied”, the List / Grid / By floor switch (the List table opens first; the choice is remembered per module and ?view=grid deep-links) and, for Rooms = Full, Room types and New room.
  2. 2
    Filter bar
    “Search room number or type…”, plus Room type, Floor and Housekeeping (HK state) dropdowns. Shown / total counts and Clear.
  3. 3
    View switch
    Grid and By floor are the alternatives to the table. Grid shows a card per room with a coloured status stripe. By floor is the floor map: one tile per room under “Floor N · rooms · occupied · arriving · departing”, each tile showing the number, the status colour, the guest in it (or the type when empty), “Departs today” or “Until dd/mm”, a purple “arriving” tag for today's arrivals, and a broom or wrench icon when housekeeping or maintenance is on the room. Hover a tile for the full story.
  4. 4
    Rows
    Room, Type, Floor, Status, Housekeeping, Guest (who is in-house or reserved, or who is arriving), Departs (with a “today” badge on departure day) and Price / night. Tap a heading to sort; Type, Floor, Status and Housekeeping headings filter. Click a row for the drawer.
  5. 7
    Status tiles
    All rooms, Available, Occupied, Reserved, Cleaning, Maintenance, each with its count. Click one to filter; the chosen tile gets a coloured border.

Every room carries the stay holding it today: the card and the Guest today column name the guest, say whether they are In-house or Reserved, and show the stay dates. Rooms nobody is booked into read “No guest today”. A room can be Cleaning or Maintenance and still have a reservation waiting on it, which is exactly the case the desk needs to see early.

Out-of-service rooms have no tile of their own, they show with the grey Out of Service badge under All rooms and carry a red “Out of service” badge in the drawer. The Housekeeping dropdown filters on the HK state (clean, pending, in progress, occupied) that the projection stores alongside the status.

The room drawer and room actions

ReceptionistHousekeeping Mgr

Status is never edited directly; the drawer offers the actions that change the facts behind it.

Click any card, tile or row to open “Room N”, headed with its type, beds and size, a status badge, floor and an “Out of service” badge when set.

  • Occupancy: who holds the room today: guest, guest code and booking code, the status badge, In-house / Arriving today / Reserved, the dates, nights, guests and country, their phone and email, when they checked in, and what the folio has been charged and paid with the balance still due. Open bookingjumps to that booking in the archive. When nobody is booked in it says so.
  • Price / night, Housekeeping, Last released, Past stays: the four summary cards. Notes (for example the out-of-service reason) appear below them.
  • Next 14 days: a strip of day cells painted by the stays that hold the room (blue = in-house, purple = confirmed), then Revenue for the last 30 and 90 days with the nights behind it, the room type profile (sleeps, beds, size, amenities) and the last Housekeeping and Maintenance events on this room.
  • Open work: every open housekeeping task and maintenance order on the room, with its code, status and who it is assigned to. Orders that block the room are flagged.
  • Next arrivals: the next five reservations on the room; click one to open it.
  • Stay history: every stay this room has ever carried (guest, booking, dates, nights, status, amount and anything still owed), 25 at a time with Prev / Next underneath.

Under Room actions the drawer reminds you: “Status is projected from bookings, housekeeping and maintenance. It is not edited directly.”

  • Out of service: flags the room; it disappears from availability and reads Out of Service regardless of anything else. Toast: “Room N marked out of service”. This works offline and is queued until the connection returns. It is refused while a guest is in-house, and when reservations still hold the room a dialog lists them (“Room 12 has 2 upcoming bookings (BK-…, BK-…)”) and offers Unassign them and continue, after which those bookings wait for a room on the board.
  • Return to service: clears the flag; the projection recomputes at once (“Room N returned to service”). Also offline-capable.
  • Create HK task: raises a deep-clean task at Medium priority on the Housekeeping board (“HK task created for N”). The room reads Cleaning until housekeeping marks it Ready for Guest.
  • Report maintenance: opens a work order titled “Issue in room N” (category General, Medium priority) on the Maintenance board (“Maintenance reported for N”). It only blocks the room if the work order is marked as blocking.

View-only users see “View-only access. Status changes need the Rooms edit permission.” instead of the action chips. Rooms = Full users also get a red Delete button in the footer.

Adding and deleting rooms

Hotel ManagerHousekeeping Mgr

New rooms are sellable immediately; a room with booking history cannot be deleted.

  1. 1
    Click New room
    The dialog “New room, Appears immediately in availability and the booking wizard” opens.
  2. 2
    Enter Room number, Floor and Room type
    Numbers are unique within the hotel (up to 10 characters); floor 0–50. The type list shows the base rate per night.
  3. 3
    Click Add room
    Toast “Room N added”. The room starts Available and counts toward its type's sellable capacity from that moment.

Deleting

Open the room, click Delete and confirm. A room a guest has ever slept in, or that a restaurant bill was ever charged to, is refused with the count: the stays have to keep naming the room they were sold. Take it out of service instead, which stops it being sold and keeps everything. Open housekeeping tasks and work orders do not block the delete for a Super Admin; they go with the room.

Room types and rates

Hotel Manager

Rates are edited inline (new quotes only); each type also carries a profile: who fits, what the room has, how it is described.

  1. 1
    Click Room types
    The dialog “Room types & rates, Rate changes apply to new bookings only. Existing bookings keep their agreed rate” lists every type with Beds, the number of Rooms and an editable Rate / night (UGX).
  2. 2
    Change a rate
    Type a whole figure into the rate cell and press Enter or click away. Toast: “Deluxe → UGX 280,000/night (new bookings only)”.
  3. 3
    Add a type
    Fill Name, Rate (UGX), Beds (e.g. “1 King”) and optionally the size (“26 m²”), then click the plus button. Empty required fields give “Fill name, rate and beds”.
  4. 4
    Edit the profile
    Each row shows Sleeps (adults + children) and the amenities as icons. Profile opens a dialog for Adults (1 to 20), Children (0 to 10), Amenities (picked from a list, up to 30) and a Description (up to 600 characters). Toast: “<name> profile saved”. The profile shows in the room drawer and feeds the reports.

Room types are ordered by the sequence they were created in.

Amenities

Amenities are picked from a list, never typed: open Profile on a room type and press the amenities box. The list drops down grouped the way a person thinks about a room (Comfort, Bathroom, Media and work, Drinks and food, Outside the room, Service, Hotel facilities, Access and policy), and every row is acheckbox, so the list itself shows what this room already has. Tick and untick as many as you like; the box above says how many are picked, Clear empties it, and each one also appears underneath as a chip with its icon and an x. Saving shows on the room types table behind at once, without closing it.

On the Rooms screens they show as icons alone: the room types table and the room drawer draw the little pictures, with the name on hover and on the accessible name, and a “+3” when there are more than fit. A list of six pictures reads as a room at a glance where six words read as a wall of text.

Stopping a type being sold

Each row has a red bin. What happens when you press it depends on what the type is carrying, and the app says which:

  • Nothing points at it: it goes, along with any published prices it had. Bookings are not affected because there are none.
  • It has rooms but has never been booked: “Room type “Trial Wing” still has 1 room.” A Hotel Manager is told a Super Admin can delete it anyway; the Super Admin gets a Move its rooms to picker, and one press moves the rooms and deletes the type together.
  • A guest has been sold it: “still has 639 bookings, 3 group allotments, 15 rooms and 6 published rates. The 639 bookings and 3 group allotments cannot be deleted with it.” Nothing gets past that, at any access level, because a folio has to keep saying what it sold. Move its rooms to another type instead: the type stays on the old bookings and stops being sold the moment its last room leaves.

Availability search

Receptionist

The same query feeds the booking wizard and the check-in room chips, with a stricter “ready” mode for check-in.

Asking “which rooms are free from A to B” returns rooms that are not out of service and have no New, Confirmed or Checked In booking whose nights overlap the requested window (a room under maintenance today still counts for later dates; the ready-only variant used at check-in also drops Maintenance and Cleaning rooms). Optionally limit it to one room type. The booking wizard uses this at Check availability.

At check-in the desk asks for ready rooms only: the same list minus rooms in Cleaning, rooms with an open housekeeping task and rooms where a guest is still checked in (a same-day turnover). That mirrors the check-in rules exactly, so a chip the drawer offers never fails.

Room status is a projection

Six statuses, computed from facts in a fixed priority order and refreshed by every relevant action, a 30-minute sweeper and the night audit.

A typical day for one room, every arrow is a fact changing, not a status edit
A typical day for one room, every arrow is a fact changing, not a status editbooking arrives todaycheck incheck outHK task readyblocking work orderorder closedOut of serviceReturn to serviceAvailableReservedOccupiedCleaningMaintenanceOut of Service
  • Available → Reserved (booking arrives today)
  • Reserved → Occupied (check in)
  • Occupied → Cleaning (check out)
  • Cleaning → Available (HK task ready)
  • Available → Maintenance (blocking work order)
  • Maintenance → Available (order closed)
  • Available → Out of Service (Out of service)
  • Out of Service → Available (Return to service)

The stored status is recomputed from five facts, and the first that is true wins:

  1. Out of Service: the out-of-service flag is set (HK state pending).
  2. Occupied: a booking is Checked In on the room (HK state occupied).
  3. Maintenance: an open work order (Reported, Assigned, In Progress or Waiting for Parts) is marked as blocking the room.
  4. Cleaning: an open housekeeping task (Dirty, Assigned, In Progress or Inspection) exists for the room (HK state in progress).
  5. Reserved: a New or Confirmed booking holds the room today in hotel-local time: its check-in is today or earlier and its check-out is later than today. A booking three weeks out does not make the room Reserved.
  6. Available: none of the above (HK state clean).

Because the Reserved rule depends on the date, the server also re-syncs every room of every hotel on a timer, every 30 minutes by default (ROOM_SYNC_MINUTES; 0 disables it), and again when the night audit closes the business day. Between sweeps, every booking, housekeeping, maintenance and out-of-service action re-syncs the rooms it touches, so the grid is right within seconds of the fact changing.

Fields

The New room dialog and the room type row.

New room
FieldTypeNotes
Room number *text 1–10Unique within the hotel. Shown on cards, in the booking drawer and on the housekeeping board.
Floor *0–50Groups the By floor view; shown as a “Floor N” tag.
Room type *selectSets the nightly price and which bookings the room can take.
Notestext ≤ 300Free text shown in the drawer. The out-of-service reason is written here when one is given.
Room type
FieldTypeNotes
Name *text 2–60Unique within the hotel.
Rate / night *whole UGXBase rate before any rate plan and before tax. Digits only, commas and spaces are stripped.
Beds *text 1–40Free text such as “1 King” or “2 Twin”, shown in the booking wizard.
Sizetext ≤ 20Optional label such as “26 m²”.

Permissions

View watches the grid; Edit changes facts about a room; Full manages the inventory and rates.

Default levels for Rooms (Housekeeping and Maintenance share the Rooms module)
RoleRoomsBookings
Super AdminFullFull
Hotel ManagerFullFull
ReceptionistEditFull
AccountantNoneView
Housekeeping MgrFullView
MaintenanceEditNone
Restaurant MgrNoneView
HR ManagerNoneNone
SecurityViewView
WaiterNoneNone
ChefNoneNone
HousekeeperEditNone
CashierNoneNone
None No accessView View onlyEdit Can editFull Full access
  • Rooms = View: the grid, list and floor views, room types and rates (read-only), the drawer.
  • Rooms = Edit: Out of service, Return to service, Create HK task, Report maintenance.
  • Rooms = Full: New room, Delete, Room types (add a type, change rates, delete a type). Deleting past rooms that are still on a type needs a Super Admin.
  • Bookings = View: the availability search used by the wizard and check-in.

Tips

Tiles as filters, live updates, offline behaviour and when to use out-of-service.

Errors you may see

Every refusal the rooms endpoints return.

409Room 204 already exists
Why
Another room already has that number.
Fix
Use a different number, or edit the existing room.
409Room 204 has booking history. Mark it "Out of Service" instead of deleting
Why
The room has carried at least one booking, so deleting it would break folios and reports.
Fix
Open the room and click Out of service; it leaves availability but keeps its history.
409Room type "Deluxe" already exists
Why
Type names are unique within the hotel.
Fix
Pick another name, or change the rate on the existing type.
409"Deluxe" still has rooms or bookings attached
Why
A room type cannot be deleted while rooms or bookings reference it.
Fix
Move or delete its rooms first; bookings keep it forever.
400Whole UGX figure
Why
The rate contained something other than digits.
Fix
Enter the nightly rate as a whole number, 250000, not 250,000.00.
400to must be after from
Why
The availability search was asked for a zero- or negative-length window.
Fix
Check-out must be at least one day after check-in.

Housekeeping

Cleaning tasks from checkout to “Ready for Guest”. A five-column board, a paged task archive, per-task checklists, and transitions that keep working when the connection drops.

Purpose and who uses it

Housekeeping MgrReceptionist

Turns every departure and every manual request into a task the floor team can work through and a supervisor can inspect.

Housekeeping tracks one task per room that needs attention. A checkout at the front desk creates a task on its own; you add stayover refreshes and deep cleans yourself. Each task moves across the board from Dirty Rooms to Ready for Guest, carries a checklist, and, while it is open, puts the room into Cleaning status on the Rooms module so the front desk cannot check a guest into it.

  • Housekeeping managers run the board, inspect rooms and sign them off as ready.
  • Room attendants (signed in with the front-desk PIN, or on a shared tablet) tick checklist items and move their own rooms forward.
  • Receptionists watch the board to know which rooms are back in the sellable pool; they can also raise a stayover refresh when a guest asks.

Housekeeping sits under the Rooms permission module: View shows everything read-only, Edit creates tasks and moves them.

Screen anatomy

Four KPI tiles, four views (List is the default; Cards, Board and Cleaning checklist are the others) and a filter bar that changes with the view.

Housekeeping → Board (the List view opens first)
123458
  1. 1
    Page head and KPIs
    “Tasks today” (every task in the working set), “Completed” (Ready for Guest), “In progress” (In Progress + Inspection) and “Overdue” (open tasks whose due time has passed).
  2. 2
    Dirty Rooms
    New tasks land here. Checkout cleans arrive as High priority, due in two hours.
  3. 3
    Assigned
    Tasks that have an attendant on them. Between it and Inspection sits In Progress.
  4. 4
    Ready for Guest
    Done and inspected. The room leaves Cleaning status the moment a card lands here.
  5. 5
    Task card
    Room number, priority badge, task type and floor, an amber note if one was left at checkout, the attendant, and a “→ next column” button.
  6. 8
    New task
    Opens the “New housekeeping task” dialog (Rooms Edit).

Views

  • List (the default): a paged table loaded from the server one page at a time. Adds a Status filter and lives in the address bar (?status=ready&floor=2&page=2), so a filtered view can be bookmarked. Columns: Room, Floor, Type, Assigned, Priority, Status. Click a row to select the task for the checklist view.
  • Cards (?view=cards): the same paged archive, one card per task; the view phones open on.
  • Board (?view=kanban): the whole working set of tasks, never paged. Filters: search (room, task code, staff, note), Task type, Priority, Assigned to, Floor. Status has no filter here because the columns already are the status.
  • Cleaning checklist: the checklist of the task you last clicked; if you have not clicked one, the first task that is In Progress.

Your view choice is remembered per module in a cookie on this browser, and ?view= in the address shares it. Phones default to Cards.

Working a checkout clean

Housekeeping Mgr

The everyday flow: a departure creates the task, an attendant works it, a supervisor inspects and signs it off.

  1. 1
    The front desk checks the guest out
    A Checkout clean task appears in Dirty Rooms with High priority, due by the hotel's check-in time (or two hours out when that is closer). An alert “Housekeeping: Room 204 needs cleaning” goes to the notification feed. If the room already has an open checkout clean, no second task is created.
  2. 2
    Move the card to Assigned or straight to In Progress
    Drag the card, or click the → Assigned button on it. From Dirty Rooms you may skip Assigned and go directly to In Progress.
  3. 3
    Tick the checklist as the room is cleaned
    Open the Cleaning checklist tab (or click the card first so it becomes the selected task). Each line, “Strip & change linens”, “Clean bathroom & restock”, …, saves the moment you tick it and records who ticked it.
  4. 4
    Send it to Inspection
    Click Move to Inspection at the bottom of the checklist, or the card button. Inspection can start with ticks still open; releasing the room cannot: Ready for Guest is refused while a checklist line is open (“3 checklist items still open on Room 204”), unless a supervisor with Rooms · Full access releases it anyway, which is audited.
  5. 5
    Supervisor signs off: Ready for Guest
    From Inspection the only forward move is Ready for Guest. The room drops out of Cleaning status, a green alert “Room 204 ready” is posted, and the change is written to the audit log. A room that fails inspection goes back to In Progress instead.

Adding a stayover refresh or deep clean

Housekeeping MgrReceptionist

Manual tasks for in-house guests and periodic deep cleans, created from the New task button.

  1. 1
    Click New task
    Top right of the page. You need Rooms Edit.
  2. 2
    Pick the Room
    The list shows every room as “204 · Floor 1 · Deluxe”. Occupied rooms are allowed, that is the point of a stayover refresh.
  3. 3
    Pick the Task type
    Stayover refresh or Deep clean. Checkout cleans cannot be created by hand; only a checkout makes one.
  4. 4
    Click Create
    The task appears in Dirty Rooms (or straight in Assigned if you picked an attendant) and the toast names its code. The room shows as Cleaning on the Rooms page until the task is Ready (unless a guest is in house, in which case Occupied wins).

Checklists and their template

Housekeeping MgrHotel Manager

Every task gets a copy of the hotel's checklist template when it is created; the template lives in Settings → Ops config.

When a task is created the system copies the hotel's active checklist steps onto it, in order. If the hotel has never edited its template, the built-in list is used:

  • Strip & change linens
  • Make beds
  • Clean bathroom & restock
  • Vacuum & mop floors
  • Dust all surfaces
  • Empty bins
  • Restock minibar
  • Restock amenities
  • Check lights & AC
  • Final inspection

To change the template open Settings → Ops config → Housekeeping checklist(needs Settings Full). You can rename a step in place, switch a step off without deleting it, or add a new one with New checklist step. As the screen says: “Changes apply to tasks created from now on; open tasks keep their checklist.”

Ticks are per task and per person: each tick stores who completed it and when. Unticking clears both. The checklist gates one move only: a room is not Ready for Guest until every line is ticked, unless a supervisor (Rooms · Full access) releases it, in which case the audit log records the override.

Task statuses and what they drive

Five stored statuses, two of them allow a step back; the room's Cleaning status is derived from any open task.

Cleaning workflow (only these moves are accepted)
Cleaning workflow (only these moves are accepted)skipunassignrestartpassfailDirty RoomsAssignedIn ProgressInspectionReady for Guest
  • Dirty Rooms → Assigned
  • Dirty Rooms → In Progress (skip)
  • Assigned → In Progress
  • Assigned → Dirty Rooms (unassign)
  • In Progress → Inspection
  • In Progress → Dirty Rooms (restart)
  • Inspection → Ready for Guest (pass)
  • Inspection → In Progress (fail)
  • Dirty Rooms: nobody is on it yet. Checkout cleans start here at High priority.
  • Assigned: an attendant owns it. Moving a card back to Dirty Rooms puts it up for grabs again.
  • In Progress: being cleaned; the checklist is normally ticked during this stage.
  • Inspection: cleaned, waiting for a supervisor. Pass → Ready; fail → back to In Progress.
  • Ready for Guest: final. Counts towards the “Completed” tile.

What is derived, not stored

  • The board column is simply the task status, there is no separate column field.
  • Overdue is worked out on screen: an open task whose due time is earlier than now.
  • The room's status on the Rooms page is recomputed after every task change: out of service → occupied → blocked by maintenance → Cleaning (any task not yet Ready) → reserved → available. Nobody sets “Cleaning” by hand.
  • The check-in room picker only offers rooms that are ready, so a room with an open task cannot be handed to an arriving guest until its task reaches Ready for Guest.

Task fields

What a task record holds, and which parts the screen lets you set.

Housekeeping task
FieldTypeNotes
CodeHK-…Assigned automatically; shown on the checklist tab and used in alerts and the audit log.
Room *roomPicked in the New task dialog. Fixed once created.
Task type *enumCheckout clean (system-created at checkout), Stayover refresh, Deep clean.
PriorityHigh / Medium / LowHigh for checkout cleans, Medium for manual tasks. Not editable on screen; used as a filter and badge.
Status *enumOne of the five board columns. Changed by dragging or the → buttons.
Assigned tostaff recordAn employee from the staff directory (not a login). Shown as the first name and avatar on the card, “Unassigned” otherwise. Supervisors change it from the list cell or the drawer; the picker searches by name, job title or department and never offers inactive staff.
Duedate-timeTwo hours after checkout for checkout cleans; empty for manual tasks. Drives the Overdue tile and the List tab's default sort.
Notetext ≤ 300Left by the front desk at checkout (for example “guest reported broken lamp”). Shown as an amber strip on the card.
ChecklistitemsCopied from the template at creation. Each item records who ticked it and when.

Permissions

Housekeeping is governed by the Rooms module: View reads, Edit does everything on this screen.

Default levels that matter for Housekeeping
RoleRoomsSettings
Super AdminFullFull
Hotel ManagerFullEdit
ReceptionistEditNone
AccountantNoneNone
Housekeeping MgrFullNone
MaintenanceEditNone
Restaurant MgrNoneNone
HR ManagerNoneView
SecurityViewNone
WaiterNoneNone
ChefNoneNone
HousekeeperEditNone
CashierNoneNone
None No accessView View onlyEdit Can editFull Full access
  • Rooms View: open the board, list and checklist read-only. The New task button and the → buttons are hidden; cards cannot be dragged.
  • Rooms Edit: create tasks, move cards, tick checklist items.
  • Settings Full: edit the checklist template in Settings → Ops config.

By default that means Housekeeping Mgr, Receptionist, Maintenance, Hotel Manager and Super Admin can work the board; Security can only look; Accountant, Restaurant Mgr and HR Manager do not see the module at all.

Tips

Live updates, offline moves, filters and the checklist tab.

  • Use Assigned to → Unassigned together with Floor to hand out a floor's rooms at the start of a shift.
  • The board search matches room number, task code, attendant name and the checkout note, so typing “lamp” finds the room whose note mentions it.
  • Click a card to make it the selected task, then switch to Cleaning checklist; the header shows “Room 204: Checkout clean” and the code so you know you are ticking the right one.
  • The List view sorts by creation date (newest first) and pages 50 at a time (25, 50 or 100); change rows-per-page at the bottom. Esc closes any dialog.
  • Dragging a card to a column the workflow does not allow shows “Move to an allowed next column in the cleaning workflow” and leaves the card where it was.

Errors you may see

The server refuses only one thing here: a move the workflow does not allow.

409Cannot move from inspection to dirty
Why
The target column is not an allowed next step from the task's current status (the message names both). It also appears when a queued offline move arrives after someone else already moved the task.
Fix
Move one step at a time along the workflow diagram. From Inspection you can only go to Ready for Guest or back to In Progress.
404Task not found
Why
The task was removed or belongs to another hotel, usually a stale tab.
Fix
Reload the page.
404Room not found
Why
The room picked in New task no longer exists.
Fix
Close the dialog and open it again to refresh the room list.
404Checklist item not found
Why
The item you ticked is not on that task, the checklist was opened from an outdated snapshot.
Fix
Reload; the task's current checklist will be shown.

Client-side messages: “Pick a room” (New task with no room chosen), “Could not update task” / “Could not create task” / “Could not update checklist” when the request fails for a reason other than the above.

Stayover refresh
A light service of a room whose guest is staying another night.
Checkout clean
The full turn-around after a guest departs; created automatically by check-out.
Ready for Guest
The final task status. The room is sellable again and can be picked at check-in.
Working set
Every task on the board, regardless of age, the same list the offline snapshot keeps.

Maintenance

Work orders for repairs anywhere on the property: report an issue, assign a technician or an outside contractor, block the room while it is unsafe, track parts and cost, and close it for good.

Purpose and who uses it

MaintenanceHousekeeping MgrReceptionist

One record per fault, an M-code work order, from the moment it is reported until it is closed.

Maintenance keeps a work order for every fault: a broken AC, a leaking tap in the lobby, a pool pump. Anyone with Rooms Edit can report one; the maintenance team works it through six statuses. A work order tied to a room can block that room, it shows as Maintenance on the Rooms page and leaves the sellable pool, until the repair is completed.

  • Maintenance technicians live in the list and board, moving orders along and recording cost.
  • Housekeeping and front desk report what they find (“AC not cooling”, “lamp broken in 204”).
  • Managers watch the KPI tiles, open requests, high priority, estimated cost, and use the list filters for a weekly review.

Maintenance sits under the Rooms permission module, the same as Housekeeping.

Screen anatomy

A list-first page: five KPI tiles that double as filters, a paged table with editable cells (or the same page as cards), and a board for open work only.

Maintenance → List (the default view)
1234568
  1. 1
    KPI tiles
    Open requests, High priority, In progress, Resolved, Est. cost. Click a tile to filter the list by it; click again to clear.
  2. 2
    Filter bar
    Search (code, issue, location), Status, Priority, Category, Technician (Unassigned / External / a person).
  3. 3
    List / Cards / Board switch
    Board shows open work only, “completed and closed orders live in the list”.
  4. 4
    Rows
    ID, Issue, Location, Category, Priority, Technician, Due, Cost, Status. Priority, Technician and Status are editable in place.
  5. 5
    Row click
    Opens the work-order drawer with every field editable and the next-step buttons in the footer.
  6. 6
    Pagination
    Newest first, 50 per page by default (25, 50 or 100). Filters and page live in the address bar.
  7. 8
    Report issue
    Opens the “Report maintenance issue” dialog.

The Board tab lays the same open orders out as cards in the columns Reported · Assigned · In Progress · Waiting for Parts · Completed. Because it only loads open work, the Completed column is where cards leave the board: drop one there and it reappears in the list. Closed orders never show on the board.

Reporting an issue

ReceptionistHousekeeping MgrMaintenance

Title, category, priority and where it is, a room, or a free-text location for anywhere else.

  1. 1
    Click Report issue
    Top right. Needs Rooms Edit.
  2. 2
    Describe it in Issue title
    At least three characters, e.g. “AC not cooling”. Submitting with less shows “Describe the issue”.
  3. 3
    Category and Priority
    Category is free text with suggestions from categories already in use (default “General”). Priority is High, Medium or Low, Medium unless you change it.
  4. 4
    Room (optional) or Location
    Pick a room, or leave “Not a room” and type a Location such as “Lobby, Pool deck…”. An empty location is saved as “General area”.
  5. 5
    Click Submit
    The order gets an M-code and starts in Reported. A notification “Maintenance: AC not cooling” is posted, red for High priority, amber otherwise. The toast reads “Maintenance request created”.

Assigning and working an order

Maintenance

Assign from the Technician cell or the drawer; move status with the drawer buttons, the inline Status cell or the board.

  1. 1
    Assign a technician
    Click the Technician cell in the list (or the field in the drawer) and pick a person, or External contractor. The picker lists active staff, maintenance people first (search by name, job title or department; “Show everyone” for the rest); the technician gets a notification if they can sign in. Assigning an order that is still Reported moves it to Assigned on its own.
  2. 2
    Start work
    From Assigned choose In Progress: or Waiting for Parts if you already know a part is needed. In the drawer these are footer buttons; in the list the Status cell offers “→ In Progress” and “→ Waiting for Parts”; on the board drag the card or click its “→ In Progress” button.
  3. 3
    Record what it will cost and when
    In the drawer edit Estimated cost (whole shillings; it feeds the Est. cost tile) and Due (a date). Every edit saves as you leave the field.
  4. 4
    Waiting for parts
    Move to Waiting for Parts while a part is on order. The room stays blocked. When it arrives go back to In Progress, or straight to Completed if the fit is trivial.
  5. 5
    Complete
    The purple Completed button in the drawer. The room is unblocked and returns to its normal status. The technician can no longer be changed.
  6. 6
    Close
    A supervisor checks the work and clicks Closed. From here the order is read-only (“Closed orders are read-only.”) and it cannot be reopened.

Every status change and field edit is written to the audit log with the from/to status and the fields that changed. Moving a card to a column the workflow does not allow shows “Move to an allowed next column on this work order”.

Statuses and what they drive

Six stored statuses; only Completed → Closed and the two parts loops go sideways. Room blocking is derived from status + the toggle.

Work-order workflow (only these moves are accepted)
Work-order workflow (only these moves are accepted)assignReportedAssignedIn ProgressWaiting for PartsCompletedClosed
  • Reported → Assigned (assign)
  • Assigned → In Progress
  • Assigned → Waiting for Parts
  • In Progress → Waiting for Parts
  • Waiting for Parts → In Progress
  • In Progress → Completed
  • Waiting for Parts → Completed
  • Completed → Closed
  • Reported: logged, nobody on it. The only way forward is assigning someone (which happens automatically when you pick a technician).
  • Assigned: owned by a technician or an external contractor.
  • In Progress and Waiting for Parts: active work; you can bounce between them.
  • Completed: repair done. Counts as “Resolved”. Technician is locked; other fields still editable.
  • Closed: signed off. Read-only, no reopening. Never shown on the board.
  • Cancelled: raised by mistake or overtaken by events. Available from any open column as Cancel order in the drawer (never by dragging); the order leaves the board, stops blocking its room, stays in the List as a record and can no longer be edited. Whether an order blocks its room can only be changed while the work is open.

What is derived, not stored

  • Open requests = Reported + Assigned + In Progress + Waiting for Parts. In progress tile = In Progress + Waiting for Parts. Resolved = Completed + Closed. Est. cost sums every order's estimate.
  • The room's Maintenance status is recomputed after every change: a room is blocked only while an order on it has Room blocked while open switched on and is in one of the four open statuses. Completing or closing the order, or flipping the toggle to Sellable, releases the room automatically.
  • Location reads “Room 204” for room orders and the free-text label otherwise.

Work-order fields

What the report dialog asks for and what the drawer lets you edit afterwards.

Work order (drawer: every field editable until Closed)
FieldTypeNotes
IDM-…Assigned automatically. Search matches it.
Issue title *text 3–120What is wrong. Editable in the drawer.
Category *text 2–40Free text; the dialog suggests categories already in use. Filterable.
PriorityHigh / Medium / LowDefault Medium. Editable in the list cell and drawer. High open orders feed the “High priority” tile.
RoomroomOptional. Fixed once created, the Location cannot be changed from a room to free text later.
Locationtext ≤ 80Used when no room is chosen; “General area” if left blank. Editable in the drawer for non-room orders.
Technicianuser / ExternalAny active account, or External contractor. Locked once Completed.
DuedateOptional target date. Saved as midday hotel time.
Estimated costwhole currency unitsDefaults to 0. Non-negative integer; the drawer rounds what you type.
Room blocked while opentoggleOnly for room orders. On (“Out of service”) by default; “Sellable” keeps the room in the pool. Shown in the drawer only.
Status *enumReported → … → Closed as in the diagram. Editable from the list cell (shows only allowed next steps), drawer footer and board.

Permissions

Rooms View reads; Rooms Edit reports, assigns, edits and moves, including Close. There is no separate Full-only action.

Default Rooms levels, Maintenance uses this module
RoleRooms
Super AdminFull
Hotel ManagerFull
ReceptionistEdit
AccountantNone
Housekeeping MgrFull
MaintenanceEdit
Restaurant MgrNone
HR ManagerNone
SecurityView
WaiterNone
ChefNone
HousekeeperEdit
CashierNone
None No accessView View onlyEdit Can editFull Full access
  • Rooms View: see the list, board and drawer. Cells show as plain text; the drawer says “You have view-only access to maintenance.”
  • Rooms Edit: Report issue, every inline edit, every status move including Completed and Closed.

Default roles with Edit or better: Maintenance, Receptionist, Housekeeping Mgr, Hotel Manager, Super Admin. Security has View. Accountants and HR do not see the module; if they need cost figures, use the Reports module instead.

Tips

Tiles as filters, inline cells, the address bar and live updates.

  • Tiles are filters. Click Open requests to hide everything completed or closed; click High priority to stack it with the priority filter. The Status dropdown clears the “open only” tile filter and vice versa.
  • Edit without opening. Priority, Technician and Status change straight from the table. A refused change shows a toast and the cell snaps back; Esc cancels an open cell.
  • Bookmark a view. /maintenance?tech=external&status=parts reopens exactly that list. Your List/Board choice is remembered per browser.
  • Weekly review. Filter Status → Completed and close orders in bulk from the Status cell, one click each.
  • Live. Any change by a colleague refreshes your list, tiles and board within seconds; the drawer keeps your place.
  • Maintenance has no offline queue, if the connection drops, changes fail with a toast and you retry when it returns. Rooms → Out of service is the offline-capable way to pull a room quickly.

Errors you may see

Two conflicts from the server, both about status; everything else is a validation message.

409Cannot move from reported to progress
Why
The target status is not an allowed next step from the order's current status (the message names both). Reported can only go to Assigned; Completed only to Closed; Closed nowhere.
Fix
Assign a technician first, then start work. Follow the diagram one step at a time.
409Closed work orders cannot be reopened
Why
A status change was sent for a closed order. In practice the previous message (“Cannot move from closed to …”) fires first, so you will rarely see this one.
Fix
Report a new issue instead; a closed order is history.
404Work order not found
Why
The order was removed or the tab is stale.
Fix
Reload the page.
404Room not found
Why
The room chosen in the report dialog no longer exists.
Fix
Close and reopen the dialog.

Client-side: “Describe the issue” (title under three characters); “Could not create work order” / “Could not update work order” for other failures. A title over 120 characters, a category over 40, or a negative cost is rejected as a 400 validation error before it reaches the server rules.

Work order
One maintenance record with an M-code, from Reported to Closed.
Blocks room
The toggle that keeps a room out of the sellable pool while its order is open.
External
A contractor outside the hotel; the order has no user assigned but counts as Assigned.
Open work
Reported, Assigned, In Progress and Waiting for Parts, what the board shows.

Notifications

The hotel-wide alert feed, the bell in the top bar, toasts while you work, and Device alerts that reach your phone or desk PC when the app is hidden or closed.

Purpose and who uses it

Every signed-in user gets the same hotel feed, filtered by their own mutes and marked read per person.

Notifications tell the team what just happened: a new booking, a payment, a room turned dirty, a stock item running out, an export ready. Most entries are hotel-wide, and each person sees those that belong to a module they can open: a waiter sees kitchen and order alerts but not “Payment received on INV-…”, an accountant the reverse. Personal ones (“Order ready: Table 4” for the waiter who took the order, your test notification) reach one person only, on every device they are signed in on. Read state is per person: marking an alert read for you does not clear it for a colleague.

There is no permission gate: the feed, the bell and the preferences are available to every role, because the feed only tells you where to look, the module you click through to still enforces its own access.

Screen anatomy

The full feed page, plus the bell panel that shows the last twelve entries from anywhere in the app.

Notifications page
12458
  1. 1
    Page head
    “Notifications” with “3 unread” or “All caught up”.
  2. 2
    Category chips
    All · Bookings · Payments · Operations · System. A chip filters the list; muted categories never appear.
  3. 4
    Feed rows
    Icon tinted by severity, title, optional body text, “5m ago”, and a purple dot while unread. Unread rows have a faint purple background.
  4. 5
    Click a row
    Marks it read and jumps to the module the alert is about.
  5. 8
    Actions
    Preferences (opens Settings → Notifications) and Mark all read (only while something is unread).

The bell

  • The bell in the top bar carries a live unread count. Clicking it opens a panel, a popover on desktop, a bottom sheet on phones, titled Notifications with the twelve most recent entries, Mark all read, a close ×, and View all to open this page.
  • New alerts are prepended to the panel as they arrive. Esc or clicking outside closes it. When empty it reads “Nothing new. Events appear here as they happen.”

The feed loads the latest 100 entries. Empty states: “No payments notifications.” when a chip filter has nothing; otherwise “Nothing here yet. Bookings, check-ins and payments will appear as they happen.” or, if you have not turned on device alerts in a browser that supports them, a prompt to do so with an Open notification settings button.

Categories and muting

Four categories; mute any of them for your own account and it disappears from every channel.

Categories (Settings → Notifications → Categories)
FieldTypeNotes
BookingsNew reservations, confirmations, check-ins and check-outs.
PaymentsPayments received, invoices settled, refunds. Also “Stock short: …” alerts raised when a POS ticket closes with too little stock on hand.
OperationsHousekeeping, maintenance and room status; low-stock and out-of-stock alerts from Inventory.
SystemAccounts, roles, exports (“Export ready”) and configuration changes.
  1. 1
    Open Settings → Notifications
    Or click Preferences on the feed page.
  2. 2
    Click the chip beside a category
    It toggles between On (green) and Muted (dimmed). The change saves immediately and rolls back with a toast if it fails.
  3. 3
    Muted means gone from every channel
    “Muted categories are hidden from your feed, badge, toasts and device alerts, for this account only.” The rows are still written for the hotel, so un-muting brings history back.

Toasts, OS banners and Web Push

Where an alert appears depends on whether the app is focused, hidden or closed.

Delivery path for one new alert
Delivery path for one new alertlive socketlive socket + Device alertsserver push + Device alertsEvent in the hotelToast (tab focused)OS banner (tab hidden)Web Push (app closed)
  • Event in the hotel → Toast (tab focused) (live socket)
  • Event in the hotel → OS banner (tab hidden) (live socket + Device alerts)
  • Event in the hotel → Web Push (app closed) (server push + Device alerts)
  • Tab focused: a toast slides in with the title, body and a link; the bell count goes up by one. No OS banner.
  • Tab open but hidden (another tab, minimised), with Device alerts on, the browser shows a system notification from the live event. Clicking it focuses the app and opens the linked module. This path needs no server configuration.
  • App closed or phone locked: the server sends a Web Push message to every device you enabled; the service worker shows the banner unless a focused app window already exists. This needs VAPID keys on the server, Settings tells you when they are missing: “OS banners work while a tab is open. Ask your admin to set VAPID keys for alerts when the app is closed.”
  • All three respect your category mutes.

Turning on Device alerts

One switch per browser or installed app: grants permission, registers the device and lets you send a test.

  1. 1
    Open Settings → Notifications → Device alerts
    The card reads “Off for this browser” or “On for this browser” with a hint that explains what will happen on this device.
  2. 2
    Click the Off/On chip
    The browser asks for notification permission. Allow it. When server push is configured the device is registered too. Toast: “Device alerts on, you will get banners when the app is in the background” (or “…on for this browser (server push is not configured yet)”).
  3. 3
    Click Send test
    A “Test notification, Device alerts are working on this browser.” entry is written to your personal System feed and pushed to your devices even if System is muted. The toast says “Hide this tab (or lock your phone) to see the OS banner as well.” when the tab is visible, or “Check your notification tray.” when it is not.
  4. 4
    Turn off any time
    Click the chip again: the device is unregistered and you see “Device alerts off for this browser”. The setting is per browser and per device, not per account.

Where a click takes you

Each alert links to the module it concerns; the target is fixed by what the alert is about.

Click-through targets
FieldTypeNotes
BookingBookings.
Invoice, paymentPayments.
Housekeeping taskHousekeeping.
Work orderMaintenance.
Stock itemInventory.
Leave requestStaff.
POS ticketPOS.
Export, night auditReports.
SettingsSettings (the test notification lands here).
No recordFalls back to the category: Bookings → Bookings, Payments → Payments, Operations → Housekeeping, System → Settings; otherwise the feed itself.

Clicking marks the alert read first (optimistically, the page does not wait for the server), then navigates. OS banners and Web Push banners carry the same link and open it in the app.

Tips

Keep the badge honest and do not miss the big ones.

Errors you may see

The one server error, plus every reason Device alerts can refuse to turn on.

404Notification not found
Why
The alert you clicked was removed (for example a demo sandbox was reset) before it could be marked read.
Fix
Reload the feed.
This browser does not support notifications.
Why
No Notification API or service worker in this browser.
Fix
Use Chrome, Edge, Firefox or Safari on a Home Screen app.
On iPhone, add HMS to your Home Screen first, then open it from there.
Why
iOS Safari only supports push for installed web apps.
Fix
Share → Add to Home Screen, open the icon, enable again.
Notifications are blocked. Allow them in your browser settings, then try again.
Why
Permission was denied earlier for this site.
Fix
Change the site's notification permission in the browser, then click the chip again.
Permission was not granted.
Why
You dismissed the browser prompt without allowing.
Fix
Click the chip again and choose Allow.
Service worker is not ready yet. Refresh and try again.
Why
The app's worker had not finished installing.
Fix
Reload the page, then enable.
Could not read push subscription keys.
Why
The browser returned an incomplete push subscription.
Fix
Turn the switch off and on again; if it persists, try another browser.
Toast
The small in-app message that slides in while the tab is focused.
OS banner
A system notification shown by the browser or phone outside the app window.
Web Push
Server-sent notifications that arrive even when the app is closed; needs VAPID keys on the server.
Device alerts
The per-browser switch in Settings → Notifications that enables OS banners and Web Push.

Settings

Your own account and theme, the hotel profile with taxes and stay fees, branding and locale, operational lists for POS and housekeeping, notification preferences, and document numbering.

Purpose and who uses it

Super AdminHotel Manager

Everyone gets Account and Notifications; the hotel-wide tabs need Settings access.

Settings has six tabs: Account, Hotel, Branding & locale, Ops config, Notifications and Numbering. Account and Notifications are personal and open for every role. The other four describe the hotel and need Settings access: View to read, Edit to change most fields, Full for the handful that can break things, currency, timezone, the front-desk PIN and the numbering counters.

By default only the Super Admin has Settings = Full. The Hotel Manager has Edit, the HR Manager has View, and everybody else sees just Account and Notifications. Every hotel-level change is written to the audit log as a settings.* event.

Screen anatomy

A segmented tab bar; each tab loads its own data when opened.

Settings
12346
  1. 1
    Page head
    “Your account, hotel profile and operational configuration”, then the tab bar: Account · Hotel · Branding & locale · Ops config · Notifications · Numbering. Hotel-wide tabs are hidden when your role has no Settings access.
  2. 2
    Left card(s)
    Hotel: Hotel profile. Branding: Logo, Theme. Ops config: POS discounts, Housekeeping checklist. Account: your name, email, role and Change password.
  3. 3
    Right card(s)
    Hotel: Taxes & charges. Branding: Locale. Ops config: POS void reasons, Outlet service charge. Account: Appearance.
  4. 4
    Second row
    Hotel: Deposits & stay fees (with the front-desk PIN) and Rate plans. Ops config: Departments, suppliers & categories.
  5. 6
    Save
    The Hotel tab has one Save changes button top-right (Settings Edit). Branding saves per card (logo immediately; Save locale). Ops config and Numbering save each field on blur or Enter.

Deep link a tab with /settings?tab=notifications (ids: account, hotel, branding, ops, notifications, numbering); the Preferences button on the Notifications page does exactly that.

Account tab

See who you are signed in as, change your password, and pick light or dark for this device.

  1. 1
    Click Change password
    Three fields unfold: Current password, New password (min 8) and Confirm new password.
  2. 2
    Click Update password
    The page checks “New password must be at least 8 characters” and “Passwords don't match” before sending. The server verifies the current password.
  3. 3
    Other devices are signed out
    Toast: “Password changed. Other devices were signed out”. Every other session's refresh token is revoked; this browser gets a fresh one and stays in. The change is audited as user.password.changed.

Appearance: Light or Dark. “Theme is saved per device”, meaning it lives in this browser, not on your account, and the moon/sun icon in the top bar toggles the same setting.

Hotel tab

Hotel ManagerSuper Admin

Profile, check-in/out times, tax chain, deposit and cancellation fees, the front-desk PIN and rate-plan adjustments.

Edit any field and click Save changes (top right; Settings Edit). Toast: “Settings saved”.

Hotel profile
FieldTypeNotes
Hotel name *text2–120 characters. Shown in the sidebar, print headers and exports.
PhonetextUp to 40 characters, e.g. +256 …
Alternative phonetextA second number for the hotel, up to 40 characters.
Reservations emailemailMust be a valid address or blank.
AddresstextUp to 200 characters; printed on invoices and exports.
Check-in from / Check-out bytimeHH:MM. Informational defaults for the front desk.
Star rating1–5Shown as stars on the card.
Taxes & charges, “Applied by calcTotals at check-out”
FieldTypeNotes
VAT %, Service charge %, Tourism levy %0–50, step 0.5Chained on the room charge in the order service → VAT → levy. All zero means nightly rates are tax-inclusive and invoices equal rate × nights. Affects new quotes and future check-outs only. Changing any tax rule needs Settings · Full access and an idle till: while a restaurant ticket is open the save is refused (“3 tickets are still open on the till”), because open bills would be re-priced mid-service.
Daily housekeeping for every occupied roomcheckboxOn (default): from 06:00 hotel time a stayover task is created for every room with a guest in house, once per day, due by the check-out time. Off for a hotel that services rooms on request only.
Require an open shift to take money at the tillcheckboxOff (default): the POS sells with or without a shift. On: cash, card and mobile money on a ticket are refused (“No shift is open on this outlet”) until the outlet manager opens one, so every tender lands on a Z-report.
Take money only after the kitchen marks the food readycheckboxOn (default): the till refuses every tender while a kitchen dish on the bill is unsent or still cooking (“2 items not ready: …”); the pass marks items ready one by one. Drinks never hold a bill. Restaurant · Full access may override, and the override is written to the audit log. Off: the till pays whenever.
Sign out after minutes without activity0–720Default 15. A screen with no input for that long shows a one-minute countdown, then signs the person out and the login page says why. 0 never signs out. The kitchen display keeps itself signed in while it is on screen.
MTN MoMo merchant code · Airtel Money merchant code · Merchant name the networks showtextPrinted as “PAY BY MOBILE MONEY” on every bill and receipt so a guest can pay from the table; the merchant name (for example IJHotel) prints beside each code so the guest can check the payee. Two Airtel codes go in one box with a slash.
Prices include taxescheckboxOff (default): the taxes above are added on top of room rates and menu prices. On: rates and prices are final figures and the taxes are extracted from them; bills and receipts label the rows “Includes VAT 18%” and print “Prices include taxes”. The helper text under the box says which way the hotel is set. Affects new charges only.
Till receipt paperselect80 mm till roll (default), 58 mm till roll, or an A6 card for a desk printer. A roll receipt is as tall as the ticket needs and cuts after the footer; one print can override it with ?paper= on the receipt address.
Tax identification number (TIN)textPrinted under the address on every till receipt and guest bill. Leave blank until the hotel has one.
Receipt footertext, up to 200The last line of every till receipt. Blank prints “Thank you, asante, webale”.
Guest bill footertext, up to 400Printed under the thank-you line on the guest bill: bank details, a policy line, or nothing.
Deposits & stay fees, “Posted to the folio on confirm, cancel, or no-show”
FieldTypeNotes
Deposit on confirm %0–100Posted when a booking is confirmed. Zero means no charge.
Cancellation fee % of stay0–100Posted on cancellation.
No-show fee % of one night0–100Defaults to 100% of one night.
Front-desk PIN4 digitsSettings Full only. Shows “(set)” or “(not set)”; leave blank to keep the current PIN. Saving a new PIN signs out every session that was opened with the old one within minutes. Others read “Only a role with full Settings access (Super Admin by default) can change the front-desk PIN.” Client check: “Front-desk PIN must be 4 digits”. The PIN is hashed and never displayed.

Amenities on offer is the list the room-type picker shows (M9.1). Press the box, tick what this hotel has: the dropdown is grouped and every row is a checkbox, and each ticked one also appears as a chip with its icon and an x. Leave it empty and every amenity the system knows is offered, which is what a full-service hotel wants; a lodge narrows it to the handful it has. Taking one off the list never strips it from a room type that already carries it. It saves with Save changes.

Rate plans lists every plan (code, name and kind, BAR, weekend, promo…) with its percentage adjustment; change the number and click Save on that row (toast “WKND saved”). New plans are created from the rate-plan API, not here. The bin deletes a plan no booking was quoted on.

Branding & locale tab

Hotel ManagerSuper Admin

Upload the sidebar logo, pick the theme and sign-in tagline, and set the IANA timezone and the three-letter currency code.

Logo

  • “PNG, JPEG or WebP. Downscaled to 512px; max 200KB after that.” Click Upload logo, pick a file; the browser scales it to 512 px on the long edge and saves it at once (toast “Logo updated”). Remove clears it (“Logo removed”). Settings Edit.
  • Too complex an image after scaling gives “Logo too large even after downscaling. Try a simpler image”; an unreadable file gives “Could not read that image”.
  • The logo is stored with the hotel profile (no file server) and appears in the sidebar and on exports. The audit log records “(image updated)”, never the image.

Theme

  • Theme picks the colour set and the display font for every screen and every PDF letterhead; the change applies as soon as you save (toast “Theme saved”).
  • Tagline is the headline on the sign-in page of a live hotel (up to 140 characters); leave it empty for the standard line.

Locale

  • Timezone (IANA): a list of every zone the browser knows (Africa/Kampala, Africa/Nairobi…). It defines the hotel's business date for check-ins, night audit, reports and the audit log.
  • Currency code: three capital letters (UGX, KES…). Client check: “Currency must be a 3-letter code like UGX or KES”.
  • Both need Settings Full: the fields are disabled otherwise and the note adds “Changing currency or timezone needs full Settings access.” Click Save locale (toast “Locale saved”); the sidebar and money labels refresh immediately.

Ops config tab

Hotel ManagerSuper Admin

The lists POS and Housekeeping read at runtime: discounts, void reasons, checklist steps, outlet service charge, and reference data.

Everything on this tab needs Settings Edit. Rename fields save on blur or Enter; the + button beside each “New …” box adds a row.

  • POS discounts: “Deactivate rather than delete. Tickets copy label & %”. Each row: label (2–60 chars), whole-number % (0–100), an Auth chip (amber when the discount “Requires supervisor authorization” at the till) and Active / Off. Add with “New discount label” + “%”.
  • POS void reasons: “Offered when a ticket line is voided”. Label (2–80 chars) with Active / Off. Add with “New void reason”.
  • Housekeeping checklist: “Template applied to every new cleaning task”. Steps with Active / Off; add with “New checklist step”. “Changes apply to tasks created from now on; open tasks keep their checklist.”
  • Outlet service charge: “Overrides the hotel service % on POS folios”, with one “% svc” box per POS outlet (0–50). Shows “No POS outlets configured.” when there are none.
  • Departments, suppliers & categories: “Create and rename only. Rows stay referenced by history”. Staff departments, Suppliers and Inventory categories, each with a rename box per row and a “New department” / “New supplier” / “New category” box. Names must be unique (2–60 characters; suppliers up to 80).

Notifications tab

Per-browser Device alerts and per-account category mutes, covered in the Notifications chapter.

Two cards: Device alerts (the On/Off chip and Send test) and Categories (Bookings, Payments, Operations, System with On / Muted chips). Both are personal, no Settings access needed. Full detail in Notifications → Turning on Device alerts.

Numbering tab

Super Admin

See the next code for every document type; move a counter forward, never back.

“Prefixes are fixed; the next counter can only move upward (lowering it would duplicate codes)”. The table lists Documents, Prefix, Next code and Next value for: Bookings (BK-), Invoices (INV-), Payments (PAY-), Guests (G-), Housekeeping tasks (HK-), Maintenance orders (M-), POS tickets (TKT-), Purchase orders (PO-), POS shifts (SHF-), Staff records (S-) and Leave requests (LV-).

  1. 1
    Type the new Next value
    Settings Full only; others see the number and “Editing counters needs full Settings access.”
  2. 2
    Press Enter or click away
    The counter saves on blur. Toast: “BK counter moved to 5000”.
  3. 3
    Lower values are refused
    “Next value must be above the current 1042. Lowering it would duplicate codes”. The change is audited as settings.sequence.updated with from/to.

Permissions

View reads, Edit changes, Full unlocks currency, timezone, PIN and counters.

Default Settings level per role
RoleSettings
Super AdminFull
Hotel ManagerEdit
ReceptionistNone
AccountantNone
Housekeeping MgrNone
MaintenanceNone
Restaurant MgrNone
HR ManagerView
SecurityNone
WaiterNone
ChefNone
HousekeeperNone
CashierNone
None No accessView View onlyEdit Can editFull Full access
  • None: Account and Notifications tabs only.
  • View: read Hotel, Branding & locale, Ops config and Numbering.
  • Edit: Save changes on Hotel, logo upload/remove, rate-plan adjustments, every Ops config list.
  • Full: additionally currency, timezone, the front-desk PIN and numbering counters. Full also makes the role admin tier: it can manage roles and users and read the audit log, and the shared PIN can no longer sign in as it.

Errors you may see

Every refusal from the settings, ops-config and password endpoints.

403Changing currency, timezone or the front-desk PIN requires full Settings access
Why
The request included one of the Full-only fields while your role is Settings = Edit.
Fix
Ask a Super Admin, or raise the role in User Roles.
400Unknown timezone. Use an IANA name like Africa/Kampala
Why
The timezone is not one the server recognises.
Fix
Pick from the dropdown rather than typing.
400Next value must be above the current 1042. Lowering it would duplicate codes
Why
You tried to move a numbering counter down or to the same value.
Fix
Enter a higher number.
404Unknown sequence
Why
The prefix does not exist for this hotel.
Fix
Reload the Numbering tab.
409A discount with that name already exists
Why
Labels are unique per hotel (the same shape appears as “That void reason already exists”, “That checklist item already exists”, “A department with that name already exists”, “A supplier with that name already exists”, “A category with that name already exists”).
Fix
Reactivate the existing row or choose a different name.
404Discount not found
Why
The row was removed or belongs to another hotel (also “Void reason not found”, “Checklist item not found”, “Outlet not found”, “Department not found”, “Supplier not found”, “Category not found”).
Fix
Reload the tab.
401Current password is incorrect
Why
The Current password field did not match.
Fix
Type it again; if you have forgotten it, ask an administrator to set you a new one in Staff → Accounts. The sign-in page names who to ask under “Forgotten your password?”.
400Use HH:MM
Why
Check-in or check-out time was not in 24-hour HH:MM form.
Fix
Use the time picker.
400Logo too large. Keep it under 200KB
Why
The data URL exceeded the server cap.
Fix
Use a simpler or smaller image.
400PIN must be 4 digits
Why
The PIN contained other characters or the wrong length.
Fix
Digits only, exactly four.
Business date / hotel day
The calendar day in the hotel's timezone; check-in dates, night audit and reports all use it.
Sequence
The per-hotel counter behind a document prefix such as BK- or INV-.
Soft delete
Switching a list row to Off so it stops being offered but stays referenced by past tickets and tasks.

Offline mode

What keeps working when the connection or the API drops, which actions queue locally and replay later, and how the system resolves a conflict when the hotel changed while you were offline.

What keeps working

ReceptionistHousekeeping Mgr

Every screen reopens from cache with the last data it saw; writes queue, and the pill says when you are looking at a saved copy.

The app installs a small service worker that caches its own files and every screen you have openedon this device. If you reload one with no network, the page still opens. Every list the app fetched while online is also kept on the device, so the menu, the open orders, the rooms, the bookings and the rest render from the last copy the screen saw; the pill in the top bar then reads Offline · saved 14:05(or Showing saved 14:05 once the connection is back but a screen still shows old data) so nobody mistakes a stale list for a live one. Installed as an app, it opens in full screen like a native till.

  • Dashboard: shows the cached rooms, bookings and summary with a “saved at” time.
  • Bookings: the pipeline board and drawers open from the cached window; queued check-ins and check-outs are already projected onto the cards.
  • Rooms: the room grid with cached statuses; queued out-of-service changes appear immediately.
  • Housekeeping: the task board and checklists from the cached task list.

Every other page (Guests, Payments, POS, Reports, Settings and the rest) reopens from cache too, showing the data it last loaded; anything that needs the server, such as searching or turning a page, waits for the connection. The API and the live-update socket are never cached, so nothing you see offline is ever older than the moment it was last fetched.

POS keeps selling. If the network drops mid-service the ticket panel switches to an Offline draft: you keep adding items from the cached menu and tap Pay as usual; the ticket is queued and posts when the connection returns, priced again from the live menu. Send to kitchen, Split, discounts and tables need a connection and are greyed out on a draft. The total shown on a draft is an estimate, before VAT.

Which actions queue

ReceptionistHousekeeping Mgr

Six convergent actions are captured locally and replayed; creating anything new is online-only.

When you press a button and the request cannot reach the API, the system checks whether that action is on the offline whitelist. Whitelisted actions are written to a local outbox in your browser (IndexedDB), the screen updates optimistically, and the toast says the action was queued rather than failed.

Actions that queue offline
FieldTypeNotes
Check inBookingsFrom the booking drawer, with the room chosen at the desk. Queued as “Check in <guest> → Room <n>”.
Check outBookingsIncluding “settle later” when a Payments manager chose it. Queued as “Check out <guest>”.
Move a housekeeping taskHousekeepingDragging a card or pressing the arrow to the next column, e.g. “Housekeeping Room 204 → progress”.
Tick a checklist itemHousekeepingEach tick or untick is its own queued row, truly idempotent on replay.
Mark a room out of serviceRoomsWith the optional reason.
Return a room to serviceRoomsThe reverse of the above.

Everything else stays online-only: new bookings, new guests, new housekeeping tasks, work orders, payments, POS tickets, edits to dates or rooms, cancellations and no-shows. These mint new codes or move money and would duplicate on replay, so the button simply reports that you are offline. Take the details on paper and enter them once the Offline pill disappears.

The Offline pill and the activity tray

A pill in the top bar tells you the connection state and how many actions are waiting; click it for the list.

The pill appears next to the quick-add button only when something needs saying:

  • Offline (grey), the browser is offline or the live socket is down. Hover: “Working offline. Actions are queued locally”.
  • Syncing (amber), you are back online and queued actions are being sent.
  • Needs attention (red), at least one action could not be applied and is waiting for you.

The number on the pill is queued plus needs-attention rows. Click it to open the Offline activitydrawer, which has two lists:

  1. 1
    Queued (n)
    Each row shows its label and “Captured 14:05”. Sync now forces a replay; the toast answers “All queued actions sent” or “Still offline. Will retry automatically”.
  2. 2
    Needs attention (n)
    Rows the server refused, with the server's message and the context (guest, room). Resolve them manually, for example re-room the guest from Bookings, then press Dismiss.

Replay is triggered automatically when the browser comes back online, when the tab becomes visible again, when the live socket reconnects, and three seconds after the app starts. You rarely need Sync now.

Replay order and conflict rules

ReceptionistHotel Manager

Actions replay per record in the order you did them; a 409 that already matches your intent is dropped silently, a real clash is parked for you.

The outbox groups rows by record, booking:…, room:…, hk:…: and replays each group strictly in order, so a queued check-out can never run before its check-in. Groups are independent: a problem on one booking does not hold up the room changes. Every flush starts by refreshing your session so the replay runs with a fresh cookie, and ends by reconnecting the live socket so every open screen refetches.

What happens to each queued row on replay
What happens to each queued row on replay2xx409, already in target state409 clash / 400 / 403 / 404network failed401QueuedDoneConverged (dropped)Needs attentionStill queuedPaused, sign in
  • Queued → Done (2xx)
  • Queued → Converged (dropped) (409, already in target state)
  • Queued → Needs attention (409 clash / 400 / 403 / 404)
  • Queued → Still queued (network failed)
  • Queued → Paused, sign in (401)
  • Success: the row is removed.
  • Converged: the server answered 409 but a quick check shows the record is already where you wanted it (the booking is checkedin, the task is already in that column, the room is already out of service). Another desk did it first. The row is dropped silently; nothing to do.
  • Genuine conflict: a 409 whose state does not match, typically Room is already booked for those dates or Room 204 is unavailable. The row moves to Needs attention with the server's message. Open the booking, pick another room and check in again, then dismiss the row.
  • Other refusals: 400, 403 (your role changed), 404 (the record was deleted) or a booking that was cancelled meanwhile. Also parked under Needs attention with the message; they can never succeed as queued.
  • Network failure: the row stays queued and the whole flush stops until the next trigger.
  • 401: the session could not be refreshed. The queue pauses and you are taken to sign-in; the rows are kept and replay after you sign in again.

Timestamps are captured at action time

A check-in done at 14:05 offline and sent at 16:40 is recorded at 14:05, as long as it replays within 48 hours.

Queued check-ins and check-outs carry an occurredAt stamp taken the moment you pressed the button. On replay the server uses it for the booking's check-in/out time and for the arrival-day rule, so the folio and the night audit reflect when the guest actually arrived, not when the network came back.

  • The stamp must be within the last 48 hours and never in the future; older rows are refused with occurredAt must be within the last 48 hours and land in Needs attention.
  • The booking's status history and the audit log keep who did it and when it was captured.
  • Housekeeping and room changes do not carry a stamp; they take the time they are applied.

Install as an app

Installed, the front desk opens full-screen from the home screen and keeps its cached screens ready.

  1. 1
    Desktop (Chrome or Edge)
    Open the app, then choose Install app from the address-bar menu. It appears as “HMS” in your apps and launches on the Dashboard.
  2. 2
    Phone or tablet
    Use Add to Home Screen from the browser's share or menu. iPad Safari is supported; the queue works there too.
  3. 3
    Updates
    When a new build is deployed, a bar at the bottom says “A new version is available.” Press Update to reload onto it, or Later to finish what you are doing first.

Speed tips & tricks

Keyboard shortcuts, bookmarkable list state, in-place editing, drag on boards and the small habits that make a busy desk faster. Everything here exists in the app today.

Keyboard shortcuts

A handful of keys cover search, help, paging the guide, closing things and saving inline edits.

  • ⌘K / Ctrl K: jump to the global search box on any screen. Two characters start the search; results are grouped into Bookings, Guests, Rooms and Invoices and only include modules you may see.
  • ?: open this guide. Ignored while you are typing in a field or a dialog is open.
  • /: while reading the guide, focus the guide search box.
  • [ and ]: while reading the guide, go to the previous or next chapter.
  • Esc: clears and leaves the global search; closes the mobile sidebar; closes the drawer or dialog on top; cancels an inline text edit without saving.
  • Enter: saves an inline text cell (so does clicking away). In the Rooms and Settings number fields it also commits the value.
  • Tab: the staff directory cards, inventory department chips and report shortcuts are keyboard-focusable; Enter activates them.

The address bar remembers your list

Search text, filters, sort, page and view all live in the URL, bookmark it, share it, use Back.

  • Every paged list writes its state to the address: /payments?q=okello&status=overdue&page=2. Bookmark the “overdue invoices” view and open it each morning; paste it to a colleague and they land on the same rows.
  • Defaults are stripped, so an untouched list has a clean address. Clear in the filter bar resets search and filters in one click.
  • Back and Forward walk through your filter history without reloading the page.
  • Column sort is in the URL too (sort=, dir=). Tap a column title to sort: first tap ascending, second descending, third clears; dates and amounts start descending. The small filter icon on a title opens a popover with that column's values, counts and presets.
  • If rows disappear while you are on page 9 of 8, the list snaps back to the last real page by itself.

Views

  • Every module opens on its table (list) view. Modules with more views (List, Cards, Pipeline, Board, Calendar, Grid, Floor and so on) remember your last choice per module in a cookie on this device; phones default to Cards.
  • Add ?view=kanban (or grid, calendar…) to a link to force a view for whoever opens it; the URL wins over the remembered preference.

Rows per page

Change Rows (25 / 50 / 100) under any table once and every paged list on this device opens at that size from then on, including the very first server render, so there is no flash. The preference is a small cookie, like your theme.

Edit in place, drag on boards

Most status, assignee and priority cells save on change; kanban cards move by drag or arrow.

  • Inline selects: click a status, priority or assignee cell and pick; it saves at once with a small spinner. An error rolls the cell back and shows the server's message as a toast.
  • Inline text: cells with a pencil on hover open an input; Enter or clicking away saves, Esc cancels. Money cells are right-aligned and formatted.
  • Toggles: yes/no switches (active, blocks room…) flip and save on click.
  • View-only: with View access the same cells render as plain text titled “View only”; nothing to unlearn when your role changes.
  • Kanban drag: press and move a card more than a few pixels to start a drag; the target column highlights as you hover. Works with a mouse, touch and pen. Columns the card may not enter do not highlight. Clicking a card (without moving) still opens its drawer.
  • Drag on a button, link or field inside the card does nothing, so you can use the card's own controls without accidentally moving it.

Live updates, do not refresh

One socket per tab pushes changes from every other desk into the page you are looking at.

  • Bookings, rooms, housekeeping, maintenance, POS tickets, invoices, staff, exports and notifications all refetch when someone else changes them. Paged lists refetch the current page in place, keeping your filters.
  • The bell badge, toasts and the notifications page all update from the same feed; muted categories (Settings → Notifications) never toast.
  • When the tab is in the background and device alerts are on, new alerts arrive as system notifications instead of toasts.
  • The socket reconnecting is also what flips the Offline pill back and replays queued work (see the Offline chapter).

Top-bar habits

Quick add, dark mode, the guide and sign-out are one click each.

  • Quick add (the plus icon), jumps to Bookings, where New booking is the first action. Fastest route to a walk-in.
  • Dark mode: the moon/sun icon. The choice is a cookie, so it applies to the very first paint after a reload; no flash.
  • User guide: the book icon or ?. The guide is public: send /guide/bookings#check-in to a new hire before their account exists.
  • Bell: the last few alerts and a link to the full feed; the count is live.
  • Sidebar: the panel icon collapses it to icons on desktop and slides it in on phones; Esc closes the mobile sidebar. A lock on a module means view-only for your role.
  • Demo chip (demo sandbox only), shows the time left, switches you to any role in one click, and Reset my demo data throws the sandbox away and starts fresh.

Print, export, install

Invoices and receipts open as PDFs, big reports queue as files, and the app installs on any desk.

  • Print an invoice: open it in Payments and press Print in the drawer footer; the PDF opens in a new tab ready for the browser's print dialog. Email sends the same PDF to the guest's address on file.
  • POS receipts: closed tickets have a receipt PDF the same way.
  • Exports: Reports queue PDF/Excel files in the background; the Exports card lists them with status, kind and requester, and a live event marks each one done. Generated files are kept for 30 days.
  • Print this guide: the chapter header has a Print button; the layout collapses to one clean column.
  • Install as an app: Install app in Chrome or Edge, Add to Home Screen on a phone. Full-screen, on the home screen, offline-capable front desk.

Page numbers everywhere

Every list, the audit log included, pages with numbers; nothing scrolls forever.

  • Lists use a numbered pager (“Showing 26–50 of 313”, Prev / Next, page numbers with gaps). Compact pagers inside drawers and card views show Prev / Next and “3 / 12”.
  • The Audit log pages the same way since M4.14; the page, sort and filters sit in the address bar, so page 3 of a filtered trail can be bookmarked.
  • Nothing scrolls infinitely, so the browser's Find (Ctrl F) always searches exactly what is on screen.

Demo sandbox tricks

Try anything, then reset; every browser gets its own hotel.

  • Your sandbox lasts 24 hours and is private to your browser. Change anything, nobody else sees it.
  • Open the Demo chip to switch role without signing out; the page reloads as that person.
  • Reset my demo data discards every change and clones a fresh hotel (a few seconds). Handy after a training session. Ten resets an hour per address.
  • The sign-in page's demo panel can also prefill the classic email/password or PIN forms with a demo account, so you can show both sign-in flows inside your own sandbox.

Troubleshooting & FAQ

Every red toast the server can send, area by area, with why it happens and what to do, plus the screen-level situations: sign-in bounces, the access screen, throttling, the Offline pill and version banners.

How errors appear

Red toasts carry the server's exact message; the status code tells you which kind of problem it is.

  • 400 Bad request: the form has a value the server will not accept. Fix the value and retry. Validation failures list the field and reason (“Validation failed”).
  • 401 Unauthorised: the session is gone. The app refreshes it silently once; if that fails you land on sign-in.
  • 403 Forbidden: your role may not do this. Ask an administrator or a supervisor.
  • 404 Not found: the record vanished (deleted, or another sandbox). Refresh the list.
  • 409 Conflict: the action is not allowed from the record's current state, or another desk got there first. Read the message; refresh; act on the new state.
  • 429 Too many requests: throttled. Wait the stated time.
  • Offline / 502: nothing reached the API. See the Offline pill section below.

Screen-level situations

Bounced to sign-in, the access screen, login throttling, the Offline pill, the update banner and expired demos.

You were sent back to sign-in

Your access cookie lives 15 minutes and refreshes silently while you work; the refresh token lives 30 days. You are bounced when the refresh is refused: you signed out elsewhere, an administrator deactivated your account (This account has been deactivated), your password was changed (all sessions are revoked), or the refresh token expired. Sign in again. If the API was merely unreachable, the app keeps your cookies and treats it as offline instead.

“You don't have access to …”

A module page shows a lock and “Your role (Receptionist) isn't permitted to view this module” when your level for that module is None. User Roles needs Full on Settings; the Audit log is for Super Admin, Hotel Manager, Security or anyone with Settings Full. Role changes take effect within about 15 seconds without signing out. Contact your administrator if you need access.

Too many sign-in attempts (429)

Ten failed attempts for the same email (or the same hotel PIN) from your address within 15 minutes lock it out: Too many failed sign-in attempts. Try again in 15 minutes or Too many failed PIN attempts. Try again in 15 minutes. Password reset requests are limited to three per address per 15 minutes (Too many reset requests. Try again later). A successful sign-in clears the counter.

The Offline pill, or “Request failed (502)”

When the API cannot be reached, no network, or the proxy answers 502/503/504, the app raises an offline condition instead of an error. The top bar shows Offline; whitelisted front-desk actions queue, everything else shows “You appear to be offline” or “Could not load this page”. Check the connection and wait; the pill turns to Syncing and disappears by itself. If it stays grey while other sites work, the API is down, tell whoever runs the server. See the Offline chapter for the queue rules.

“A new version is available.”

A bar at the bottom means a new build was deployed and downloaded. Press Update to reload onto it (finish typing first, unsaved drawer edits are lost), or Later; the next full reload picks it up anyway.

Demo sandbox expired

Sandboxes live 24 hours. When yours is swept, the next request answers This demo has expired(401) and you land on the sign-in page; the chip may have read “Demo · expired” for a few minutes before. Pick a role again to get a fresh sandbox. If the host is busy you may see The demo is at capacity right now. Please try again in a little while (503) or You have started several demos recently. Try again in an hour (429, six starts per hour per address).

Sign-in & sessions

Messages from the login form, PIN pad, password reset and account settings.

401Invalid email or password
Why
No active account with that email and password in a real (non-demo) hotel, or the account is deactivated.
Fix
Check for typos and caps lock. Then use “Forgotten your password?” on the sign-in page, which shows who to ask; an administrator sets a new one in Staff → Accounts and checks the account is still active.
409HOTEL_AMBIGUOUS
Why
The same email and password are valid in more than one hotel on this host.
Fix
Open the sign-in page from your hotel's own link so the form knows which hotel to use.
401Invalid PIN
Why
The PIN does not match this hotel, the chosen person is not an active user, or that person is an admin-tier role (Super Admin, Hotel Manager, or anyone with Settings Full), which the PIN can never sign in as.
Fix
Re-enter the PIN. Managers must use email and password.
400Open the sign-in page from your hotel's link so the PIN pad knows which hotel to unlock
Why
More than one hotel on this host uses that PIN and no hotel was named in the address.
Fix
Use the hotel-specific sign-in link.
429Too many failed sign-in attempts. Try again in 15 minutes
Why
Ten failures for that email from your address within 15 minutes.
Fix
Wait 15 minutes. A correct sign-in resets the counter.
429Too many failed PIN attempts. Try again in 15 minutes
Why
Ten wrong PINs from your address within 15 minutes.
Fix
Wait 15 minutes, then try again with the current PIN (Settings → Hotel shows who may change it).
429Too many reset requests. Try again later
Why
More than three reset emails for one address in 15 minutes, or ten from one IP in an hour.
Fix
Check the mailbox (and spam) for the earlier email before requesting another.
401Current password is incorrect
Why
Settings → Account → change password needs your current password and it did not match.
Fix
Re-type the current password; if you cannot remember it, sign out and use “Forgotten your password?”, which names the person who can set you a new one.
401Session expired
Why
The access cookie could not be verified and the silent refresh failed.
Fix
Sign in again.
401This account has been deactivated
Why
An administrator switched your account off; it takes effect everywhere within seconds.
Fix
Speak to your administrator.
401Not authenticated
Why
A request reached the API with no session cookie at all (usually a bookmarked API link or a very old tab).
Fix
Open the app normally and sign in.
401No refresh token
Why
The refresh cookie is missing (cleared site data, different browser profile).
Fix
Sign in again.
401Invalid refresh token
Why
The refresh token was revoked (sign-out elsewhere, password change) or belongs to a deactivated user.
Fix
Sign in again.

Permissions (any module)

The one message the role guard sends when your level is too low for an action.

403Your role (Receptionist) has "View only" on Payments; this action needs "Can edit".
Why
Every write names the module and level it requires (View, Can edit, Full access). Your role's level in User Roles is below it. The role, module and levels in the message vary.
Fix
Ask someone whose role has that level, or ask an administrator to raise your role's level in User Roles. Buttons you cannot use are normally hidden; you mostly see this after a role change mid-session.

Which module a screen counts under: Housekeeping and Maintenance are Rooms; POS, Restaurant and Inventory are Payments; User Roles, Settings and the Audit log are Settings.

Bookings & check-in

New booking, dates, groups, rate plans, check-in, check-out, cancel and no-show.

400Check-out must be after check-in
Why
Same-day or reversed dates on a booking or group.
Fix
Set check-out at least one night after check-in.
400Provide either guestId or a new guest
Why
The wizard sent both an existing guest and a new guest, or neither.
Fix
Pick a guest from the search or fill in the new-guest fields, not both.
400month must be YYYY-MM
Why
The calendar view was opened with a malformed month in the address.
Fix
Use the calendar's own month arrows, or fix the URL so the month reads as a year and month (YYYY-MM).
400Room 204 is not a Deluxe
Why
A specific room was chosen whose type differs from the room type selected on the booking.
Fix
Change the room type to match, or pick a room of the booked type.
409Room 204 is out of service
Why
The chosen room is flagged out of service (or “under maintenance”) and cannot be sold.
Fix
Pick another room, or return the room to service from Rooms first.
409Room is already booked for those dates
Why
The database's no-overlap guard refused: another active booking (new, confirmed or in-house) holds that room for an overlapping night. Same-day turnover is allowed; overlapping nights are not.
Fix
Pick a different room or dates. Rooms → availability shows what is free. If this appears in the Offline tray, re-room the guest and check in again.
409No Deluxe left for 2026-09-12: 8 sellable, 8 already booked
Why
The capacity guard: counting assigned and unassigned bookings of that type, one night in the range would exceed the sellable rooms (maintenance and out-of-service rooms do not count). Groups add “, 3 requested”.
Fix
Choose another room type, shorten the stay, or free a room (cancel, move, or return one to service).
409Cannot edit a checkedout booking
Why
Checked-out, cancelled and no-show bookings are closed history.
Fix
Create a new booking instead. Money corrections go through the invoice.
409Room 204 is unavailable
Why
On edit or check-in the room is out of service or under maintenance.
Fix
Pick another room; return the room to service if it is ready.
409Cannot check in a cancelled booking
Why
Only new or confirmed bookings can be checked in. The status in the message varies (checkedin, checkedout, noshow…).
Fix
For a checked-in guest nothing is needed. For a cancelled booking, make a new one.
409BK-1042 arrives on 2026-09-06. Move the booking dates for an early check-in
Why
Check-in is only allowed on or after the hotel-local arrival day so the folio charges the nights actually slept.
Fix
Edit the booking's check-in date to today first (subject to capacity), then check in.
400Assign a room before check-in
Why
The booking has no room and none was chosen in the check-in dialog.
Fix
Pick a ready room in the dialog.
400Room 305 is a Suite; BK-1042 was booked as a different type. Assign it on the booking first
Why
A room picked at the desk must match the booked type. Upgrades are deliberate: assign the room on the booking (edit) before check-in.
Fix
Either pick a room of the booked type, or edit the booking to assign the upgrade room, then check in.
409Room 204 is not clean yet (HK-88 is open). Pick another room or wait for housekeeping
Why
A room is sellable only after housekeeping releases it; an open task (dirty, assigned, in progress or inspection) blocks it.
Fix
Choose a ready room, or have housekeeping move the task to Ready.
409Room 204 is still occupied by BK-1031. Check them out first
Why
Same-day turnover: the outgoing guest has not been checked out yet.
Fix
Check the previous guest out, then check in.
409Cannot check out a confirmed booking
Why
Only in-house (checked-in) bookings check out.
Fix
Nothing to do for a booking that never arrived, cancel or mark no-show instead.
409INV-0412 still owes UGX 240,000. Collect it before check-out, or a Payments manager can check out and bill later
Why
An open folio still has a balance; the message starts with the invoice codes and the total. Check-out requires a settled folio (code FOLIO_UNSETTLED).
Fix
Record the payment in the drawer, or ask someone with Payments Full to check out with “settle later”.
403INV-0412 still owes UGX 240,000. Only Payments "Full access" can check out with a balance
Why
“Settle later” was requested by a role below Payments Full.
Fix
A Payments manager must do this check-out; it is audited and the folio stays collectable.
400occurredAt must be within the last 48 hours
Why
A queued offline check-in or check-out replayed more than 48 hours after it was captured (or with a future time).
Fix
Dismiss the row in the Offline tray and do the action again now.
409Cannot move a checkedin booking to cancelled
Why
Status changes follow the lifecycle: confirm from new; cancel or no-show only before check-in.
Fix
An in-house guest checks out; use the correct action for the current status.
400Cap a group at 80 rooms
Why
A group block asked for more than 80 rooms in total.
Fix
Split it into two groups.
404Rate plan not found
Why
The chosen rate plan was deleted or deactivated.
Fix
Pick another plan or BAR.
400That rate plan does not apply to this room type
Why
The plan is restricted to one room type.
Fix
Choose a plan for the selected type, or change the type.
400Rate plan WKND already exists
Why
Rate-plan codes are unique per hotel.
Fix
Use a different code.
404Booking not found
Why
The booking was deleted or belongs to another hotel/sandbox.
Fix
Refresh the list.

Rooms & housekeeping

Room and room-type setup, out of service, and the housekeeping board.

409Room 204 already exists
Why
Room numbers are unique per hotel.
Fix
Use a different number, or edit the existing room.
409Room 204 still has 12 stays on the record. Take it out of service instead: it stops being sold and room 204 keeps its history
Why
A stay or a restaurant bill charged to a room is a hard hold: no access level deletes a room a guest has slept in.
Fix
Use Out of service on the room instead.
409Room type "Deluxe" already exists
Why
Room-type names are unique per hotel.
Fix
Pick another name or edit the existing type.
409Room type "Deluxe" still has 3 rooms and 12 bookings. The 12 bookings cannot be deleted with it
Why
Bookings are a hard hold, a stay sold as a Deluxe has to keep saying Deluxe. Rooms alone are a soft hold: the refusal then says a Super Admin can delete the type anyway and move its rooms.
Fix
Move the rooms to another type. If the type has ever been booked, it stays; taking its rooms off it stops it being sold.
400to must be after from
Why
The availability search has a reversed date range.
Fix
Set the to date after the from date.
409Cannot move from dirty to ready
Why
Housekeeping moves follow the board: Dirty → Assigned or In Progress; Assigned → In Progress (or back to Dirty); In Progress → Inspection (or Dirty); Inspection → Ready (or back to In Progress). Ready is final.
Fix
Move one column at a time in the allowed direction.
404Checklist item not found
Why
The tick was sent for an item that no longer exists on this task.
Fix
Reopen the task.
404Task not found
Why
The task was completed and archived, or belongs to another hotel.
Fix
Refresh the board.

Maintenance

Work-order transitions.

409Cannot move from reported to completed
Why
Work orders follow Reported → Assigned → In Progress ⇄ Waiting for Parts → Completed → Closed. Assigning a technician or picking External moves Reported to Assigned by itself.
Fix
Move one step at a time.
409Closed work orders cannot be reopened
Why
Closed is final.
Fix
Raise a new work order and reference the old code in the notes.
404Work order not found
Why
Deleted or in another hotel.
Fix
Refresh the board.

Guests

Guest profiles and exports.

404Guest not found
Why
The guest chosen for a booking, group or edit no longer exists.
Fix
Search again and pick the current record.
403Guest exports need Guests view access
Why
Exporting the guest list requires at least View on Guests, on top of the Reports level.
Fix
Ask an administrator for Guests access, or have a colleague run the export.

Staff & accounts

Staff records, rota, attendance, leave, user accounts and roles.

400That account is already linked to a staff record
Why
A user account can be linked to one staff record only.
Fix
Unlink it from the other record first, or leave this record without a login.
400Start and end time must differ
Why
A shift template with equal start and end has no length. Overnight windows are fine (end before start).
Fix
Set a real window, e.g. 18:00 – 06:00.
400That record is retired, restore it before rostering shifts
Why
Retired staff cannot be rostered, marked present or booked on leave (the wording varies: “…before recording attendance”, “…before booking leave”).
Fix
Restore the record from the directory, then retry.
400Attendance cannot be recorded for a future date
Why
Attendance is a statement about a day that has happened.
Fix
Record it on or after the day.
400End date must not precede start date
Why
Reversed leave dates.
Fix
Fix the dates.
400A single request cannot span more than a year
Why
Leave requests are capped at a year.
Fix
Split it.
400Overlaps LV-12 (pending) for the same staff member
Why
The person already has a pending or approved request covering some of those days.
Fix
Cancel or adjust the other request first.
400Only pending requests can be cancelled (this one is approved)
Why
Approved, rejected and cancelled requests are final for the requester (deciding likewise: “Only pending requests can be decided”).
Fix
Ask a Staff-Full user to handle an approved request by other means, e.g. a correcting request.
400Overlaps already-approved LV-9
Why
Approving this request would overlap an already-approved one.
Fix
Reject it, or cancel the other request first.
409A user with that email already exists
Why
Emails are unique per hotel.
Fix
Search Accounts for the existing user and edit it.
400You cannot deactivate or change the role of your own account
Why
Protects against locking yourself out.
Fix
Ask another administrator.
403Only a Super Admin can manage Hotel Manager accounts
Why
Admin-tier accounts (Super Admin, Hotel Manager) can only be created or edited by a Super Admin.
Fix
Ask the Super Admin.
409The Super Admin role is fixed at full access
Why
Its permission matrix cannot be edited.
Fix
Create or edit another role.
409Full access on Settings is reserved for admin-tier roles (Super Admin, Hotel Manager); give Receptionist "Can edit" at most
Why
Settings Full makes a role admin-tier (roles, users, the PIN), which the shared front-desk PIN must never reach.
Fix
Set Settings to Can edit or lower for non-admin roles.
403The audit log is limited to Super Admin, Hotel Manager and Security
Why
Only admin-tier roles and Security read the audit trail.
Fix
Ask one of them for the entries you need.

Payments & invoices

Recording payments, refunds, emailing invoices.

400Amount must be positive
Why
A zero or negative payment amount.
Fix
Enter the amount received.
400Select the mobile money network
Why
Mobile-money payments need MTN or Airtel.
Fix
Pick the network.
409Invoice is already settled
Why
The balance is zero (or the invoice is refunded); nothing to collect.
Fix
Nothing to do. Over-payments are not accepted.
409Amount exceeds the outstanding balance (UGX 120,000)
Why
Part-payments are fine, but never more than what is owed.
Fix
Enter at most the stated balance.
409That entry is itself a refund
Why
You tried to refund a refund line.
Fix
Refund the original payment (PAY- code) instead.
409PAY-311 has already been refunded in full
Why
Every refund is capped by the original payment; this one has nothing left.
Fix
Nothing to refund on that payment.
400Refund must be positive
Why
Zero or negative refund amount.
Fix
Enter the amount, or leave it blank to refund what is left on the payment.
409Refund exceeds what is left on PAY-311 (UGX 50,000 refundable)
Why
Refunds on one payment cannot add up to more than it.
Fix
Refund at most the stated amount.
409Refund exceeds the amount received on this invoice
Why
Net cash on the invoice would go negative.
Fix
Reduce the amount.
400Guest has no email address
Why
Email invoice needs an address on the guest profile.
Fix
Add the email in Guests, then send; or use Print.
404Invoice not found
Why
Deleted or another hotel.
Fix
Refresh the list.

POS & restaurant

Tickets, lines, discounts, splits, kitchen display, room charge, shifts and menu setup.

409Ticket is closed
Why
Closed tickets are read-only: no lines, quantities, covers, table moves, discounts, sends or splits.
Fix
Open a new ticket.
400Menu item unavailable
Why
The item is marked sold out or was deleted.
Fix
Pick another item, or a Restaurant manager can put it back on sale in Menu.
409Line is voided
Why
A voided line cannot change quantity.
Fix
Add the item again.
409Use void-line for sent items
Why
Once sent to the kitchen a line cannot be deleted, it must be voided with a reason.
Fix
Use Void on the line and choose a reason.
409Line already voided
Why
Double void.
Fix
Nothing to do.
400No unsent lines
Why
Send to kitchen with nothing new on the ticket.
Fix
Add items first.
400Unknown discount
Why
The discount was removed in Settings → Ops.
Fix
Pick one of the listed discounts.
403Supervisor credentials required for this discount
Why
Discounts flagged as needing authorisation (staff meal, manager comp…) need a supervisor's email and password.
Fix
Ask a supervisor to enter their credentials in the dialog.
403Supervisor credentials invalid
Why
Wrong email or password, or the account is inactive.
Fix
Re-enter them.
403Supervisor must have Payments or Settings at Full level
Why
The person authorising is not senior enough.
Fix
Ask someone with Payments Full or Settings Full.
400No active lines to split
Why
Split bill on an empty or fully voided ticket.
Fix
Add items first.
400lineIds required for by_item split
Why
Split by item without choosing lines.
Fix
Tick the lines to move.
400No matching lines
Why
The chosen lines are voided or not on this ticket.
Fix
Refresh and choose again.
409Cannot move KDS from new to served
Why
Kitchen tickets go New → Preparing → Ready → Served, one step at a time.
Fix
Press the next stage.
409Ticket already closed
Why
Pay pressed twice.
Fix
Nothing to do; print the receipt.
400Add items before closing
Why
Empty ticket.
Fix
Add items or discard the ticket.
400Select the mobile money network
Why
Mobile-money tender without MTN/Airtel.
Fix
Pick the network.
400Room or booking required for room charge
Why
Charge to Room needs a room or booking on the ticket.
Fix
Pick the room in the ticket head.
409No checked-in guest in that room
Why
Room charge to a room with nobody in-house.
Fix
Check the room number, or take another tender.
400Booking required for room charge
Why
The room could not be resolved to a booking.
Fix
Choose the booking directly.
409No open folio for this booking. Check the guest in first
Why
Room charges post to the stay folio, which opens at check-in.
Fix
Check the guest in, or take cash/card.
409Folio is closed
Why
The guest has checked out.
Fix
Take another tender.
409Ticket must be closed before folio posting
Why
Internal ordering error, the ticket was not closed.
Fix
Close the ticket with Charge to Room again.
409Shift SHF-41 is already open for this outlet
Why
One open cash shift per outlet (also “Shift already open for this outlet”).
Fix
Use the open shift, or close it first.
409Shift already closed
Why
Cash-up pressed twice.
Fix
Nothing to do.
400outletId required
Why
The shift panel was opened without an outlet.
Fix
Pick the outlet in the bar at the top of the terminal.
400Category does not belong to outlet
Why
A menu item was added to a category from another outlet.
Fix
Choose a category of the same outlet.
404Outlet not found
Why
The outlet was removed.
Fix
Pick another outlet.
404Table not found
Why
The table belongs to another outlet or was deleted.
Fix
Choose a table of this outlet.

Inventory

Stock adjustments, purchase orders and the supplier directory.

409A supplier with that name already exists
Why
Supplier names are unique per hotel, including inactive ones.
Fix
Search the directory with Show inactive on; edit or reactivate the existing supplier instead.
Name needs at least 2 characters
Why
Checked in the browser before anything is sent (no HTTP status): the supplier form was saved with an empty or one-letter name.
Fix
Type the supplier's trading name.
Enter a valid email
Why
Checked in the browser before anything is sent (no HTTP status): the email field has something that is not an address.
Fix
Fix the address or leave the field blank.
400Unit cost must be a whole UGX figure
Why
A connection was saved with decimals or text in the cost.
Fix
Enter whole shillings, or leave the cost blank.
400The same stock item is listed twice
Why
Manage items sent one item in two rows.
Fix
Refresh the drawer and save again.
400Unknown stock item
Why
A connection points at an item that was deleted meanwhile.
Fix
Refresh and pick the item again.
404Supplier not found
Why
Deleted or another hotel.
Fix
Refresh the directory.
400Adjustment would make quantity negative
Why
A negative adjustment larger than what is on hand.
Fix
Count the shelf and adjust to the real figure.
400One or more stock items not found
Why
A PO line references a deleted item.
Fix
Remove the line and pick a current item.
400Cannot receive PO in status received
Why
Received and cancelled orders are final.
Fix
Raise a new PO for further deliveries.
400Nothing left to receive on this PO
Why
Every line is already fully received.
Fix
Nothing to do; the PO is complete.
404Purchase order not found
Why
Deleted or another hotel.
Fix
Refresh.
404Stock item not found
Why
Deleted or another hotel (also when linking a recipe).
Fix
Refresh and pick again.

Reports & exports

Night audit and the export queue.

4092026-09-04 is already closed
Why
Night audit closes each hotel-local business day once.
Fix
Nothing to do; the snapshot is in the recent audits list.
400Export is queued
Why
The download link was opened before the file was Ready; the message names the current status (Queued, Running or Failed).
Fix
Wait for the live update that marks it Ready, then download. A Failed export can be requested again.
404Export not found
Why
Exports are kept for 30 days and then pruned.
Fix
Generate it again.
400sort must be one of name, code, createdAt
Why
A list address carries a sort, filter or date the endpoint does not know (the wording names the field and allowed values, e.g. “from must be YYYY-MM-DD”).
Fix
Clear the filters; use the filter bar rather than editing the URL.

Settings & roles

Hotel settings, numbering, ops configuration.

403Changing currency, timezone or the front-desk PIN requires full Settings access
Why
Those three fields are admin-tier.
Fix
Ask a Super Admin or Hotel Manager.
400Unknown timezone. Use an IANA name like Africa/Kampala
Why
The timezone must be a valid IANA zone name.
Fix
Pick from the list, e.g. Africa/Nairobi.
404Unknown sequence
Why
The numbering row does not exist for this hotel.
Fix
Reload the Numbering tab.
400Next value must be above the current 2041. Lowering it would duplicate codes
Why
Counters (BK-, INV-, PAY-…) only move upward.
Fix
Enter a higher number.
409That void reason already exists
Why
Ops items are unique by name: void reasons, checklist items, departments (“A department with that name already exists”), suppliers, inventory categories.
Fix
Edit the existing entry instead.

Demo sandbox

Messages specific to the public demo.

401This demo has expired
Why
Your 24-hour sandbox was swept.
Fix
Pick a role on the sign-in page to get a new one.
403Only a demo sandbox can be reset
Why
Reset was called on a real hotel.
Fix
Nothing to do, real hotels are never reset this way.
429You have started several demos recently. Try again in an hour
Why
Six sandbox starts per hour per address.
Fix
Wait, or keep using the sandbox you have.
429Too many resets. Try again in an hour
Why
Ten resets per hour per address.
Fix
Wait an hour.
503The demo is at capacity right now. Please try again in a little while
Why
The host's live-sandbox cap (200) is reached.
Fix
Try again later; sandboxes expire continuously.
503Demo mode is off
Why
This host is a real hotel, not the demo.
Fix
Sign in with your account.

FAQ

Short answers to the questions the desk asks most.

  1. 1
    The board says Arriving Today but the list says Confirmed, which is right?
    Both. Board columns are derived from status plus dates: a confirmed booking whose check-in is today (hotel time) sits in Arriving Today. Nothing is stored twice.
  2. 2
    Why is a room Cleaning when nobody is cleaning it?
    Room status is derived: out of service wins, then an in-house guest, then a blocking work order, then any open housekeeping task, then a reservation for today, else Available. An open task anywhere on the board shows as Cleaning.
  3. 3
    Why does this invoice say Overdue when it was Pending yesterday?
    Overdue is never stored, it is pending or partial with a due date before today. Record the payment and it becomes Paid.
  4. 4
    Someone is shown Off duty but they are here.
    Duty is derived: approved leave, then today's attendance mark, then a live rota window. Mark them Present in Attendance and it flips at once.
  5. 5
    My change is not showing on another PC.
    Live updates need the socket. If that PC's top bar shows Offline, its connection or the API is down; otherwise refresh once.
  6. 6
    I checked someone in offline and now the tray says Room is already booked.
    Another desk sold that room while you were offline. Open the booking, pick another ready room, check in again, then Dismiss the tray row.

Glossary

The words the app and this guide use, in alphabetical order, defined the way the code defines them.

A–Z

Front-desk, money, housekeeping, restaurant, staff and system terms.

Arrival day
The hotel-local calendar date of a booking's check-in. A guest can only be checked in on or after it; an early arrival is a date change first, so the folio charges the nights actually slept. Confirmed bookings whose arrival day is today (or earlier) sit in the Arriving Today column.
Admin tier / super tier
Two capabilities above the permission levels, both read from a role's matrix rather than its name. Admin tier is Super Admin, Hotel Manager, or any role with Settings Full: it manages roles, accounts and the PIN, reads the audit log, and can never sign in on the front-desk PIN. Super tier is Full on all thirteen modules, which by default is the Super Admin alone: it is the only one that can delete past a soft hold, delete a sign-in account or erase a guest.
Audit log
The hotel-wide trail of who changed what, when, from which address. Readable by Super Admin, Hotel Manager, Security and anyone with Settings Full.
BAR / rate plan
BAR is the Best Available Rate: the room type's base rate. A rate plan adjusts it per night, kinds are BAR (rack), Weekend and Promo: by a percentage or a fixed nightly amount, optionally limited to certain weekdays, a validity window and one room type. The booking stores the average nightly rate and the tax-inclusive stay total.
Board column
Where a booking sits on the pipeline board: New Requests, Confirmed, Arriving Today, In-House Guests, Checked Out, Cancelled. Columns are derived from status plus dates and today's date, never stored, cancelled and no-show both land in Cancelled.
Booking group
A GRP- coded block of rooms for one guest (the organiser): a name, dates, an optional rate plan and a list of room types with quantities, capped at 80 rooms. Group rooms start unassigned, so the capacity guard, not the double-booking constraint, protects them.
Capacity guard
The per-night check that stops a room type being oversold: assigned and unassigned active bookings of the type are counted against its sellable rooms (maintenance and out-of-service rooms excluded) for every night of the stay, with the room-type row locked so two desks cannot both take the last room. Refuses with “No Deluxe left for a date”.
Checklist template
The hotel's list of cleaning steps (Settings → Ops), copied onto every housekeeping task when it is created. Falls back to the built-in ten-step list if the hotel has none. Ticks on a task are its own; editing the template does not change open tasks.
Deposit
A percentage of the stay total (Settings → Hotel, deposit %) posted as a deposit line on a pre-arrival invoice when a booking is confirmed. At check-in that invoice becomes the folio: room and tax lines are appended and each deposit line is offset by an equal “Deposit applied” credit, so money paid against the deposit counts towards the stay.
Derived status
Anything computed from canonical fields at read time and never written to the database: board columns, room status, housekeeping state, invoice “overdue”, stock low/out, duty status, attendance %, leave day counts. One shared function computes each, used by both server and screen, so they can never disagree.
Duty status
On duty / Off duty / On leave for a staff member right now, derived in this order: approved leave covering today, then today's attendance mark (absent → off; present or late → duty), then a live rota window (including yesterday's overnight shift before it ends), else off. The reason travels with the status (“No shift on today's rota”).
Exclusion constraint / double booking
The database rule that makes double-booking impossible: for one hotel and one room, no two bookings in status new, confirmed or checked-in may overlap on a half-open date range [check-in, check-out). Same-day turnover is legal. A violation surfaces as 409 “Room is already booked for those dates”. Unassigned bookings are outside it (see capacity guard).
Folio
The guest's running bill for a stay: the invoice (INV- code) opened at check-in with room-night and tax lines, onto which POS room charges and fees post, and which must be settled (or explicitly settled later) before check-out closes it. One open folio per in-house stay.
Hard hold / soft hold
What a record is holding when it refuses to be deleted. A hard hold is money or history, a booking, an invoice, a payment, a bill, an expense, a purchase order line, a day of attendance, a line in the audit trail, and nothing gets past one, at any access level. A soft hold is other configuration, rooms on a room type, people in a department, stock in a category, and a Super Admin can delete past it, moving what was held where the dialog asks.
Hotel-local day
The calendar date in the hotel's IANA timezone (Settings → Hotel), computed once per request. Every “today” (arrival day, arriving column, overdue, night audit, attendance) uses it, and timestamped facts (payments, closed tickets) are grouped by the instants the local day starts and ends, not UTC midnight.
In-house
A booking in status Checked In: the guest is physically staying. Shown in the In-House Guests column; its room reads Occupied.
KDS
Kitchen Display System: the kitchen's view of sent tickets, moving each through New → Preparing → Ready → Served, one step at a time. Lines reach it when the server presses Send.
Modifier
An option attached to a menu item on a ticket line (size, extra, sauce…) from the item's modifier groups. Each carries a price delta added to the unit price; a line's total is (item price + modifiers) × quantity.
Night audit
Closing the hotel-local business day once (Reports, needs Reports Edit). Refreshes room projections and freezes a snapshot: rooms total/occupied/dirty/out of order, in-house, arrivals, departures, no-shows, cancellations today, cash in, refunds, POS closed total, and outstanding invoices. A day can be closed only once.
No-show
A booking marked No Show because the guest never arrived. Allowed from new or confirmed only. Posts a no-show fee, a percentage of one night (Settings → Hotel, default 100%), as a fee line on the pre-arrival invoice. Counts as Cancelled on the board.
Out of service
A room flag set from Rooms (with an optional reason) that removes the room from sale and from every availability list; the room reads Out of Service and wins over every other status. Return clears the flag. Both work offline. Distinct from Maintenance, which comes from a work order that blocks the room.
Outlet
A point of sale, restaurant, bar, pool bar, with its own menu categories, tables, cash shifts and service-charge percentage. Tickets, shifts and menu items always belong to one outlet.
Overdue
Overdue is never stored: an invoice is overdue when it is still pending or partially paid and its due date is before the hotel-local today. Paying it makes it Paid.
Part-payment
A payment smaller than the outstanding balance; the invoice becomes Partially Paid. Payments can never exceed the balance, and net received (payments minus refunds) is what the status is computed from.
PIN sign-in
The shared front-desk PIN of 4 to 8 digits (Settings → Hotel, Settings Full to change): pick your name, type the PIN. It can sign in any active user except admin-tier roles, Super Admin, Hotel Manager, or any role holding Settings Full, which always need email and password. Ten wrong PINs in 15 minutes lock the pad.
Purchase order
A PO- coded order to a supplier for stock items: draft → ordered → partial (some lines received) → received, or cancelled. Receiving books a stock movement per line; received and cancelled orders are final.
Quote
The stay price the wizard shows before you save: for each night, the room type's base rate adjusted by the chosen rate plan, summed, then service charge, VAT and levy applied with the hotel's canonical rounding. The saved booking keeps the average nightly rate and the total; the folio opened at check-in matches it exactly.
Ready for Guest (housekeeping)
The final housekeeping column. Only a room with no open task, no card in Dirty, Assigned, In Progress or Inspection, can be sold or checked into; the check-in room picker offers ready rooms only.
Refund cap
Every refund is tied to one original payment and capped by what is left on it, refunds on a payment can never add up to more than that payment, and by the net amount received on the invoice. Leaving the amount blank refunds whatever remains on that payment. Refunds need Payments Full.
Reorder level
The quantity at which a stock item becomes Low (quantity ≤ reorder level; zero is Out). Crossing it downwards raises a notification (“Reorder level reached. Create purchase order.”). Status is derived, never stored.
Room charge
The Charge to Room tender in POS: closing a ticket posts its subtotal, service charge and VAT as separate POS lines onto the in-house guest's open folio. Needs a checked-in guest in that room; idempotent if the ticket was already posted.
RLS / tenant
Every table is scoped by hotel and Postgres row-level security enforces it on every query, so one hotel can never read another's rows, including demo sandboxes, which are ordinary tenants. Your session carries the hotel; there is no “switch hotel” inside the app.
Sandbox
On the public demo, a private clone of the template hotel created for your browser when you pick a role. Lives 24 hours (the Demo chip counts down), can be reset, and is swept automatically. Same browser → same sandbox; role switches reuse it.
Sequence (BK-/INV-/PAY- codes)
Human-readable codes come from per-hotel counters, one per kind: BK bookings, GRP groups, INV invoices, PAY payments, HK housekeeping tasks, M work orders, TKT tickets, SHF cash shifts, PO purchase orders, S staff, LV leave. Settings → Numbering shows the next value and lets Settings Full move it upward only.
Settle later
Checking out with a balance still owed (bill-to-company, disputed charge). Needs Payments Full, is written to the audit log, and leaves the folio open for collection. Everyone else must collect the balance before check-out.
Shift (POS) vs shift (rota)
Two unrelated things. A POS shift (SHF- code) is a cash-drawer session on one outlet, opened with a float, closed with a cash-up; one open per outlet. A rota shift is a staff template window in minutes since midnight (Morning 07:00 – 15:00, Night 18:00 – 06:00) assigned to one person on one date; it feeds duty status.
Stayover
A guest who stays another night. Housekeeping's stayover refresh task type is the lighter clean for occupied rooms, as opposed to the checkout clean created automatically at check-out and the deep clean requested from Rooms.
Stock movement
One row per change to a stock item's quantity with a reason: receive (from a purchase order), adjust (manual count, cannot go negative), consume (recipe-driven depletion when a POS ticket closes, clamped to what is on hand, with a notification for any shortfall) or waste.
Supervisor authorisation
Some POS discounts (staff meal, manager comp) require a second person's email and password in the dialog. The supervisor must be active and hold Payments Full or Settings Full. The check happens on the server; the ticket keeps only the discount label and percentage, not who authorised it.
Tender
How a ticket is paid: Cash, Mobile Money (MTN or Airtel), Card, or Charge to Room. Closing a ticket records the tender; only room charge touches a folio.
Tier
A guest's loyalty band, Platinum, Gold, Silver or Bronze, set in the guest drawer form; the list shows it as a read-only badge. Guest CRM counts every non-Bronze guest as a loyalty member.
Void reason
The reason required when voiding a line that has already been sent to the kitchen (unsent lines are simply deleted). The list is per hotel in Settings → Ops; defaults include “Guest changed mind”, “Wrong item rung” and “Item sold out”.
Walk-in
A guest with no reservation who books at the desk: booking source Walk-in in the wizard, usually checked in straight away. Other sources are Direct, Booking.com, Expedia, Travel Agent and Corporate.
Work order
An M- coded maintenance job: title, category, priority (High/Medium/Low), optional room or location, technician or external contractor, due date, estimated cost. Lifecycle Reported → Assigned → In Progress ⇄ Waiting for Parts → Completed → Closed; closed is final. An order that blocks its room makes the room read Maintenance until it completes.