Home / Help Center / pos-app / Sell / Billing / Rentals
🔑 Sell / Billing

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.

📍 Menu path: Sell / Billing → Rentals
👤 Who uses it: All roles with Billing access (featureKey: billing)
🏷️ Plan tier: advanced+

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

Step-by-Step Guide

1 Create a new rental agreement

  1. Click New Rental.
  2. Enter the Customer name and, if you want WhatsApp reminders to work, their Phone.
  3. Choose the Rate charged unit: per hour, per day or per week.
  4. Set Due back — the date and time the item(s) must be returned.
  5. Enter a Security deposit amount (defaults to none if left blank) and any Notes.
  6. 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.
  7. Click Create rental — at least one item line and a customer name are required.

2 Check an item back in (return)

  1. Find the agreement under the On rent or Overdue tab and click Return.
  2. 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.
  3. 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.
  4. 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.
  5. Click Confirm return to check the item in, settle the deposit, and restore stock automatically for tracked products.

3 Chase an overdue rental

  1. Switch to the Overdue tab to see every agreement whose due-back date has passed without being returned.
  2. 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

  1. Click the trash icon on an active agreement and confirm the prompt.
  2. 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 / ButtonWhat it does
On rent / Overdue / Returned / All tabsFilters the agreement list to currently active rentals, active rentals past their due date, completed returns, or every agreement regardless of status.
Customer name / PhoneIdentifies 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 backDate and time the rented item(s) must come back; once passed without a return, the agreement also appears under Overdue.
Security depositAmount 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 — RentPre-calculated as elapsed pricing periods × the agreement's rate; editable before confirming.
Return — Late feeA suggested amount for overdue periods, editable before confirming return.
Return — Damage chargeManually entered charge for any damage found at return; defaults to 0.
Refund / Collect summaryCharges (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 iconCancels an active agreement, restores any reserved stock and refunds the full deposit — irreversible.

Tips & Best Practices

Troubleshooting & FAQ

Why is the sidebar missing Rentals entirely?
Rentals requires the billing feature at the Advanced plan tier or above; below that tier the menu item and route are hidden.
The suggested late fee looks wrong.
It is only a suggestion based on periods overdue; you can always edit the Late fee field in the Return dialog before confirming to match your own policy.
I need to un-cancel a rental I cancelled by mistake.
There is no undo for Cancel — you will need to create a new rental agreement with the same details.
An item shows as rented out but was never actually taken by the customer.
Open the agreement and use Return (or Cancel if it should never have started) rather than leaving it open — an open agreement keeps that stock reserved and shows the customer as owing rent.

🧑‍💻 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):

  • RentalAgreement
  • RentalItem

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.