Home / Help Center / pos-app / Sell / Billing / Advance Booking
📅 Sell / Billing

Advance Booking

Advance Booking (also called Lay-by) lets a customer reserve items with a deposit and pay off the balance in instalments over time; once the balance reaches zero the order can be converted straight into a normal sales invoice.

📍 Menu path: Sell / Billing → Advance Booking
👤 Who uses it: All Billing-access roles can view lay-by orders; recording payments, cancelling orders and converting completed orders to an invoice require Create/Edit permission

Overview

Every lay-by order tracks a Total Amount, how much has been paid in Deposit Paid, and the remaining Balance Due — as instalments are recorded, the balance shrinks until it reaches zero.

Orders move through three statuses: ACTIVE (still being paid off), COMPLETED (fully paid), and CANCELLED (called off before completion).

A due date can be set on each order; if that date has passed while the order is still ACTIVE, the due date is shown in red and bold in the list so overdue lay-bys stand out.

Before You Start

Step-by-Step Guide

1 Filter and find a lay-by order

  1. Use the status tabs (All, Active, Completed, Cancelled) at the top to filter the list.
  2. Type in the search box to filter by order number or customer ID.
  3. Click any sortable column header (Order #, Total, Paid, Balance Due, Due Date) to sort ascending/descending.
  4. Switch between Table and Grid layout with the view toggle, and use Export to download the current filtered list.

2 Record an instalment payment

  1. Click anywhere on an ACTIVE order's row (or card) to expand it and reveal the payment history and payment form.
  2. Enter the Amount to collect — it cannot exceed the order's remaining Balance Due; the form blocks over-payment with an error naming the exact balance due.
  3. Choose the Payment Method: Cash, Card, UPI, Wallet or Bank Transfer.
  4. Optionally add Notes (e.g. "2nd instalment") for your own record-keeping.
  5. Click Record Payment — if the payment brings the balance to zero the order automatically flips to COMPLETED and a success message confirms this; otherwise you see the new balance due.

3 Cancel or convert an order

  1. To call off an order before it is paid off, expand it and click Cancel Order — you must confirm the action in a browser confirmation dialog before it proceeds.
  2. Once an order reaches COMPLETED status and has not yet been converted, expand it and click Convert to Invoice — confirm the prompt naming the lay-by order number.
  3. On success, a new sales invoice is created from the lay-by order and a toast shows the new invoice number; the order is then marked as converted and the button is replaced with a "converted" label.
💡 Cancelling and converting are one-way actions with no undo, which is why both require an explicit confirmation dialog first.

Every Field & Button, Explained

Field / ButtonWhat it does
Status tabs (All/Active/Completed/Cancelled)Filters the order list; resets to page 1 and collapses any expanded row when changed.
Search boxFilters visible orders by order number or customer ID.
Order #, Total, Paid, Balance Due, Due Date columnsSortable table columns — clicking toggles ascending/descending sort direction.
Table / Grid view toggleSwitches the layout of the order list between a table and a card grid.
ExportDownloads the current sorted/filtered list (Order #, Customer, Total, Paid, Balance Due, Due Date, Status).
Amount (payment form)Instalment amount to record; capped at the order's remaining balance due.
Payment Method (payment form)Cash, Card, UPI, Wallet or Bank Transfer.
Notes (payment form)Optional free-text note attached to the instalment.
Record PaymentSubmits the instalment; auto-completes the order if it brings the balance to zero.
Cancel OrderCancels an ACTIVE order after a confirmation prompt.
Convert to InvoiceTurns a fully-paid COMPLETED order into a normal sales invoice; a one-time action shown only before conversion.
Payment historyList of past instalments shown when an order is expanded (amount, method, date/time, notes).
Active / Completed / Cancelled stat cardsCounts by status, plus the total balance still owed across all Active orders.

Tips & Best Practices

Troubleshooting & FAQ

Why can't I record a payment larger than what the customer owes?
Instalment amounts are capped at the order's current Balance Due — the form rejects any amount above that with "Cannot exceed balance due <amount>".
The Convert to Invoice button is missing on a completed order.
It only appears once, before the order has been converted; once converted it is replaced by a "converted" confirmation label, since an order can only be converted once.
I don't see any way to create a brand-new lay-by order on this page.
New lay-by orders with their deposit and item list are created from the Sales/billing screen, not from this page — this page is for tracking and managing orders after they exist.
Advance Booking is not in my sidebar at all.
It requires the Advanced plan tier or above; check your plan under Settings → Billing/Subscription.

🧑‍💻 Developer Notes

Source component(s):

  • frontend-app/packages/pos-react-lib/src/pages/LaybyPage.jsx

Backend endpoints used:

  • GET /layby
  • GET /layby/:id
  • POST /layby/:id/installment
  • PUT /layby/:id/cancel
  • POST /layby/:id/convert

Related tables (db-core repositories):

  • LaybyOrder
  • LaybyInstallment
  • Sale

Redux slices:

  • scope (selectCurrentScope / getScopeQueryParams)

Feature flag key: layby (requires advanced plan tier or above)

Sorting, searching and pagination (10 rows/page) all happen client-side against the full order list returned by GET /layby rather than server-side, so very large lay-by histories are fetched in one call. Order line items are stored as a JSON string on the order (items field) and parsed client-side just to display an item count.