---
title: Create a purchase order
order: 7
updated: 2026-07-12
---

# Create a purchase order

A purchase order (PO) is your written instruction to a supplier to deliver agreed items at agreed prices. Every PO is created as a **Draft** first — nothing is emailed at this stage. You review the draft, then send it from the [purchase order detail page](/docs/procurement/view-purchase-order). This page covers the create form itself: how to reach it, every field on it, and exactly what the server re-checks before it saves.

There are three ways to open the form, and they all share the **same** two-part layout — a header (supplier, dates, PO number) and one *ProductPanel* per line item. Only how the form arrives pre-filled differs.

## Open the form

### Add a purchase order directly

Use this for a repeat order, or any PO raised outside an RFQ.

1. Open *Procurement* in the sidebar and click *Purchase Orders*. The page heading reads *Purchase Orders*.
2. Click *Generate Purchase Order* next to the search panel. The form opens with the heading *Generate Purchase Order* and one blank product row.

The *Generate Purchase Order* button only appears if you hold *Create Purchase Order* (`procurement.createPurchaseOrder`, which itself depends on *View Already Placed Purchase Orders*, `procurement.viewAlreadyPlacedPurchaseOrders`). The save endpoint re-checks the same permission and returns `Forbidden` without it — the button being hidden is not the only defence.

### Generate from a vendor response

This is the usual route when you have run an RFQ. The new PO is pre-filled from the awarded supplier's quotation — supplier, contact person, priced lines, discount, tax, and the supplier's quotation number and offer date.

1. Open [Procurement enquiries](/docs/procurement/enquiries) and open the RFQ, then open the supplier's [vendor response](/docs/procurement/vendor-responses).
2. From the vendor's actions menu choose *Generate Purchase Order*.
3. If that supplier already has one or more **draft** POs and you can edit POs, a chooser first asks whether to start a fresh PO or **append** these lines into an existing draft (consolidation). Pick *Start a new purchase order* to create, or a draft to append into. Without edit permission you always go straight to a fresh PO.
4. The *Generate Purchase Order* form opens with the priced lines filled in.

Only lines the vendor actually **quoted and did not mark no-bid** are carried over. If every line is no-bid or unquoted you get *"Vendor has no quotable lines — every line is no-bid or unquoted."* and no PO is started. Each line's make is the make the supplier offered, or — if the supplier quoted a price without naming one — the make specified on the RFQ line.

### Generate from a sales order or enquiry (no RFQ)

You can raise a PO straight from a customer sales order or enquiry, matching its products to a supplier without running an RFQ at all.

1. Open the sales order or enquiry and choose the *Generate Purchase Order* action. A *Generate Purchase Order* modal lists every supplier that can supply the source's products, **matched by product + make**.
2. Each supplier row shows its matching products, quantities and makes. Products with no matching supplier are called out in a *No matching supplier* card — add a supplier (or its make) to source them. See [Suppliers](/docs/records/suppliers).
3. Click *Place PO* on a supplier. As with the vendor route, if that supplier has draft POs and you can edit POs, the append-or-new chooser appears first.
4. The form opens pre-filled with the matched products. **Unit prices come in at `0`** — there is no RFQ rate here, so you type the rates you have agreed. The heading reads *Generate Purchase Order* (new) or *Append to Purchase Order* (appending), and appended lines are shown under an *"Appended from this order/enquiry"* divider.

This screen carries a *Cancel* button that returns you to the source order/enquiry.

> **Copying an existing PO.** From a saved PO you can also use *Copy* to start a new draft pre-filled from it — see [View a purchase order](/docs/procurement/view-purchase-order). It uses this same form and needs *Copy Purchase Order* (`procurement.copyPurchaseOrder`).

## The header

The header holds everything about the PO that is not a line item. It sits above the product rows on every variant of the form.

### Supplier Name

The supplier the PO is addressed to. Type to search your registered suppliers. **Required.**

- On the direct *Add* form this field is editable.
- On the vendor-response and from-source forms it is **locked** to the chosen supplier (you picked the supplier when you opened the form).
- Changing the supplier here **clears the contact person** and clears the *Product Category*, *Product Code* and *Make* on every line — those are all scoped to the supplier, so they can't carry over.

The server independently verifies the supplier id exists in your firm; a forged id is rejected with *"Supplier not found."*

### Supplier Contact Person Name

The person at the supplier the PO is addressed to. The search is **scoped to the chosen supplier** — you must pick a supplier first. **Required.**

