Home / Help Center / pos-app-bakery / Sell / Billing / Pre-Orders
📅 Sell / Billing

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.

📍 Menu path: Sell / Billing → Pre-Orders
👤 Who uses it: All roles with Billing access (the page itself does not add extra internal permission checks)

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

Step-by-Step Guide

1 Take a new pre-order

  1. Click New Pre-Order.
  2. Search for an existing customer or type a new Customer Name and Phone Number.
  3. Set the required Delivery Date and, optionally, a Time Slot (Any time / Morning 9am–12pm / Afternoon 12pm–4pm / Evening 4pm–8pm).
  4. 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").
  5. Enter the required Total Amount, any Advance Paid now, and the Payment Method — a live Balance Due preview appears once both amounts are entered.
  6. Add any internal Notes, then click Create Pre-Order.

2 Track and filter orders

  1. Read the four stat cards: Active Orders, Today's Deliveries, Ready for Pickup, and Balance Pending (total outstanding across active orders).
  2. Use the status tabs (All / Pending / Confirmed / In Production / Ready / Delivered / Cancelled) to filter the table.
  3. 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

  1. Click a row to expand its detail panel.
  2. 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).
  3. Use Cancel Order instead if the order needs to be called off — this asks for confirmation and is available at any non-terminal status.
💡 Status-advance and Cancel actions are hidden once an order reaches a terminal status (Delivered or Cancelled).

4 Collect an advance or balance payment

  1. 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.
  2. Click Record Payment — the balance updates immediately, and if it reaches zero you'll see a "Fully paid — balance cleared!" confirmation.
  3. 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

  1. 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.
  2. 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.
  3. A note on the bill also carries the pre-order number, delivery date, cake inscription and paid/balance amounts for reference.
  4. 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 / ButtonWhat it does
New Pre-OrderOpens the creation form for a new custom/advance order.
Active OrdersCount of pre-orders not yet Delivered or Cancelled.
Today's DeliveriesCount of orders whose Delivery Date is today, regardless of status.
Ready for PickupCount of orders currently in the Ready status.
Balance PendingTotal outstanding balance summed across all active (non-terminal) orders.
Status tabsAll / Pending / Confirmed / In Production / Ready / Delivered / Cancelled — filters the table.
Order # columnThe pre-order number and its creation date.
Customer columnCustomer name and phone number, if recorded.
Delivery columnDelivery date (with a "(Today)" or "(Overdue)" flag as applicable) and time slot.
Cake columnSize/weight and flavour, shown compactly in the table.
Total / Advance / Balance columnsTotal order amount, amount paid as advance, and remaining balance due (highlighted red when greater than zero).
Status badgeColour-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 buttonLabel changes with the order's current status — Confirm Order, Start Production, Mark Ready, or Mark Delivered.
Cancel OrderCancels the order after a confirmation prompt; unavailable once Delivered or already Cancelled.
Bill via POSSends 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 InvoiceShown instead of Bill via POS once the order has been billed; opens the printed invoice for the linked sale.

Tips & Best Practices

Troubleshooting & FAQ

I can't create a pre-order — the form won't submit.
Total Amount and Delivery Date are both required. Fill in both and try again.
Bill via POS is missing on an order.
It only shows while the order has no linked sale yet and is not already Delivered. Once billed, it is replaced by View Invoice; once Delivered without billing, neither button is shown.
Record Payment button won't let me enter a large amount.
The payment amount is capped at the order's current Balance Due — you cannot collect more than what is actually still owed on that order.
The status-advance button disappeared.
It only appears for non-terminal statuses (Pending, Confirmed, In Production, Ready) that have a defined next step. Delivered and Cancelled orders are terminal and show no further status actions.
Delivery shows "(Overdue)" even though we delivered it.
The Overdue flag is based purely on today's date vs. the Delivery Date for any order not yet in a terminal status. Advance the order to Delivered (or Cancel it) and the flag will stop appearing.

🧑‍💻 Developer Notes

Source component(s):

  • frontend-app/packages/pos-react-lib/src/pages/PreOrderPage.jsx
  • frontend-app/packages/pos-react-lib/src/components/CustomerSearch.jsx
  • frontend-app/packages/pos-react-lib/src/pages/sales/InvoicePrint.jsx

Backend endpoints used:

  • GET /preorder
  • GET /preorder/:id
  • POST /preorder
  • POST /preorder/:id/payment
  • PUT /preorder/:id/status
  • PUT /preorder/:id/cancel
  • POST /preorder/:id/convert
  • GET /sales/:id

Related tables (db-core repositories):

  • PreOrder
  • PreOrderPayment
  • Sale
  • Customer

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.