Reservation Module Concepts
The Reservation module is for businesses that sell time on a place: futsal or badminton courts, studios, meeting rooms, and rooms or villas rented per night, month, or year. Customers book by themselves on the /booking page and pay a deposit online, while admins follow everything in the Reservation Calendar (daily table and Unit chart) and record check-in and check-out. Read this page before opening any form.
What This Module Does
- A customer opens the /booking page, logs in with a customer account, picks a type (rental product group), date, and duration (or number of nights, months, or years), then chooses an available schedule. The customer books the type, not a specific court: the system places the reservation on the first free unit in name order.
- The server calculates the price and holds the schedule for 15 minutes until the deposit is paid through an online payment gateway. A type without a deposit (0%) is Confirmed immediately.
- Admins see the schedule per date in the Reservation Calendar and per unit in the Unit chart, create reservations for walk-in or phone customers, move or cancel them, check customers in and out, and read the report.
- Two people can never get the same unit and time: the second person is rejected with a message that the schedule was just booked.
Reservation Units: Per Slot, Per Night, Per Month, Per Year
How a place is booked is set by the Time Unit on its rental product.
| Time Unit of the rental product | How it is booked | Price and schedule |
|---|---|---|
| Minute or Hour (per slot) | Date, start time, and duration (a multiple of the group slot length, at most 24 slots). Only inside Opening Hours. | Price of one slot = unit price x slot length / time-unit length. The schedule must not have started. |
| Day (per night) | Check-in date and number of nights, 1 to 365. The daily check-in and check-out hours come from Start Deadline and Completion Deadline on the rental product (Completion Deadline 0 = same as check-in hour). Opening Hours are not used. | One night = one unit price. Today is still bookable even if the check-in hour has passed. Check-out at 12:00 and check-in at 14:00 mean guests leaving and arriving on the same day do not conflict. |
| Month | Start date and number of months, 1 to 36, from date to date at 00:00. A date that does not exist in the target month is clamped to month end (31 January + 1 month = 28 or 29 February). | One month = one unit price. Opening Hours are not used. |
| Year | Start date and number of years, 1 to 10. | One year = one unit price. Opening Hours are not used. |
What Is Not in This Version
So you do not promise customers something the app cannot do yet, note these limits.
- The POS invoice created by check-in is not settled automatically: the cashier finishes it and uses the deposit as payment. There are no extra charges other than the early check-in and late check-out fees.
- Marking a refund as returned exists only in the Unit chart bar menu, for reservations still shown in the chart. Refunds from cancellation or late payment have no button yet; record the return in finance, the amount stays visible in the Refund Due column.
- The cashier does not automatically refuse a table a customer has already booked for that hour. The other direction does apply: a table currently running at the cashier cannot be booked through the portal for the running hours. The Unit chart shows a cashier icon on units that have an open cashier invoice.
- There is no automatic recurring booking (for example every Tuesday 19:00 for 3 months) and no WhatsApp notification; notices go by email only.
- The No-show status exists in the report filter, but nothing sets it yet.
- Customers cannot cancel by themselves. Only admins cancel. Customers may move their schedule.
Terms Used
| Term | Meaning |
|---|---|
| Rental Product Group (reservation type) | What you sell, for example Mini Soccer Court. This is the same Table Group the POS uses (menu Rental Product Group List); the Open for Reservations toggle makes it bookable, and the /booking page calls it "Reservation type". The group sets slot length, division, deposit percentage, unit name, and the early check-in and late check-out fee products. |
| Rental Product (unit) | The physical place being booked, for example Court A and Court B, or Room 101. It is a row of the Rental Product List (a POS table) marked Leased, with a product and a time unit (Minute, Hour, Day, Month, or Year) that set its price and how it is booked. Because it is the same POS table, the cashier uses the same place customers book. |
| Unit Name | The word customers and admins read for the units of a group: Court, Room, Table, Studio, or any other word. Set on the Rental Product Group. Blank means the language default (Table in English, Meja in Indonesian). It is per group, so one business can use Court and Meeting Room at the same time. |
| Slot | One piece of time on one unit, as long as the group says. A 2-hour reservation on a 60-minute group holds two consecutive slots. For rentals per night, month, or year, one cell is one night, one month, or one year. |
| Opening Hours | The hours that can be booked, set per group per day of the week, only for groups in Minute or Hour units. A day without opening hours is closed. |
| Blocked Time | Closes a rental product for a time range, for example for turf maintenance or room renovation. It applies to every unit. |
| Deposit | The part of the total paid when booking. Recorded in Customer Advances and usable as payment at the cashier. The rest is paid at the cashier when the customer arrives, on the same POS table. |
| Check-in, Check-out | Marks the customer starting and finishing use of the unit, from the Reservation Calendar or the Customer Reservations form. Check-in opens a POS invoice on that table; check-out releases the rest of the schedule that was not used. |
| Unit chart | A tab in the Reservation Calendar that shows each unit against dates (7, 14, or 31 days), like a hotel room chart. |
What Must Be Ready First
- The Rental Transaction feature is active on your plan. Without it the Reservation menus do not appear and the /booking page rejects every request.
- A service product to rent out, for example "Court Rental" or "Deluxe Room", with a base unit (quantity 1) such as "Hour" or "Night" and a sales price on every price level. That price applies per time unit of the table; on an Hour table, a 30-minute slot is automatically half of it. On a Day, Month, or Year table, one night, month, or year equals one unit price.
- One active Payment Type of kind Sales Advance when any group has a deposit (above 0%). Without it customers cannot book that group and the /booking page shows a warning for the admin. Groups with Minimum Deposit 0% do not need it. The account on this payment type is credited with every reservation deposit, so make sure it is a customer-advance liability account, not a cash or bank account.
- At least one active online gateway Payment Type that customers can pay without a cashier. Types that need a cashier, such as static QRIS, are not offered on the /booking page.
- Email (SMTP) settings if you want customers to receive notices. On a self-hosted server with empty SMTP settings, emails are not sent and no error is shown.
- The admin user role has access to the Reservation menus: Reservation Calendar to create, move, cancel, the chart, and the report; Customer Reservations for check-in and check-out. The server rejects those actions from a role without the menu. See Common Problems.
- For check-in: one active table POS session that includes that rental product, with the default customer, salesman, division, and shipment filled in.
Setup Order
- Create a Rental Product Group (Sales & POS menu): switch on Open for Reservations, then fill the slot length, Minimum Deposit (%), the Unit Name (Court, Room, Table, and so on), the division, and if needed the early check-in and late check-out fee products.
- Create a Rental Product for each court or room that gets booked: pick that group, switch on Leased, choose the product, and fill the time unit (Hour for courts, Day for rooms per night). For rental per night also fill the Start Deadline and Completion Deadline as the check-in and check-out hours. Steps 1 and 2 are explained on the Setting Up Rental Products for Reservations page.
- For per-slot groups, fill Reservation Opening Hours for each open day. One day may have more than one range, for example morning and evening. Groups per night, month, and year do not use opening hours.
- If needed, add Sales Discount Rules on the product for peak-hour or weekend prices (see How Price Is Calculated).
- Share the portal link with customers. The easiest way: open the Customer Reservation Portal menu, then copy the address that opens in the new tab. On the subscription service (SaaS) the link must carry the tenant code, that is /booking?tenantId=TENANT-CODE; without it the page does not know which business is meant.
- Test once end to end: create a customer account, book a schedule, pay the deposit, then see the result in the Reservation Calendar.
How Price and Deposit Are Calculated
Price is always calculated by the server, never by the customer browser, and is calculated per cell (per slot, night, month, or year) and then added up. The price shown in the portal is the price of the unit that will be assigned.
- The base price of a cell is the table product sales price in its base unit, by the customer Price Level. For per-slot rental it is adjusted for the slot length against the table time unit (a 60-minute slot on an Hour table = the one-hour price). For rental per night, month, or year the unit price is used as is per period. Member customers can be given another price level; if the price on that level is empty, the level 1 price is used, as at the cashier. Reservations created by an admin use price level 1.
- The product Sales Discount Rules are evaluated for every cell: the price kind replaces the price, the percent kind gives a percentage discount, and the value kind subtracts an amount.
- The total is the sum of all cell prices. The deposit is the total times the group Minimum Deposit (%), rounded to two decimals.
- Price-kind example for peak hours (from 18:00) and weekends at +30%:
detail.slotdayofweek >= 6 || detail.slothour >= 18 ? detail.baseprice * 1.3 : detail.baseprice - Percent-kind example for 20% off on weekday mornings:
detail.slotdayofweek <= 5 && detail.slothour < 12 ? 20 : 0 - Example for rooms per night, Friday and Saturday nights +25%:
detail.slotdayofweek == 5 || detail.slotdayofweek == 6 ? detail.baseprice * 1.25 : detail.baseprice(the cell date is the date of that night). - Rules on a rental product are also evaluated when that product is sold in Point of Sale, TableOrder, the online shop, and sales forms, for example a direct rental without a reservation. There
detail.slotdate,detail.slothour, anddetail.slotdayofweekhold the sale time anddetail.basepriceholds the list price of the customer price level, so the examples above still apply by the transaction hour at the cashier.
| Rule variable | Contains |
|---|---|
detail.baseprice |
The cell base price by the customer price level. |
detail.slotdate |
The cell date (for rental per night, the date of that night), for example 2026-10-18. |
detail.slothour |
The slot start hour, 0 to 23. Always 0 for rental per night, month, and year. |
detail.slotdayofweek |
Day of the week: 1 Monday to 7 Sunday. For rental per period, the day of the period start date. |
detail.bookingunit |
slot, day, month, or year on a reservation; empty when the rule is evaluated at the cashier. |
currenthour or currentday in reservation rules: both mean the time the order was created, not the time of use. Always write prices relative to detail.baseprice; a fixed number such as ? 400000 : 300000 overwrites the price-level price, so members lose their price. At the cashier, product rules are only evaluated for customers who also have a sales discount rule; in reservations, product rules apply to every customer.The Life of a Reservation
| Status | Meaning | Schedule |
|---|---|---|
| Awaiting payment | Created by the customer, deposit not yet received. Payment deadline is 15 minutes. | Held |
| Confirmed | Deposit received, or no deposit (0%), or created by an admin. | Held |
| In use | Checked in. A POS invoice is open on that table. | Held |
| Completed | Checked out. | The unused part that had not started is released |
| Expired | The deposit did not arrive before the deadline. | Released |
| Late payment | The deposit arrived after the reservation expired. The money goes to the manual refund queue. | Already released |
| Cancelled | Cancelled by an admin. Money already received becomes a manual refund. | Released |
Check-in and Check-out
- The buttons are in the Reservation Calendar (table rows and the Unit chart bar menu) and in the Customer Reservations form. The server requires the Customer Reservations menu on the role for both actions.
- Check-in is possible from the reservation start date until before the rental time ends. Before the start time it is an early check-in: only when the unit is not used or booked by anyone else until the start time, and charged per hour when the group has an Early Check-in Fee Product.
- Check-in opens a POS invoice on the table of that rental product, in the name of the reservation customer (or the POS default customer for walk-in reservations). The invoice holds rent lines at the price promised at reservation (already including peak-hour and weekend rules) and, if any, an early check-in fee line. The cashier does not recalculate those reservation lines; extra orders go on the same invoice.
- Check-out is possible any time after check-in, also after the schedule has ended. A late check-out is charged per hour when the group has a Late Check-out Fee Product; the fee is written to the check-in invoice while it is still open, and if the invoice was already closed a warning appears so the fee is billed through a cashier transaction. Check-out records the finish time on the table and releases the rest of the schedule that had not started.
- Fee = hours outside the schedule (rounded up to whole hours) x the sales price of the fee product by the customer price level. Before saving, the staff member sees the hours and the rate and may change the hours charged (0 = free). Without a fee product, or when its price is 0, there is no fee.
Deposit, Balance, and Refunds
- Every amount the gateway receives for a reservation is recorded in Customer Advances, one row per reservation with the memo "Uang muka reservasi" followed by the reservation number, and is journaled: debit the gateway payment type account, credit the Sales Advance payment type account.
- The advance balance usable at the cashier equals the deposit of the schedule in force. The part that must be refunded cannot be used, and a cancelled or expired reservation has a balance of 0.
- When the customer arrives, use that advance as payment (the Sales Advance payment type) at the cashier, then collect the balance. After check-in, settle the POS invoice opened by check-in on the same table.
- Reservations created by an admin have no deposit. Their payment is recorded at the cashier when the customer pays.
- The check-in invoice holds the rent price as reserved, so a guest who booked a Saturday night and checks out on Monday is still charged the promised price. A rental created directly at the cashier without a reservation is priced by the cashier from the product, rental length, and price rules at the transaction time.
- Refunds are manual. The app records the amount to return (the Refund Due column) and holds it back from the cashier balance. The money is returned outside the app, for example by bank transfer, and finance records the refund journal (debit Sales Advance, credit cash or bank).
- A refund appears when: an admin cancels a reservation whose money was received; a payment arrives after expiry or after cancellation; a schedule is moved to a cheaper price; or the customer overpays, for example two bills are both paid.
- If a schedule is moved back to a higher price before the refund is returned, that refund is cancelled because the money is used as deposit again.
Email Notices
- The customer receives an email when a no-deposit reservation is confirmed, the deposit is received, the schedule changes (by the customer or an admin), the reservation is cancelled, and when a payment arrives late.
- Customers without an email address, and walk-in reservations created by an admin, do not get email.
- If an email fails to send, the reservation is still saved and the failure is recorded as an "emailfailed" event in Reservation History.
Common Problems
| Symptom | Cause and how to check |
|---|---|
| Reservation menus are not visible | The Rental Transaction feature is not active, or your role has not been given access to the Reservation menus. Ask an admin to update the role access. |
| The /booking page fails or says the tenant is not registered (SaaS) | The link does not carry ?tenantId=TENANT-CODE. Copy the link from the Customer Reservation Portal menu. |
| A type is missing from the /booking choices though Open for Reservations is on | The group has no active, Leased rental product with a product and a time unit of Minute, Hour, Day, Month, or Year; or the rental products in the group mix different units. |
| Customers find no schedule at all | A per-slot group has no Opening Hours for that day, or the date is in the past. Schedules that have passed, are full, or are blocked show as Taken or Full. |
| Customers see "Admin needs to activate a sales advance payment type" | There is no active Payment Type of kind Sales Advance. |
| One court is never assigned while the others are used | That rental product is not Leased, has no product, its product has no active base unit (quantity 1), or its time unit cannot be booked. A unit whose price cannot be calculated is skipped and another unit is used. |
| A schedule shows Full though nothing is reserved | Every unit of that group is running as a rental session at the cashier (POS), is blocked by Blocked Time, or is already booked in an overlapping range. |
| Message "Minimum Deposit (%): 0 - 100." when saving the group | The percentage is negative or above 100. Zero is valid (no deposit); enter 0 to 100. |
| Message that the time unit must be the same when saving a group or rental product | Rental products in a group that is Open for Reservations must use the same unit: minute/hour, day, month, or year. Move them to another group. |
| "Schedule is outside opening hours" | Only for per-slot groups. The start time must fall on a multiple of the slot length counted from opening time, and the end must not pass closing time. |
| A rule gives an unexpected price | Check the rule kind and make sure the formula is relative to detail.baseprice. When several rules of the same kind apply, the last one wins. |
| The customer paid but the status is still Awaiting payment | The gateway confirmation is checked when the customer reopens My Reservations. Ask the customer to reload the page after paying. |
| The cashier advance balance is smaller than what the customer paid | Part of the money became a refund: the schedule was moved to a cheaper price, the reservation was cancelled, or the customer overpaid. See the Refund Due column in the Report. |
| Check-in is rejected | The start date has not arrived or the rental time has ended; there is no active table POS session including that unit, or more than one; the table still has an open POS invoice; the default customer, salesman, division, or shipment of the POS is incomplete; or an early check-in is rejected because the unit is still used or already booked before this schedule. The error message says which. |
| Check-out is rejected | The POS invoice of the table has changed since check-in; check the POS invoice first. A check-out after the schedule has ended is not rejected, but is charged a late fee when the group sets one. |
| The late check-out fee is not on the invoice | The check-in invoice was closed before check-out. The server shows a warning with the fee amount; bill it through a cashier transaction. |