The server re-checks that the contact person exists **and belongs to that supplier**. A contact person id borrowed from a different supplier is refused with *"Supplier contact person not found or doesn't belong to this supplier."* — this is the guard that stops a forged payload from linking a PO to the wrong party.

### Date of PO Generation

The PO's own date (printed on the document, used as the *PO Date* in lists). A date picker; it **defaults to today**. The time is fixed to midday so the date reads the same in every timezone. **Required** — the server rejects a missing or non-positive date.

### PO Number

How the PO number is handled depends on your firm's numbering mode, set under [Purchase order personalisation → PO number format](/docs/settings/document-templates#po-number-format):

- **Auto numbering** — this field is **disabled** and pre-filled with a *preview* of the next number. The real number is only assigned (and the firm counter consumed) when the PO is **sent**, so drafts that never go out don't burn numbers and leave no gaps. Because the preview is computed without consuming the counter, if a colleague sends a PO before you send yours, your actual number can shift. Whatever you see in this field is ignored by the server in auto mode.
- **Manual numbering** — this field is editable and **required**; type the number yourself. The server rejects an empty value with *"PO Number is required when manual numbering is active."*

### Supplier Quotation No

An optional free-text reference to the supplier's own offer/quotation (up to `200` characters). On the vendor-response route it is pre-filled with the winning quotation's number. Purely a reference — it does not affect numbering.

### Offer Date

An optional date for the supplier's offer. Empty by default; pre-filled from the vendor's quotation on the vendor-response route.

### Subtotal and Total (read-only)

Two calculated, non-editable boxes:

- *Subtotal (excl. Tax)* — the sum of every line's `quantity × unit price`, less each line's discount.
- *Total (incl. Tax)* — the same, plus each line's tax.

Both update live as you edit the lines and are shown in `₹` (INR). They are display-only; the server recomputes all money itself.

## Product lines

Each line item is a *ProductPanel*. A fresh form starts with one; use *Add Product* at the bottom to add more, and each panel has controls to remove, collapse, and reorder itself. At least one line is required — the server rejects an empty product list.

### Product Category

The product head (category) the item belongs to. **Disabled until a supplier is chosen**, and the search is **scoped to the supplier** — only heads that supplier is registered against appear. **Required.**

Changing the category **clears the Product Code and Make** on that line, because both are scoped to the head.

### Product Code

The specific item within the category. **Disabled until a category is chosen**, and its results are limited to codes under that category. **Required.**

Picking a code auto-fills several fields on the line from the code's master record:

- **HSN Code** — read from the code.
- **Tax** — set to the code's default tax rate.
- **Unit** — if the code allows exactly one unit, that unit is filled in automatically.
- **Description** — the code's default description is prepended into the description editor (see [Description](#description)).

The server re-checks that every product code on the PO exists in your firm; an unknown code fails with *"Invalid product code(s)."*

### Quantity

How many units to order. Accepts decimals (for units like metres or kilograms). The browser blocks the save unless **every line's quantity is greater than `0`** (*"Quantity must be > 0."*). The server additionally rejects any non-numeric or negative quantity, so a forged payload can't slip a bad value through.

### Unit

The unit of measure. The picker is **filtered to the units the product code allows**. If the code allows only one unit the field is auto-filled and **disabled**. **Required** — the server rejects a missing or invalid unit id.

### Unit Price

The price per unit, shown in `₹` (INR), entered in steps of `0.01`. Minimum `0`; **defaults to `0`**. On the from-source route every line starts at `0` for you to fill in; on the vendor-response route it is pre-filled with the supplier's quoted rate.

### Discount (%)

A per-line percentage discount off the line value. Range `0`–`100`, **default `0`**. The server enforces the same `0`–`100` bound.

### Tax

The GST rate for the line, chosen from the fixed slabs `0%`, `5%`, `12%`, `18%`, `28%`. It is pre-set to the product code's default tax rate when you pick the code. If the code is marked as always using the same tax rate, this field is **disabled** (locked to that rate). The server accepts any rate `0`–`100`.

### HSN Code

The item's HSN tax-classification code, auto-filled from the product code. If the code is marked as always using the same HSN, this field is **disabled**. It is a non-negative whole number and is optional on the server (defaults to `0` if absent). To change it permanently, edit it on the product code's master record — see [Products](/docs/records/products).

### Make

