---
title: Sales orders
order: 8
updated: 2026-07-21
---

# Sales orders

A **sales order** is the confirmed, fulfilment-side record created from an enquiry once the customer's purchase order (PO) arrives. Where the enquiry tracked the *offer* (quotations, follow-ups, won/lost), the order tracks *delivery* — what was dispatched, what is still pending, returns, and the acknowledgment mail. The order carries a snapshot of the enquiry's products, prices, descriptions, additional charges, notes, and PO forward, and the two stay linked by the enquiry reference.

This page covers converting an enquiry, browsing the *Sales Orders* list, and everything on an individual order's detail screen. Related flows live on their own pages: [Attach a purchase order](/docs/enquiry-bank/purchase-order), [Delivery receipt](/docs/enquiry-bank/delivery-receipt), and [Acknowledging customer orders](/docs/enquiry-bank/order-acknowledgment).

## Convert an enquiry to an order

An order is never created directly — it is always *converted* from an enquiry whose PO has arrived.

1. Open the enquiry from the *Enquiry Bank*.
2. From the actions submenu, choose *Convert to Sales Order* (*Create a sales order and deliver*).
3. The *Formalise into an Sales Order* modal appears. Confirm by clicking *Convert Enquiry to Sales Order*.

On success the enquiry is converted, a toast confirms it, and you land on the *Sales Orders* list where the new order appears.

### When the action is available

The *Convert to Sales Order* item only shows when **all** of these hold:

- You have the *Convert to Sales Order* permission (`enquiry.convertToSalesOrder`).
- The enquiry's PO has arrived (`po.hasPoArrived` is true).
- The enquiry status is exactly `poArrived`.

The PO must be recorded against the enquiry first — see [Attach a purchase order](/docs/enquiry-bank/purchase-order). Until a PO is attached and marked arrived, the action stays hidden.

### What the server re-checks

The backend re-verifies the same three preconditions on every convert request, so a forged or stale request cannot create an order out of an enquiry that has not genuinely reached `poArrived`. A missing permission returns *Forbidden*; a wrong status returns a message naming the actual status it found; a not-yet-arrived PO is rejected. An invalid enquiry id is rejected as well.

### What carries forward into the order

The conversion copies a frozen snapshot from the enquiry:

