Rentals
Rentals lets you rent items out to customers — tools, equipment, costumes or anything else you stock — against a security deposit, track them until they are due back, check them back in with any late fee or damage charge, and settle the deposit automatically.
Overview
A rental starts as an agreement: one or more items at a per-hour/day/week rate, a due-back date and time, an optional security deposit, and the customer's details.
While an item is out, it shows under the On rent tab; once its due-back date passes without a return it automatically shows under Overdue as well, with a one-click WhatsApp reminder.
Returning an item is a check-in step: the page pre-calculates the rent owed for the actual number of full pricing periods used and a suggested late fee, which you can adjust before confirming — the deposit is then automatically netted against rent + late fee + damage charge to show a refund or an extra amount to collect.
This is distinct from Rent Management elsewhere in the app, which tracks the shop's own rent paid to its landlord — Rentals here is exclusively about renting items out to your customers.
Before You Start
- Requires the
billingfeature at the Advanced plan tier or above. - Items being rented can be linked to existing Products (searched by name, showing live stock) or entered as free-text lines if not tracked as inventory.
Step-by-Step Guide
1 Create a new rental agreement
- Click New Rental.
- Enter the Customer name and, if you want WhatsApp reminders to work, their Phone.
- Choose the Rate charged unit: per hour, per day or per week.
- Set Due back — the date and time the item(s) must be returned.
- Enter a Security deposit amount (defaults to none if left blank) and any Notes.
- Under Items, type an item name to search your product catalog (results show live stock) and pick a match, or simply type a free-text name if it is not a tracked product; set the quantity and the per-period rate for each line; use + Add item for more lines.
- Click Create rental — at least one item line and a customer name are required.
2 Check an item back in (return)
- Find the agreement under the On rent or Overdue tab and click Return.
- The Return dialog shows the items, when they went out, when they were due, and how many pricing periods (hours/days/weeks) have elapsed, flagging any that are late.
- Review the pre-filled Rent amount (periods × rate) and the suggested Late fee; adjust either field, and enter a Damage charge if applicable, plus optional Notes.
- The dialog shows the running total: charges minus the deposit, resulting in either a refund owed to the customer or an extra amount to collect from them.
- Click Confirm return to check the item in, settle the deposit, and restore stock automatically for tracked products.
3 Chase an overdue rental
- Switch to the Overdue tab to see every agreement whose due-back date has passed without being returned.
- Click the WhatsApp icon on an overdue row to open a pre-filled reminder message (item names and due date included) addressed to the customer's phone.
4 Cancel a rental before it goes out further
- Click the trash icon on an active agreement and confirm the prompt.
- Cancelling restores any reserved stock and refunds the full deposit — use this only for agreements that should never have gone ahead, not as a substitute for a normal return.
Every Field & Button, Explained
| Field / Button | What it does |
|---|---|
On rent / Overdue / Returned / All tabs | Filters the agreement list to currently active rentals, active rentals past their due date, completed returns, or every agreement regardless of status. |
Customer name / Phone | Identifies who the items are rented to; phone is required for the WhatsApp overdue reminder to address a specific contact. |
Rate charged (Hourly / Daily / Weekly) | The pricing period used for every item line on this agreement; shown next to each item price and used to calculate periods elapsed on return. |
Due back | Date and time the rented item(s) must come back; once passed without a return, the agreement also appears under Overdue. |
Security deposit | Amount collected up front, later netted against rent + late fee + damage charge at return to compute a refund or extra collection. |
Item lines (name / quantity / rate) | What is being rented; names can be searched against your product catalog (shows live stock) or typed freely for untracked items. |
Return — Rent | Pre-calculated as elapsed pricing periods × the agreement's rate; editable before confirming. |
Return — Late fee | A suggested amount for overdue periods, editable before confirming return. |
Return — Damage charge | Manually entered charge for any damage found at return; defaults to 0. |
Refund / Collect summary | Charges (rent + late fee + damage) minus the deposit — shown as a refund owed to the customer if positive, or an extra amount to collect if negative. |
WhatsApp icon (overdue rows) | Opens a pre-filled reminder message naming the rented items and the due date, addressed to the customer's phone. |
Trash / Cancel icon | Cancels an active agreement, restores any reserved stock and refunds the full deposit — irreversible. |
Tips & Best Practices
- Always record a phone number on new rentals — it is what makes the one-click WhatsApp overdue reminder possible later.
- Set the deposit high enough to cover a realistic worst-case late fee plus damage, so the Return dialog rarely ends up asking you to collect extra cash from a customer who has already left.
- Use the product search when adding item lines for anything you also sell or track as inventory, so stock is automatically reserved while it is out and restored on return.
Troubleshooting & FAQ
Why is the sidebar missing Rentals entirely?
The suggested late fee looks wrong.
I need to un-cancel a rental I cancelled by mistake.
An item shows as rented out but was never actually taken by the customer.
🧑💻 Developer Notes
Source component(s):
frontend-app/packages/pos-react-lib/src/pages/RentalsPage.jsx
Backend endpoints used:
GET /rentals?status= (list by tab: ACTIVE / OVERDUE / RETURNED / all)GET /rentals/:id (full agreement detail + return estimate)POST /rentals (create agreement)POST /rentals/:id/return (check-in, settle deposit)POST /rentals/:id/cancel (cancel, restore stock + deposit)GET /products?search=&limit=6 (item-line product search)
Related tables (db-core repositories):
RentalAgreementRentalItem
Feature flag key: billing (requires advanced plan tier or above)
Backed by backend/src/routes/rental.routes.js mounted at /rentals. The server computes the return estimate (periods elapsed, suggested late fee, rent due) when GET /rentals/:id is opened for a return, and the final settlement (refund or extra-collect amount) is recomputed server-side on POST /rentals/:id/return rather than trusting the client-calculated total, so the UI numbers are always a preview of what the server will actually settle.