Wholesale Orders
Wholesale Orders is a dedicated ledger for your B2B accounts — hotels, cafés, retailers buying in bulk — with their own wholesale pricing, credit terms and delivery routes, separate from your normal walk-in customer base.
Overview
The page has two tabs: Orders (every wholesale order, with status and balance) and Customers (your wholesale accounts, each with its own discount %, payment terms, credit limit and GST/tax number).
Every wholesale customer can carry a Discount %, Payment Terms (Prepaid, Net 7/15/30/60), a Credit Limit, and — from the account record — a possible Credit Hold and a Minimum Order Value that BazaarPOS enforces automatically when a new order is created.
Order line items track both a Retail Price and a separate Wholesale Price per product/unit, and if a Price List defines a minimum order quantity (MOQ) for an item, the quantity field is highlighted and a warning appears when you enter less than that MOQ.
Orders move through Draft → Confirmed → Dispatched → Delivered (or Cancelled), and partial or full payments can be recorded against the order's balance due at any point once it has one.
Before You Start
- Requires the Advanced plan tier or above.
- A wholesale customer account must exist before you can create an order for them.
- Credit limit, credit hold and minimum order value checks only trigger if those fields are set on the customer's account — a blank/zero value skips that particular check.
Step-by-Step Guide
1 Add a wholesale customer account
- Switch to the Customers tab and click Add Customer.
- Enter the Business/Org Name (required), Contact Person, Phone, Email, Address and Tax/GST Number.
- Set Discount %, Payment Terms (Prepaid / Net 7 / Net 15 / Net 30 / Net 60) and a Credit Limit if you want BazaarPOS to warn you before that account goes over its credit.
- Click Add Customer — the account appears as a card showing its terms, discount and credit limit.
2 Create a new wholesale order
- Switch to the Orders tab and click New Order.
- Select the customer, Order Date, optional Delivery Date, Delivery Route/Zone and Payment Method.
- Add line items by searching for each product — Retail Price and Wholesale Price pre-fill from the product record and can be overridden — and enter the Quantity and Unit for each.
- If a quantity is entered below that product's configured minimum order quantity (from the wholesale price list), the field is highlighted amber with a "Min order qty is N" warning.
- Click Create Order — BazaarPOS runs credit checks first (see below) before saving.
3 Advance an order through fulfilment and record payment
- In the Orders table, click the status action button on a row to move it forward: Draft → Confirmed → Dispatched → Delivered.
- Click the row itself to expand it and see each line item's product, quantity, unit, wholesale price and line total, plus any notes and the delivery route.
- Once an order has a Balance Due greater than zero, click the payment icon to open Record Payment, enter the Amount (capped at the balance due) and Payment Method, then submit — the order's paid amount and balance update immediately.
- While an order is Dispatched and the customer has a contact phone on file, a "Notify customer" share bar appears in the expanded row to send a pre-filled dispatch message.
4 Bill an order and print its invoice
- On an order without a linked sale yet, click the invoice icon to open Billing pre-loaded with that order's items, customer and a note referencing the order number and balance due.
- Once billed, the invoice icon is replaced by a print icon for reopening and printing that sale's invoice directly from this page.
5 Edit or delete orders and customers
- Click the pencil icon on an order or customer to edit it, or the trash icon to delete it after a confirmation prompt.
- From a customer card, click "New order" to jump straight to the Orders tab with the New Order form open.
Every Field & Button, Explained
| Field / Button | What it does |
|---|---|
Orders / Customers tabs | Switches the whole page between the wholesale order ledger and the wholesale customer account list. |
New Order / Add Customer | Opens the respective creation form depending on which tab is active. |
Status filter chips | All / Draft / Confirmed / Dispatched / Delivered / Cancelled — filters the Orders table. |
Order # / Customer / Order Date / Delivery / Total / Balance / Status columns | One row per wholesale order; click a row to expand its item-level detail. |
Balance column | Shows the remaining amount owed in red, or a green "Paid" tag once fully settled. |
Status action button | Advances an order one step (Draft→Confirmed→Dispatched→Delivered); not shown once Delivered or Cancelled. |
Record payment icon | Opens the payment form for an order with a balance due greater than zero. |
Bill via POS / Print Invoice icons | Bill via POS shows before a sale exists for the order; Print Invoice replaces it afterward. |
Notify customer (share bar) | Appears on expanded Dispatched orders with a contact phone, offering a pre-filled delivery notification message. |
Business/Org Name, Contact, Phone, Email, Address, Tax/GST Number | Core wholesale customer profile fields. |
Discount % | A standing discount percentage applied to this customer's pricing. |
Payment Terms | Prepaid, Net 7, Net 15, Net 30 or Net 60 — informational and used to set expectations on payment collection. |
Credit Limit | The maximum outstanding balance BazaarPOS will let this customer carry before warning on new orders. |
Retail Price / Wholesale Price (per line item) | Two separate price fields per order line — Wholesale Price is what is actually billed, Retail Price is shown for comparison. |
Min order qty (MOQ) warning | Amber-highlighted quantity field and inline warning when an item's ordered quantity is below its configured minimum from the wholesale price list. |
Tips & Best Practices
- Set a realistic Credit Limit on repeat wholesale accounts — the exceed-limit confirmation is your early warning before a customer's outstanding balance gets out of hand.
- Use Payment Terms consistently (e.g. Net 30 for regular hotel accounts, Prepaid for new or occasional buyers) so expectations are clear before the first order is even placed.
- Fill in a wholesale Price List with minimum order quantities for your bulk-only SKUs — the amber MOQ warning catches under-ordering before it becomes a delivery-cost problem.
- Record payments as they come in rather than in a batch at month-end — the Balance column is only as accurate as how promptly payments are logged.
Troubleshooting & FAQ
I can't create an order — it says the customer is on credit hold.
My order was blocked for being below the minimum order value.
I got a confirmation asking if I want to exceed the credit limit — what happens if I click Cancel?
The quantity field turned amber with a "Min order qty" message.
The payment amount field won't accept the number I typed.
🧑💻 Developer Notes
Source component(s):
frontend-app/packages/pos-react-lib/src/pages/fnb/WholesaleOrdersPage.jsx (exported as FnbWholesaleOrdersPage)frontend-app/packages/pos-react-lib (DocumentShareBar, ItemSearch, GenericOrderModal, openInBilling, InvoicePrint — shared components)
Backend endpoints used:
GET /wholesale/customersPOST /wholesale/customersPUT /wholesale/customers/:idDELETE /wholesale/customers/:idGET /wholesale/ordersPOST /wholesale/ordersPUT /wholesale/orders/:idPATCH /wholesale/orders/:id/statusPOST /wholesale/orders/:id/paymentDELETE /wholesale/orders/:idGET /wholesale/price-listGET /settingsGET /sales/:id
Related tables (db-core repositories):
WholesaleCustomerWholesaleOrderWholesaleOrderItemWholesalePriceListSale
Feature flag key: wholesale_orders (requires advanced plan tier or above)
The component lives under the shared pos-react-lib/src/pages/fnb/ folder (exported as FnbWholesaleOrdersPage), built to be reusable across F&B variants; the bakery variant mounts it at /bakery/wholesale-orders. Credit-hold, minimum-order-value and credit-limit checks all run client-side against the selected customer record at submit time, before the order POST is made. "Bill via POS" uses sourceOrder: { type: "WHOLESALE", id, returnPath: "/bakery/wholesale-orders" }.