- **Products** — each line's product code, quantity, price per unit, unit, discount %, tax %, HSN code, and make list. The description is **merged and frozen** at convert time: the product code's `defaultDescription` and the line's own custom description are combined (both, if present). Later edits to the product code's default description do **not** change an already-converted order.
- **Additional charges** — carried verbatim as a frozen snapshot (charge type, amount, tax %, remark).
- **Associated Party Expense** (commission list) — carried forward.
- **Customer**, **contact person**, **enquiry number** (kept as the order's `Enquiry Ref`), **PO details**, **enquiry date**, **mode of enquiry**, and **quotation attachments**.
- **Universal Note** — the rich-text enquiry note (with its file attachments) becomes the read-only *carried* half of the order's note; the order then gets its own editable note half. File ownership transfers so nothing is orphaned.

The originating enquiry is **deleted** after the order is created. If that delete fails, the order is still created and a warning is returned (the app logs it for manual cleanup) — you never end up with no order.

A sales order carries **no order number of its own** — it is identified by the customer's PO number and the originating enquiry reference.

## Open the Sales Orders list

Open *Sales* in the sidebar and click *Orders*. The page heading reads *Sales Orders* with the subtitle *Track and manage customer orders*, and a small count badge next to the title shows how many orders match the current filters.

The sidebar item appears for anyone with *View* enquiry access, but the list itself is served only to users who hold at least one of: firm-administrator, *Convert to Sales Order* (`enquiry.convertToSalesOrder`), or one of the delivery permissions — *Generate Deliver Stock Request*, *Approve Deliver Stock Request*, *See Pending Deliveries*, or *See Delivery History*. Without one of those the page loads but the list stays empty with a load error.

The list is paged (20 orders per page) and sorted newest-first by conversion date. Each row's *View* button opens that order's detail screen.

## Filter and search the list

Four quick filters sit above the table; a fifth *Advanced Filters* modal adds product and date-range filters. Any filter change resets the list to page 1.

### Quick filters

- *Customer* — an autocomplete matching the customer on the order. Picking a customer also clears the contact-person filter.
- *Contact Person* — an autocomplete matching the contact person on the order.
- *PO Number* — free-text search against the customer's PO number, **debounced** by about `650 ms` after you stop typing. The server matches it case-insensitively and treats your text as literal (regex characters are escaped), so a stray `*` or `(` cannot break the search.
- *Delivery Status* — `All` (default), `Delivered`, or `Pending Delivery`.

### Advanced filters

The options button (top right) → *Advanced Filters* opens the *Advanced Filters* modal, which is the single source of truth for the reference filters. It has two groups and an *active* count badge:

**References**

- *Customer* and *Contact Person* — the same references as the quick bar (they stay in sync). Choosing a customer clears the contact person.
- *Product Head* and *Product Code* — filter to orders containing a product. If a specific *Product Code* is set it takes precedence; otherwise a *Product Head* matches any code under that head. (If a head has no codes, the result is empty.)

**Date Ranges** (each a from–to range)

- *PO Arrival Date* — the PO date recorded on the order.
- *Enquiry Date* — the date the originating enquiry was received.
- *Conversion Date* — when the enquiry was converted into this order.

*Reset all* clears the modal; *Apply filters* runs the search. All ranges are inclusive on both ends.

### Options menu

The options button (the sliders icon, with a badge counting active advanced filters) opens a menu:

- *Advanced Filters* — opens the modal above.
- *Toggle Columns* — a submenu to show or hide table columns, with a *Reset* to defaults.
- *Tooltip visibility* — the same hover-tooltip toggler as the Enquiry Bank, covering the *Customer*, *Contact Person*, and *Product* hover cards (the Orders table has no price tooltip).
- *Order Acknowledgment* — jumps to the acknowledgment sending screen. Shown only with the *Send Order Acknowledgment* permission (or firm-admin). See [Acknowledging customer orders](/docs/enquiry-bank/order-acknowledgment).
- *View Deleted Orders* — opens the deleted-orders list. Shown only with the *View Deleted Orders* permission (`sales.viewDeletedOrders`). See [Delete, restore, and permanently remove](#delete-restore-and-permanently-remove).

### Columns

Visible by default: *Customer*, *Contact Person*, *Product*, *Delivered*, *Total Qty*, *PO Date*, *PO No*, *Status*, and the *View* action. Hidden by default (enable via *Toggle Columns*): *Enquiry Ref* and *Order Date*.

Product-related columns render one row per product line, aligned across *Product*, *Delivered*, and *Total Qty*. The *Delivered* number is colour-coded per line — green when the full quantity is delivered, amber when partially delivered, muted when nothing has shipped. The *Status* pill reads `Delivered` (green) or `Pending` (amber) for the whole order. Dates display as `dd/mm/yy`.

## Inside an order

Clicking *View* opens the order detail screen. The header shows the customer name, the enquiry reference, a *Delivered* / *Pending Delivery* status chip, and the actions menu (see [Order actions](#order-actions)). A small dot on the actions button flags that the order has **pending deliveries** awaiting approval.

### Information cards

- **Customer** — name and GST number.
- **Order Info** — delivery status chip, the *Created* (conversion) date, and the *Enquiry Ref*.
- **Order Value** — the money summary, described below.
- **Contact Person** — name, email, phone, and post/role.
- **Purchase Order** — shown only when a PO has arrived: PO number, PO date, who uploaded it, and a link to view the attached PO document(s). Clicking *View file* / *View all (n)* streams the file into the in-app preview; multiple files open a picker first.
- **Acknowledgment** — the state of the "thank you for your order" mail: `Not sent`, `Sending…`, `Sent`, `Failed`, or `Ignored`, plus who actioned it and when. Sending it is done from the [Order Acknowledgment](/docs/enquiry-bank/order-acknowledgment) screen.
- **Note** — a plain universal-note card, shown only when the order carries one and you have the *View Universal Notes* permission.

### Order Value

This card is computed live from the order's own line items (no extra server call) and always reconciles exactly:

- *Value (excl. tax)* — subtotal of `quantity × price` across all lines, before GST.
- *Value (incl. tax)* — the subtotal plus each line's tax.
- *Delivered* — value of goods already delivered, shown as the pre-tax amount with the tax portion noted alongside (e.g. `₹1,234 (+₹222 tax)`).
- *Pending* — value still to deliver, in the same amount-plus-tax format.

*Delivered* + *Pending* always add up to *Value (incl. tax)*. Delivered quantity is clamped to each line's ordered quantity, so an over- or stale value can never produce a negative *Pending*. These figures cover **goods only** — additional charges are excluded here and, when present, a note on the card points to their total and the *Additional Charges* table below.

### Products table

One row per line, with *Product*, *Qty* (with unit), *Delivered* (shown as `delivered/ordered`, green when complete), *Price/Unit*, *Tax %*, *Make*, and *HSN*. Expanding a row reveals its full (rich-text) description. This is a read-only view of the frozen snapshot taken at conversion.

### Additional Charges

If any additional charges carried over from the enquiry, a read-only *Additional Charges* table lists each charge's type, amount, tax %, line total, and remark, with a combined total including tax. These are separate from the goods value.

### Associated Party Expense

Shown only with the *View Commissions List* permission (`enquiry.viewCommisionsList`). Lists any commission/expense entries carried from the enquiry — contact person, amount (a flat `₹` figure or a `%`), and remarks.

## Order actions

The actions menu (the three-dots button in the header) groups everything you can do with an order. Items and whole groups appear only when your permissions allow them, and a single-item group renders flat instead of as a submenu.

### Copy Order

*Copy Order* (*Duplicate this order's lines into a new enquiry*) opens the copy flow pre-filled with this order's lines, creating a fresh enquiry. Needs the *Add Enquiry* permission (`enquiry.add`). See [Editing and copying enquiries](/docs/enquiry-bank/edit-copy-enquiry).

### Universal Notes

*Universal Notes* opens the order's note editor — the read-only note carried from the enquiry plus this order's own editable note. Shown only when the order has a note and you have the *View Sales Order Universal Note* permission. See [Attachments and notes](/docs/enquiry-bank/attachments-and-notes).

### Delivery

Grouped under *Delivery* (*Dispatch, history & returns*); the group and its dot flag pending deliveries:

- *Upload Delivery* (*Record stock dispatched to customer*) — records a dispatch against the order. Hidden once the order is fully delivered. Needs *Generate Deliver Stock Request*. See [Delivery receipt](/docs/enquiry-bank/delivery-receipt).
- *View Delivery History* (*See all dispatch entries for this order*) — opens a modal with tabs *All*, *Pending*, *Approved*, *Rejected*, and (with the *View Delivery Notes* permission) *Delivery Notes*. If there are no pending deliveries on open, it auto-switches to *All*. Deliveries can be opened for detail and, with the approve permission, approved or rejected there. Needs one of the delivery view/approve permissions.
- *Return Entry* (*Reverse stock received back from customer*) — records a return, reversing delivered stock. Needs *Generate Return Stock Request*.
- *Attach Delivery Note* (*Link a pre-order delivery note's quantities to this order*) — links a standalone delivery note whose goods were handed over before the order existed. This stays available even on a delivered order; the server rejects the link (`409`) if there is genuinely no remaining quantity to absorb. Needs *Attach Delivery Note to Order* (or admin). See [Delivery Note](/docs/inventory/delivery-challan).

### Attachments

Grouped under *Attachments* (*Quotation & order files*):

- *Quotation Attachments* (*Files sent with the original offer*) — the files that went out with the quotation. Shown only when the order actually has such attachments and you have the *View Quotation Attachments* permission.
- *Additional Attachments* — documents attached directly to this order. With the add/delete permissions you can attach or remove; otherwise it is view-only. Needs the *View Additional Attachments* permission to see it.

### Procurement

Grouped under *Procurement* (*RFQ, suppliers & POs*) — for sourcing the order's items from suppliers:

- *Add To RFQ Cart* (*Source items from suppliers*) — starts a supplier RFQ from this order. Needs the *Add To Cart* procurement permission. See [Add to cart from a sales order](/docs/procurement/add-to-cart-from-order).
- *Generate Purchase Order* (*Create a PO directly from this order*) — opens the supplier-match flow to raise a PO straight from the order. Needs *Create Purchase Order*. See [Create a purchase order](/docs/procurement/create-purchase-order).
- *Supplier Quoted Prices* (*Compare rates from all suppliers*) — compares supplier quotes for the order's originating enquiry. Shown only for enquiry-sourced orders, with the *View Already Placed Enquiries* permission.
- *Supplier POs Placed* (*Placed (sent) purchase orders for this order*) and *Show Draft POs* (*Draft purchase orders in progress*) — list the placed and draft supplier POs linked to the order's enquiry. Shown for enquiry-sourced orders with the *View Already Placed Purchase Orders* permission.

### Logs

Grouped under *Logs* (*Edit history & mail history*):

- *Mail History* (*Quotations & acknowledgments sent for this order*) — merges the enquiry-side quotation/follow-up sends with the order's acknowledgment history. Available to enquiry viewers, sales-order viewers, and acknowledgment senders.
- *Edit History* (*Revisions made to the originating enquiry*) — the enquiry's edit log. Shown only when the order still has a linked enquiry.

### Delete

*Delete Order* (*Soft-delete this order (restorable)*) opens a confirmation. Shown only with the *Delete Arrived Order* permission (`sales.deleteArrivedOrder`). See below.

## Delete, restore, and permanently remove

Deleting an order is a **soft delete** — it is hidden from the list but recoverable, not destroyed.

### Delete an order

From the order detail actions menu, choose *Delete Order* and confirm. The server refuses the delete (and shows the *Cannot Delete Order* screen) when either:

- The order has **net delivered stock** (approved deliveries minus returns greater than zero) — you must record returns for all delivered stock first.
- A delivery note is still **linked or link-pending** against the order — detach it first.

Otherwise the order is marked deleted, recording who deleted it and when.

### View, restore, or permanently delete

Open the *View Deleted Orders* option from the Orders list options menu (needs `sales.viewDeletedOrders`). The list shows each deleted order's customer, contact person, and who deleted it and when. Opening one shows its read-only detail (including delivery history) and, depending on your permissions:

- *Restore Order* — moves it back to the active list. Needs *Restore Deleted Orders* (`sales.restoreDeleteOrders`).
- *Delete Permanently* (*Cannot be undone*) — permanently removes the order and cascade-deletes its delivery records (snapshotting them to an audit tombstone first) and cleans up its note files. Still blocked if net delivered stock remains. Needs *Delete Permanently* (`sales.deletePermanently`).

Both actions are re-verified server-side against the same permissions and the net-stock rule.

## Common questions

### What is the difference between an order and an enquiry?

The enquiry is the offer stage (quotations, follow-ups, won/lost). The order is the fulfilment stage created from the enquiry once the PO arrives — it tracks dispatch, delivery, and returns. Converting deletes the enquiry and moves its data into the order; they remain linked by the enquiry reference.

### Why can't I convert my enquiry to an order?

Conversion needs the *Convert to Sales Order* permission, a PO recorded against the enquiry, and the enquiry to be in the `poArrived` status. If the *Convert to Sales Order* action is missing, attach the PO first — see [Attach a purchase order](/docs/enquiry-bank/purchase-order).

### Does the order have its own order number?

No. A sales order is identified by the customer's PO number and the originating *Enquiry Ref*; it does not mint a separate order number.

### Where do I record what was actually dispatched?

Use *Upload Delivery* on the order, or the [Delivery receipt](/docs/enquiry-bank/delivery-receipt) screen. To confirm a delivery to the customer by email, see [Send a delivery receipt](/docs/enquiry-bank/send-delivery-receipt).

### The order shows the wrong / old product description — why?

Descriptions are frozen at conversion time (the product code's default description plus the line's own custom text, merged). Editing the product code's default later does not rewrite an already-converted order. The order deliberately keeps the snapshot it was created with.

### I can't delete an order — what's blocking it?

Either the order still has net delivered stock (record returns for everything delivered first), or a delivery note is still linked to it (detach it first). The *Cannot Delete Order* screen names the reason.

### Can I restore a deleted order?

Yes. Open *View Deleted Orders* from the options menu and use *Restore Order* — available only with the matching permission. *Delete Permanently* removes it for good and cannot be undone.

### Why is the Orders page empty even though it's in my sidebar?

The sidebar shows the page to anyone with *View* enquiry access, but the list data requires firm-admin, *Convert to Sales Order*, or a delivery permission (generate/approve deliveries, or see pending/history). Ask an administrator to grant one of those if the list stays empty.
