Home / Help Center / pos-app / Sell / Billing / Sales & Bills
🛒 Sell / Billing

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.

📍 Menu path: Sell / Billing → Sales & Bills
👤 Who uses it: All roles with Billing access; the New Sale, Estimates, Sales Orders and Delivery Challan tabs additionally need Create permission, and the Estimates/Sales Orders/Delivery Challan tabs need the Advanced plan tier

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

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.

  1. Search or scan a product to add it to the cart; adjust quantity, price, discount or tax per line as needed.
  2. Attach a Customer if the sale is on credit, earns loyalty points, or needs an invoice addressed to them.
  3. Apply a coupon code, gift card, or let an automatic promotion/membership/wholesale price apply itself.
  4. Choose a payment method (Cash, Card, UPI, Wallet, Credit, Cheque, Split, or Advance Booking/Layby) and press F12 or click Complete Sale.
  5. Print the invoice or share it via WhatsApp from the confirmation screen.
💡 Press F10 to save the current cart as an Estimate instead of completing the sale — it will appear on the Estimates tab as a DRAFT.

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.

  1. 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.
  2. 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.
  3. Click a sortable column header (Invoice, Payment, Status, Total, Date) to reorder the list; click again to reverse the sort direction.
  4. 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.
  5. 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).
  6. Page through results with the Prev/Next controls, or export the current list with the Export button.
💡 A PENDING bill whose due date has passed automatically displays an ⚠ OVERDUE badge in place of the normal status chip.

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.

  1. 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.
  2. Open a quote to view its full detail: customer, valid-until date, line items with tax, subtotal, discount, total, notes and terms & conditions.
  3. Click Mark Sent on a Draft quote once you have shared it with the customer.
  4. 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.
  5. 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.

  1. Filter by status — Pending, Partial, Fulfilled, On Hold or Cancelled — or search by order/customer.
  2. Open an order to see Ordered / Fulfilled / Pending quantities per line alongside price and totals.
  3. 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.
  4. Click Fulfill All instead to ship every remaining unit and generate the invoice in one step.
  5. 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.
💡 The progress bar on the order list (Fulfilled ⁄ Ordered) lets you spot partially-shipped orders at a glance without opening each one.

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.

  1. 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.
  2. Track dispatch progress with the truck icon action, which advances status Pending → Dispatched → Delivered one step at a time.
  3. 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).
  4. 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 / ButtonWhat it does
All Bills — Invoice / Customer / Payment / Status / Total / DateStandard 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 ViaOptional 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 itemsEnter 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 / NotesSelect 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 / TotalDRAFT, 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 progressPending, Partial, Fulfilled, On Hold or Cancelled, with a bar showing quantity fulfilled versus quantity ordered.
Sales Orders — Fulfillment "Now" columnThe 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 DateDispatch-note details captured when the challan is created; Vehicle and Driver are optional free-text fields.
Delivery Challan — Convert to Invoice: Payment Method / Amount PaidPayment Method choice of Cash/Card/UPI/Bank Transfer/Credit; leaving Amount Paid blank marks the resulting invoice as fully paid.

Tips & Best Practices

Keyboard Shortcuts

ShortcutAction
F1Show or hide the keyboard-shortcuts help overlay (New Sale tab)
F2Focus the product search box (New Sale tab)
F6Focus the barcode scanner field (New Sale tab)
F8Hold the current sale (New Sale tab)
F9Clear the cart (New Sale tab)
F10Save the current cart as an Estimate/Quotation (New Sale tab)
F12Complete the sale (New Sale tab)
EscClose 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.
Those three tabs require the Advanced plan tier and Create permission on the Sales & Bills page. Check your plan under Settings → Billing/Plan, or ask an Admin to grant Create permission.
The Convert to Sale button is missing on a quotation.
A quotation can only be converted while it is Draft, Sent or Accepted — once it shows Converted (or has expired/been rejected), that action disappears.
What is the difference between Partial Return, Exchange and Full Refund on a bill?
Partial Return sends some items back and refunds just those; Exchange swaps returned items for different new items and settles only the balance; Full Refund reverses the entire sale and restores all stock.
A Sales Order is stuck On Hold and I can't fulfil it.
Click Resume to bring it back to Pending/Partial status first — fulfillment actions are disabled while an order is On Hold.
Convert to Invoice is missing on a Delivery Challan.
That action only appears while the challan has no linked sale yet and is not Cancelled — once converted or cancelled, it is gone.
"Please select a specific branch..." appears when I try to create a Delivery Challan.
Admins must pick one specific branch in the scope selector (not "All branches") before creating a challan, quotation or sales order for that branch.

🧑‍💻 Developer Notes

Source component(s):

  • frontend-app/packages/pos-react-lib/src/pages/Sales.jsx
  • frontend-app/packages/pos-react-lib/src/pages/sales/POSBilling.jsx
  • frontend-app/packages/pos-react-lib/src/pages/sales/QuotationList.jsx
  • frontend-app/packages/pos-react-lib/src/pages/sales/SalesOrderList.jsx
  • frontend-app/packages/pos-react-lib/src/pages/sales/DeliveryChallanList.jsx
  • frontend-app/packages/pos-react-lib/src/pages/sales/InvoicePrint.jsx

Backend endpoints used:

  • GET /sales
  • GET /sales/stats
  • GET /sales/:id
  • PUT /sales/:id/refund
  • PUT /sales/:id/payment
  • POST /sales/:id/return
  • POST /sales/:id/exchange
  • POST /catalog/sales/:id/share
  • GET /quotations
  • GET /quotations/:id
  • PUT /quotations/:id
  • POST /quotations/:id/convert
  • DELETE /quotations/:id
  • GET /salesorders
  • GET /salesorders/:id
  • POST /salesorders/:id/fulfill
  • POST /salesorders/:id/hold
  • POST /salesorders/:id/resume
  • POST /salesorders/:id/cancel
  • DELETE /salesorders/:id
  • GET /challans
  • GET /challans/:id
  • POST /challans
  • PUT /challans/:id
  • POST /challans/:id/convert
  • DELETE /challans/:id

Related tables (db-core repositories):

  • Sale
  • SaleItem
  • SaleReturn
  • Quotation
  • QuotationItem
  • SalesOrder
  • SalesOrderItem
  • DeliveryChallan
  • DeliveryChallanItem
  • Customer
  • Product

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.