The manufacturer/brand for the line. The picker is **scoped to the supplier and the chosen category**, and is **disabled until a category is picked** (it shows *"Choose a category first"*). **Exactly one make is required per line** — the server rejects any line with no make (*"Make is required for each product."*). If you switch the category and the selected make isn't allowed under the new one, it is dropped.

### Description

A rich-text note that travels with the line onto the PO document. When you pick a product code its default description is prepended on top of whatever the editor already holds. On the vendor-response and from-source routes the line's incoming description is seeded here first. The description is sanitised server-side — any script/HTML-injection attempt is stripped and logged as a security event, never stored raw.

### Line controls

Each panel also offers:

- *Remove* — deletes the line after a *Confirm Removal* prompt.
- The chevron — collapses/expands the line's description, HSN, and make block.
- The two triangle buttons — move the line up or down.
- *View Analatics* — opens a stock/sales/purchase analytics modal for the selected product code. It appears only if you hold *View Product Analytics* (`procurement.viewProductAnalytics`) or are a firm admin, and is enabled only once a product code is chosen.

## Saving

Click *Save Purchase Order* (or *Save* on the from-source form). The form first checks, and lists any problems in a *"Please fix the following"* dialog:

- supplier, supplier contact person, and PO date are set;
- PO number is present **when manual numbering is active**;
- every line has a category, a code, a unit, a quantity greater than `0`, and a make.

On success the PO is created as a **Draft** and you land on the *Purchase Orders* list (direct/vendor routes) or on the new PO's detail page (from-source route). A draft carries **no additional charges and no universal note** from this form — add those later on the [detail page](/docs/procurement/view-purchase-order). When the PO was generated from an RFQ, saving also moves that sourcing event to *Awarded*.

## After saving

Once the draft exists, open it from *Purchase Orders* to:

- **Send it** to the supplier (email the PO PDF) — *Send Purchase Order* from the actions menu.
- **Edit it** — while it is still a *Draft* (the server enforces this; a sent PO can only be changed via the revise flow, which needs *Revise Sent Purchase Order*).
- **Add additional charges** (transport, packing, etc.) and attachments.

All of that lives on the detail page — see [View a purchase order](/docs/procurement/view-purchase-order). To chase the supplier after sending, use [Purchase order follow-up](/docs/procurement/purchase-order-follow-up).

## Common questions

### Why is *Generate Purchase Order* missing from a vendor response?

Either the supplier has not submitted a quotation yet, or every line is marked *No-bid* (or was left unquoted). A PO can only be generated from lines the supplier actually priced.

### Why can't I pick a product category, code, or make yet?

They cascade. The category is disabled until you choose a **supplier** (and is scoped to that supplier). The code is disabled until you choose a **category**. The make is disabled until you choose a **category** too. Fill them top-down and each unlocks the next.

### Why can I not type a PO number?

Your firm is on **auto numbering**, so the field is locked and shows a preview; the real number is assigned when you send the PO. To type numbers yourself, an administrator must switch the firm to manual numbering under [PO number format](/docs/settings/document-templates#po-number-format).

### The previewed PO number changed after I saved — is that a bug?

No. In auto mode the preview is computed without reserving the counter, and the number is only fixed at **send** time. If someone else sends a PO before you send yours, your number can shift by one. This is expected and keeps the sequence gap-free.

### Can I edit prices that came from the vendor response?

Yes — before you save, edit any line freely (quantity, price, discount, tax, make, description). After the PO is saved, further changes go through *Edit* on the detail page, and only while the PO is still a *Draft*. See [View a purchase order](/docs/procurement/view-purchase-order).

### Can the same RFQ produce two POs for one supplier?

The vendor route links one supplier's response to a PO. If the supplier already has a draft, you'll be offered to **append** the lines into it (consolidation) rather than spawn a second draft. For a genuinely separate order, raise a fresh PO directly.

### Where do I set the PO number format, email wording, or terms?

Not on this screen — this screen only builds the PO. Numbering, the PO email/PDF subject and body, firm CC/BCC, and default terms all live under *Settings → Firm Customisation → Procurement*. See [Purchase order personalisation](/docs/settings/document-templates#purchase-order-personalisation) and [PO number format](/docs/settings/document-templates#po-number-format).

### Why doesn't a supplier I expected appear when generating from an order/enquiry?

The supplier-match list is strict: a supplier is matched only if it is registered against the product **and** carries the line's **make**. Add the product head — or the specific make — to that supplier's record and it will appear. See [Suppliers](/docs/records/suppliers).
