User guide · Complete edition

Hotel Management System: complete user guide

All 24 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 a 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 three parts:

  1. 1
    Start here
    Signing in, moving around quickly, and a walkthrough of a typical front-desk day.
  2. 2
    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.
  3. 3
    Reference
    Offline mode, speed tips, troubleshooting for every error message, and a glossary.

Conventions used throughout:

  • ⌘K / Ctrl K style keys mean “press together”; g then b means one after the other.
  • 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
    Forgot password
    Sends a reset link to your email (if mail delivery is configured for the hotel).
  5. 6
    Sign in
    Lands on the Dashboard.
  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
    Your hotel's address, 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 the Dashboard
    The sidebar shows only the modules your role can open.

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 two-minute tour. It spotlights the real screen as you go: the sidebar and what each group holds, global search, the quick-action buttons, your role and its exact access levels, the dashboard, then one card per module you can open, each ending with a concrete first task.

  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 first tasks for your role, such as 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 9 standard roles. Each one has a level for each of the eight permission modules; the matrix below is the default; administrators can adjust it in User Roles.

Default access matrix (User Roles can change it)
RoleDashboardBookingsRoomsGuestsPaymentsStaffReportsSettings
Super AdminFullFullFullFullFullFullFullFull
Hotel ManagerFullFullFullFullFullFullFullEdit
ReceptionistViewFullEditEditViewNoneNoneNone
AccountantViewViewNoneViewFullNoneEditNone
Housekeeping MgrViewViewFullNoneNoneEditViewNone
MaintenanceViewNoneEditNoneNoneNoneNoneNone
Restaurant MgrViewViewNoneViewEditViewViewNone
HR ManagerViewNoneNoneNoneViewFullEditView
SecurityViewViewViewViewNoneViewNoneNone
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 at the front desk

One shift, start to finish: morning handover on the Dashboard, departures and their folios, a walk-in through the wizard, the arrivals rush, in-house charges, evening payments and the night audit, with a link to the chapter that explains each step.

Morning to night audit

Receptionist

Follow the timeline; every entry names the screen, the button and the rule the system enforces.

  1. 06:30
    Handover on the Dashboard
    Sign in (email or the staff PIN). The Dashboard tells you the shape of the day: Available rooms, Occupied rooms, Arriving today with “N in-house now”, and Staff on duty. Scroll to Today's arrivals for the names and room types expected, and to Housekeeping status to see how many rooms are still cleaning from last night. Click the bell for overnight alerts.
  2. 07:00
    Walk the room grid
    Open Rooms. The status tiles are the count you hand over: Available, Occupied, Reserved (a booking holds the room today), Cleaning and Maintenance. A room with a fault gets Report maintenance; a room that must not be sold today gets Out of service. You never set a status by hand, it is projected from the facts.
  3. 08:00
    Departures: settle, then check out
    On the Bookings pipeline the In-House Guests column holds today's departures. Open the guest's invoice on Payments and use Record payment until the balance is zero, then click Check out in the booking drawer. If anything is still owed the server refuses: “INV-… still owes UGX …. Collect it before check-out, or a Payments manager can check out and bill later”. A user with Payments = Full is offered “Check out anyway and bill later? The folio stays open on Payments.” for bill-to-company cases. See Checking a guest out.
  4. 08:05
    The room goes to housekeeping by itself
    Check-out closes the folio to new charges, creates a High-priority checkout clean task due in two hours on the Housekeeping board, turns the room Cleaning and posts the alert “Guest checked out: room to cleaning”. The room becomes sellable again only when housekeeping moves the task to Ready for Guest.
  5. 10:00
    A walk-in at the desk
    Click New booking. Step 1: dates, room type, guests, Source = Walk-in, rate plan; the grey box quotes the room charge. Check availability lists free rooms of that type (never one that is out of service). Step 2: pick a room chip or Assign later, choose New guest and type the name and phone, then Create booking. The booking is saved as Confirmed; if the hotel takes deposits, a deposit line is posted to a new invoice at that moment. Full detail in Creating a booking.
  6. 12:00
    The arrivals rush
    Work the Arriving Today column. Open each card and click Check in; if no room is assigned, the drawer shows “Assign a room to check in · N free”: only rooms that are of the booked type, not cleaning, with no open housekeeping task and nobody still inside. The server checks the same things: it is on or after the arrival day (an early arrival must have its dates moved first), the room is ready and the type matches unless the room was assigned earlier as an upgrade. On success the room turns Occupied and the folio opens with the room nights and tax lines; a deposit already invoiced is credited against it, never charged twice. See Checking a guest in.
  7. 14:00
    In-house: charges land on the folio
    Lunch at the restaurant closed with the Charge to room tender on the POS appears on the guest's open folio as “POS · TKT-… · Restaurant” plus its service charge and VAT lines. A room move is a change of room on the booking (the new room must not be under maintenance or out of service); the drawer does not yet have a Move room button, so ask a manager to do it through the API. Special requests stay in the amber box on the drawer for the whole stay.
  8. 16:00
    No-shows and cancellations
    A confirmed guest who has not appeared by your cut-off gets No-show in the drawer (“Mark BK-… as a no-show?”). A call to cancel gets Cancel booking. Both release the room; the hotel's no-show fee (default 100% of one night) or cancellation fee (default 0%) posts to the folio automatically. See Confirming, cancelling and no-shows.
  9. 18:00
    Evening payments and deposits
    On Payments record part-payments and deposits as they come in, cash, mobile money, card or bank transfer. An invoice's status (Paid, Partially Paid, Pending, Overdue) is derived from its payments every time it is shown, so the booking drawer, search and the night audit always agree with the till.
  10. 22:00
    Close the business date
    On Reports a Reports = Edit user clicks Close 2026-09-04 and confirms “Close business date”. The server re-syncs every room's status for the new day, then freezes a snapshot: rooms (total, occupied, dirty, out of order), bookings (in-house, arriving, departing, no-shows, cancelled today), cash (payments, refunds, closed POS tickets) and the total still owed on open invoices, all measured on the hotel's local day, not UTC midnight. The same date cannot be closed twice (“2026-09-04 is already closed”). Until it is closed, the reports are live queries.

When the system says no

Receptionist

The refusals you will meet most often on a shift, and the one-line reason behind each.

  • “… arrives on 2026-09-12. Move the booking dates for an early check-in”: the guest is early. Change the dates so the folio charges the extra night, then check in.
  • “Room 204 is not clean yet (HK-88 is open). Pick another room or wait for housekeeping”: housekeeping has not released the room. Pick a chip that is offered, or wait for Ready for Guest.
  • “Room 204 is still occupied by BK-1039. Check them out first”: same-day turnover. Check the outgoing guest out first.
  • “No Deluxe left for 2026-09-12: 8 sellable, 8 already booked”: the type is sold out that night, counting unassigned bookings too. Offer another type or date.
  • “INV-… still owes …”: collect, or hand over to a Payments manager for a bill-later check-out.

The full list with fixes is in Bookings → Errors and Troubleshooting.

Words used on this page

Front-desk vocabulary as the system uses it.

Folio
The open invoice attached to a stay. Opened at check-in (or earlier, for a deposit), collects room nights, taxes, fees and POS room charges, closed at check-out.
Walk-in
A guest with no reservation; a booking created at the desk with Source = Walk-in and checked in straight away.
Arriving Today
The board column for confirmed bookings whose check-in date is today or earlier and who have not checked in yet.
Stayover
An in-house guest staying another night; their room reads Occupied and housekeeping may raise a stayover refresh.
No-show
A confirmed guest who never arrived. Marking it releases the room and may post a no-show fee.
Settle later
A Payments = Full check-out with a balance still owed; audited, the folio stays payable on the Payments screen.
Night audit
Closing the hotel-local business date on Reports: a frozen snapshot of occupancy, cash and outstanding invoices.
Projection
A value computed from facts rather than stored, room status, board column, duty status, invoice status.

Dashboard

The landing page after sign-in: today's room and arrival numbers, revenue and occupancy trends, the arrivals list, quick actions and a housekeeping summary, each part shown only if your role can see the module behind it.

Purpose and who uses it

ReceptionistHotel ManagerAccountant

A one-glance picture of the house for everyone; what you see depends on your module levels.

The Dashboard is the app's start page (and the page a phone opens when the app is installed). It greets you by first name, “Good morning, Fatima”: shows today's date, and lays out the numbers a front desk or manager needs before doing anything else. Nothing on it is edited; every tile and card links onward to the module that owns the data.

Every role can open the Dashboard. Which tiles and charts appear is decided by your levels for Rooms, Bookings, Payments and Staff, an Accountant sees revenue but no room tiles; a Maintenance user sees the room tiles and little else.

Screen anatomy

Greeting and New Booking, the role banner, a KPI row, two chart rows, then arrivals, quick actions and housekeeping.

Dashboard
18234567
  1. 1
    Greeting
    Time-of-day greeting with your first name and today's date.
  2. 8
    New Booking
    Jumps to the Bookings screen where the wizard lives.
  3. 2
    Available rooms
    “of N total · M in maintenance”.
  4. 3
    Occupied rooms
    with the occupancy percentage.
  5. 4
    Arriving today
    “N in-house now” underneath.
  6. 5
    Pending reservations / Pipeline value / Staff on duty
    The row wraps to fit; tiles appear per module access.
  7. 6
    Charts and Today's arrivals
    Revenue, Occupancy, Check-ins & outs, Room type performance, Booking sources; then the arrivals list and Quick actions.
  8. 7
    Housekeeping status
    Ready for guest, Cleaning in progress, Occupied, Maintenance / out as bars over the room count.

The role banner

Under the greeting a card shows your role, “Signed in as …” and one tag per permission module (Dashboard, Bookings, Rooms, Guests, Payments, Staff, Reports, Settings) coloured by level, grey with a lock for no access, blue for view, amber for edit, green for full. Hover a tag to read the level. It is the quickest way to see why a module is missing from your sidebar.

KPI tiles

Live counts from the room grid and the bookings board; the staff tile is derived from the rota and attendance.

  • Available rooms (Rooms = View), rooms whose projected status is Available, “of N total · M in maintenance”.
  • Occupied rooms: rooms with a checked-in guest; the sub-line is occupied ÷ all rooms as a percentage.
  • Arriving today (Bookings = View), bookings in the board's Arriving Today column: confirmed, check-in today or earlier, not yet checked in. Sub-line: how many guests are in-house now.
  • Pending reservations: bookings still in New Reservation, “awaiting confirmation”.
  • Pipeline value: the stay totals of every booking on the board (the seven days either side of today plus everyone in-house) added together, in the hotel currency.
  • Staff on duty (Staff = View), “on duty / total”, derived at the moment you load the page from approved leave, today's attendance sheet and rostered shift windows. It is never stored; see the Staff chapter for the reasons shown per person.

Charts

Five trend cards, bucketed on the hotel's local calendar, each gated by a module level.

  • Revenue (Payments = View), “Collections · last 14 days vs previous 14”. Payments received per hotel-local day, refunds subtracted; the purple line is the 14 days before that.
  • Occupancy (Bookings = View), “Rooms occupied per night · last 14 nights”, as a percentage of all rooms. Only bookings that have a room assigned count.
  • Check-ins & outs: “Last 7 days”: stacked bars of actual check-in and check-out times per day.
  • Room type performance: “Occupied nights · last 30 days”: for each type, occupied nights as a percentage of rooms × 30. Types with no rooms are hidden.
  • Booking sources: “Last 90 days”: a donut of bookings created per source (Direct, Walk-in, Booking.com…), largest first, with the total in the middle.

Cards you are not allowed to see are simply absent; the remaining cards stretch to fill the row.

Today's arrivals and quick actions

Receptionist

The arrivals list is the morning checklist; quick actions are shortcuts into modules you can open.

Today's arrivals

“N guests expected” lists every booking in the Arriving Today column: guest name, “Room 204 · Deluxe” (or just the type when no room is assigned yet), a Pending tag and the number of nights. Click Board to open the Bookings pipeline and check them in. The empty state reads “No arrivals expected today.” Late arrivals from earlier days stay on this list until they are checked in or marked no-show.

Quick actions

New Booking, Check In and Check Out open Bookings; Add Guest opens Guests; Create Invoice opens Payments; Assign Room opens Rooms; Report Issue opens Maintenance; Add Staff opens Staff; Notifications opens the alert feed. Only the actions whose module your role can open are shown.

Housekeeping status

Four bars over the total room count: Ready for guest (Available rooms), Cleaning in progress, Occupied, and Maintenance / out. The last bar counts rooms whose projected status is Maintenance; rooms flagged out of service are excluded from every bar.

Live updates and the offline snapshot

The page re-renders on any change in the house, and shows its last good copy when the network is gone.

Whenever a room, booking, invoice, housekeeping task, work order or staff record changes anywhere in the hotel, the Dashboard silently refreshes. You never need to reload it.

Each visit also saves a snapshot (rooms, board, summary) on the device. If you open the Dashboard with no connection, the snapshot is shown with an amber banner: “You're offline. Showing cached data from 4 Sep, 07:12.” When queued offline actions are sent, the page refreshes again.

Permissions

Dashboard is always visible; each section follows the level of the module it reports on.

Which sections a role sees
RoleDashboardRoomsBookingsPaymentsStaff
Super AdminFullFullFullFullFull
Hotel ManagerFullFullFullFullFull
ReceptionistViewEditFullViewNone
AccountantViewNoneViewFullNone
Housekeeping MgrViewFullViewNoneEdit
MaintenanceViewEditNoneNoneNone
Restaurant MgrViewNoneViewEditView
HR ManagerViewNoneNoneViewFull
SecurityViewViewViewNoneView
None No accessView View onlyEdit Can editFull Full access
  • Rooms ≥ View: Available / Occupied tiles, Housekeeping status, the room counts in the KPI row.
  • Bookings ≥ View: Arriving today, Pending reservations, Pipeline value, Occupancy, Check-ins & outs, Room type performance, Booking sources, Today's arrivals.
  • Payments ≥ View: the Revenue chart.
  • Staff ≥ View: the Staff on duty tile.

The Dashboard reads only; it has no actions of its own and returns no module-specific errors.

Bookings

The reservation pipeline: a board for today's work, a paged list of every booking, a month calendar, the two-step booking wizard, group blocks, rate plans, and the check-in / check-out rules that protect rooms and folios.

Purpose and who uses it

ReceptionistHotel Manager

Every stay starts here: a reservation becomes a room to prepare, a folio to settle and a line on the night audit.

Bookings is the front desk's home screen. A booking records who is staying, in which room type (and, once assigned, which room), for which nights, at what rate and from which source. Its status drives the rest of the house: confirming it may raise a deposit invoice, checking in opens the folio and marks the room occupied, checking out closes the folio and drops a cleaning task on the housekeeping board.

  • Receptionists create bookings, confirm, check in and out, and mark cancellations and no-shows (Bookings = Full by default).
  • Hotel Managers do the same and may also check a guest out with a balance still owed (that needs Payments = Full).
  • Accountants, Housekeeping Managers, Restaurant Managers and Security see the board and list read-only.

Screen anatomy

Three views share one page: the List archive (the default), the Pipeline board and the month Calendar, plus four KPI tiles.

Bookings, Pipeline view (the List is the default)
123458
  1. 1
    Page head
    Title, the List / Cards / Pipeline / Calendar switch (List opens first; the choice is remembered), the Filters button, and (Bookings = Edit) New group and New booking.
  2. 2
    New Requests
    Bookings still in the New Reservation status, awaiting confirmation.
  3. 3
    Confirmed
    Confirmed bookings whose arrival date is still in the future.
  4. 4
    Arriving Today
    Confirmed bookings whose check-in date is today or earlier (late arrivals stay here until checked in or marked no-show).
  5. 5
    Booking card
    Guest, code, Room / type / rate-plan / group tags, dates and the stay total. Click to open the drawer; drag to move (Edit).
  6. 8
    KPI tiles
    Total bookings, Pending requests, In-house and Pipeline value for the bookings currently visible on the board.

The three views

  • Pipeline: six columns: New Requests, Confirmed, Arriving Today, In-House Guests, Checked Out, Cancelled. It shows a working set: every booking whose stay touches the seven days either side of today, plus everyone in-house. This is also the snapshot the app keeps for offline use.
  • List: the full archive, one page at a time from the server. Search box (“Search booking, guest, phone, room…”), Status and Source dropdowns, and a “Showing / total” count. Columns: Booking, Guest, Room, Dates, Status, Amount, Source. Newest arrival date first; the filters and page live in the address bar (/bookings?view=list&status=confirmed&page=2).
  • Calendar: a Monday-first month grid. Each day lists up to three arrivals (“+N more arriving” beyond that), a “N in-house” count for stays spanning the day and “N departing”. Use the arrows or Today to move months; on a phone it becomes an agenda of active days only.

Filters opens the “Filter bookings” dialog: Status, Source, Stay from and Stay until, with Clear and Show results. On the Pipeline the filters narrow the board and the KPI tiles; on the List they are written to the URL so the page can be bookmarked or shared.

Creating a booking (the wizard)

Receptionist

