Sales & Bills
Sales & Bills is one page with five tabs reached through the URL (?tab=…): New Sale for billing, All Bills for your invoice history, Estimates for quotations, Sales Orders for orders you fulfil over time, and Delivery Challan for dispatch notes — each mapped to its own item in the sidebar's "Sales & Bills" sub-menu.
Overview
All five tabs live on a single React route; switching sidebar sub-items (New Sale, All Bills, Estimates, Sales Orders, Delivery Challan) just changes the ?tab= query parameter, so the browser back/forward buttons and bookmarking work exactly as you would expect.
The New Sale tab embeds the identical billing engine used by Quick Bill, so anything documented on the Quick Bill page (product search/scan, discounts, payment methods, F-key shortcuts) applies here too.
If you arrived at billing from another workflow — a cake order, pre-order, wholesale order, festival order, or standing order — a banner appears above the cart ("Billing {Order Type} — complete the sale below or click Back to cancel") with a Back to Orders button that clears the cart and returns you to that order screen.
Estimates, Sales Orders and Delivery Challan are each individually gated behind the Advanced plan tier — on the Basic tier those tabs disappear rather than showing an empty screen.
Before You Start
- You must have Billing feature access and be logged in.
- New Sale, Estimates and Sales Orders all require the Create permission on this page — without it you are silently redirected to the All Bills tab.
- Estimates, Sales Orders and Delivery Challan are wrapped individually in a plan-tier gate requiring Advanced — each is hidden below that tier rather than shown broken or empty.
Step-by-Step Guide
1 New Sale — bill a customer at the till
This tab is the same POSBilling engine documented on the Quick Bill help page, without the extra shortcut bar.
- Search or scan a product to add it to the cart; adjust quantity, price, discount or tax per line as needed.
- Attach a Customer if the sale is on credit, earns loyalty points, or needs an invoice addressed to them.
- Apply a coupon code, gift card, or let an automatic promotion/membership/wholesale price apply itself.
- Choose a payment method (Cash, Card, UPI, Wallet, Credit, Cheque, Split, or Advance Booking/Layby) and press F12 or click Complete Sale.
- Print the invoice or share it via WhatsApp from the confirmation screen.
2 All Bills — search, print and manage past invoices
This is the tab most staff live in when they are not actively billing — every completed, pending or refunded sale lands here.
- Read the four stat cards at the top: Today's total and invoice count, This Month's total and count, Pending (unpaid) count, and All-Time invoice count.
- Use the search box to find a bill by invoice number or customer name, and toggle between Table and Grid view with the icons beside it.
- Click a sortable column header (Invoice, Payment, Status, Total, Date) to reorder the list; click again to reverse the sort direction.
- Use the row action icons: View/Print Invoice, Share via WhatsApp, E-Invoice/IRN, and — only on PENDING bills — Collect Payment and (if the customer has a phone number) a WhatsApp payment reminder link.
- On any bill that is not already Refunded, Exchanged or Cancelled you can also Partial Return (choose which items and how many units to send back, with a restock checkbox), Exchange (return some items and add new ones, with the balance calculated as customer owes or store refunds), or Full Refund (choose Cash, Wallet or Original Method, with an optional reason).
- Page through results with the Prev/Next controls, or export the current list with the Export button.
3 Estimates — create and convert quotations
Estimates are not created from this tab directly — they come from the New Sale tab's "Save as Quotation" (F10) action; this tab is for managing them afterwards.
- Filter the list by status — Draft, Sent, Accepted, Rejected or Expired (Converted quotes are excluded from the filter but still visible in the full list) — or search by quote/customer.
- Open a quote to view its full detail: customer, valid-until date, line items with tax, subtotal, discount, total, notes and terms & conditions.
- Click Mark Sent on a Draft quote once you have shared it with the customer.
- Once the customer accepts, click Convert to Sale — after a confirmation prompt this generates a real invoice (Cash payment method by default) and opens it in the print view.
- Use Print to produce a proforma copy at any stage, or Delete a quote that is no longer needed (not available once it has been Converted).
4 Sales Orders — fulfil orders over time
Like Estimates, Sales Orders are created from New Sale's order-saving action (with an Expected Delivery Date) — this tab is where you track and fulfil them.
- Filter by status — Pending, Partial, Fulfilled, On Hold or Cancelled — or search by order/customer.
- Open an order to see Ordered / Fulfilled / Pending quantities per line alongside price and totals.
- Click Partial Fulfill to open the fulfillment modal, adjust the "Now" quantity per line (it is automatically capped between 0 and the remaining pending quantity), and click Create Fulfillment — this generates an invoice for just the quantities you shipped.
- Click Fulfill All instead to ship every remaining unit and generate the invoice in one step.
- Use Hold (with a reason) to pause an order that cannot be progressed yet, Resume to bring it back to Pending/Partial, or Cancel (with a reason) if the order falls through.
5 Delivery Challan — dispatch notes and later invoicing
Unlike Estimates and Sales Orders, Delivery Challans are created directly on this tab, not from the billing screen.
- Click + New Challan (Admins must have a specific branch selected in the scope selector first) and fill in Customer, Delivery Date, Vehicle Number, Driver Name, Delivery Address, Notes, and one or more Items (product, quantity, unit) — at least one item with a product is required.
- Track dispatch progress with the truck icon action, which advances status Pending → Dispatched → Delivered one step at a time.
- When the goods are delivered and you are ready to bill, click Convert to Invoice, choose a Payment Method (Cash, Card, UPI, Bank Transfer or Credit) and optionally an Amount Paid, then confirm — a real invoice is generated using each product's current listed price (challan lines do not carry price/tax until conversion).
- Use Cancel on a Pending or Dispatched challan that will not be delivered, or Delete on any challan that is not yet Delivered.
Every Field & Button, Explained
| Field / Button | What it does |
|---|---|
All Bills — Invoice / Customer / Payment / Status / Total / Date | Standard columns on the bill history table; Status shows Completed, Pending, Overdue, Refunded, Partial Refund, Exchanged, Partial Exchange or Cancelled with colour-coded chips. |
Full Refund modal — Reason / Refund Via | Optional reason text plus a choice of Cash, Wallet, or Original Method for how the money goes back to the customer. |
Partial Return modal — per-item Qty / Reason / Restock items | Enter how many units of each line to return (capped at the sold quantity); the Restock checkbox puts returned stock back into inventory automatically. |
Exchange modal — Step 1 (return) / Step 2 (new items) / Payment Method / Notes | Select returned quantities to calculate store credit, search and add replacement products, then see the net amount the customer pays or the store refunds before confirming. |
Estimates — Quotation Number / Status / Valid Until / Total | DRAFT, SENT, ACCEPTED, REJECTED, EXPIRED or CONVERTED; only Draft/Sent/Accepted quotes can be converted or deleted. |
Sales Orders — Order Number / Status / Order Date / Expected Date / Fulfilled progress | Pending, Partial, Fulfilled, On Hold or Cancelled, with a bar showing quantity fulfilled versus quantity ordered. |
Sales Orders — Fulfillment "Now" column | The quantity you are shipping in this fulfillment run for each line; clamped between 0 and the remaining pending quantity. |
Delivery Challan — Challan Number / Vehicle / Driver / Delivery Date | Dispatch-note details captured when the challan is created; Vehicle and Driver are optional free-text fields. |
Delivery Challan — Convert to Invoice: Payment Method / Amount Paid | Payment Method choice of Cash/Card/UPI/Bank Transfer/Credit; leaving Amount Paid blank marks the resulting invoice as fully paid. |
Tips & Best Practices
- Use Save as Quotation (F10) during billing for customers who are "just asking" — it costs nothing and converts to a real invoice in one click the moment they confirm.
- For big B2B orders that ship in batches, use Sales Orders with Partial Fulfill rather than waiting to bill everything at once — each fulfillment generates its own invoice automatically.
- Remember Delivery Challan items carry no price until you convert — always double check the product's current listed price is correct at conversion time, especially if prices changed between dispatch and invoicing.
- Use All Bills' Export button regularly for reconciliation with your accountant instead of exporting each search result separately.
Keyboard Shortcuts
| Shortcut | Action |
|---|---|
| F1 | Show or hide the keyboard-shortcuts help overlay (New Sale tab) |
| F2 | Focus the product search box (New Sale tab) |
| F6 | Focus the barcode scanner field (New Sale tab) |
| F8 | Hold the current sale (New Sale tab) |
| F9 | Clear the cart (New Sale tab) |
| F10 | Save the current cart as an Estimate/Quotation (New Sale tab) |
| F12 | Complete the sale (New Sale tab) |
| Esc | Close the shortcuts overlay, or clear the search box (New Sale tab) |
Troubleshooting & FAQ
I can't see the Estimates, Sales Orders or Delivery Challan tabs.
The Convert to Sale button is missing on a quotation.
What is the difference between Partial Return, Exchange and Full Refund on a bill?
A Sales Order is stuck On Hold and I can't fulfil it.
Convert to Invoice is missing on a Delivery Challan.
"Please select a specific branch..." appears when I try to create a Delivery Challan.
🧑💻 Developer Notes
Source component(s):
frontend-app/packages/pos-react-lib/src/pages/Sales.jsxfrontend-app/packages/pos-react-lib/src/pages/sales/POSBilling.jsxfrontend-app/packages/pos-react-lib/src/pages/sales/QuotationList.jsxfrontend-app/packages/pos-react-lib/src/pages/sales/SalesOrderList.jsxfrontend-app/packages/pos-react-lib/src/pages/sales/DeliveryChallanList.jsxfrontend-app/packages/pos-react-lib/src/pages/sales/InvoicePrint.jsx
Backend endpoints used:
GET /salesGET /sales/statsGET /sales/:idPUT /sales/:id/refundPUT /sales/:id/paymentPOST /sales/:id/returnPOST /sales/:id/exchangePOST /catalog/sales/:id/shareGET /quotationsGET /quotations/:idPUT /quotations/:idPOST /quotations/:id/convertDELETE /quotations/:idGET /salesordersGET /salesorders/:idPOST /salesorders/:id/fulfillPOST /salesorders/:id/holdPOST /salesorders/:id/resumePOST /salesorders/:id/cancelDELETE /salesorders/:idGET /challansGET /challans/:idPOST /challansPUT /challans/:idPOST /challans/:id/convertDELETE /challans/:id
Related tables (db-core repositories):
SaleSaleItemSaleReturnQuotationQuotationItemSalesOrderSalesOrderItemDeliveryChallanDeliveryChallanItemCustomerProduct
Redux slices:
cart (sourceOrder / clearCart / setSourceOrder)scope (selectCurrentScope / getScopeQueryParams)
Feature flag key: billing (requires advanced plan tier or above)
The five tabs are one route, switched purely by the ?tab= search param (pos, sales, quotations, salesorders, challans) to line up exactly with the sidebar's child menu paths. Estimates, Sales Orders and Delivery Challan are each wrapped in their own <TierGate feature="billing" minTier="advanced"> rather than one gate around the whole page, so the New Sale and All Bills tabs remain usable on the Basic tier. "Sales Orders" fulfillment and Delivery Challan conversion both create a Sale row under the hood via the same invoicing path used by New Sale.