Pre-Orders
Pre-Orders is where you take custom cake and advance bakery orders — flavour, size, inscription and delivery date/time — track them through a Pending → Confirmed → In Production → Ready → Delivered flow, collect advance and balance payments, and bill the final amount through POS when the order is picked up.
Overview
Unlike most Bakery-section pages, Pre-Orders is an addition to the generic Sell / Billing menu in the bakery variant — it sits alongside Sales, not under the Bakery menu group, and has no plan-tier restriction.
Every pre-order tracks a customer, a delivery date/time slot, cake details (flavour, size, inscription, design notes, special instructions), a total amount, and how much has been paid so far as an advance and any later instalments.
Orders move through a fixed status flow — Pending → Confirmed → In Production → Ready → Delivered — with a single "advance" button whose label changes to match the next step (e.g. "Confirm Order", "Start Production"); Cancelled is a separate terminal state reachable at any point before Delivered.
When an order is ready to be paid off and handed over, Bill via POS sends it straight into the billing screen with the cake pre-loaded as a line item, the already-paid amount applied as a discount, and the customer pre-filled — so cashiers don't have to re-key anything.
Before You Start
- No plan tier restriction — Pre-Orders is available on every plan in the bakery variant.
- A Delivery Date and a Total Amount are required to create a pre-order; everything else (flavour, size, inscription, time slot, advance) is optional at creation time.
Step-by-Step Guide
1 Take a new pre-order
- Click New Pre-Order.
- Search for an existing customer or type a new Customer Name and Phone Number.
- Set the required Delivery Date and, optionally, a Time Slot (Any time / Morning 9am–12pm / Afternoon 12pm–4pm / Evening 4pm–8pm).
- Fill in Cake Details as applicable: Flavour, Size/Weight, Inscription (the text to pipe on the cake), Design Notes and Special Instructions (e.g. "Egg-less, no nuts").
- Enter the required Total Amount, any Advance Paid now, and the Payment Method — a live Balance Due preview appears once both amounts are entered.
- Add any internal Notes, then click Create Pre-Order.
2 Track and filter orders
- Read the four stat cards: Active Orders, Today's Deliveries, Ready for Pickup, and Balance Pending (total outstanding across active orders).
- Use the status tabs (All / Pending / Confirmed / In Production / Ready / Delivered / Cancelled) to filter the table.
- In the table, deliveries due today are highlighted amber with "(Today)"; deliveries past their date that are still active are highlighted red with "(Overdue)".
3 Advance an order's status
- Click a row to expand its detail panel.
- Click the single status-advance button — its label matches the next step: Confirm Order (Pending→Confirmed), Start Production (Confirmed→In Production), Mark Ready (In Production→Ready), or Mark Delivered (Ready→Delivered).
- Use Cancel Order instead if the order needs to be called off — this asks for confirmation and is available at any non-terminal status.
4 Collect an advance or balance payment
- Expand the order and, if it has a Balance Due greater than zero, use the Collect Payment fields: enter an Amount (capped at the remaining balance), pick a Payment Method, and add optional Notes.
- Click Record Payment — the balance updates immediately, and if it reaches zero you'll see a "Fully paid — balance cleared!" confirmation.
- Scroll the Payment History list in the expanded panel to see every payment recorded against the order, with amount, method, date/time and notes.
5 Bill the order through POS at pickup/delivery
- Expand the order and click Bill via POS — this is only available while the order has no linked sale yet and is not already Delivered.
- BazaarPOS opens the billing screen with a single line item for the cake (named from its Size/Flavour), the item's price set to the pre-order's Total Amount, the customer pre-filled, and the amount already paid pre-applied as a line discount so only the true remaining balance is collected.
- A note on the bill also carries the pre-order number, delivery date, cake inscription and paid/balance amounts for reference.
- Once billed, the pre-order shows "Billed via POS" and a View Invoice button in place of Bill via POS.
Every Field & Button, Explained
| Field / Button | What it does |
|---|---|
New Pre-Order | Opens the creation form for a new custom/advance order. |
Active Orders | Count of pre-orders not yet Delivered or Cancelled. |
Today's Deliveries | Count of orders whose Delivery Date is today, regardless of status. |
Ready for Pickup | Count of orders currently in the Ready status. |
Balance Pending | Total outstanding balance summed across all active (non-terminal) orders. |
Status tabs | All / Pending / Confirmed / In Production / Ready / Delivered / Cancelled — filters the table. |
Order # column | The pre-order number and its creation date. |
Customer column | Customer name and phone number, if recorded. |
Delivery column | Delivery date (with a "(Today)" or "(Overdue)" flag as applicable) and time slot. |
Cake column | Size/weight and flavour, shown compactly in the table. |
Total / Advance / Balance columns | Total order amount, amount paid as advance, and remaining balance due (highlighted red when greater than zero). |
Status badge | Colour-coded label for Pending, Confirmed, In Production, Ready, Delivered, or Cancelled. |
Customer Name / Phone Number (create form) | Customer search-and-create field plus a phone number input. |
Delivery Date (create form) | Required date the order must be ready/delivered by. |
Time Slot (create form) | Any time, Morning (9am–12pm), Afternoon (12pm–4pm), or Evening (4pm–8pm). |
Flavour / Size / Inscription (create form) | Free-text cake description fields; Inscription is the text piped onto the cake itself. |
Design Notes / Special Instructions (create form) | Longer free-text fields for design details and requirements like allergen-free preparation. |
Total Amount / Advance Paid / Payment Method (create form) | Required total price, any advance collected at booking time, and how it was paid (Cash/Card/UPI/Wallet/Bank Transfer); a live Balance due preview appears once both amounts are filled in. |
Collect Payment (expanded row) | Amount (capped at the remaining balance), Payment Method and Notes, plus a Record Payment button; only shown while a balance remains. |
Status-advance button | Label changes with the order's current status — Confirm Order, Start Production, Mark Ready, or Mark Delivered. |
Cancel Order | Cancels the order after a confirmation prompt; unavailable once Delivered or already Cancelled. |
Bill via POS | Sends the order into the billing screen pre-loaded with its cake, price, already-paid discount and customer details; only shown before the order has a linked sale and before it is Delivered. |
View Invoice | Shown instead of Bill via POS once the order has been billed; opens the printed invoice for the linked sale. |
Tips & Best Practices
- Always record the exact Inscription text as the customer wants it spelled — it prints straight onto the confirmation and the design notes the kitchen will read from.
- Collect at least a partial Advance Paid at booking time for custom cakes — the Balance Pending stat card is what tells you, at a glance, how much money is still owed across every active order.
- Use Bill via POS instead of manually re-entering the sale — it automatically nets off whatever has already been paid so the cashier only collects the true remaining balance.
Troubleshooting & FAQ
I can't create a pre-order — the form won't submit.
Bill via POS is missing on an order.
Record Payment button won't let me enter a large amount.
The status-advance button disappeared.
Delivery shows "(Overdue)" even though we delivered it.
🧑💻 Developer Notes
Source component(s):
frontend-app/packages/pos-react-lib/src/pages/PreOrderPage.jsxfrontend-app/packages/pos-react-lib/src/components/CustomerSearch.jsxfrontend-app/packages/pos-react-lib/src/pages/sales/InvoicePrint.jsx
Backend endpoints used:
GET /preorderGET /preorder/:idPOST /preorderPOST /preorder/:id/paymentPUT /preorder/:id/statusPUT /preorder/:id/cancelPOST /preorder/:id/convertGET /sales/:id
Related tables (db-core repositories):
PreOrderPreOrderPaymentSaleCustomer
Feature flag key: billing
PreOrderPage.jsx is a shared component (not under pages/fnb/) mounted generically wherever a variant adds the Pre-Orders nav item — in the bakery variant it is added on top of the standard Billing section via PRE_ORDERS_ITEM in Layout.jsx, with no minTier. The component defines a handleConvert function that calls POST /preorder/:id/convert to create an invoice directly from the API, but no button in the current UI is wired to call it — the only user-facing path to an invoice is Bill via POS (which opens the billing screen for the cashier to complete the sale) or View Invoice once a sale already exists.