Two steps: stay details with a live quote and an availability check, then room and guest.

  1. 1
    Click New booking
    The “New booking” dialog opens on “Step 1 of 2: stay details & availability”.
  2. 2
    Enter the stay
    Check-in (today or later), Check-out (at least one night), Room type, Guests (1–6 pax), Source (Booking.com, Direct, Expedia, Walk-in, Travel Agent, Corporate) and, if the hotel has any, a Rate plan. The BAR plan is preselected; only plans that apply to the chosen room type are listed.
  3. 3
    Read the quote
    A grey box shows “N nights · room charge …” for the chosen plan. It is the room charge before tax; the final total is computed from the hotel's service charge, VAT and levy settings when you save.
  4. 4
    Click Check availability
    The wizard asks the server which rooms of that type are free for those nights (maintenance and out-of-service rooms are never offered) and moves to “Step 2 of 2: room & guest”.
  5. 5
    Pick a room, or Assign later
    Room chips read “204 · Fl 2”. If none are free you see “No {type} rooms free for those dates. The booking can still be saved without a room and assigned later.”: the capacity guard still checks that the type is not oversold.
  6. 6
    Choose the guest
    Existing guest: type at least two characters of a name, code, phone or email and pick from the list. New guest: Full name (required), Phone, Email, the profile is created with the booking.
  7. 7
    Add Special requests (optional) and click Create booking
    The booking is saved as Confirmed, a “Booking BK-… created” toast appears and the board refreshes.

Checking a guest in

Receptionist

Check-in is allowed on or after the arrival day, into a ready room of the booked type that nobody else is still occupying.

  1. 1
    Open the booking
    Click the card in Arriving Today (or Confirmed for an early arrival, which will be refused, see below), or find it in the List and click the row.
  2. 2
    Click Check in in the drawer footer
    You can also drag the card into In-House Guests, or pick Checked In in the Status select.
  3. 3
    Assign a room if there is none yet
    The drawer shows “Assign a room to check in · N free” with a chip per room that is free for the stay, of the booked type, not cleaning, with no open housekeeping task and no guest still inside. Click a chip to check in to it. If the list is empty you see “No free {type} rooms for those dates”.
  4. 4
    Done
    A toast reads “BK-… → Checked In”. The room turns Occupied, the folio opens with the room nights and tax lines, and a “Guest checked in: Room N” alert is posted.

The rules the server enforces

  • Arrival day: the hotel-local date of the action must not be before the booking's check-in date. Late arrivals are fine; an early arrival must have its dates moved first so the folio charges the nights actually slept.
  • A room must be assigned: either earlier on the booking or from the chips at check-in.
  • Type must match: a room picked at the desk must be of the booked room type. A room assigned earlier on the booking stands even if it is a different type (an upgrade).
  • Room must be ready: not out of service or under maintenance, not in Cleaning, and with no open housekeeping task.
  • Nobody still inside: a same-day turnover is a legal reservation, but the physical check-in waits until the outgoing guest has checked out. The room row is locked so two desks cannot both pass the check.

Checking a guest out

ReceptionistHotel Manager

The folio must be settled first; a Payments = Full user may check out and bill later.

  1. 1
    Settle the folio
    Open the invoice on the Payments screen and use Record payment until the balance is zero (see the Payments chapter).
  2. 2
    Click Check out in the booking drawer
    Or drag the card from In-House Guests to Checked Out, or pick Checked Out in the Status select.
  3. 3
    If a balance remains
    The server refuses with “INV-… still owes UGX …. Collect it before check-out, or a Payments manager can check out and bill later”. A user with Payments = Full is asked “Check out anyway and bill later? The folio stays open on Payments.”: confirming checks out with the balance outstanding and writes an audit entry.
  4. 4
    What happens next
    The open folio is closed to new charges, a High-priority checkout-clean housekeeping task due in two hours is created for the room, the room turns Cleaning, and a “Guest checked out: room to cleaning” alert is posted.

Confirming, cancelling and no-shows

Receptionist

Each move has a confirmation dialog; cancellations and no-shows may post a fee to the folio.

  • Confirm (New → Confirmed), drawer button Confirm, or drag the card from New Requests to Confirmed. Posts the deposit hold and sends the confirmation email as described above.
  • Cancel booking (New or Confirmed → Cancelled), opens “Cancel BK-…?” / “{guest}'s stay will be cancelled and the room released.” Confirm with Cancel booking. A cancellation fee of the hotel's cancel percentage of the stay total is posted if that percentage is above zero (default 0%).
  • No-show (Confirmed → No Show), opens “Mark BK-… as a no-show?” / “{guest} did not arrive. The room is released. A no-show fee may post to the folio.” Confirm with Mark no-show. The fee is the hotel's no-show percentage of one night (default 100%).

Fees and deposits land on the booking's open pre-arrival invoice (one is opened if needed) as a line such as “No-show fee · BK-1042 (100% of one night)”. A fee posted onto an invoice that was already paid reopens it.

Group bookings

Receptionist

Block several rooms of one or more types under one lead guest; room numbers are assigned later.

  1. 1
    Click New group
    The “New group” dialog: “Allot rooms under one lead guest, assign room numbers later”.
  2. 2
    Fill in the block
    Group name (tour operator, wedding, conference…), Check-in and Check-out, the Lead guest (search an existing profile) and an Allotment count per room type (0–40 each, up to eight types, 80 rooms in total).
  3. 3
    Click Create group
    The server checks capacity for each type over the whole block, then creates one Confirmed booking per room, unassigned, 1 pax, source Direct, all under the lead guest, and gives the group a GRP-… code. Toast: “Group GRP-… · N rooms”.

Group bookings appear on the board as ordinary cards carrying the group code tag. Assign rooms and check each one in exactly like a single booking. The wizard's validation messages are “Give the group a name”, “Pick the lead guest” and “Allot at least one room”.

Rate plans and the quote

Hotel Manager

A plan adjusts the room type's base rate per night; the booking stores the average nightly rate and the tax-inclusive total.

Every room type has a base rate. A rate plan is one of three kinds, BAR (rack), Weekend, Promo , and can be limited to one room type, to certain days of the week, and to a valid-from / valid-to window. Inactive plans are never offered.

  • For each night of the stay: if the plan is inactive, outside its dates or not on its days, the base rate applies. Otherwise a fixed plan amount wins; failing that the base rate is adjusted by the plan's percentage (for example −15%).
  • The booking keeps rate = the average of the nightly rates and amount = the subtotal with service charge, VAT and levy applied in that order. The folio opened at check-in uses the same figures, so quote and folio always agree.
  • Changing a room type's base rate or a plan later affects new quotes only. Existing bookings keep the rate they were sold at.

Plans are managed in Settings → Hotel → Rate plans (Settings = Edit): each row shows the name, code and kind with an editable percentage and a Save button. The BAR plan is what the wizard preselects.

Statuses and the board columns

Six stored statuses; the board columns are derived from status and the hotel-local date, never stored.

Booking lifecycle, arrows the server allows
Booking lifecycle, arrows the server allowsConfirmCancelCheck in (API)Check inNo-showCancelCheck outNew ReservationConfirmedChecked InChecked OutNo ShowCancelled
  • New ReservationConfirmed (Confirm)
  • New ReservationCancelled (Cancel)
  • New ReservationChecked In (Check in (API))
  • ConfirmedChecked In (Check in)
  • ConfirmedNo Show (No-show)
  • ConfirmedCancelled (Cancel)
  • Checked InChecked Out (Check out)
  • New Reservation: a request that holds inventory but has not been confirmed. The drawer offers Confirm and Cancel booking. (The server also accepts a direct check-in of a New booking; the drawer only offers Check in on Confirmed ones.)
  • Confirmed: holds the room type (and room, if assigned). Deposit and confirmation email have gone out.
  • Checked In: guest in-house; folio open; room Occupied.
  • Checked Out, Cancelled, No Show: final. Read-only from here; the room is released.

Board columns are derived

The column a card sits in is computed from its status and the hotel's date, by the same function on the server and in the browser:

  • New Reservation → New Requests
  • Confirmed with check-in after today → Confirmed; check-in today or earlier → Arriving Today
  • Checked In → In-House Guests; Checked Out → Checked Out
  • Cancelled and No Show → Cancelled

So you cannot drop a card into Arriving Today, the toast says “Arriving Today is based on the check-in date. Confirm the booking if it is still a request.” Any other move the lifecycle does not allow answers “That column isn't a valid next step for this booking”.

A booking's history (every status change, who made it and when) is stored and shown by the API; the drawer's Status select offers only the moves drawn above (“Only valid transitions are offered; check-in asks for a room, check-out closes the folio.”).

Fields

What the wizard collects and what the server validates.

New booking wizard
FieldTypeNotes
Check-in *dateHotel-local calendar date. The wizard does not allow a past date.
Check-out *dateMust be after check-in, at least one night.
Room type *selectShown as “Deluxe (UGX 250,000/night · 1 King)”. Decides the base rate and which rooms are offered.
Guests1–6 paxAdults on the booking. The server accepts up to 12 adults and up to 12 children; the wizard sends children as 0.
SourceselectBooking.com, Direct (default), Expedia, Walk-in, Travel Agent or Corporate. Feeds the Booking sources chart.
Rate planselectOnly shown when the hotel has active plans; filtered to the chosen room type. BAR is preselected.
RoomchipOne of the rooms free for the stay, or Assign later. A room out of service is never offered; a room under maintenance today is still offered for later dates, but cannot be checked into until its work order closes.
Guest *existing or newExisting: search by name, code, phone or email. New: Full name (at least 2 characters), Phone, Email (must be a valid address if given).
Special requeststext ≤ 500Shown in an amber box on the drawer, high floor, late check-in, and so on.
New group dialog
FieldTypeNotes
Group name *text 2–120Tour operator, wedding, conference…
Check-in / Check-out *datesOne block of dates for every room in the group.
Lead guest *existing guestEvery room booking in the group is made under this profile.
Allotment *0–40 per typeUp to eight room types; 80 rooms in total. Each type is capacity-checked for the whole block.

Permissions

View opens the board, list and calendar; Edit performs every booking action; checking out with a balance needs Payments = Full.

