---
title: View a purchase order
order: 8
updated: 2026-07-21
---

# View a purchase order

The purchase order detail page — *Purchase Order Details* — brings together everything about a single PO: the supplier, the contact person, every line item and its make/HSN/description, and the money totals. It is also the launch pad for every action a PO supports: sending it to the supplier, editing or revising it, copying it, attaching files, adding charges and notes, recording stock arrivals against it, and deleting it.

Almost every action here is permission-gated and re-checked on the server. If a control is missing from your actions menu, you don't hold the permission for it — see [Users & permissions](/docs/settings/users-and-permissions). This app treats every request as untrusted, so even if a control were forced open, the backend re-verifies status, ownership, and every value before it commits anything.

## Open a purchase order

1. Open *Procurement* in the sidebar and click *Purchase Orders*. Each row shows the PO number, supplier, supplier contact person, products, *Qty* (total quantity ordered), *Price* (goods value before tax), *PO Date* (`dd/mm/yy`), status, and total including tax. The options dropdown (the slider icon at the top right of the list) lets you show, hide, and drag-reorder these columns, set a *Default Status* that pre-applies every time the page opens, run an *Advanced Search* (PO number + date range), jump to *PO Follow-up*, *Refresh*, or *Reset Filters*.
2. Click *View* on a row (or right-click the row and choose *View*). The page heading reads *Purchase Order Details*.

You can also reach a PO from the inventory side: users with *View Pending Arrival POs* or *Upload Stock Arrival From PO* can open a sent PO from the *Pending Arrivals* tab on the In-Stock page. When a PO is opened embedded inside another screen, the actions menu is hidden (the page is view-only in that context).

Opening the page needs one of: *View Already Placed Purchase Orders* (`procurement.viewAlreadyPlacedPurchaseOrders`), *View Pending Arrival POs* (`inventory.viewPendingArrivalPurchaseOrder`), *Upload Stock Arrival From PO* (`inventory.uploadArrivalFromPO`), or firm-administrator. Without one of these the page returns a permission error.

## What you see

The detail is laid out in two columns of cards, followed by the products table and (if present) an additional-charges summary.

### Supplier card

- *Name* — the supplier's name.
- *Address* — the full address assembled from plot no, street, city, state, country, and postal code. Shows `—` if the supplier has no address.
- *GST* — the supplier's GST number, or `—`.

### Purchase Order Info card

- *PO Number* — the PO number. On an auto-numbered draft this is blank until the PO is sent (the number is assigned at send time). A `Rev N` chip appears beside it once the PO has been revised more than once.
- *Supplier Quotation No* — the supplier's own quotation reference, shown only if one was recorded.
- *Offer Date* — the supplier's offer date, shown only if set (`dd Mon yyyy`).
- *Status* — one of `Draft`, `Sent`, `Partially Arrived`, `Arrived`, or `Cancelled`, colour-coded (draft grey, sent blue, partially-arrived amber, arrived green, cancelled red).
- *Date of PO* — the PO date. This is the **dispatch date** — it is stamped the moment the PO is sent (and re-stamped on every re-send of a revision), not the date the draft was created.
- *Created By* / *Created At* — who first created the draft and when.
- *Subtotal (excl. tax)* — goods value after per-line discount, plus additional charge amounts, before tax.
- *Total (incl. tax)* — the grand total including per-line GST and charge tax.

### Supplier Contact Person card

*Name*, *Email*, *Phone*, and *Post / Role* of the contact person the PO is addressed to. Any missing field shows `—`.

### Products table

One row per line item with columns *Head* (product category), *Code* (product code), *Qty* (quantity + unit shortform), *Price / Unit* (₹), *Discount* (%), and *Tax* (%). Expand a row to reveal:

- *Make* — the make(s) chosen for that line, shown as chips.
- *HSN Code* — the line's HSN code, or `—`.
- *Custom Description* — the rich-text description saved on the line.

### Additional Charges table

If the PO carries any additional charges, a read-only *Additional Charges* table appears below the products, listing each charge's *Charge type*, *Amount*, *Tax %*, *Total* (amount + tax), and *Remark*, with a combined *Total (incl. tax)*. To add or edit charges, use *Additional Charges* in the actions menu (draft only — see below).

## The actions menu

