6 tabs — what's different
| Tab | What it is | Different from |
|---|---|---|
| Rooms | Today's room board — which rooms are free/occupied | Different from "Room types," which is the price catalog, not today's board |
| Room types | Set the price and details for each room type | Not today's room board — the board is in "Rooms" |
| Bookings | Room bookings customers made themselves (from the app/web) | Different from "Monthly," which is monthly tenants, separate from daily/nightly guests |
| Monthly | Monthly tenants — add tenants, issue rent + utility bills | Separate from daily/nightly guests in the "Bookings" tab |
| Leases | Monthly/yearly lease contracts for tenants, with tenant info/deposit/documents | Tied to tenants in the "Monthly" tab, but a more detailed contract system |
| Stay settings | Property rules — check-in/check-out times, cancellation policy, amenities | Price and occupancy are set in "Room types," not here |
Rooms — today's board
- 1Click "Set room count" the first time (requires the "manage shop page" permission, page.manage) — reducing the room count later doesn't delete existing stays; a room removed from the board can't be checked out until it's set back
- 2A free room shows green — click to open the check-in form: choose a room type (price/night auto-fills from today's seasonal price), enter the guest's name/phone, number of nights, and price/night
- 3An occupied room shows red with the guest's name — click to open check-out: enter a discount (if any), choose a payment method (cash/PromptPay/transfer), then click "Check out & collect payment"
The amount shown before you click check-out is before deducting the customer's credit — customer credit/points are only actually applied when the bill closes on the server. See the real amount on the receipt after check-out succeeds.
The board auto-refreshes every 15 seconds (the web has no push notifications) so two people working the same shop see the same room status.
Room types — price and seasonal pricing
Add/edit room types (requires page.manage): name (e.g. Standard/Deluxe), photos, price/night, room count, amenities, and open/close for booking. If "Monthly" mode is on in stay settings, extra fields appear for price/month and deposit.
Seasonal pricing & promotions
Set a date range + price adjustment (positive = high season, negative = low season/promotion); the rule automatically applies to price/night based on check-in date, both on the front-desk check-in page and the price customers see when booking.
The end date must always be after the start date — a rule where the end date comes before the start date would never be usable. The system warns before you save, and a rule missing either date is never saved at all (so it never looks active while actually doing nothing).
Bookings — the inbound box from customers
When a customer books through the "Stay" menu in the app/web, the booking lands here with a status:
| Status | Meaning | Available action |
|---|---|---|
| Awaiting confirmation | The customer just booked | Confirm / decline (must select a reason; the customer will see it was cancelled) |
| Confirmed | The shop confirmed it, awaiting the stay date | Check in |
| Checked in | Already checked in | Check out & collect payment |
| Checked out / cancelled | Closed | — no button |
Monthly — tenants and bills
- 1Set "Mode & utilities" first (page.manage): choose the service mode (daily/monthly/both), the water/electricity rate per unit, and any other flat monthly fees (e.g. common area fee, internet)
- 2Click "+ Add tenant" — choose a room type to auto-fill rent/deposit, and enter name, phone, room number
- 3Click a tenant's name to "Issue this month's bill" — enter the water/electricity units used, and the system calculates: rent + water + electricity + other fees = total
- 4Tap the bill to check "Paid" once you've received the money (tap again to undo if checked by mistake)
The "Move out (end lease)" button removes the tenant from the current list, but all past bills stay intact, and the room can accept a new tenant immediately.
Leases
A detailed lease-contract system, tied to tenants in "Monthly" but keeping deeper records: emergency contact, attached documents (contract/ID), and a separate itemized deposit ledger.
3 ways to create a lease
- + New lease — fill in everything yourself
- From a booking — choose an existing daily booking; the system copies the guest's name/phone/room/customer account over immediately (a booking that already has a lease won't appear twice in the list)
- From an existing tenant — pull in a tenant who existed before this lease system, and attach a lease retroactively
Lease status
Draft → active → ended or cancelled — the "Open" filter tab above shows only draft + active.
Security deposit
4 types of entries can be recorded: received · deducted · refunded · forfeited. Any entry can be voided later if the staff member has permission — a voided entry shows as "voided," it isn't deleted outright. The running balance (received − paid out) is calculated automatically.
Tenant ID documents
The field for entering a full national ID/passport number is deliberately not enabled yet — the system can only store the last 4 digits (stored as plain text, not encrypted), because the full number needs to go through a hashing step that this form has no connection to yet. Do not type a full ID number into another notes field to work around this limit.
Attached documents (contract/ID copy) are stored in private file storage, viewable only by people with access to that lease.
The counterparty's name requires the "view accounting documents" permission (accounting.view) to be visible — without this permission, you'll still see the lease list (room/date/amount/status), but the name field will be blank with an explanation, not a fully broken screen.
Stay settings
Basic property settings (requires page.manage): property type, on-site amenities, check-in/check-out times, cancellation policy, and rules like pets/smoking.
Every yes/no rule always has 3 possible answers: allowed · not allowed · not specified — "not specified" does not mean "not allowed"; it means the shop hasn't answered this question yet. The customer will see that there's no information yet, not that it's forbidden.
What can break
| Symptom | Cause / fix |
|---|---|
| Can't check in — "This room was just occupied" | Someone else checked into the same room a few seconds earlier — close this page and check the board again |
| After checkout: "This bill is already closed (no second receipt issued)" | The system automatically prevents duplicate bills — the bill really has been closed, no need to click again |
| Checkout failed partway through | The room may already be released but the bill not yet closed — the message will say you can immediately click the same button again; the system prevents duplicate billing on its own |
| Room price doesn't auto-fill at check-in | Reading the room–room type match failed, or the room was never linked to a type — you can still type the price in manually as normal |
| Can't save seasonal pricing — "Couldn't read the existing price rule" | The system refused to overwrite the save to prevent the old rule from being lost — try again, or edit from the mobile app instead |
| Issued a monthly bill but water/electricity shows 0 | Reading the water/electricity rate failed while issuing the bill — check your connection and re-issue the bill |
| Can't see the counterparty's name on a lease | You don't have the accounting.view permission — ask the shop owner to grant it |