Default levels for the modules Bookings touches
RoleBookingsPaymentsRooms
Super AdminFullFullFull
Hotel ManagerFullFullFull
ReceptionistFullViewEdit
AccountantViewFullNone
Housekeeping MgrViewNoneFull
MaintenanceNoneNoneEdit
Restaurant MgrViewEditNone
HR ManagerNoneViewNone
SecurityViewNoneView
None No accessView View onlyEdit Can editFull Full access
  • Bookings = View: Pipeline, List, Calendar, the booking drawer, rate plans and the availability search (the wizard's room list also needs Rooms = View to load room types).
  • Bookings = Edit: New booking, New group, Confirm, Cancel booking, No-show, Check in, Check out, drag-and-drop on the board.
  • Payments = Full: the “Check out anyway and bill later?” override when a folio still has a balance.
  • Settings = Edit: create or change rate plans.

Tips

Live updates, remembered views, the List URL, and where to look when a card is missing.

Errors you may see

Every refusal the bookings, groups and rate-plan endpoints can return, with what to do.

400Check-out must be after check-in
Why
Same-day or reversed dates.
Fix
Pick a check-out date at least one night after check-in.
400Provide either guestId or a new guest
Why
The request named an existing guest and a new one, or neither.
Fix
In the wizard choose Existing guest or New guest, not both.
400Room 204 is not a Deluxe
Why
A specific room was requested that is not of the booked room type.
Fix
Pick a room of the chosen type, or change the room type.
409Room 204 is out of service
Why
The room is flagged out of service (or “under maintenance”).
Fix
Choose another room; a Rooms = Edit user can Return to service when it is fixed.
409No Deluxe left for 2026-09-12: 8 sellable, 8 already booked
Why
The room-type capacity guard: on that night every sellable room of the type is already held (assigned and unassigned bookings together). Group blocks add “, 5 requested”.
Fix
Offer another room type or other dates. Only rooms out of service are excluded from the sellable count, a room under maintenance today still sells for later dates.
409Room is already booked for those dates
Why
Two holding bookings would overlap on the same room.
Fix
Pick a different room or dates.
400That rate plan does not apply to this room type
Why
The plan is restricted to another type.
Fix
Choose a plan listed for the type, or BAR.
409Cannot edit a checkedout booking
Why
Checked-out, cancelled and no-show bookings are read-only.
Fix
Create a new booking instead.
409Room 204 is unavailable
Why
On an edit or check-in, the room is out of service or under maintenance.
Fix
Assign a different room.
409Cannot check in a cancelled booking
Why
Only New or Confirmed bookings can be checked in.
Fix
Re-create the booking if the guest has arrived after all.
409BK-1042 arrives on 2026-09-12. Move the booking dates for an early check-in
Why
The hotel-local date is before the booking's check-in date.
Fix
Change the dates first so the folio charges the extra night(s), then check in.
400Assign a room before check-in
Why
The booking has no room and none was chosen.
Fix
Click one of the “Assign a room to check in” chips.
400Room 204 is a Suite; BK-1042 was booked as a different type. Assign it on the booking first
Why
A room chosen at the desk must match the booked type.
Fix
Pick a room of the booked type. An upgrade assigned on the booking beforehand is accepted.
409Room 204 is not clean yet (HK-88 is open). Pick another room or wait for housekeeping
Why
The room is in Cleaning or has an open housekeeping task.
Fix
Wait for Ready for Guest on the Housekeeping board, or pick another room.
409Room 204 is still occupied by BK-1039. Check them out first
Why
Same-day turnover: the previous guest has not checked out.
Fix
Check the outgoing booking out, then retry.
409Cannot check out a confirmed booking
Why
Only Checked In bookings can be checked out.
Fix
Check the guest in first.
409INV-2301 still owes UGX 120,000. Collect it before check-out, or a Payments manager can check out and bill later
Why
Code FOLIO_UNSETTLED, an open folio has a balance.
Fix
Record payment on the invoice, or have a Payments = Full user confirm the bill-later check-out.
403INV-2301 still owes UGX 120,000. Only Payments "Full access" can check out with a balance
Why
settleLater was requested by a user without Payments = Full.
Fix
Collect the balance, or ask a Payments manager.
409Cannot move a checkedin booking to cancelled
Why
The lifecycle does not allow that move (see the diagram).
Fix
Use the move that applies: a checked-in guest is checked out, not cancelled.
400occurredAt must be within the last 48 hours
Why
An offline replay carried a timestamp older than two days or in the future.
Fix
Perform the action again online.
400month must be YYYY-MM
Why
The calendar was asked for a malformed month.
Fix
Use the month arrows; the URL parameter must look like 2026-09.
400Cap a group at 80 rooms
Why
The allotments add up to more than 80.
Fix
Split the block into two groups.
400Rate plan WEEKEND already exists
Why
A plan with that code already exists for the hotel.
Fix
Edit the existing plan or choose another code.

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 List / Grid / By floor views of the same rooms.

Rooms, List view
17243
  1. 1
    Page head
    “Rooms · N rooms · X% occupied”, the List / Grid / By floor switch (List opens first; the choice is remembered and ?view=grid deep-links) and, for Rooms = Full, Room types and New room.
  2. 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.
  3. 2
    Filter bar
    “Search room number or type…”, plus Room type, Floor and Housekeeping (HK state) dropdowns. Shown / total counts and Clear.
  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. 3
    View switch
    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.

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” with its type, status badge, floor, an “Out of service” badge when set, and four cards: Price / night, Housekeeping, Type, Floor. Notes (for example the out-of-service reason) appear below, then thedetail panel: the Occupant (guest, dates, nights, party size and, with Payments access, the folio balance),Next 14 days as a strip of day cells painted by the stays that hold the room (blue = in-house, purple = confirmed),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. 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.
  • 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 “Delete room N?”: “Only possible if this room has no booking history. This cannot be undone.” with Delete room. A room that has ever carried a booking is refused; mark it Out of service instead so history stays intact.

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 first amenities. Profile opens a dialog for Adults (1 to 20), Children (0 to 10), Amenities (comma separated, up to 20) and a Description (up to 600 characters). Toast: “Deluxe King profile saved”. The profile shows in the room drawer and feeds the reports.

Room types are ordered by the sequence they were created in. Deleting a type is only possible through the API while it has no rooms and no bookings attached.

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
  • AvailableReserved (booking arrives today)
  • ReservedOccupied (check in)
  • OccupiedCleaning (check out)
  • CleaningAvailable (HK task ready)
  • AvailableMaintenance (blocking work order)
  • MaintenanceAvailable (order closed)
  • AvailableOut of Service (Out of service)
  • Out of ServiceAvailable (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
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).
  • 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 tabs (List, Cards, Board, Cleaning checklist) and a filter bar that changes with the tab.

Housekeeping → Board (the List tab 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).

Tabs

  • List (the default): a paged archive 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 tab.
  • 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 tab choice is remembered per browser. On phones the List tab shows cards instead of a table.

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 and a due time two hours out. 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. The checklist does not have to be complete, the system does not block the move, so make “Final inspection” a habit.
  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 2 · 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 with Medium priority and no due time, and the toast “Housekeeping task created” confirms it. 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 SettingsOps configHousekeeping 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 never gates a transition, it is a record, not a lock.

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 RoomsAssigned
  • Dirty RoomsIn Progress (skip)
  • AssignedIn Progress
  • AssignedDirty Rooms (unassign)
  • In ProgressInspection
  • In ProgressDirty Rooms (restart)
  • InspectionReady for Guest (pass)
  • InspectionIn 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 touserShown as the first name and avatar on the card, “Unassigned” otherwise. Filterable; the screen has no picker to change it.
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
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 tab sorts by creation date (newest first) and pages 25 at a time; 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, 25 per page by default. 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. Any active account can be chosen. 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
  • ReportedAssigned (assign)
  • AssignedIn Progress
  • AssignedWaiting for Parts
  • In ProgressWaiting for Parts
  • Waiting for PartsIn Progress
  • In ProgressCompleted
  • Waiting for PartsCompleted
  • CompletedClosed
  • 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.

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
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.

Guests & CRM

The guest directory: one profile per person or company, built up by every booking, with honest stay counts, collected spend, loyalty tiers and an export for marketing.

Purpose and who uses it

ReceptionistHotel Manager

A profile for every guest, created by the booking wizard or by hand, that grows with each stay.

Guests is the hotel's CRM. Every booking points at a guest profile, a G-code, contact details, country, loyalty tier and notes, so the front desk recognises a returning guest and management can see who actually stays and spends. Profiles are usually created by the booking wizard; the New guest button is for adding someone before their first booking or setting up a corporate account.

  • Receptionists search the directory during check-in, fix a phone number, read the notes (“prefers high floor”).
  • Managers use the KPI strip and tier chips for loyalty and repeat-business figures, and export the list.
  • Accountants and the restaurant have view-only access to look a guest up.

Screen anatomy

KPI strip, tier chips with counts, type and country selects, then a paged table (or cards) that opens a profile drawer.

Guests directory
12346
  1. 1
    Page head
    “N guests on file”: every guest, never the filtered count. Search box, Export (Reports Full only) and New guest (Guests Edit) on the right.
  2. 2
    Tier chips
    All tiers · Platinum · Gold · Silver · Bronze, each with its count across the whole hotel.
  3. 3
    Type and country
    “Everyone / Corporate only / Individuals only” and “All countries” (countries actually on file). Clear appears when any filter is on.
  4. 4
    Rows
    Guest (name, corporate tag, code), Contact (phone or email), Country, Tier, Stays, Lifetime spend, Rating. Click a row to open the drawer.
  5. 6
    Pagination
    “N of M guests”, sorted by name. Page, search and filters live in the address bar.

Above the chips sit four KPI tiles when analytics are available: Total guests, Loyalty members(Silver tier and above), Returning rate (repeat stayers) and In-house now. Phones open the Cards view; the Table / Cards switch sits in the page head next to the search box.

Finding a guest and reading the profile

Receptionist

Search by name, code, phone, email or company; the drawer shows stats, contact cards, notes and the last 25 bookings.

  1. 1
    Type in “Search name, code, phone…”
    Matches name, G-code, phone, email and company name. The list narrows as you type; the count reads “12 of 480 guests”.
  2. 2
    Narrow with the chips and selects
    Click a tier chip, choose Corporate only, or pick a country. Filters combine. Clear resets all of them.
  3. 3
    Click the row
    The drawer opens with the guest's name and code (plus company for corporate guests).
  4. 4
    Read the three stat cards
    Total stays, Lifetime spend and Member since (the date the profile was created).
  5. 5
    Scroll the Stay history
    Up to 25 most recent bookings, newest first: booking code, room and room type, dates, status badge (Checked In, Cancelled, …) and amount. “No bookings yet.” for a fresh profile.

Adding and editing a guest

Receptionist

New guest for a walk-in-to-be or a company account; Edit in the drawer for contact details, tier and notes.

New guest

  1. 1
    Click New guest
    The dialog reminds you: “Guests are also created automatically by the booking wizard”.
  2. 2
    Full name
    Required, at least two characters, otherwise “Enter the guest's name”.
  3. 3
    Phone, Email, Country, Tier
    All optional except Tier, which defaults to Bronze. Email must be a valid address. Tiers: Platinum, Gold, Silver, Bronze.
  4. 4
    Corporate account
    Tick it to reveal a Company name box. The list then shows a “corporate” tag next to the name and the drawer a Corporate badge.
  5. 5
    Notes, then Add guest
    Up to 500 characters. The toast reads “Guest Jane Doe added” and the profile drawer is ready to open.

Editing

Open the drawer and click Edit (Guests Edit needed). Name, Phone, Email, Country, Tier and Notes become fields; Save writes them and the toast “Guest updated” confirms. The corporate flag and company name are not on the edit form, set them when the profile is created. Every edit is written to the audit log.

How stays, spend and tiers are counted

Hotel ManagerAccountant

Stays are bookings that really happened; spend is money actually collected, minus refunds. Both are computed, never typed.

  • Stays counts bookings whose status is Checked In or Checked Out. Cancellations, no-shows and reservations that have not arrived yet do not count, so a guest with three future bookings and no history still shows 0 stays.
  • Lifetime spend is the sum of payments received on that guest's invoices, with refunds subtracted. It is not the billed total: an unpaid folio adds nothing until it is paid. A dash means nothing has been collected.
  • Returning rate = guests with two or more real stays ÷ guests with at least one, as a percentage.
  • Loyalty members = everyone not in Bronze. The tier chips count guests per tier across the whole hotel.
  • In-house now = distinct guests with a booking currently checked in.
Loyalty tiers (set by hand, nothing promotes a guest automatically)
Loyalty tiers (set by hand, nothing promotes a guest automatically)BronzeSilverGoldPlatinum
  • BronzeSilver
  • SilverGold
  • GoldPlatinum

Corporate guests

ReceptionistAccountant

A company account is a guest profile with the corporate flag and a company name; bookings for its travellers hang off it.

Tick Corporate account in New guest and enter the company name. From then on:

  • The directory shows a corporate tag next to the name and the “Corporate only” filter finds it.
  • The drawer subtitle reads “G-… · Company Ltd” and shows a Corporate badge and a Company card.
  • Search matches the company name as well as the contact person's name.
  • Stays and spend accumulate on the company profile, so the account's real value is visible in one place.

Pick the company profile as the guest in the booking wizard and choose the Corporate booking source; invoices then carry the company as the billed party.

Guest fields

The profile record, what the forms accept and what is computed.

Guest profile
FieldTypeNotes
CodeG-…Assigned automatically on creation.
Full name *text 2–100Person or contact name. Searchable.
Phonetext ≤ 40Shown as the Contact column when present. Searchable.
EmailemailMust be a valid address if given. Used as Contact when there is no phone.
Countrytext ≤ 60Free text; the country filter lists the values on file, so spell consistently.
Tier *enumPlatinum / Gold / Silver / Bronze; defaults to Bronze. Changed by hand only.
Corporate accountyes/noCreate-time only. Adds Company name (≤ 100).
Notestext ≤ 500Preferences, allergies, VIP handling. Shown in a grey box in the drawer.
Rating1–5 starsDisplayed in the list and drawer when present; there is no control on this screen to set it.
Stays · Lifetime spend · Member sincecomputedDerived from bookings, payments and the creation date, never edited.

Permissions

Guests View reads; Guests Edit creates and edits; the Export button needs Reports Full.

Default levels for the directory and its export
RoleGuestsReports
Super AdminFullFull
Hotel ManagerFullFull
ReceptionistEditNone
AccountantViewEdit
Housekeeping MgrNoneView
MaintenanceNoneNone
Restaurant MgrViewView
HR ManagerNoneEdit
SecurityViewNone
None No accessView View onlyEdit Can editFull Full access
  • Guests View: directory, drawer, analytics tiles. No New guest or Edit buttons.
  • Guests Edit: New guest, Edit / Save in the drawer.
  • Reports Full: the Export button (the file is produced by the Reports module).

Default roles: Receptionist has Edit; Accountant, Restaurant Mgr and Security have View; Housekeeping, Maintenance and HR do not see the module.

Tips

Export to Excel, bookmarkable filters, and keeping the country list clean.

  • Export. Click Export in the page head. The toast reads “Guest export queued. Download it from Reports”: the workbook appears under Reports → Exports once it is built. The export is the full directory, not the filtered page.
  • Bookmark a segment. /guests?tier=Gold&country=Kenya reopens the same slice; share it with the sales team.
  • Country spelling. The country select only offers what has been typed before, so “Uganda” and “UG” become two entries. Fix stragglers with Edit.
  • Notes at check-in. The booking drawer shows the guest's notes, so put anything the desk must know here rather than on a single booking.
  • The typeahead in the booking wizard uses the same search rules (name, code, phone, email) and returns the top eight matches.

Errors you may see

Nothing here conflicts; what you can hit is validation and the occasional stale profile.

400Validation failed
Why
A field broke its rule: name under 2 or over 100 characters, an email that is not an address, notes over 500 characters, phone over 40, country over 60, company name over 100.
Fix
Shorten or correct the field and save again.
404Guest not found
Why
The profile was opened from a stale list or link.
Fix
Reload the directory and search again.

Client-side: “Enter the guest's name” (blank name on New guest), “Could not add the guest”, “Could not save changes”, “Could not open guest”, “Could not queue the export” (export needs Reports Full and a working export queue).

Real stay
A booking that reached Checked In or Checked Out. The only kind that counts as a stay.
Lifetime spend
Collected payments on the guest's invoices minus refunds, cash in the till, not amounts billed.
Tier
Loyalty band (Platinum, Gold, Silver, Bronze). Set manually; Silver and above are “loyalty members”.
Corporate account
A guest profile flagged as a company, with a company name, used as the billed party for its travellers.

Staff

People and their access in one place: staff records, the weekly rota, daily attendance, leave requests and approvals, and the sign-in accounts that decide what each person can open.

Purpose and the two axes

HR ManagerHotel Manager

A staff record is the job; an account is the way in. They are linked, but neither implies the other.

Staff answers two different questions. Who works here, and when?: the Directory, Rota, Attendance and Leave tabs. Who can sign in, and what may they open?: the Accounts tab. As the screen puts it: “a staff record is the person's job, an account is their way in. Link the two from the directory when someone needs both.”

  • A room attendant may have a staff record and no login (they use the shared front-desk PIN, or none at all).
  • An outside accountant may have a login and no staff record, they are not on the rota.
  • A receptionist has both: a record with job title “Receptionist” in Front Office, linked to an account whose role is Receptionist. The job title is free text; the role is the permission set. They do not have to match.

HR managers own the directory, rota, attendance and leave. Department heads with Staff Edit mark attendance and request leave for their teams. Administrators manage accounts and approve leave. Everything on this page emits live updates, so two HR screens never disagree.

Screen anatomy

Six KPI tiles, department chips and a directory table (with Cards and By department views) on the Directory tab; four more tabs for Rota, Attendance, Leave and Accounts.

Staff → Directory
1234567
  1. 1
    Page head
    “12 active people across 5 departments · 4 on duty right now”, plus a link “2 leave requests to decide” when the queue is not empty. Add staff on the right.
  2. 2
    Total staff
    Active records.
  3. 3
    On duty / Off duty / On leave
    Derived right now. Click a tile to filter the grid by that duty status; click again to clear.
  4. 4
    Leave to decide
    Pending requests. The Leave tab is where you act on them.
  5. 5
    Attendance
    Days not marked absent over the last 30 days, hotel-wide.
  6. 6
    Department chips and directory
    All · Front Office · Housekeeping · …, then the table: Name, Job title, Department, Duty (hover for the reason), Phone, Hired, Attendance, Account. Tap a heading to sort, or its filter icon to narrow by that column. The Cards view shows one card per person with today's shift; By department groups the cards.
  7. 7
    Filter bar
    Search (name, code, job title, phone), Duty status, Job title. Narrows within the chosen department.

The tabs: Directory, Rota, Attendance, Leave, Accounts. Retired records are hidden from the directory and rota but can be restored from their drawer.

Adding, editing and retiring a staff record

HR Manager

Add staff creates the record; the drawer edits it, links an account, and retires or restores it.

  1. 1
    Click Add staff
    The dialog is titled “Add staff, A staff record. A sign-in account is optional and separate”.
  2. 2
    Full name, Job title, Department
    Name and job title need two characters or more; department is a dropdown of the hotel's departments. Phone is optional.
  3. 3
    Linked account (optional)
    A dropdown of active accounts not already linked to someone else, shown as “Name · Role”. Leave it at “No login” for staff who do not sign in.
  4. 4
    Click Add staff
    The person gets an S-code and appears in the grid; the toast reads “Jane Doe added to the team”.
  5. 5
    Edit later from the card
    Click a card to open the drawer. Name, job title, department, phone and Linked account are editable; Save writes them (“Staff record updated”). The right-hand column shows phone, email, hire date, today's shift and attendance.
  6. 6
    Retire record
    Red button in the drawer → confirm “Retire record”. “They disappear from the directory and rota. You can restore the record later.” A retired record cannot be rostered, marked or booked on leave. Restore record brings it back.

Shift templates and the weekly rota

HR Manager

Define the shifts once (Staff Full), then fill a staff × day grid one cell at a time.

Shift times

At the bottom of the Rota tab, Shift times lists the templates the rota can use, “Morning 07:00 – 15:00”, “Night 22:00 – 06:00”. With Staff Full you can rename a shift, retime it (hh:mm), or add one with the row at the bottom. “An end time at or before the start makes it an overnight shift” and gets an overnight tag. “Retiming a shift moves every rota entry already using it.” Start and end must differ. Without any templates, “every rota cell is empty”.

Filling the rota

  1. 1
    Pick the week
    The card head shows “Mon 7 Sep – Sun 13 Sep · one shift per person per day”. Use ‹ › to move a week, This week to come back. Today's column is highlighted.
  2. 2
    Choose a shift in each cell
    Every cell is a dropdown: “, off” or a template “Morning · 07:00 – 15:00”. It saves on change and is written to the audit log as rota.assigned or rota.cleared.
  3. 3
    Find the gaps
    Filter Coverage → “Has unfilled days” to list only people with at least one empty cell this week; combine with Department.

Marking attendance

HR Manager

One row per active person per day: Present / Late / Absent, clock in and out, and a note. Never for a future date.

  1. 1
    Pick the date
    The date box tops out at hotel-local today; the card head reads “7 of 12 marked for today · unmarked people read as off duty”.
  2. 2
    Click a status chip
    Present, Late or Absent on the row. It saves immediately and is audited as attendance.recorded.
  3. 3
    Clock in / Clock out
    Type hh:mm and leave the field. Typing a time on an unmarked row marks the person Present as well, because a record needs a status. A bad value shows “Enter the time as hh:mm, e.g. 07:30” and reverts.
  4. 4
    Note
    Free text up to 200 characters (“doctor's appointment”), saved when you leave the box.
  5. 5
    Work down the unmarked list
    Filter Status → “Not yet marked” to see who is left. The Shift column shows the rostered window so you can judge Late.

Attendance % on the directory (per person and hotel-wide) is the share of marked days over the last 30 that are not Absent, Late counts as attended. People with no marks show “not marked yet”.

Leave: request, approve, reject, withdraw

HR ManagerHotel Manager

Anyone with Staff Edit can raise a request; only Staff Full decides it; withdrawing is for requests raised in error.

  1. 1
    Click Request leave
    On the Leave tab. The dialog says “Pending until someone with Staff full access decides”. Choose the Staff member, Type (Annual, Sick, Unpaid, Other), First day, Last day and an optional Reason.
  2. 2
    Submit request
    The request gets an LV-code, appears under Pending requests, and a blue alert “Leave request: Jane Doe” goes to the feed. A request that overlaps a pending or approved one for the same person is refused.
  3. 3
    Approve or Reject (Staff Full)
    Green Approve / red Reject on the pending row open a confirmation titled “Approve LV-…” or “Reject LV-…” with an optional Note “kept on the record”. Approving warns: “Approved leave outranks the rota: this person reads as On leave on every day in the range.” Rejecting: “the rota untouched. The request stays in history with your note.”
  4. 4
    Withdraw (Staff Edit)
    For requests raised in error. Confirm “Withdraw request”: the row “disappears from the approval queue and is filed as cancelled. … use Reject to turn one down.”
  5. 5
    History
    Decided and withdrawn requests, newest first, with Decided by and the note. Filter by Status, Leave type and Department; search by code or name.
Leave request lifecycle
Leave request lifecycleApprove (Full)Reject (Full)Withdraw (Edit)PendingApprovedRejectedCancelled
  • PendingApproved (Approve (Full))
  • PendingRejected (Reject (Full))
  • PendingCancelled (Withdraw (Edit))

Decided requests are final: there is no un-approve. If plans change, the person simply comes to work and is marked Present, attendance is checked after leave, so an approved day still reads as On leave; ask an administrator if that matters for records.

Duty status is derived

On duty, Off duty and On leave are never typed in, they are worked out live from leave, today's attendance and the rota.

The badge on every card is recomputed on each request, in this priority order. The first rule that applies wins, and the card's tooltip tells you which one it was.

  1. 1
    On leave
    On approved leave today
  2. 2
    Off duty
    Marked absent on today's attendance sheet
  3. 3
    On duty
    Marked present on today's attendance sheet, or marked late on today's attendance sheet
  4. 4
    On duty
    Inside a rostered shift right now (by the hotel's clock)
  5. 5
    Off duty
    Rostered today, but outside the shift window, or no shift on today's rota
  • An attendance mark is an explicit statement about today and outranks the rota: someone marked Present at 06:50 is on duty even before their 07:00 shift starts.
  • Overnight shifts work across midnight: a “Night 22:00 – 06:00” rostered for Monday shows the person on duty from 22:00 Monday until 06:00 Tuesday.
  • Nobody on the rota today and no mark → Off duty with “No shift on today's rota”. This is why a brand-new hotel shows everyone off duty until the rota is filled.
  • The KPI tiles and the page-head “on duty right now” use exactly the same rule, so they always agree with the cards.

Accounts: logins, roles, passwords, deactivation

HR ManagerSuper Admin

Create sign-in accounts, change a role, reset a password or deactivate. Admin-tier roles need Settings Full.

The Accounts tab lists every login with Name, Email, Role, Status (Active / Deactivated) and Last sign-in, with four counters (Accounts, Active, Deactivated, Roles in use) and filters for Role and Status. Your own row is tagged “you”.

  1. 1
    New account
    Dialog “New staff account, They sign in with this email and password”: Full name, Email, Temporary password (“min 8 chars, share it securely”), Role. Click Create account. The email must be unique in the hotel.
  2. 2
    Change a role
    Open the account and pick a new Role; it saves at once (“Role updated”) and takes effect on the person's next request. You cannot change your own role.
  3. 3
    Reset password
    Type a new password (8+ characters) and click Set. The toast reads “Password reset. Existing sessions revoked”: the person is signed out everywhere.
  4. 4
    Deactivate account
    Confirm “Deactivate account”: “They will be signed out immediately and will not be able to sign in until you reactivate the account.” Reactivate account reverses it. You cannot deactivate yourself.
  5. 5
    Link it to a person
    Go back to the Directory, open the staff record and choose the account under Linked account.

Fields

Staff record, shift template, leave request and account, what each form accepts.

Staff record (Add staff / drawer)
FieldTypeNotes
Full name *text 2–80Searchable.
Job title *text 2–80Free text; feeds the Job title filter. Not a permission.
Department *selectOne of the hotel's departments; drives the chips and rota/attendance filters.
Phonetext ≤ 30Optional.
Linked accountuserActive, not linked elsewhere. “No login” is fine.
Hire datedateShown as “Hired …” in the drawer when set; not on the forms.
Activeyes/noRetire / Restore record. Retired people cannot be rostered, marked or booked on leave.
Shift template (Rota → Shift times, Staff Full)
FieldTypeNotes
Name *text 2–40“Morning”, “Night”.
Start · End *hh:mmMust differ. End at or before start = overnight.
Leave request
FieldTypeNotes
Staff member *selectActive records only.
Type *enumAnnual / Sick / Unpaid / Other
First day · Last day *dateInclusive; days = last − first + 1. Last day may not precede first; at most 366 days.
Reasontext ≤ 300Optional, shown to the approver and in history.
Note (decision)text ≤ 300Optional, typed by the approver; kept on the record with their name.
Account (Accounts tab)
FieldTypeNotes
Full name *text 2–80Shown in the top bar and audit log.
Email *emailSign-in identity; unique per hotel; stored lower-case.
Password *≥ 8 charsTemporary on creation; reset from the drawer. Never shown again.
Role *selectThe permission set. Admin-tier roles need Settings Full to grant.
Activeyes/noDeactivate / Reactivate. Deactivating revokes every session.

Permissions

Staff View reads everything; Edit runs the day-to-day; Full decides leave and defines shifts; Settings Full is needed for admin-tier accounts.

Default levels that matter on this page
RoleStaffSettings
Super AdminFullFull
Hotel ManagerFullEdit
ReceptionistNoneNone
AccountantNoneNone
Housekeeping MgrEditNone
MaintenanceNoneNone
Restaurant MgrViewNone
HR ManagerFullView
SecurityViewNone
None No accessView View onlyEdit Can editFull Full access
  • Staff View: all five tabs read-only (drawers say “View-only access …”).
  • Staff Edit: Add staff, edit / retire / restore records, fill the rota, mark attendance, Request leave, Withdraw; create accounts, change roles, reset passwords, deactivate and reactivate.
  • Staff Full: additionally Approve / Reject leave and add or retime shift templates.
  • Settings Full: required on top of Staff Edit to create, re-role or edit a Super Admin / Hotel Manager (admin-tier) account.

Defaults: HR Manager has Staff Full but Settings View, so HR can approve leave yet cannot touch admin accounts; Housekeeping Mgr has Staff Edit; Restaurant Mgr and Security can only look; Super Admin does everything.

Tips

Tiles as filters, the hotel clock, live updates and where the numbers come from.

  • Tiles filter. Click On leave to see who is away today; it also resets the department chip because tiles count the whole hotel.
  • Hotel time. “Today” for attendance, the rota and duty status is the hotel's own calendar day and clock, not your laptop's.
  • Everything is live. Approving leave on one screen flips the person's badge on every other open Staff page within seconds.
  • Start-of-day routine: Attendance tab → filter “Not yet marked” → chips down the list; then Directory to confirm “on duty right now” matches the floor.
  • Pending queue. The page-head link “N leave requests to decide” jumps straight to the Leave tab.
  • History is capped. The Leave tab shows the 200 most recent decided requests; pending ones always show in full.

Errors you may see

Every refusal from the staff and accounts endpoints, verbatim.

Records, rota, attendance

400That account is already linked to a staff record
Why
The Linked account you chose belongs to another person.
Fix
Unlink it from the other record first, or create a new account.
400That record is retired, restore it before rostering shifts
Why
A rota cell was set for a retired person (usually from a stale grid).
Fix
Open the record from the directory (Duty status → any) and click Restore record.
400That record is retired, restore it before recording attendance
Why
Attendance was marked for a retired person.
Fix
Restore the record, then mark.
400Attendance cannot be recorded for a future date
Why
The date is after hotel-local today.
Fix
Pick today or an earlier date.
400Start and end time must differ
Why
A shift template with identical start and end would last 24 hours.
Fix
Set a real window; end before start is fine (overnight).
404Staff record not found
Why
The record was removed or the tab is stale.
Fix
Reload the page.
404Shift template not found
Why
The shift used in the cell was removed.
Fix
Reload and pick a current shift.

Leave

400End date must not precede start date
Why
Last day is before First day.
Fix
Swap the dates.
400A single request cannot span more than a year
Why
More than 366 days, almost certainly a typo.
Fix
Check the year in both dates.
400That record is retired, restore it before booking leave
Why
Leave was requested for a retired person.
Fix
Restore the record first.
400Overlaps LV-0042 (approved) for the same staff member
Why
A pending or approved request already covers one of those days.
Fix
Adjust the dates, or withdraw / decide the other request first.
400Overlaps already-approved LV-0042
Why
Approving this request would overlap leave approved after it was raised.
Fix
Reject one of them, or shorten the dates by raising a new request.
400Only pending requests can be decided (this one is approved)
Why
Someone else decided it moments ago.
Fix
Nothing, the list refreshes on its own.
400Only pending requests can be cancelled (this one is rejected)
Why
Withdraw was clicked on a request that is no longer pending.
Fix
Nothing to do; it is already in history.
404Leave request not found
Why
Stale row.
Fix
Reload.

Accounts

403Only a Super Admin can manage Hotel Manager accounts
Why
You tried to create, re-role or edit an admin-tier account (Super Admin, Hotel Manager, or any role with Settings = Full) without Settings Full yourself.
Fix
Ask a Super Admin, or have your own role granted Settings Full in User Roles.
409A user with that email already exists
Why
Emails are unique per hotel (case-insensitive).
Fix
Search the Accounts tab for the address, it may be a deactivated account you can reactivate.
400You cannot deactivate or change the role of your own account
Why
Self-lockout guard.
Fix
Ask another administrator.
400Password must be at least 8 characters
Why
Validation on create; the Set button also stays disabled below 8.
Fix
Use a longer temporary password.
404Role not found
Why
The role was deleted in User Roles while the form was open.
Fix
Reload and pick again.
Staff record
A person on the payroll: S-code, job title, department, rota and attendance. May have no login.
Account
A sign-in (email + password) with a role. May have no staff record.
Duty status
On duty / Off duty / On leave, derived live from leave, attendance and the rota; never stored.
Shift template
A named time window (e.g. Night 22:00 – 06:00) that rota cells reference. Retiming it retimes every cell.
Admin tier
Super Admin, Hotel Manager, or any role with Settings Full. Needs Settings Full to grant; never PIN sign-in.

User Roles & permissions

The permission matrix: which of the nine roles may view, edit or fully manage each of the eight modules, and how an administrator changes it.

Purpose and who uses it

Super AdminHotel Manager

One table decides what every sidebar entry and every button does for a given role.

Access in the system is role × module × level. There are 9 standard roles (Super Admin, Hotel Manager, Receptionist, Accountant, Housekeeping Mgr, Maintenance, Restaurant Mgr, HR Manager, Security) and 8 permission modules (Dashboard, Bookings, Rooms, Guests, Payments, Staff, Reports, Settings). Each role holds a level from 0 to 3 for each module. The same table drives the sidebar, the buttons on every screen and the API guard behind them, there is no separate list of "who can click what".

User Roles & Access is the screen where an administrator reads and changes that table. It is deliberately narrow: it does not create roles, rename them or assign people to them. People are given a role in Staff → Accounts; this screen only sets what a role may do.

Only a user whose Settings level is Full can open it, by default that is Super Admin alone (Hotel Manager holds Settings at "Can edit").

Screen anatomy

A single wide table: one row per role, one column per module, a level selector in each cell.

User Roles & Access
1245
  1. 1
    Page head
    “User Roles & Access” with the legend “0 none · 1 view · 2 edit · 3 full. Changes reach signed-in users within about 15 seconds”.
  2. 2
    Level legend
    The four levels with their colours: 0 No access (grey), 1 View only (blue), 2 Can edit (amber), 3 Full access (green).
  3. 4
    Matrix rows
    One row per role. Under the name, how many user accounts currently hold that role (“3 users”).
  4. 5
    Save
    A purple Save button appears on a row as soon as you change any of its cells and disappears once saved.
  • Each cell is a small dropdown with the values 03, coloured by level.
  • The Super Admin row shows a lock icon and eight fixed green 3 badges, it has no dropdowns.
  • There are no filters, tabs or search; the whole matrix fits on one screen (scroll sideways on a narrow window).

Levels and what they allow

A level is a number; the actions it unlocks are derived from it the same way everywhere.

The server never stores a list of actions per role. It stores one number per module and derives the actions: View at 1, Create and Edit at 2, Delete, Approve and Export at 3. Every screen and every API route is annotated with the module and the minimum level it needs, so the derivation is the same in the sidebar, on the buttons and in the guard.

Levels → actions
FieldTypeNotes
0 · No accessThe module is hidden from the sidebar and every request to it is refused.
1 · View onlyViewOpen the screen, read lists and drawers, print. No create, edit or export buttons.
2 · Can editView · Create · EditEverything a desk needs day to day: new records, status moves, inline edits.
3 · Full accessView · Create · Edit · Delete · Approve · ExportAlso delete, approve, refund, export and change configuration.

Two practical consequences. A role with View only on a module sees a small lock icon next to it in the sidebar and gets read-only screens. A role with No access does not see the entry at all, and if someone types the address by hand, the page shows a module gate and the API answers 403.

Which screens sit under which module

Sixteen sidebar entries are guarded by eight permission modules; several screens share one.

The permission modules are coarser than the sidebar. When you set a level for Rooms you are also setting it for Housekeeping and Maintenance; a level for Payments covers the POS terminal, Restaurant and Inventory as well.

Permission module → screens it guards
FieldTypeNotes
DashboardDashboard, Notifications
BookingsBookings
RoomsRooms, Housekeeping, Maintenance
GuestsGuests
PaymentsPayments & invoices, POS terminal, Restaurant, Inventory
StaffStaff (directory, rota, attendance, leave, accounts)
ReportsReports & exports
SettingsSettings, User Roles, Audit log

So a Housekeeping Manager with Rooms = Full can also close maintenance tickets, and a Restaurant Manager with Payments = Can edit can record a payment on a guest folio. If that is not what you want, lower the level, there is no finer split.

The default matrix

What every hotel starts with; administrators may change any row except Super Admin.

Default levels per role and module
RoleDashboardBookingsRoomsGuestsPaymentsStaffReportsSettings
Super AdminFullFullFullFullFullFullFullFull
Hotel ManagerFullFullFullFullFullFullFullEdit
ReceptionistViewFullEditEditViewNoneNoneNone
AccountantViewViewNoneViewFullNoneEditNone
Housekeeping MgrViewViewFullNoneNoneEditViewNone
MaintenanceViewNoneEditNoneNoneNoneNoneNone
Restaurant MgrViewViewNoneViewEditViewViewNone
HR ManagerViewNoneNoneNoneViewFullEditView
SecurityViewViewViewViewNoneViewNoneNone
None No accessView View onlyEdit Can editFull Full access
  • Super Admin: Full on everything, and fixed: the server refuses to change it.
  • Hotel Manager: Full on everything except Settings (Can edit), so it runs the hotel but cannot rewrite this matrix.
  • Receptionist: Full on Bookings, Can edit on Rooms and Guests, View only on Payments: can see a folio but not record money.
  • Accountant: Full on Payments (record, refund, settle-later at checkout), Can edit on Reports.
  • Housekeeping Mgr: Full on Rooms (housekeeping and maintenance included), Can edit on Staff for the rota.
  • Maintenance, Restaurant Mgr, HR Manager, Security: narrow by design; Security has View on most operational modules plus the Audit log.

Changing a role's permissions

Super Admin

Pick new levels in a row, click Save; the change is audited and reaches users within seconds.

  1. 1
    Open User Roles
    Sidebar → User Roles. If you cannot see the entry, your Settings level is below Full.
  2. 2
    Change the cells you need
    Use the dropdown in each cell (0–3). You can change several cells in one row before saving; each row saves separately.
  3. 3
    Click Save on that row
    The button appears only on rows with unsaved changes. The toast reads “<role> permissions saved. Applies to signed-in users within about 15 seconds”.
  4. 4
    Verify
    Ask the affected person to reload, the sidebar re-reads the levels from their session. The change is recorded in the Audit log as role.permissions.updated with the before and after levels.

The admin tier: by name or by capability

Super Admin and Hotel Manager are admin-tier by name; any role holding Settings = Full is admin-tier by capability.

"Admin tier" is what the system calls the roles that can manage roles, user accounts and the shared front-desk PIN. It is decided in two ways, and either is enough:

  • By name: Super Admin and Hotel Manager, whatever their matrix says.
  • By capability: any role whose Settings level is Full, whatever it is called.

Being admin-tier has three effects:

  • The shared staff PIN can never sign in as an admin-tier user, those accounts always use email and password, and they are hidden from the PIN name list.
  • Creating an account with an admin-tier role, or changing one, needs Settings = Full. Staff → Accounts refuses otherwise with “Only a Super Admin can manage <role> accounts”.
  • The Audit log is readable (admin tier plus Security).

This is why the matrix editor refuses Settings = Full for non-admin roles: promoting, say, Receptionist to Settings = Full would make it admin-tier by capability while still being reachable through the desk PIN.

Permissions

Reading and writing the matrix both need Settings at Full access.

Settings level per role (default)
RoleSettings
Super AdminFull
Hotel ManagerEdit
ReceptionistNone
AccountantNone
Housekeeping MgrNone
MaintenanceNone
Restaurant MgrNone
HR ManagerView
SecurityNone
None No accessView View onlyEdit Can editFull Full access
  • Open User Roles, read the matrix: Settings · Full access. (View or Can edit is not enough; the sidebar entry is hidden below Full.)
  • Save a row: Settings · Full access.
  • Assign a role to a person: done in Staff → Accounts under the Staff module; admin-tier roles additionally need Settings · Full.

Tips

Small habits that keep the matrix safe and legible.

Errors you may see

Every message the roles API can return, with the reason and the fix.

409The Super Admin role is fixed at full access
Why
You tried to save the Super Admin row. Its levels are hard-wired to 3 on every module.
Fix
Nothing to do; the row is shown locked on screen. Edit a different role.
409Full access on Settings is reserved for admin-tier roles (Super Admin, Hotel Manager); give <role> "Can edit" at most
Why
A non-admin role was given 3 on Settings. That would make it admin-tier by capability and reachable through the front-desk PIN.
Fix
Set Settings to 2 (Can edit) or lower for that role and save again.
403Your role (<role>) has "<level>" on Settings; this action needs "Full access".
Why
The API guard refused the request because your Settings level is below Full. The refusal is written to the Audit log as access.denied.
Fix
Ask a Super Admin to make the change, or to raise your role's Settings level.
403Only a Super Admin can manage <role> accounts
Why
Raised by Staff → Accounts, not this screen: you tried to create or edit a user with an admin-tier role without Settings = Full.
Fix
A Super Admin (or any Settings-Full user) performs that account change.
404Role not found
Why
The role was removed or belongs to another hotel while your page was open.
Fix
Reload User Roles and try again.

Terms used on this screen

Short definitions for the words that matter here.

Permission module
One of the 8 areas a level is set for. Several sidebar screens can share a module.
Level
0 No access · 1 View only · 2 Can edit · 3 Full access. Stored per role per module.
Admin tier
Super Admin, Hotel Manager, or any role with Settings = Full. Excluded from PIN sign-in; may manage accounts and roles.
Module gate
The read-only or blocked state a screen shows when your level is too low for it.

Payments & folios

Guest folios and invoices: what lands on them, how to record money against them, refunds, and the rule that a folio must be settled before check-out.

Purpose and who uses it

AccountantReceptionistHotel Manager

One list of every invoice the hotel has raised, with the money received against each.

Payments & Invoices is the money side of a stay. Every booking that is confirmed or checked in has an invoice, the folio: that collects room nights, taxes, deposits, fees and restaurant charges. This screen lists those invoices, shows what has been paid, lets you record a payment or a refund, and prints or emails the invoice.

There is no card gateway: the system records money that has already changed hands (cash, mobile money, card terminal slip, bank transfer) and keeps the reference you type. Amounts are whole shillings, the hotel currency label can change in Settings, but there are never decimals.

Receptionists can open the screen and read every folio; recording money needs Payments at Can edit (Accountant, Hotel Manager, Restaurant Manager by default) and refunds need Full.

Screen anatomy

Four header figures, status chips, a searchable invoice table (or the Cards and By status views) and a folio drawer.

Payments & Invoices
12346
  1. 1
    Header figures
    Invoices · Collected · Outstanding · Overdue. Computed over every invoice in the hotel, not just the page in view; Overdue turns red when above zero.
  2. 2
    Status chips and search
    All · Pending · Partially Paid · Paid · Overdue · Refunded, then “Search invoice, guest, booking…” and a Balance select (Any balance · Outstanding only · Fully settled).
  3. 3
    Issue dates
    Opens the “Filter invoices” dialog with Issued from / Issued until. Show results applies; Clear empties both.
  4. 4
    Invoice rows
    Invoice · Guest · Booking · Issued · Due · Status · Total · Balance. Balance is red while owed, green at zero. Click a row to open the folio.
  5. 6
    Pagination
    Page and page-size controls; the list lives in the URL so you can bookmark a filtered view.

The folio drawer

Clicking a row opens a drawer titled with the invoice code (e.g. INV-0412) and the guest and booking under it. Left: status badge, issued and due tags, the line items (Item · Qty · Amount) and a dark totals card (Total · Paid · Balance). Right: the Payment history: one entry per payment or refund with method, network, reference, code, date and who received it. Footer buttons: Close,Print, Email, Record payment (only while a balance is owed) and, once the payment form is open, Save payment.

Empty state: “No invoices yet. A folio opens at check-in, and a deposit invoice when a booking is confirmed”.

How a folio is built

The quote is the folio: room nights plus the tax chain, deposits offset once, POS charges appended, fees added.

An invoice is a header (issue date, due date, totals, a cached status) plus lines of a kind:room, tax, deposit, fee, pos,adjustment, other. Where each comes from:

  1. 1
    Confirmation, deposit invoice
    If the hotel has a deposit % (Settings → Hotel), confirming a booking opens an invoice with one line “Deposit <pct>% · BK-…”. Issue and due date are the hotel-local day it was raised. The guest can pay it now; it shows as Pending, Partially Paid or Paid like any other.
  2. 2
    Check-in, the stay lands on the same invoice
    Check-in appends “Accommodation · BK-… · <room type> × N nights” and the tax lines “Service charge X%”, “VAT X%”, “Tourism levy X%” (only those with a non-zero rate). If a deposit invoice already exists it is reused: every deposit line is offset by an equal negative line “Deposit applied to stay · BK-…”, so total = the stay, and whatever was paid on the deposit already counts toward it. The deposit is never charged twice.
  3. 3
    During the stay, POS room charges
    A restaurant or bar ticket closed with Charge to Room posts “POS · TKT-… · <outlet>”, “Service charge · TKT-…” and “VAT · TKT-…” lines onto the open folio and raises its total. A folio that was already Paid becomes Partially Paid again.
  4. 4
    Cancellation / no-show, fees
    A cancellation fee (% of the stay) or no-show fee (% of one night), if configured, is added as a fee line, on the open invoice if there is one, otherwise a new one. Each fee posts once per booking.
  5. 5
    Check-out, the folio closes
    Check-out closes every open invoice on the booking: no more charges can land on it, but it stays payable until settled.

The tax chain

Totals are computed in one fixed order and rounded at every step: discount on the subtotal → service charge on the discounted subtotal → VAT on (discounted subtotal + service) → tourism levy on the discounted subtotal → total. Rates are the hotel's percentages in Settings; a POS outlet may override the service % for its own tickets.

Recording a payment

AccountantHotel Manager

Open the folio, click Record payment, enter amount, method and reference, Save payment.

  1. 1
    Open the folio
    Click the invoice row. Check the Balance figure in the dark card, that is what can be collected.
  2. 2
    Click Record payment
    The button is in the drawer footer and only shows while the balance is above zero. The Amount field is pre-filled with the full balance.
  3. 3
    Enter the amount
    Whole shillings only; commas and spaces are stripped. A part-payment is fine, the invoice becomes Partially Paid and Record payment stays available for the rest.
  4. 4
    Choose the method
    Cash · Mobile Money · Card · Bank Transfer. Mobile Money asks for the Network (MTN or AIRTEL). Every method except Cash shows a Reference no. field (“Transaction / slip reference”), type the MoMo transaction id, card auth code or transfer reference so the audit trail can be matched to the bank.
  5. 5
    Save payment
    A PAY-… code is issued, the invoice status is re-derived, a notification is raised (“Payment received on INV-…” or “Invoice INV-… settled”) and the toast reads “Payment of UGX … recorded on INV-…”.

Refunding a payment

AccountantHotel Manager

Refunds are per payment, capped at what is left on that payment, and need Payments Full.

A refund is a payment entry with a negative effect, linked to the payment it reverses. It cannot exceed what is still refundable on that payment, nor what has been collected on the invoice overall.

  1. 1
    Find the payment in Payment history
    Each non-refund entry with something left shows a Refund chip; if part of it was already returned the chip reads Refund rest. A fully returned payment shows a Refunded badge instead.
  2. 2
    Click Refund
    A confirm dialog titled “Refund PAY-…?” explains: “This refunds whatever is still outstanding on the payment. The guest balance will increase.”
  3. 3
    Issue refund
    The refund is created with the same method and reference as the original, a new PAY-… code, written to the audit log as payment.refunded, and the folio status is re-derived (Refunded once net paid reaches zero).

Settled folio before check-out

ReceptionistAccountant

Check-out is refused while any open folio owes money, unless a Payments-Full user chooses to settle later.

The rule lives on the booking, but it is a payments rule: Check out on the booking drawer refuses while any open folio on that booking has a balance. The 409 names the invoices and the total , “INV-0412 still owes UGX 240,000. Collect it before check-out, or a Payments manager can check out and bill later”.

  1. 1
    Usual path, collect first
    Open Payments, record the balance, then check the guest out. The folio is closed at check-out and shows Paid.
  2. 2
    Exception, settle later
    Bill-to-company or a disputed charge: a user with Payments Full sees a confirm on the booking drawer to check out anyway. The booking is checked out, the action is audited as booking.checkedout_unsettled, and the folio is closed to new charges but stays open for collection here.
  3. 3
    Collect afterwards
    The invoice keeps its status (Pending, Partially Paid, and Overdue once the due date passes). Record payment works exactly as during the stay.

Invoice statuses

Pending, Partially Paid, Paid and Refunded are cached from the payments; Overdue is derived from the due date and never stored.

Invoice money state (derived from total and payments)
Invoice money state (derived from total and payments)part-paymentpaid in fullbalance paidPOS charge / feerefund to zerorefund to zerodue date passeddue date passedbalance paidPendingPartially PaidPaidOverdueRefunded
  • PendingPartially Paid (part-payment)
  • PendingPaid (paid in full)
  • Partially PaidPaid (balance paid)
  • PaidPartially Paid (POS charge / fee)
  • PaidRefunded (refund to zero)
  • Partially PaidPending (refund to zero)
  • PendingOverdue (due date passed)
  • Partially PaidOverdue (due date passed)
  • OverduePaid (balance paid)
  • Pending: nothing received yet.
  • Partially Paid: net paid (payments minus refunds) is above zero but below the total.
  • Paid: net paid ≥ total.
  • Refunded: at least one refund exists and net paid is back at zero or below.
  • Overdue: Pending or Partially Paid and the due date is before the hotel's today. This one is derived on every read: list, drawer, PDF, search, the booking drawer and the night audit, and is never written to the database.

The record-payment form

Four fields inside the folio drawer; the reference is optional but expected for anything but cash.

Record payment
FieldTypeNotes
Amount (UGX) *whole numberPre-filled with the balance. Must be > 0 and ≤ the outstanding balance. Commas are ignored.
Method *selectCash · Mobile Money · Card · Bank Transfer
NetworkselectShown for Mobile Money only: MTN or AIRTEL. Required when the method is Mobile Money.
Reference no.text ≤ 60Shown for every method except Cash. Free text: transaction id, auth code, slip or transfer reference. Kept on the payment and printed on the invoice history.

Permissions

View to read and print; Can edit to record payments and email; Full to refund and settle later.

Payments and Bookings levels per role (default)
RolePaymentsBookings
Super AdminFullFull
Hotel ManagerFullFull
ReceptionistViewFull
AccountantFullView
Housekeeping MgrNoneView
MaintenanceNoneNone
Restaurant MgrEditView
HR ManagerViewNone
SecurityNoneView
None No accessView View onlyEdit Can editFull Full access
  • Open the list, open a folio, Print (PDF): Payments · View only.
  • Record payment, Email invoice: Payments · Can edit.
  • Refund: Payments · Full access.
  • Check out with a balance (settle later): Payments · Full access, from the booking drawer (Bookings · Can edit for the check-out itself).

The POS terminal, Restaurant and Inventory share the Payments module, so a Restaurant Manager (Can edit) can record a folio payment here even though their day is spent on tickets.

Tips

Printing and emailing, the overdue chip, live refresh and URL filters.

Errors you may see

Every payments message the server can return, plus the checkout gate and POS-to-folio messages.

400Amount must be positive
Why
The amount parsed to zero.
Fix
Enter a figure above zero.
400Amount must be a whole UGX figure
Why
The amount contained a decimal point or letters.
Fix
Whole shillings only; the screen strips commas and spaces for you.
400Select the mobile money network
Why
Method is Mobile Money but no network was chosen.
Fix
Pick MTN or AIRTEL in the Network select.
409Invoice is already settled
Why
The balance is zero (or below), someone else recorded the money first, or the drawer was stale.
Fix
Close and reopen the folio; the Record payment button disappears when nothing is owed.
409Amount exceeds the outstanding balance (UGX N)
Why
You entered more than is owed. Overpayments are never held on account.
Fix
Record the balance shown and give change.
400Guest has no email address
Why
Email invoice needs an address on the guest profile.
Fix
Add the email in Guests, then try again, or Print instead.
409That entry is itself a refund
Why
Refund was requested on a refund row.
Fix
Refund the original payment row; refund rows have no chip on screen.
409PAY-… has already been refunded in full
Why
Nothing is left to return on that payment.
Fix
Refund a different payment on the same folio if money is still owed to the guest.
400Refund must be positive
Why
An explicit refund amount of zero was sent (API only).
Fix
Send an amount above zero or omit it to refund the rest.
409Refund exceeds what is left on PAY-… (UGX N refundable)
Why
An explicit amount was larger than the unrefunded part of that payment.
Fix
Refund at most the figure quoted.
409Refund exceeds the amount received on this invoice
Why
Net receipts on the whole invoice are lower than the refund (earlier refunds already used them).
Fix
Check the Payment history; only what has actually been collected can go back.
409INV-… still owes UGX N. Collect it before check-out, or a Payments manager can check out and bill later
Why
Check-out was attempted with an unsettled open folio (code FOLIO_UNSETTLED).
Fix
Record the payment here, then check out, or have a Payments-Full user confirm settle later.
403INV-… still owes UGX N. Only Payments "Full access" can check out with a balance
Why
Settle later was requested by a user below Payments Full.
Fix
An Accountant or Hotel Manager performs the check-out.
409No open folio for this booking. Check the guest in first
Why
A POS ticket was charged to a room whose booking has no open folio (not checked in, or already checked out).
Fix
Check the guest in, or settle the ticket with cash, mobile money or card.
409Folio is closed
Why
The folio was closed at check-out before the room charge posted.
Fix
Settle the ticket by another tender.
403Your role (<role>) has "View only" on Payments; this action needs "Can edit".
Why
Your level is too low for the button you pressed (the button is normally hidden).
Fix
Ask a user with the right Payments level; see User Roles.

Terms

Folio, deposit, net paid, balance, overdue.

Folio
The invoice attached to a booking that collects the stay, taxes, deposits, fees and POS charges. Opens at confirmation (deposit) or check-in; closes at check-out.
Deposit
A percentage of the stay requested at confirmation as a deposit line. At check-in it is offset by an equal “Deposit applied” credit so it is never charged twice.
Net paid
Payments minus refunds on an invoice.
Balance
Total minus net paid, never below zero.
Overdue
Derived: unpaid or part-paid and due before the hotel’s today. Never stored.
Settle later
A Payments-Full override that checks a guest out with a balance; audited; the folio stays collectable.

POS terminal

The touch till for restaurant and bar outlets: shifts, tables, tickets, modifiers, sending to the kitchen, voids, discounts, split bills and tenders including charge-to-room.

Purpose and who uses it

Restaurant MgrAccountantHotel Manager

Waiters and bar staff ring up orders; supervisors authorise sensitive discounts; managers open and close shifts.

The POS terminal is the screen a server stands at. Each hotel has one or more outlets (a restaurant, a bar) with their own menu, tables and service-charge rate. A sale is a ticket of lines; lines are sent to the kitchen, adjusted, voided with a reason, discounted, split, and finally settled by a tender, cash, mobile money, card, or a charge to an in-house guest's room folio.

The terminal sits under the Payments permission module. Anyone with Payments at Can edit can ring and settle; Payments at View only sees the ticket and totals but no buttons. Discounts flagged as needing authorisation ask for the email and password of a supervisor who holds Payments or Settings at Full.

Screen anatomy

Outlet and shift bar on top, category rail on the left, menu grid in the middle, the ticket on the right.

POS terminal
1726345
  1. 1
    Outlet switch and shift chip
    One button per outlet (fork icon for restaurants, glass for bars). When a shift is open a chip shows its code and “Shift open · <opener>”. New ticket sits at the right end.
  2. 7
    Category rail
    Popular (starred items) first, then each menu category with its item count. Typing in the search box overrides the rail.
  3. 2
    Menu grid
    One tile per item: name, “N options” when it has modifier groups, price, a star if popular. Unavailable items are dimmed and marked 86'd.
  4. 6
    Search
    “Search the <outlet> menu…” filters every category by name; the count of shown items sits beside it.
  5. 3
    Ticket head
    Pick table (or the assigned table number), the TKT-… code, a badge with “N to send” or the kitchen status, Covers stepper, and a Room · guest banner when the ticket belongs to an in-house room.
  6. 4
    Ticket lines
    Name, modifiers, kitchen note, quantity stepper, a “sent” tag once fired, the void bin icon, and the line total with unit price.
  7. 5
    Totals and actions
    Discount select, Split, then Subtotal · discount · Service N% · VAT · Total due, and the two big buttons Send (N) and Pay.

If the hotel has no outlet the page shows “No POS outlet configured for this hotel.” Outlets, tables and menus are seeded per hotel; the per-outlet service % and the discount and void-reason lists are edited in Settings → Ops config.

Shifts

Restaurant MgrAccountant

One open shift per outlet; the shift report totals tenders, discounts and voids at close.

A shift (code SHF-…) is opened per outlet with an opening float and closed with an optional cash count. Only one shift can be open per outlet at a time, the server locks the outlet while it checks, and a database constraint backs it up, so two managers opening at once get one shift, not two.

  1. 1
    Open
    POST /pos/shifts/open with the outlet and the opening float (whole shillings, ≥ 0). The terminal then shows the green shift chip with the code and who opened it.
  2. 2
    Trade
    Tickets are not blocked by the absence of a shift; the chip is informational. Everything closed between open and close belongs to the shift.
  3. 3
    Close
    POST /pos/shifts/:id/close with optional closing notes and a denomination count (note value × count). The stored report holds ticket count, gross sales, total discounts, void count and value, totals per tender method, and the counted cash.

Building a ticket

Restaurant Mgr

Tap items to add them, pick a table or room, set covers, adjust quantities; a ticket is created the first time you need one.

  1. 1
    Start
    Tap a menu tile, click Pick table, or click New ticket. If no open ticket is selected, the first tap creates one (TKT-…, 1 cover) on the current outlet. The terminal reopens the most recent open ticket for the outlet when you return.
  2. 2
    Table or walk-in
    Pick table opens the floor by zone; each tile shows the number, seats and status. Choose a table, or Walk-in / no table. The table turns “open”; moving the ticket elsewhere frees the old table.
  3. 3
    Room service
    A ticket created against an in-house room (roomId) is linked to that guest's booking and shows a Room N · guest banner. The link is also made at payment time if you choose Charge to Room.
  4. 4
    Add items
    Tapping a plain item adds one straight away (“Added <name>”). Items with options open the modifier sheet.
  5. 5
    Quantities
    Use the − / + stepper on a line (1–99). Taking an unsent line to zero deletes it; taking a sent line to zero opens the void dialog instead.
  6. 6
    Covers
    The Covers stepper (1–20) sets how many guests; it also decides how many ways Split evenly divides the bill.

The modifier sheet

Titled with the item name and “Choose options · UGX … base”. Each modifier group is a row of chips; a group marked · required must have a choice (single-choice required groups preselect the first option), · choose any allows several. Price deltas show as +2K / −1K on the chip. Below is theKitchen / bar note (“e.g. allergy, no peanuts”), a quantity stepper and the running unit × qty price. Add to ticket stays disabled until every required group has a choice.

Sending to the kitchen and voiding

Restaurant Mgr

Send fires every unsent line and starts the kitchen ticket; voiding a sent line needs a reason and is audited.

Send

  1. 1
    Check the badge
    The ticket head shows “N to send” in purple while unsent lines exist; once everything is fired it shows the kitchen status instead.
  2. 2
    Click Send (N)
    All unsent, non-voided lines are marked sent; the ticket's kitchen status moves from new to preparing if it was new. Toast: “N items sent to kitchen”. The kitchen sees it on the Restaurant order board immediately.
  3. 3
    Add more later
    New lines start unsent; Send fires just those. Send is disabled when nothing is waiting (“No unsent lines” if forced).

Void a line

Click the bin icon on a line (or step a sent line to zero). The Void item dialog shows “2 × Chicken curry · UGX 48,000” and the reason list from Settings (defaults: Guest changed mind · Wrong item rung · Item unavailable / 86'd · Quality complaint · Duplicate entry · Manager comp).Keep item cancels; Void item confirms.

Discounts and split bills

Restaurant Mgr

Whole-ticket percentage discounts, some needing a supervisor; split evenly by covers or move items to a new ticket.

Discounts

The select under the lines lists the hotel's discounts (defaults: No discount · Staff meal 30% (auth) · Happy hour 20% · Loyalty member 10% · Manager comp 100% (auth)). A discount applies to the whole ticket subtotal and shows as a red line with its label; the ticket copies the label and % so later edits to the list do not change old tickets.

  1. 1
    Pick a discount
    Ones without “(auth)” apply immediately.
  2. 2
    Supervisor authorisation
    Ones marked “(auth)” open “Discount authorization, Enter supervisor credentials to continue” with Supervisor email and Password. Authorize sends them with the request.
  3. 3
    Server check
    The supervisor must be an active user of this hotel with Payments or Settings at Full access. On success the toast says “Discount applied”.

Split bill

Split opens “Split bill · TKT-… · table · UGX … due” with two modes.Split evenly divides every line by the number of covers (minimum 2), creating one child ticket per extra guest with the same table, room and discount; the original keeps its share. Split by itemlets you tick lines and Move to new ticket; the panel shows what goes to the new ticket and what stays. Each child is a normal ticket that is sent and paid separately.

Taking payment

Restaurant MgrAccountant

Pay opens the tender drawer; settling closes the ticket, prints the receipt, depletes stock and, for room charge, posts to the folio.

Pay (enabled once the ticket has a live line) opens the Take payment drawer: “TKT-… · table · outlet”, four tender tiles, the Balance due card and a right-hand panel that changes with the tender.

Tender types (as offered by the terminal)
FieldTypeNotes
CashUGX drawerQuick-cash chips 10K · 20K · 50K · 100K · 200K and Exact, plus a numpad. Entering more than due shows Change and the button reads “Settle · change UGX …”.
Mobile MoneyMTN / AirtelProvider select (MTN Mobile Money · Airtel Money) and Reference / phone. Settle needs at least 3 characters of reference.
CardVisa · MastercardCard auth reference (“Auth code or last 4 digits”), at least 3 characters.
Charge to RoomPosts to folioCharge to room select listing every in-house room as “Room N · guest”. “Posts to the guest folio as an F&B charge. Amount settles at check-out.”
  1. 1
    Choose the tender and fill its field
    The Settle button stays disabled until the tender's rule is met.
  2. 2
    Settle UGX …
    The ticket is recalculated, a tender row is written for the full total (one tender per ticket, no mixed tenders), the ticket closes, its table goes to “bill”, and the audit log gets pos.ticket.closed with method and total.
  3. 3
    Receipt
    The receipt PDF opens in a new tab (/api/pos/tickets/<id>/pdf): outlet, table or room, covers, server, live lines with modifiers and notes, discount, service, VAT, total and the tender. Toast: “Ticket settled” or “Posted to guest folio”.
  4. 4
    Stock
    Every live line with a recipe depletes its stock items. Stock never goes below zero: the decrement is clamped to what is on hand, the movement records what was actually taken, and any shortfall raises the notification “Stock short: <item>” (“TKT-… needed 6 but only 4 was on hand · count and adjust”). The sale itself is never blocked.

Ticket, kitchen and table statuses

A ticket is open or closed; its kitchen status runs new → preparing → ready → served; tables carry their own status.

Ticket status
Ticket statusSettle (any tender)OpenClosed
  • OpenClosed (Settle (any tender))

Every edit, lines, covers, table, void, discount, split, send, needs the ticket to be Open; a closed ticket answers “Ticket is closed”. Closing a ticket with a kitchen status of new moves it topreparing so the kitchen still sees it. The kitchen flow itself (new → preparing → ready → served) is driven from the Restaurant & kitchen boards.

Table statuses
FieldTypeNotes
freeNo ticket. Grey border in the picker.
seatedGuests sat, no ticket opened yet (blue).
openA ticket is attached to the table (purple). Set when a ticket is created on or moved to the table.
billThe ticket has been settled (amber). Set when the ticket closes.
dirtyNeeds clearing before reuse (red).

The terminal itself only writes free, open and bill; seated and dirtyexist for the floor picker's colours and for seeded data.

Ticket and line fields

What a ticket and a line carry, and the limits the server enforces.

Ticket
FieldTypeNotes
Outlet *Chosen in the top bar; fixes the menu, tables and service %.
TableOptional; from Pick table. One outlet's tables only.
Room / bookingOptional; links the ticket to an in-house guest for room charge and the Room banner.
Covers1–20Default 1. Drives Split evenly.
Note≤ 300 charsTicket-level note (API).
DiscountOne of the configured discounts; label and % are copied onto the ticket.
Line
FieldTypeNotes
Menu item *Must be available (not 86'd). Name and price are copied at the time of adding.
Qty1–99Line total = (price + modifier deltas) × qty.
ModifiersLabel and price delta per chosen option; required groups enforced on the sheet.
Note≤ 200 charsKitchen / bar note printed on the receipt and shown on the kitchen card.
Void reason *≤ 200 charsRequired when voiding; chosen from the Settings list.

Permissions

The terminal is guarded by the Payments module: View to look, Can edit to ring and settle, Full to authorise discounts.

Payments and Settings levels per role (default)
RolePaymentsSettings
Super AdminFullFull
Hotel ManagerFullEdit
ReceptionistViewNone
AccountantFullNone
Housekeeping MgrNoneNone
MaintenanceNoneNone
Restaurant MgrEditNone
HR ManagerViewView
SecurityNoneNone
None No accessView View onlyEdit Can editFull Full access
  • See the terminal, menu, tables, tickets, shift and receipts: Payments · View only.
  • New ticket, add/adjust/remove lines, table, covers, Send, void, discount, split, Pay, open and close shifts, kitchen status: Payments · Can edit.
  • Authorise an “(auth)” discount: the supervisor whose credentials are entered needs Payments · Full or Settings · Full.
  • Edit discounts, void reasons and outlet service %: Settings · Can edit, in Settings → Ops config.

Tips

Popular tab, search, live refresh, receipts and the audit trail.

Errors you may see

Every message the POS API can return, verbatim.

409Ticket is closed
Why
You edited a ticket that has already been settled.
Fix
Start a New ticket; closed tickets are read-only.
409Ticket already closed
Why
Pay was pressed twice, or another till settled the same ticket.
Fix
Nothing to do; reprint the receipt if needed.
400Add items before closing
Why
Every line on the ticket is voided or the ticket is empty.
Fix
Add at least one live line, or abandon the ticket.
400Menu item unavailable
Why
The item is 86'd or was deleted.
Fix
Mark it available in Restaurant → Menu, or ring a different item.
409Line is voided
Why
Quantity change on a voided line.
Fix
Add the item again as a new line.
409Line already voided
Why
Void requested twice on the same line.
Fix
Nothing to do.
409Use void-line for sent items
Why
A sent line was removed with the stepper instead of the void dialog (the screen normally routes this for you).
Fix
Use the bin icon and give a reason.
400No unsent lines
Why
Send was called with nothing waiting.
Fix
Add lines first; the button is disabled in this state.
400Unknown discount
Why
The discount was deactivated in Settings while your terminal was open.
Fix
Reload; pick one of the current discounts.
403Supervisor credentials required for this discount
Why
An “(auth)” discount was sent without email and password.
Fix
Fill in the Discount authorization dialog.
403Supervisor credentials invalid
Why
No active user with that email in this hotel, or wrong password.
Fix
Re-enter; the supervisor must use their own sign-in email.
403Supervisor must have Payments or Settings at Full level
Why
The credentials were right but that user is not a supervisor.
Fix
Ask an Accountant, Hotel Manager or Super Admin.
400No active lines to split
Why
Split on an empty or fully voided ticket.
Fix
Add lines first.
400lineIds required for by_item split
Why
Split by item with nothing ticked (the button is disabled on screen).
Fix
Tick at least one line.
400No matching lines
Why
The ticked lines were voided or moved by another till in the meantime.
Fix
Reload and split again.
409Cannot move KDS from <from> to <to>
Why
Kitchen status can only advance one step: new → preparing → ready → served.
Fix
Advance step by step on the Restaurant board.
400Select the mobile money network
Why
Mobile Money tender without a provider.
Fix
Choose MTN or Airtel.
400Room or booking required for room charge
Why
Charge to Room without a room selected.
Fix
Pick a room in the Charge to room select.
409No checked-in guest in that room
Why
The chosen room has no checked-in booking (guest left, or not yet arrived).
Fix
Choose another room or a different tender.
400Booking required for room charge
Why
Neither room nor booking could be resolved (API).
Fix
Send a roomId or bookingId.
409No open folio for this booking. Check the guest in first
Why
The guest is checked in but has no open folio, or checked out already.
Fix
Check the guest in, or settle by cash, mobile money or card.
409Folio is closed
Why
The folio closed at check-out before the charge posted.
Fix
Settle by another tender; hand the receipt to Payments if it must be billed later.
409Shift SHF-… is already open for this outlet
Why
One open shift per outlet.
Fix
Close the open shift first (it shows in the terminal chip).
409Shift already open for this outlet
Why
Two opens raced; the database constraint refused the second.
Fix
Use the shift that won.
409Shift already closed
Why
Close called twice.
Fix
Read the report from /pos/shifts/:id/report.
400outletId required
Why
The current-shift query was called without an outlet (API).
Fix
Pass the outlet id.
403Your role (<role>) has "View only" on Payments; this action needs "Can edit".
Why
Your Payments level is too low for the button.
Fix
See User Roles; ask a Restaurant Manager or Accountant.

Terms

Outlet, ticket, cover, 86'd, tender, room charge, shift.

Outlet
A selling point (restaurant, bar) with its own menu, tables, service % and shifts.
Ticket
One bill (TKT-…): lines, discount, totals, one tender. Open until settled.
Cover
A guest at the table; sets how many ways Split evenly divides.
86'd
Kitchen slang for “sold out / off the menu”. An unavailable item cannot be rung.
Tender
How a ticket is settled. The terminal offers Cash, Mobile Money, Card and Charge to Room; the shared tender enum also lists cash, momo, card, room, voucher, staff for reporting.
Room charge
A tender that posts the ticket to the in-house guest's open folio; settled at check-out.
Shift
An opened/closed trading period per outlet (SHF-…) with a float and a close report.

Restaurant & kitchen

The back-of-house view of the POS: today's numbers, the order board and kitchen display that move tickets from new to served, and the menu with 86 toggles, prices and recipes.

Purpose and who uses it

Restaurant MgrHotel Manager

Kitchen staff work the order board and kitchen display; the restaurant manager keeps the menu honest.

Restaurant / POS is where orders are cooked and the menu is managed; the ringing and paying happens on the POS terminal. Tickets flow from the till onto the Order board here, the kitchen advances them through preparing and ready, and the waiter marks them served. The Menu tab lists every category and item for the selected outlet with an 86 toggle, and shows supervisor notes left over from the menu import.

Like the terminal, this screen is guarded by the Payments module: View only reads the boards, Can edit advances tickets and changes menu items.

Screen anatomy

KPI row, outlet switch, four tabs: Tickets (the default), Order board, Menu, Kitchen display.

Restaurant / POS, Order board
182345
  1. 1
    Head and KPIs
    “Restaurant / POS · Kitchen orders, room service and daily sales”, then Orders today · In kitchen · Ready to serve · Sales today (closed tickets created today).
  2. 8
    Toolbar
    Kitchen display (jumps to that tab) and Open POS terminal (goes to /pos).
  3. 2
    New Orders
    Purple column: open tickets with kitchen status new.
  4. 3
    Preparing
    Amber column: being cooked.
  5. 4
    Ready
    Blue column; the fourth column, Served, is green.
  6. 5
    Order card
    Room N / Table N / TKT code, the live items (“Chips ×2”), minutes since opened, total, a Room Service · Dine-in · Walk-in tag and the advance button (Start cooking · Mark ready · Mark served).
  • Outlet switch: the same buttons as the terminal; the board and menu show one outlet at a time.
  • Tickets (the default): every open ticket of the outlet plus the recent closed ones in one table (ticket, table or room, guest, covers, items, total, kitchen status, opened). Tap a heading to sort; the Kitchen heading filters by status; the last column advances an open ticket.
  • Order board: four kanban columns; cards can be dragged one column to the right or advanced with the button.
  • Menu: categories with item cards (name, category tag, Available / 86'd badge, price, Mark 86 / Available button) and, when any exist, a MENU_NOTES side card of unresolved supervisor flags.
  • Kitchen display: large cards for tickets that are new or preparing only, each with a full-width Start cooking / Mark ready button, meant for a screen at the pass.

Without an outlet the page shows “No POS outlet configured for this hotel.”

Working an order

Restaurant Mgr

New → preparing → ready → served, one step at a time, from the board, the kitchen display or the till.

  1. 1
    The ticket appears
    As soon as a waiter creates a ticket at the till it shows under New Orders with “No items yet” until lines are added. Room-service tickets are labelled Room N; table tickets Table N; walk-ins by code.
  2. 2
    The till sends
    Send on the terminal marks the lines sent and moves a new ticket to Preparing. Lines added afterwards show up on the card as they are sent.
  3. 3
    Start cooking (kitchen)
    If the ticket is still in New Orders, e.g. lines were rung but never sent, the kitchen presses Start cooking. This marks every line on the ticket sent and moves it to Preparing.
  4. 4
    Mark ready
    Food is plated: press Mark ready (board or kitchen display). The Ready to serve KPI counts these.
  5. 5
    Mark served
    The runner delivers and presses Mark served on the board. The card sits in Served until the ticket is settled at the till, which takes it off the open-ticket board.

The kitchen display

Restaurant Mgr

A stripped-down view of what is on the fire, sized for a wall screen.

Open it from the Kitchen display button in the head or the third tab. It shows only tickets whose kitchen status is new or preparing for the selected outlet, as large cards: the room/table label, every live line with quantity, kitchen notes from the till (allergies, “no peanuts”), minutes since the order opened, and a tall purple Start cooking or Mark ready button.

Once a ticket is marked ready it disappears from the display and waits in the Ready column of the order board for a runner. “No active kitchen tickets” means the pass is clear.

Menu management

Restaurant Mgr

Categories and items per outlet; 86 an item from the screen; price, description, popular flag and recipes through the menu API.

Categories and items

Each outlet has ordered categories (Mains, Breakfast, Snacks, Drinks… each with an icon) and ordereditems inside them. An item carries a name, description, whole-shilling price, an availableflag and a popular flag (the star on the till and the Popular rail). Modifier groups, required or optional, single or multi-choice, each option with a price delta, are attached to items and shown on the till's modifier sheet.

86 and un-86

  1. 1
    Open the Menu tab
    Pick the outlet; scroll to the item card.
  2. 2
    Mark 86
    Click Mark 86. The badge flips to 86'd, the toast says “Item marked 86'd”, and the till dims the tile and refuses to add it (“<name> is 86'd and not available”).
  3. 3
    Back on
    Click Available; toast “Item marked available”.

Recipes → stock

An item can hold a recipe: up to 20 lines of stock item + quantity per portion. When a ticket is settled at the till, every live line depletes its recipe quantities from Inventory (a consumemovement referencing the ticket). Stock is clamped at zero and a shortfall raises “Stock short: <item>” so the storekeeper counts and adjusts, the sale is never blocked. Items without a recipe simply do not touch stock.

MENU_NOTES

When a menu was imported, the importer may have left supervisor flags (section, item, issue). Unresolved ones show in the side card “MENU_NOTES · Supervisor flags from menu import” so the manager can fix the item; a note is closed with PATCH /menu/notes/:id/resolve.

Tables and room service

Tables belong to an outlet and are picked at the till; the board labels each ticket by room, table or code.

There is no separate floor map on this screen. Tables are defined per outlet (number, zone, seats) and are assigned to a ticket on the terminal with Pick table, which groups them by zone and colours them by status (free · seated · open · bill · dirty). The order board uses that assignment to label cardsTable N and tag them Dine-in; a ticket linked to an in-house room shows Room N andRoom Service; anything else is a Walk-in shown by its code.

Room-service tickets can be settled with Charge to Room at the till, which posts the food, service charge and VAT onto the guest's folio, see Payments & folios.

Kitchen statuses

Four kitchen states on every ticket; only forward moves, one step each.

Kitchen (KDS) status
Kitchen (KDS) statusSend / Start cookingMark readyMark servedNew OrdersPreparingReadyServed
  • New OrdersPreparing (Send / Start cooking)
  • PreparingReady (Mark ready)
  • ReadyServed (Mark served)
What each status means
FieldTypeNotes
New OrdersStart cookingTicket opened at the till; nothing fired yet, or fired but not acknowledged.
PreparingMark readyThe kitchen is cooking. Send from the till moves a new ticket here automatically.
ReadyMark servedPlated and waiting at the pass.
ServedfinalDelivered to the table or room. Final.

The KPI tiles derive from these: In kitchen counts preparing, Ready to serve counts ready,Orders today counts tickets created today (any status), Sales today sums today's closed tickets. The board shows open tickets only; a settled ticket leaves the board whatever its kitchen state.

Menu item fields

What an item carries, from the create/update API.

Menu item
FieldTypeNotes
Outlet *The outlet whose menu the item belongs to.
Category *Must belong to the same outlet, otherwise “Category does not belong to outlet”.
Name *1–120 charsCopied onto ticket lines when rung, so renaming does not rewrite old tickets.
Price *whole shillingsBase price; modifier deltas add or subtract per option.
Description≤ 500 charsShown at the top of the modifier sheet on the till.
AvailablebooleanDefault true. False = 86'd: dimmed on the till and refused.
PopularbooleanDefault false. Starred on the tile and listed under the Popular rail.
Recipe lines≤ 20 × (stock item, qty > 0)Replaced as a whole on each save; depleted from stock at settle.

Permissions

Payments · View reads the boards and menu; Payments · Can edit advances tickets and edits items.

Payments level per role (default)
RolePayments
Super AdminFull
Hotel ManagerFull
ReceptionistView
AccountantFull
Housekeeping MgrNone
MaintenanceNone
Restaurant MgrEdit
HR ManagerView
SecurityNone
None No accessView View onlyEdit Can editFull Full access
  • Open the screen, read boards, menu, notes, recipes: Payments · View only.
  • Start cooking / Mark ready / Mark served, drag cards: Payments · Can edit.
  • Mark 86 / Available, create or edit items, set recipes, resolve notes: Payments · Can edit.

Receptionists (Payments · View only) can watch the board, useful for room-service enquiries, but cannot move anything.

Tips

Timing, the till link, live updates and 86 discipline.

Errors you may see

Messages from the kitchen-status and menu endpoints, verbatim.

409Cannot move KDS from <from> to <to>
Why
Kitchen status only advances one step forward (new → preparing → ready → served).
Fix
Press the advance button on the card; do not skip or reverse columns.
400Category does not belong to outlet
Why
An item was created with a category from a different outlet.
Fix
Pick a category listed under the same outlet.
404Menu item not found
Why
The item was removed while your page was open.
Fix
Reload the Menu tab.
404Stock item not found
Why
A recipe line references a stock item that no longer exists.
Fix
Choose a current stock item in Inventory.
404Note not found
Why
The menu note was already resolved and removed, or belongs to another hotel.
Fix
Reload; nothing else to do.
403Your role (<role>) has "View only" on Payments; this action needs "Can edit".
Why
Your Payments level is too low for the button.
Fix
Ask a Restaurant Manager; see User Roles.

Terms

KDS, 86, pass, recipe, cover.

KDS
Kitchen display system, the kitchen status on a ticket and the screens that show it.
86'd
Off the menu / sold out. An unavailable item cannot be rung at the till.
Pass
Where plated food waits for a runner; the Ready column.
Recipe
Stock item quantities consumed per portion of a menu item; depleted when the ticket settles.
Room service
A ticket linked to an in-house room; can be charged to the guest folio.

Inventory

Stock on hand by department, reorder levels that flag low and empty items, suppliers with their catalogues, and purchase orders from creation to receipt.

Purpose and who uses it

Restaurant MgrAccountantHotel Manager

One list of everything the hotel keeps in store, with the suppliers who restock it.

Inventory tracks every consumable the hotel holds, kitchen ingredients, bar stock, linen, cleaning supplies, spare parts, stationery, grouped by department and category. Each item carries a quantity on hand, a unit and a reorder level. When the quantity falls to the reorder level the item turns amber; at zero it turns red, and the people who restock get a notification.

Inventory sits under the Payments permission module, so the Restaurant Manager, Accountant and managers work here; a Receptionist can look but not order. Kitchen sales reach stock automatically: when a POS ticket closes, the ingredients linked to each menu item are deducted.

Screen anatomy

Two tabs, Stock and Suppliers, with department cards, KPI tiles and a filterable table.

Inventory → Stock tab
1723458
  1. 1
    Tabs
    Stock (the item table) and Suppliers (the directory). Below the page head, above the department cards.
  2. 7
    Department cards
    All departments plus one card per department with its item count. A red or amber badge on a card is the number of items needing attention. Click a card to filter.
  3. 2
    KPI tiles and category chips
    Items tracked · Low stock · Out of stock · Perishable / tracked expiry · Pending POs. Clicking Low stock or Out of stock filters the table. Chips below switch category.
  4. 3
    Filter bar
    “Search item, category, supplier…” and a Stock level dropdown (Any stock level / In stock / Low stock / Out of stock). Clear resets all three.
  5. 4
    Item rows
    Item (with “Expires …” when an expiry date is set), Department, Category, Supplier, In stock, Reorder at, a Level bar, and the Status badge.
  6. 5
    Reorder
    Per-row button (Edit access) that opens the purchase-order dialog with just that item ticked.
  7. 8
    Purchase order
    Primary action. Opens the dialog with every low or empty item pre-ticked.

Two extra cards appear when they have something to say: an amber banner , “N items need attention across all departments”: with a Reorder all button, and a Pending purchase orders card listing orders that are still on order, each with a Receive stock button. Selecting the Kitchen department also shows how many perishable ingredients have tracked expiry dates.

Creating a purchase order

Restaurant MgrAccountant

Tick the items, pick a supplier and delivery store, and the order is on its way with a PO- code.

  1. 1
    Open the dialog
    Click Purchase order in the page head (all low/empty items ticked), Reorder all on the amber banner, Reorder on one row, or Order N on a supplier.
  2. 2
    Tick the items to reorder
    The “New purchase order, Restock items below their reorder level” dialog lists only items that are low or out of stock, each with its department tag and current quantity. Untick anything you do not want yet. If nothing is short you see “No items need reordering”.
  3. 3
    Choose Supplier and Deliver to
    Supplier defaults to Auto (from items), the first ticked item’s supplier is used. Deliver to offers Main Store, Kitchen Store or Bar Store. Expected date is optional.
  4. 4
    Click Create order (N)
    The order is created straight into On order with a PO-… code; the toast reads “PO-12 created (3 items)”. It appears in Pending purchase orders and on the supplier’s drawer.

Receiving stock

Restaurant MgrAccountant

One click books every outstanding quantity on the order into stock and records the movement.

  1. 1
    Find the order
    Stock tab → Pending purchase orders card, or Suppliers tab → open the supplier → Recent purchase orders.
  2. 2
    Click Receive stock (or Receive in the drawer)
    Every line that still has quantity outstanding is received in full. Each item’s quantity on hand goes up and a stock movement with reason receive and the PO code is written.
  3. 3
    The order becomes Received
    Toast: “PO-12 received into stock”. The KPI tiles, department badges and status badges refresh immediately.

Suppliers tab

A directory of suppliers with profiles, the items each one can deliver (with SKU, cost and lead time), stock health and recent orders.

The Suppliers tab opens with four tiles, Suppliers (active ones; the tile notes how many are inactive), Need an order (suppliers with at least one low or empty item), Open purchase orders and Items they cover: department chips, a Show inactive chip, the Add supplier button (Payments Edit), and a filter bar (“Search supplier, contact, category, item…” plus an Attention dropdown: Any status / Needs an order / Open purchase order / Inactive).

  • Table columns: Supplier (with the contact name or “2 open POs” underneath), Category badge, Contact (phone and email are tap-to-call / mail-to links), Departments, Items (the number of connections), Stock (“3 out”, “2 low”, In stock, or a dash when the supplier is not primary for anything), Last order (or Never), and an Order N button when something is short.
  • Inactive suppliers are hidden by default. Turn on Show inactive (or pick Inactive in the Attention dropdown) to list them; they carry an Inactive badge and no Order button.
  • Supplier drawer: click a row. The header shows the name with an Active / Inactive badge and the category; the sub-line lists its departments (or “No stock items linked”). Inside: Contact, Phone, Email, Website, Payment terms and Lead time cards, Address and Notes when set, Linked items / Preferred / Need reorder counters, Recent purchase orders (up to eight, newest first, each with a status badge and a Receive button while open) and the Connections table. The footer offers Close and Order N items.
  • Connections: one row per item the supplier can deliver, with the supplier's SKU, the last quoted unit cost, the lead time in days, the item's stock and status, and a Preferred badge where this supplier is the item's primary source. An item can be connected to several suppliers but has at most one preferred.
  1. 1
    Add supplier
    Click Add supplier above the filter bar. Name is required (2 to 80 characters); Category, Contact name, Phone, Email, Website, Address, Payment terms (type or pick a preset such as Net 30), Lead time in days (0 to 365) and Notes are optional. Save supplier creates it and opens its drawer.
  2. 2
    Edit the profile
    Open the supplier and click Edit. The same form updates any field; clearing a field removes the value.
  3. 3
    Manage items
    In the drawer, click Manage items. Every stock item is listed by department with a search box; tick an item to connect it and fill in Supplier SKU, Unit cost (whole currency units) and Lead time (days). Tick Preferred supplier to make this supplier the item’s primary source, which is what Order N and Auto (from items) use on purchase orders. Unticking an item removes the connection. The footer counts “14 items linked, 9 preferred”; Save connections replaces the supplier’s list.
  4. 4
    Deactivate or reactivate
    Deactivate (with a confirmation) hides the supplier from the directory and from the Supplier dropdown on new purchase orders. Its profile, connections and order history are kept, and Reactivate restores it.

Stock status, movements and expiry

Status is derived from quantity and reorder level every time the list loads, it is never stored.

Derived stock status
Derived stock statusqty ≤ reorder levelqty reaches 0receive POreceive POIn stockLow stockOut of stock
  • In stockLow stock (qty ≤ reorder level)
  • Low stockOut of stock (qty reaches 0)
  • Out of stockIn stock (receive PO)
  • Low stockIn stock (receive PO)
  • In stock: quantity above the reorder level. Low stock: at or below it. Out of stock: zero. The Level bar shows quantity against roughly one-and-a-half times the reorder level.
  • Movements are written for every change: receive (from a PO, referenced by its code), consume (a closed POS ticket) and adjust. The adjust movement is exposed by the API (PATCH /inventory/items/:id/adjust, Payments Edit) but there is no adjust button on this screen yet. There is no movement history screen either.
  • Low-stock notifications fire the moment a movement takes an item from above its reorder level to at or below it: “Tomatoes low stock, 4 kg remaining (reorder at 5)” or “Tomatoes out of stock, Reorder level reached. Create purchase order.” in the Operations category, linking to this page.
  • POS recipes: each menu item may list the stock items and quantities it uses. When a ticket closes, those quantities are deducted (never below zero). If there is not enough on hand the sale still goes through and a “Stock short: …” notification asks the kitchen to count and adjust. Recipes are set per menu item through the menu API; there is no recipe editor screen in this version.
  • Expiry: an item with an expiry date shows “Expires 2026-09-30” under its name, and the Perishable / tracked expiry tile counts items that carry a date. Nothing is auto-removed on expiry; the date is a reminder for the kitchen.

Purchase-order fields

What the New purchase order dialog asks for and what the server fills in.

New purchase order
FieldTypeNotes
Items to reorder *checkboxesOnly items currently Low stock or Out of stock. At least one, otherwise the toast “Select at least one item”.
SupplierselectAuto (from items) uses the first ticked item’s supplier; or pick any supplier. Mixed-supplier orders show “Mixed suppliers” in the pending list when no supplier is set.
Deliver toselectMain Store (default), Kitchen Store or Bar Store. Free text up to 120 characters on the API.
Expected datedateOptional. Shown as “due 12 Sep 2026” on the supplier drawer.
CodegeneratedPO-… from the hotel’s PO sequence (Settings → Numbering).
LinesgeneratedOne per ticked item; quantity = max(reorder level − on hand, reorder level). Quantity received starts at 0.
Supplier (Add supplier / Edit)
FieldTypeNotes
Name *text2 to 80 characters, unique per hotel. A duplicate is refused with “A supplier with that name already exists”.
CategoryselectFood & produce, Meat, fish & dairy, Beverages & bar, Housekeeping & amenities, Linen & textiles, Maintenance & parts, Office & stationery, Packaging & disposables, Services or Other. Shown as a badge in the table.
Contact name, Phone, Email, Website, AddresstextOptional. Email must be a valid address. Phone and email become tap-to-call / mail-to links; the website opens in a new tab.
Payment termstextOptional, up to 60 characters. Presets: Cash on delivery, Prepaid, Net 7, Net 14, Net 30, Net 60, Monthly account.
Lead time (days)numberOptional, 0 to 365. The supplier’s typical days from order to delivery; a connection can carry its own lead time per item.
NotestextOptional, up to 1000 characters. Delivery days, minimum order, who to ask for.
ActiveflagSet by Deactivate / Reactivate in the drawer. Inactive suppliers are hidden by default and not offered on new purchase orders.
Connection (Manage items)
FieldTypeNotes
Item *checkboxAny stock item; each item at most once per supplier.
Supplier SKUtextOptional, up to 60 characters. The supplier’s own code for the item.
Unit costnumberOptional whole currency units (no decimals). The date it last changed is stored with the connection.
Lead time (days)numberOptional, 0 to 365, per item.
Preferred suppliercheckboxMakes this supplier the item’s primary source (its Supplier on the Stock tab) and un-prefers the item’s other suppliers.
Stock item (read-only on this screen)
FieldTypeNotes
Name, unitUnique per hotel. Units are free text (kg, L, pcs…).
Department, categoryDepartment cards and category chips come from these. Categories are managed in Settings → Ops config.
SupplierOptional; the primary (preferred) supplier. Set from Manage items on the Suppliers tab.
Qty, reorder leveldecimalTwo decimals. Status is derived from these two numbers.
Expiry datedateOptional.

Permissions

Inventory follows the Payments module: View to look, Edit to order and receive.

Default Payments level per role (Inventory uses this module)
RolePayments
Super AdminFull
Hotel ManagerFull
ReceptionistView
AccountantFull
Housekeeping MgrNone
MaintenanceNone
Restaurant MgrEdit
HR ManagerView
SecurityNone
None No accessView View onlyEdit Can editFull Full access
  • View: summary, item list, suppliers and purchase orders.
  • Edit: Purchase order, Reorder, Reorder all, Order N, Receive stock / Receive, and stock adjustments via the API. Menu-item recipes also need Payments Edit.
  • Full: nothing extra on this screen.

Tips

Filters combine, department cards remember nothing, and the numbers are live.

Errors you may see

Every message the inventory API returns, and what to do about it.

400One or more stock items not found
Why
An item ticked in the dialog no longer exists (or belongs to another hotel).
Fix
Reload the page and create the order again.
400Cannot receive PO in status received
Why
The order was already received (the same text appears with cancelled).
Fix
Nothing to do, check the supplier drawer for the current status.
400Nothing left to receive on this PO
Why
Every line already has its full quantity received.
Fix
The order should already read Received; refresh the list.
400Adjustment would make quantity negative
Why
A stock adjustment (API) tried to remove more than is on hand.
Fix
Count the shelf and adjust by the real difference.
404Purchase order not found
Why
The order id is wrong or belongs to another hotel.
Fix
Open it from the pending list or the supplier drawer.
404Stock item not found
Why
The item was removed between loading the page and acting on it.
Fix
Reload.
400The same stock item is listed twice
Why
A Manage items save named one item twice.
Fix
Reload the page and try again; the checklist lists each item once.
400Unknown stock item
Why
An item in the connections list no longer exists (or belongs to another hotel).
Fix
Reload and save the connections again.
400Validation failed
Why
A supplier field broke a rule: name shorter than 2 characters, an invalid email, a lead time outside 0 to 365, or a unit cost that is not a whole number.
Fix
The form checks these before sending; correct the highlighted value.
404Supplier not found
Why
The supplier id is wrong or belongs to another hotel.
Fix
Reload the Suppliers tab and open it from the table.
409A supplier with that name already exists
Why
Supplier names are unique per hotel, including inactive ones.
Fix
Turn on Show inactive and reactivate the existing supplier, or choose a different name.
Reorder level
The quantity at which an item is flagged Low stock and included in Reorder all.
PO
Purchase order, a list of items and quantities requested from a supplier, coded PO-…
Stock movement
One dated change to an item’s quantity with a reason: receive, consume or adjust.
Recipe
The stock items and quantities a menu item consumes when its ticket closes.
Connection
A supplier-to-item link with the supplier’s SKU, last quoted unit cost and lead time.
Preferred supplier
The one connection per item that makes that supplier the item’s primary source on purchase orders.

Reports, exports & night audit

Live operational charts, Excel and PDF exports produced in the background, and the night audit that closes the hotel-local business day.

Purpose and who uses it

Hotel ManagerAccountantHR Manager

One page that reads the same tables as the Dashboard and turns them into charts, files and a daily close.

Reports & Analytics shows revenue, occupancy, attendance, loyalty and stock as live queries, nothing is pre-computed, so what you see is what the database holds right now. From here you can queue an Excel or PDF export, print the page, and close the business date (the night audit).

You only see sections your role can read elsewhere: revenue, payments and inventory need Payments view; occupancy, booking sources and room-type performance need Bookings view; housekeeping and maintenance need Rooms; attendance needs Staff; loyalty needs Guests. Exports follow the same rule, so a workbook never contains a sheet you could not see on screen.

Screen anatomy

Toolbar actions, the period bar, the KPI strip, the charts, the area cards and the Exports tray.

Reports & Analytics
1823674
  1. 1
    Page head
    “Every module, one period; compare with the period before; export or print”.
  2. 8
    Toolbar
    Export PDF and Export Excel (Reports Full), Close 2026-09-04 (Reports Edit, only while the day is open) and Print.
  3. 2
    Period bar
    Today, Last 7 / 30 / 90 days, Month, Quarter or Year to date, or two dates of your own; tick Compare with previous period to see the period of equal length before it. The choice is in the address bar, so a report can be bookmarked or shared.
  4. 3
    KPI strip
    Occupancy, ADR, RevPAR, average stay, room revenue, net receipts, POS sales, outstanding now, arrivals, departures, cancellations, no-shows, rooms cleaned, clean turnaround, open work orders, attendance and new guests, each with its change against the previous period when comparing. Tiles your role cannot see are simply absent.
  5. 6
    Charts
    Net receipts and Occupancy per day (dashed line = previous period), Check-ins and check-outs, Room type performance, Staff attendance, Guest loyalty, Inventory position, Booking sources.
  6. 7
    Exports tray
    “Generated files are kept for 30 days”. Filter by filename or requester, Status and Kind; Download when Ready.
  7. 4
    Reports by area
    Front office, Revenue & payments, Restaurant & POS, Rooms, Housekeeping, Maintenance, Inventory, Staff, Guests: each card carries its headline figure for the period and opens the matching section.

Reading the report cards

What each card measures and where the number comes from.

  • Net receipts: payments received minus refunds per hotel-local day, for the whole period; the dashed line is the same series for the previous period when Compare is on.
  • KPI definitions: Occupancy = room nights sold ÷ room nights available (rooms × days). ADR = room revenue ÷ nights sold. RevPAR = room revenue ÷ nights available. Average stay = nights ÷ stays that arrived in the period. Room revenue = the agreed nightly rate × nights that fall in the period for confirmed, in-house and departed stays. Outstanding is the balance of every open folio right now, not a period figure.
  • Occupancy: rooms occupied per night as a share of all rooms, with the previous period dashed when comparing.
  • Check-ins and check-outs: arrivals and departures per day over the last two weeks. Room type performance: occupied nights per type as a share of that type's capacity over the last 30 days.
  • Staff attendance: daily attendance % with Present / Late / Absent totals in the header. The card only appears once attendance has been recorded.
  • Guest loyalty: guests on file, loyalty members, the returning-guest rate, a bar per tier (Platinum, Gold, Silver, Bronze) and how many guests are in-house right now. Spend figures are collected payments.
  • Inventory position: Healthy / Low stock / Out of stock counts and how many items carry expiry dates. Full detail is on the Inventory page.
  • Booking sources: a count per source (Direct, Walk-in, Booking.com, Expedia, Travel Agent, Corporate) for bookings created in the last 90 days.
  • Operations tiles: rooms cleaned and the average clean turnaround (task created to Ready), open work orders, attendance % (present plus late over everything recorded) and guests created in the period.

The page refreshes itself whenever a booking, invoice, housekeeping task, work order, room or staff record changes anywhere in the hotel, you do not need to reload.

Exporting to Excel or PDF

Hotel ManagerSuper Admin

Exports run as background jobs; the file lands in the tray and a notification tells you when.

  1. 1
    Click Export Excel or Export PDF
    Needs Reports Full. The toast reads “Export queued. It appears below when ready”. The request carries the current period (30 days).
  2. 2
    Watch the Exports tray
    The row starts as Queued, moves to Running while the worker builds the file, then Ready (or Failed with the reason next to the badge). The tray refreshes on the export.done live event, so there is nothing to poll.
  3. 3
    Download
    Click Download on a Ready row. Anyone with Reports View can download; the file is named reports-2026-09-04.xlsx or .pdf. A “Export ready, reports-2026-09-04.xlsx. Download it from Reports” notification also arrives in the System category.
Export job lifecycle
Export job lifecycleerror / > 5 MBQueuedRunningReadyFailed
  • QueuedRunning
  • RunningReady
  • RunningFailed (error / > 5 MB)
  • Excel workbook sheets: Overview, Revenue, Occupancy, Check-in out, Room types, Booking sources, Staff attendance, Guest tiers, Inventory, each only if you may see that section. The hotel name, address and generation time sit in the title block.
  • PDF: the same sections laid out as a printable report.
  • Guest list: the Export button on the Guests page queues a guests-xlsx export (code, name, phone, email, country, tier, stays, lifetime spend). It needs Reports Full and Guests view, and it downloads from this tray too.
  • Retention: files are stored for 30 days; older ones are pruned whenever a new export is queued. The tray lists the 20 most recent. Files above 5 MB fail rather than store.

Night audit, closing the business date

Hotel ManagerAccountantHR Manager

Freeze one hotel-local day: occupancy, cash, POS and open balances, and re-sync every room’s state.

  1. 1
    Check the business-date strip
    It shows today’s hotel-local date (from the timezone in Settings → Branding & locale) and whether it is still open.
  2. 2
    Click Close 2026-09-04 in the toolbar
    Needs Reports Edit. The button is hidden once the day is closed.
  3. 3
    Confirm “Close 2026-09-04?”
    Dialog text: “This freezes a snapshot of occupancy, cash and open invoices for the hotel-local business date. You cannot close the same day twice.” Click Close business date.
  4. 4
    Done
    Toast “2026-09-04 closed”; the strip changes to “Closed 23:58” and an audit-log row night_audit.closed carries the snapshot.
What the snapshot records
FieldTypeNotes
RoomsTotal rooms, occupied (in-house bookings), dirty (cleaning or a pending/in-progress housekeeping state), out of order.
BookingsIn-house, arriving today (new or confirmed with today’s check-in), departing today (in-house with today’s check-out), no-shows dated today, cancellations made today.
CashPayments received, refunds and closed POS ticket totals, by the instants the hotel-local day starts and ends, so a payment taken at 01:00 belongs to that day, not to yesterday UTC.
InvoicesCount and total of invoices still owing. Balance is derived from payments (the stored status column is only a cache).

Permissions

View to read and download, Edit to close the day, Full to create exports.

Default Reports level per role
RoleReports
Super AdminFull
Hotel ManagerFull
ReceptionistNone
AccountantEdit
Housekeeping MgrView
MaintenanceNone
Restaurant MgrView
HR ManagerEdit
SecurityNone
None No accessView View onlyEdit Can editFull Full access
  • View: open the page, read every section your other module levels allow, list and download exports, see the night-audit status.
  • Edit: Close business date. By default this includes the Accountant and HR Manager.
  • Full: Export Excel, Export PDF and the Guests page Export button. The Export action is a Full-level action everywhere in the app, so by default only Super Admin and Hotel Manager produce files; Accountants download them.

Tips

Jump links, the exports filter and closing at the right time.

Errors you may see

Messages from the reports, exports and night-audit endpoints.

4092026-09-04 is already closed
Why
Someone closed today’s business date before you (the date in the message is the hotel-local day).
Fix
Nothing to do, the strip shows the close time. Tomorrow’s close becomes available after midnight hotel time.
403Guest exports need Guests view access
Why
You have Reports Full but no Guests access, so the guest list would be empty for you.
Fix
Ask an administrator for Guests view, or have someone with it export the list.
400Export is queued
Why
You opened a download link before the file was built (the text also reads “running” or “failed”).
Fix
Wait for the Ready badge; if Failed, read the reason beside the badge and queue again.
404Export not found
Why
The file was pruned after 30 days or belongs to another hotel.
Fix
Queue a fresh export.
Business date
The hotel-local calendar day (per the timezone in Settings), which is what the night audit closes.
Night audit
The daily close: a frozen snapshot of rooms, bookings, cash and open balances, plus a room-state re-sync.
Export tray
The Exports card listing the last 20 generated files with their status.

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: everybody sees them, with a few personal ones (your test notification, for example). 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
18245
  1. 1
    Page head
    “Notifications” with “3 unread” or “All caught up”.
  2. 8
    Actions
    Preferences (opens Settings → Notifications) and Mark all read (only while something is unread).
  3. 2
    Category chips
    All · Bookings · Payments · Operations · System. A chip filters the list; muted categories never appear.
  4. 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.
  5. 5
    Click a row
    Marks it read and jumps to the module the alert is about.

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 hotelToast (tab focused) (live socket)
  • Event in the hotelOS banner (tab hidden) (live socket + Device alerts)
  • Event in the hotelWeb 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.

Audit log

A read-only trail of every staff action, sign-in and refused request across the hotel, who did what, when, from where, and what changed.

Purpose and who can read it

Super AdminHotel ManagerSecurity

Managers and Security see the trail; nobody edits it.

The audit log answers “who changed this and when?”. Every write to the system leaves a row: bookings, payments, guest edits, room status, staff records, settings, role changes, sign-ins, successful, failed and denied. Rows are written by the server as part of the action itself, so they cannot be skipped by the browser.

Reading it is limited to the admin tier: Super Admin, Hotel Manager, or any role whose matrix has been raised to Settings = Full, plus Security, whose job is access logs. Anyone else gets a 403 and does not see the sidebar entry. Nothing on the page writes; the only action is Export CSV.

Screen anatomy

Four KPI tiles, a filter bar with date range and extra filters, the event table and a detail drawer.

Audit log
1872346
  1. 1
    Page head
    “Every staff action across the hotel, with who / what / when / from where.”
  2. 8
    Export CSV
    Downloads audit-log-2026-09-04.csv with the current filters applied (up to 5,000 rows, newest first).
  3. 7
    KPI tiles
    Events today (with the hotel date), Last 7 days, People active today, Denied this week. Today and Last 7 days set the date range; Denied this week sets Outcome = Denied for the week.
  4. 2
    Filter bar
    “Search actor, action, code, IP…” plus Person (name · role), Role, Module and Action dropdowns.
  5. 3
    Date range and More filters
    From and To date pickers (hotel-local days). More filters reveals HTTP method (POST / PATCH / PUT / DELETE) and Outcome (Succeeded / Denied / Error).
  6. 4
    Event rows
    When · Person (avatar, name, role) · Action (with a Denied or Error badge when it failed) · Record (module badge and record id) · Detail (a three-field summary of the diff) · From (IP). On phones the rows become cards.
  7. 6
    Pager and headers
    Fifty rows a page (25, 50 or 100), numbered pages, and the page, sort and filters live in the address bar. Tap a heading to sort; the Person, Action, Record and Outcome headings carry filter popovers. A Cards view is one click away.

Click a row for the drawer: the person with role and email, then Action (raw name such as booking.checkedin), Module, Record, Outcome with the HTTP status, When, IP address, Request (method and path), Browser (user agent) and a What changed panel that lists every field as before → after (red to green), the person card with browser and IP, a link to the record and the other events on that record, or “No extra detail was stored for this event.”

What is recorded

Named domain events with diffs, plus a generic row for every other write, sign-ins and denials.

One audit row
FieldTypeNotes
ActorThe user id plus a snapshot of the name and role at the time. If the account is later renamed or deleted the row still reads correctly; rows without a snapshot fall back to the current account, or “Unknown”.
ActionA dotted name: booking.checkedin, payment.refunded, settings.updated, auth.login.failed, access.denied, night_audit.closed… Screen labels translate the common ones (“Checked in”, “Refunded payment”, “Access denied”).
Module and RecordThe entity type (booking, invoice, user, hotel, sequence…) and the record’s code or id, BK-1042, INV-…, an email for user events, a slug for settings.
What changedBefore → after per field for edits (bookings, rooms, guests, staff, accounts, settings, roles, housekeeping, maintenance, payments). Creates and older rows show the record that was sent; a night audit stores its snapshot. Secrets are masked: a logo change stores “(image updated)”, a PIN change “(updated)”, hashes read “(changed)”.
Request metadataIP (first address in X-Forwarded-For), browser user agent (240 chars), HTTP method and path (200 chars), and the status code.
OutcomeDerived from the status code: below 400 → OK; 401 or 403 → Denied; any other 4xx/5xx → Error.
WhenServer time, displayed in the hotel’s timezone to the second.
  • Named events are written inside the same transaction as the change, so a booking cannot be checked in without its row.
  • Generic rows: any other POST, PATCH, PUT or DELETE that did not write a named event gets http.post-style rows: Module is the first path segment, Record is any code or id in the path, and the diff holds the path and status. GET requests, health checks, sign-in endpoints, notifications, the audit log itself, demo sandboxes and search are deliberately not logged as actions.
  • Sign-ins and denials: successful and failed email or PIN sign-ins, sign-outs and every request refused by the permission guard are recorded with the same IP and browser details.

Outcomes

Every row is OK, Denied or Error, derived from the HTTP status, not stored.

Outcome by status code
Outcome by status code< 400401 / 403other 4xx / 5xxRequest handledOKDeniedError
  • Request handledOK (< 400)
  • Request handledDenied (401 / 403)
  • Request handledError (other 4xx / 5xx)

Denied is the security view: a role trying a screen or action it does not have, or a wrong password. Error is a business refusal, a check-in on the wrong day, an overbooked room, a validation failure, which is useful when a colleague says “it would not let me”.

Tracing a change

Search the record code, narrow by person or action, open the drawer, read the diff.

  1. 1
    Type the record code in the search box
    BK-1042, INV-2210, a guest code, an email, an IP address or part of an action name. The search matches action, record id, module, actor name, request path and IP.
  2. 2
    Narrow with the dropdowns
    Person lists every account with its role; Role matches the role snapshot on the row (or the account’s current role); Module and Action list the values that exist in the log.
  3. 3
    Set the dates
    From / To are hotel-local calendar days: From starts at 00:00 hotel time, To includes the whole day. Events today and Last 7 days fill them for you.
  4. 4
    Open the row
    The drawer shows who (name, role, browser, IP), the outcome, the request line, a link straight to the record, What changed as before → after pairs, and the other events on the same record so you can walk its history. Raw record opens the stored document for anything older.
  5. 5
    Export if you need a record
    Export CSV honours every filter and writes at, actor, role, action, entity_type, entity_id, outcome, method, path, ip and diff (as JSON text).

Permissions and retention

Admin tier plus Security may read; nobody may edit or delete; rows are kept indefinitely.

Audit access is not a level, it is admin tier (Settings = Full, or Super Admin / Hotel Manager by name) or the Security role
RoleSettings
Super AdminFull
Hotel ManagerEdit
SecurityNone
HR ManagerView
None No accessView View onlyEdit Can editFull Full access
  • A Hotel Manager reads the log even at Settings = Edit, because the role is admin tier by name. A custom role becomes admin tier the moment its matrix is set to Settings = Full.
  • Security always reads it, whatever the rest of its matrix says.
  • There is no write API: rows are appended by the server and never edited. Nothing in the system prunes them, so the trail is complete for the life of the hotel; use Export CSV for off-site copies.
  • Demo sandboxes get their own log, discarded with the sandbox.

Tips

Wildcards, denied spikes and the hotel clock.

Errors you may see

One server refusal and one client-side export failure.

403The audit log is limited to Super Admin, Hotel Manager and Security
Why
Your role is neither admin tier (Settings = Full) nor Security.
Fix
Ask an administrator to grant Settings = Full on your role, or to pull the rows you need.
Could not export the audit log
Why
The CSV download failed, usually the session expired or the connection dropped.
Fix
Reload, sign in again if prompted, and click Export CSV once more.
Admin tier
Super Admin, Hotel Manager, or any role with Settings = Full, the roles that can manage users, roles and the PIN.
Actor snapshot
The name and role copied onto the row when it was written, so history survives renames and deletions.
Diff
The JSON stored with an event describing what was sent or what changed.

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. 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”: 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 …
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.
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–8 digitsSettings Full only. Shows “(set)” or “(not set)”; leave blank to keep the current PIN. 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–8 digits”. The PIN is hashed and never displayed.

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.

Branding & locale tab

Hotel ManagerSuper Admin

Upload the sidebar logo, 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.

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”: 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
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, use Forgot password on the sign-in page or ask an administrator to reset it.
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–8 digits
Why
The PIN contained other characters or the wrong length.
Fix
Digits only, four to eight of them.
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

The four front-desk screens reopen from cache with the last data they saw; everything else needs a connection.

The app installs a small service worker that caches its own files and the four front-desk pages , Dashboard, Bookings, Rooms and Housekeeping. If you reload one of them with no network, the page shell still opens and fills itself from a local snapshot saved on the last successful load: the booking board window (±7 days plus everyone in-house), the room list, the housekeeping tasks and the dashboard tiles. The snapshot is refreshed every time the page loads or a live update arrives, so it is usually seconds old.

  • 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.

Pages outside that set (Guests, Payments, POS, Reports, Settings…) are not cached. Their lists show “Could not load this page” until the connection returns. The API and the live-update socket are never cached, so nothing you see offline is ever older than the snapshot time.

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
  • QueuedDone (2xx)
  • QueuedConverged (dropped) (409, already in target state)
  • QueuedNeeds attention (409 clash / 400 / 403 / 404)
  • QueuedStill queued (network failed)
  • QueuedPaused, 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

Six keys cover search, help, 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.
  • 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 (tap a heading, or open its filter icon for the values) (sort=, dir=): click a heading to sort, click again to reverse.
  • If rows disappear while you are on page 9 of 8, the list snaps back to the last real page by itself.

Views

  • Modules with more than one view (list, board, grid, calendar, floor…) remember your last choice per module on this device.
  • 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, tier, 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; the demo chip switches roles.

  • 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. Use Forgot password, or ask an administrator to check the account is active in Staff → Accounts.
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.
401Reset link is invalid or expired
Why
The reset link was already used, was edited, or has timed out.
Fix
Request a new reset link from the sign-in page.
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 Forgot password.
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 to e.g. 2026-09.
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.
409UGX 240,000 outstanding. Collect it before check-out, or a Payments manager can check out and bill later
Why
The folio still has a balance. 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”.
403UGX 240,000 outstanding. 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 has booking history. Mark it "Out of Service" instead of deleting
Why
Rooms with bookings are kept for reporting.
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.
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.
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 unavailable (86'd) or was deleted.
Fix
Pick another item, or a Restaurant manager can mark it available 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.
400Name needs at least 2 characters
Why
The supplier form was saved with an empty or one-letter name.
Fix
Type the supplier's trading name.
400Enter a valid email
Why
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 pending
Why
The download link was opened before the file finished (status pending, running or failed).
Fix
Wait for the live “done” update, 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.
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 <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.
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 four-digit front-desk PIN (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. Their identity is recorded with the ticket.
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 on the profile (inline-editable in the list). 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 unavailable / 86'd”.
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.