The actions menu (the three-dot button at the top right) groups everything into submenus. Which entries appear depends on your permissions and the PO's status.

### Actions submenu

Appears when you can edit, send, or copy.

- **Edit / Revise** — opens the *Edit Purchase Order* form.
  - On a **draft** it is labelled *Edit* and needs *Edit Purchase Order* (`procurement.editPurchaseOrder`) or admin.
  - On a **sent** PO it is labelled *Revise* and needs *Revise Sent Purchase Order* (`procurement.reviseSentPurchaseOrder`) or admin. Revising reverts the PO to *Draft* — you must re-send it, and the change is logged in the edit history.
  - Editing is **blocked while any non-rejected (pending or approved) stock arrival exists** against the PO — the server rejects the save with a "reject or remove the arrival(s) first" message, because a receipt references charge rows by id and a rebuilt PO could reshuffle them.
- **Send Purchase Order** — email the PO PDF to the supplier. Shown only on a **draft** and only with *Send Purchase Order to Supplier* (`procurement.sendPurchaseOrderToSupplier`). See [Send the PO](#send-the-po). The server rejects a send on anything that isn't a draft.
- **Copy** — duplicate this PO as a fresh draft. Needs *Copy Purchase Order* (`procurement.copyPurchaseOrder`) or admin. It opens a new *Generate Purchase Order* form pre-filled with the same supplier, contact person, supplier quotation no, offer date, universal note, and every line item — but **no** PO number, status, charges, or history. Save it to create an independent new PO. See [Create a purchase order](/docs/procurement/create-purchase-order).
- **Attachments** — view or upload PO documents. Shown only when you can edit/revise the PO. The combined upload cap is `20 MB`, re-enforced on the server on every upload.

### Charges & Notes submenu

- **Additional Charges** — add or view charges such as transport, packing, or handling. See [Additional charges](#additional-charges). Anyone who can view the PO can open it; editing is draft-only and needs edit permission.
- **Universal Notes** — a shared notes-and-files panel for standing instructions, internal memos, delivery terms, etc. Shown with *View Universal Notes on PO* (`procurement.viewUniversalNotes`) or admin. See [Universal notes](#universal-notes).

### Logs submenu

- **Mail Send History** — every send attempt for this PO. Needs *View Already Placed Purchase Orders* or admin. See [Send history](#send-history).
- **Edit History** — a before/after diff of every edit. Appears only when the PO has been edited at least once (version > 1) **and** you can view history. See [Edit history](#edit-history).

### Arrival submenu

- **Upload Arrival** — record stock that arrived against this PO. Shown with *Upload Stock Arrival From PO* (`inventory.uploadArrivalFromPO`) or admin, and only while the PO is *Sent* or *Partially Arrived*. See [Recording arrivals against a PO](#recording-arrivals-against-a-po).
- **Stock Arrival Ledger** — the full history of stock arrivals recorded against this PO. Always available. Each row shows the arrival date, invoice number, products with quantities, total, and status; *View* opens the individual arrival. Use the controls button at the top right to show/hide/reorder columns (optional *Qty*, *Upload Date*, and *Uploaded By* columns are hidden by default); your layout is remembered per device.
- **Reverse Entry** — return received goods to the supplier. Shown with *Create Reverse Arrival (Return to Supplier)* (`inventory.generateReturnArrivalRequest`) or admin, and only while the PO is *Partially Arrived* or *Arrived*. The reverse starts as pending; on approval it reduces on-hand stock and can drop a fully-returned PO back to *Sent*. See [Recording arrivals against a PO](#recording-arrivals-against-a-po).

### Delete

- **Delete** — soft-deletes the PO (it becomes *Cancelled* and drops off the list; its edit logs are removed). Needs *Delete Purchase Order* (`procurement.deletePurchaseOrder`) or admin. **Not shown, and rejected server-side, once the status is *Partially Arrived* or *Arrived*** — deleting then would orphan the stock arrivals that reference it. A *Delete Purchase Order?* confirmation appears first.

## Send the PO

Choose *Send Purchase Order* from the actions menu. The modal runs in two stages: *Generate Purchase Order* (build and preview the PDF) and *Send Purchase Order* (choose recipients and dispatch).

### Stage 1 — Generate & preview

The heading reads *Generate Purchase Order*.

- **Subject** — the subject line. Pre-filled from your firm's PO template; edit it freely for this send. Placeholder `Purchase Order - {poNumber}`. Tokens like `{poNumber}` are filled in at send time — the token set itself is configured in the [Purchase Order Template](/docs/settings/document-templates#purchase-order-personalisation), not here.
- **Terms & Conditions** — a rich-text editor pre-filled with the default terms printed at the bottom of the PDF. Edit to override for this send. The defaults are resolved in priority order: the **supplier's own** *Default PO Terms* if set, otherwise the **firm-wide** default from the PO template. See [Where do the default terms come from?](#where-do-the-default-terms-come-from)
- **Column menu** (the slider icon, top right) — toggles which columns the PO PDF shows. The table prints them left to right in a fixed order — `Sr`, `Product`, `Qty`, `Unit Price`, `Disc %`, `Discounted Price`, `Amount`, `Tax %`, `Tax Amount`, `Total` — and each toggle just decides whether its column appears. `Product` always prints and has no toggle. Each of the rest is on/off:
  - *Sr No.* (`Sr`) — **on** by default.
  - *Quantity* (`Qty`) — **on** by default.
  - *Unit Price* — the base price entered on the line, before discount. **On** by default.
  - *Discount* (`Disc %`) — **off** by default.
  - *Discounted Price* — the unit price after the discount is applied. **On** by default.
  - *Amount* — quantity × discounted price, the line value **before** tax. **On** by default.
  - *Tax* — **off** by default. Turning it on adds two columns, `Tax %` (the line's GST rate) and `Tax Amount` (Amount × Tax %), and makes the *Total*/*Grand Total* tax-inclusive.
  - *Total* — `Amount` + `Tax Amount` when the tax columns are on, and the same figure as `Amount` when they are off. **On** by default.
  - *Grand Total Row* — **on** by default. It is disabled (and forced off) unless *Total* is on, *Amount* is on, or *Discount* is off — a grand total can't be shown alongside a discount column without a value column to sum.

  The starting tick state is loaded in priority order: this PO's saved draft, then your personal column defaults, then the firm defaults, then the built-in defaults above. Set your firm-wide default under [Settings → Personalisation → PO Columns](/docs/settings/personalisation).

  Two columns then drop themselves from that starting set when they would print nothing useful: if **every** line on the PO has a discount of `0`, *Discount* and *Discounted Price* start unticked (the `Disc %` cells would all read `—` and `Discounted Price` would just repeat `Unit Price`); and while the *Tax* columns are off, *Amount* starts unticked because `Total` already shows the identical figure. Both are only defaults — tick any of them back on here and that choice is what gets saved and printed.
- **Save Draft** — appears only when you have unsaved changes. Persists the subject, terms, and column choices to this PO without sending. (They are also saved automatically the moment you proceed to send.)
- **View PO PDF** — generates and previews the PDF with your current subject, terms, and columns, then advances to stage 2. On an auto-numbered draft the preview already shows the exact number the send would assign at that moment (a revised draft previews its next revision suffix) — it is computed from the firm's PO number format **without** consuming the counter, so if someone else sends a PO first, your real number can shift by one.

### Stage 2 — Recipients & send

After the preview, the heading changes to *Send Purchase Order*.

- **Recipient choice (hybrid mode only)** — if your firm's PO recipient mode is *Hybrid*, a *Send to:* selector lets you pick, per send, between the *Supplier Contact Person* and the *Fixed mailbox*. In *Supplier Contact Person* or *Fixed* firm modes this selector doesn't appear — the destination is fixed by the firm setting. See [What is hybrid recipient mode?](#what-is-hybrid-recipient-mode)
- **Email Subject** — the subject again, editable here too.
- **Send From** — the email account to send from, listed as `[Firm]` or `[Personal]` per account. The available accounts come from the firm's *Purchase Order Send* email policy; the chosen account is re-checked server-side against that policy. If none are configured, sending is blocked with a prompt to set one up under *Settings → Firm Customisation → Email Sending*.
- **Recipients** button (top-left of the header) — opens *Manage Recipients* to add per-send CC/BCC. See below. A `+N` badge shows how many addresses you've added for this send.
- **Going-out preview** — a strip under *Send From* summarising the final CC/BCC counts (e.g. `CC: 3 (2 firm, 1 for this send) · BCC: 1 (1 firm)`) so you can confirm before dispatch.
- **Send Purchase Order** — queues the send. On success the PO flips to *Sent*, the PO date is stamped to now, the universal note is frozen, an auto-number is consumed (or a revision bumped), and the attempt is logged under *Send History*. The server blocks a second dispatch while one is already queued or in progress.

### Manage recipients

The *Manage Recipients* modal adds CC/BCC **for this send only**:

- **Search supplier contacts** — search the supplier's contact persons and toggle *CC* or *BCC* beside any name. This search needs the *view supplier list* permission; without it the search area degrades to a note and you can still use the custom-email field. A contact with no valid email can't be toggled.
- **Add a custom email** — type any address for a one-off recipient and add it with the *CC* / *BCC* buttons (or press Enter to add to CC). Invalid addresses are rejected.
- **Limit** — up to `30` custom addresses per list (CC and BCC each) in this picker.
- **Firm defaults** — addresses configured as firm-default CC/BCC on the PO template appear in an *Always included (firm defaults)* block as read-only chips. They go out on **every** PO send, can't be removed here, and are merged and de-duplicated server-side. Ask an admin to change them in the [Purchase Order Template](/docs/settings/document-templates#purchase-order-personalisation).

Server-side, the final recipients are rebuilt from scratch: the *To* is derived from the firm mode (a per-send *To* override is only honoured in supplier-CP / hybrid-CP mode), firm CC/BCC are always merged in, everything is de-duplicated, and a send with no valid *To* address is rejected.

## Additional charges

*Charges & Notes → Additional Charges* opens the charges editor. Each row has:

- **Charge type** — pick from the firm's additional-charge master list (an autocomplete). Every row must have a type selected before you can save.
- **Amount** — the charge amount (step `0.01`). It can't go below `0` unless the selected charge type is flagged to allow negatives; switching to a non-negative type clamps any stale negative to `0`.
- **Tax %** — read-only. It is fixed by the charge type's own tax rate.
- **Remark** — an optional one-line note, up to `300` characters.

A running *Total (incl. tax)* is shown at the bottom. *Add Charge* adds a row; the trash icon removes one.

**Editing is draft-only.** Once the PO is not a draft the modal opens read-only with just a *Close* button. Saving is further blocked, and rejected server-side, if the PO has any non-rejected (pending or approved) stock arrival — charges are frozen onto a receipt when goods arrive, so they stop being editable then. The server also caps the list at `50` charges, resolves every charge id against the live master (rejecting unknown ids), re-checks the negative-amount rule against the master, and blocks removing or replacing a charge that a stock receipt still references (you must detach it from the receipt first). Charge types themselves are managed by the firm owner under *Settings → Firm Customisation → Misc Settings → Manage Additional Charges*.

## Universal notes

*Charges & Notes → Universal Notes* opens a shared notes panel — rich text plus file attachments — that any authorised user can read. Editing needs *Edit Universal Notes on PO* (`procurement.editUniversalNotes`) or admin; without it the panel is read-only and marked as such.

- **Notes stay editable regardless of PO status.** When the PO is a draft you edit the note freely.
- **After the PO is sent, the note is frozen.** The frozen text and files are shown in a locked *Notes (locked at send)* card, and your new edits go into a separate *Additional Notes* / *Additional Attachments* section that appends on top — you can't remove a frozen attachment (the server rejects it).
- **Attachments** — click or drag files into the drop zone. The limit is `50 MB` per file and `50 MB` combined (frozen files count toward the combined total), re-enforced on the server.

## Send history

*Logs → Mail Send History* lists up to the last `50` send attempts. Each entry shows a status chip (`QUEUED`, `PROCESSING`, `SUCCESS`, or `FAILED`), the PO number string used, the subject, the resolved *To* / *CC* / *BCC*, the queued and sent times, who approved it, the attempt count, and any last error. The generated PDF and any attachments are shown as buttons that open the file inline. A **Retry** button appears on *FAILED* rows only (the server refuses to retry anything that isn't failed) and re-queues the send.

## Edit history

*Logs → Edit History* opens a tabbed, before/after diff of every saved edit (each tab labelled `Rev. N`, newest marked *LATEST*). It compares the two snapshots the server captured around each save: PO-level fields (supplier, contact person, PO number, date, status, sent-at, universal note — with contact email/phone expanded when the contact person changed) and a per-product diff that flags each line as *Added*, *Removed*, or *Modified*, drilling into the exact quantity, price, discount, tax, unit, HSN, make, and description changes. The menu entry only appears once the PO has at least one edit on record.

## Recording arrivals against a PO

Two arrival actions live under the *Arrival* submenu and both feed the standard approval flow (entries start **pending** and must be approved):

- **Upload Arrival** loads the PO's still-pending lines and opens the arrival form scoped to this PO. Available only while the PO is *Sent* or *Partially Arrived*; if nothing is left to receive, it tells you so. See [Add a stock arrival](/docs/inventory/add-stock-arrival).
- **Reverse Entry** loads the lines already received (net of prior reversals) and opens the same form in reverse, to return goods to the supplier. Available only while the PO is *Partially Arrived* or *Arrived*.

The read-only **Stock Arrival Ledger** (always available) shows every arrival already recorded against the PO.

## Common questions

### Why can I not delete this PO?

Stock has already been received against it (status *Partially Arrived* or *Arrived*). Deletion is blocked — and the server rejects it — to avoid orphaning the stock-arrival records that link back to this PO. Keep it for audit, or reverse the arrivals first.

### Why is there a *Revise* option instead of *Edit*?

The PO has already been *Sent*. Editing a sent PO is a **revision**: it needs the *Revise Sent Purchase Order* permission, reverts the PO to *Draft* (so you must re-send it), bumps the revision number, and is recorded in the edit history. A draft PO shows plain *Edit* instead.

### Why can't I edit the PO or its charges right now?

There is a non-rejected (pending or approved) stock arrival against it. Because a receipt freezes and references the PO's charge rows, the PO is locked from edits until those arrivals are rejected or removed. Additional charges are also read-only on any PO that isn't a draft.

### Can I save my subject and terms without sending?

Yes. In the *Generate Purchase Order* stage, click *Save Draft*. Your subject, terms, and column choices are saved to the PO and reappear next time you open *Send Purchase Order*. They're also saved automatically if you go on to send.

### What is hybrid recipient mode?

Hybrid mode lets the sender choose, at send time, whether the PO goes to the supplier's contact person or to a fixed mailbox (e.g. a shared procurement inbox). It only appears when your firm's PO recipient mode is set to *Hybrid* in the [Purchase Order Template](/docs/settings/document-templates#purchase-order-personalisation). In the other two modes the destination is fixed.

### Where do the default terms come from?

Terms are loaded in this priority order:

1. **Supplier-specific terms** — if the supplier has *Default PO Terms* set on its record, those are used.
2. **Firm default terms** — otherwise the firm-wide default from the [Purchase Order Template](/docs/settings/document-templates#purchase-order-personalisation) is used.

This lets you keep standard terms for most suppliers while customising them for specific vendors.

### How do I change which columns appear on the PO PDF?

Use the slider menu in the *Generate Purchase Order* stage for a one-off change (and *Save Draft* to keep it on this PO). To change the firm-wide default tick state, set it under [Settings → Personalisation → PO Columns](/docs/settings/personalisation).

### Some columns start unticked even though my defaults have them on — why?

Two columns are dropped from the starting set when they would carry no information on this particular PO: *Discount* and *Discounted Price* when every line's discount is `0`, and *Amount* while the *Tax* columns are off (because `Total` then shows the same figure). It only changes the **default** ticks — tick them back on in the column menu and the PDF prints them.

### How do I chase the supplier on a sent PO?

Use *PO Follow-up* in the *Purchase Orders* options dropdown to chase several POs at once, or reopen *Send Purchase Order* on a single PO to resend. See [Purchase order follow-up](/docs/procurement/purchase-order-follow-up).

### A send shows *FAILED* — what do I do?

Open *Mail Send History* and click *Retry* on the failed row. The error text on the row usually points at the cause (bad recipient address, an email account that needs re-authorising, etc.). Fix the underlying issue if the retry keeps failing — see [Firm customisation](/docs/settings/firm-customisation) for email accounts.
