NetSuite purchase order status report: building one that is right
Build a NetSuite purchase order status report that holds up: PO lifecycle statuses, line-level open commitment, three-way match and late-supplier data.
A NetSuite purchase order status report has to be built at line level, because the header status is a rollup. Report open commitment as quantity ordered minus quantity received, times rate, for lines that are not closed. Split billing status from receipt status, and compare each line's actual receipt date against its expected receipt date rather than the PO due date.
Key takeaways
- The header status on a PO is a summary of its lines. A three-line PO with one line complete shows Partially Received and tells you nothing about which line is late.
- Receipt status and billing status are two separate dimensions in NetSuite. A report with one status column collapses them and loses the received-not-billed balance.
- Open commitment is a line-level calculation on quantities, not a status filter. Lines closed short have quantity outstanding and are not open.
- A PO's due date is the payment due date derived from vendor terms. Expected receipt date is the delivery promise. Confusing them makes every on-time metric meaningless.
- Drop-ship and special-order POs are driven by their sales order, so they belong in a separate report from stock replenishment.
Two people ask for a NetSuite purchase order status report and they want different things. Purchasing wants to know what is late and what is landing this week. Finance wants to know how much is committed and how much has been received but not billed. One report rarely serves both, and the reason is that NetSuite tracks receipt and billing as separate dimensions while the status field you see on the record squashes them into a single label.
The PO lifecycle, and what each status does not tell you
A purchase order moves through a defined set of statuses. Reading them precisely is most of the job.
| Status | What it means | What it does not tell you |
|---|---|---|
| Pending Supervisor Approval | Entered but not approved, so it is not yet a commitment to the vendor | Whether it has been sitting there for six weeks |
| Rejected | Approval declined; the order is dead but the record remains | Nothing — but it will pollute a report that filters only on 'not closed' |
| Pending Receipt | Approved, nothing received yet | Whether it is already past its expected receipt date |
| Partially Received | Some quantity received on at least one line | Which lines, how much, or whether the shortfall is 2 units or 2,000 |
| Pending Billing/Partially Received | Some quantity received and billed, more still to come | The split between what is awaiting receipt and what is awaiting an invoice |
| Pending Billing | Fully received, no vendor bill yet | How long the accrual has been sitting in the received-not-billed account |
| Fully Billed | Every open line has been billed | Whether lines were closed short to get there |
| Closed | No further receipt or billing expected | Whether it completed or was abandoned |
Report at line level or do not bother
Every useful version of this report is built from PO lines, not PO headers. In a saved search that means turning off the main-line filter so you get one row per line; in a query it means reading the transaction line table directly. Then the quantities do the work that the status field cannot.
Open quantity = quantity ordered − quantity received (per line, excluding closed lines)
Open commitment = open quantity × line rate
Uninvoiced = quantity received − quantity billed (per line)
Accrual check = Σ (uninvoiced × rate) ≈ received-not-billed GL balance- Quantity ordered, received and billed are separate line values. Everything else derives from them, which is why the report survives changes in how statuses are labelled.
- The line-level closed flag is the one people miss. Closing a line short reduces the expected quantity without any receipt, so a line with 200 ordered and 150 received can be legitimately complete. Include closed lines in open commitment and you will overstate what is coming.
- Line rate, not header total. Header amount includes tax and shipping treatments that vary by configuration, and it cannot be apportioned back to the line that is late.
- Expected receipt date lives on the line. Different lines on one PO can have different promises, which is exactly why multi-line POs defeat header-level lateness reporting.
Check the exact field names in your own account before you trust a copied query — the received-quantity column is named differently depending on whether you are reading it from a saved search, the line record, or a query against the transaction line table. Confirm it against the field help rather than assuming, because picking the wrong quantity field produces a report that is plausible in every row and wrong in total.
Received, billed, and the money in between
For a stocked item, an item receipt debits the inventory asset account and credits a clearing account for goods received and not yet billed. The vendor bill then debits that clearing account and credits accounts payable. That clearing balance is the accrual your controller needs at month end, and it is populated automatically by receipts — which means a manual accrual for the same goods double-counts them.
Three-way matching in this world is a comparison of quantities and prices across three documents. Your PO status report is the place these breaks surface.
| Match break | Where it shows up | What it usually means |
|---|---|---|
| Received > billed, aging | Growing clearing-account balance; lines with uninvoiced quantity older than 45 days | Vendor invoices are not arriving, or they arrive and nobody enters them. Real cash timing risk at close. |
| Billed > received | Uninvoiced quantity goes negative | The bill was entered against the PO without a receipt, so inventory was never increased. Common with warehouse backlogs. |
| Bill price ≠ PO price | A variance balance, or an unexplained change in item cost | Price increases the buyer did not confirm, unit-of-measure mismatches, or freight billed on the goods line. |
| Quantity received > quantity ordered | Over-receipt within tolerance, or a line receipt exceeding the order | Vendor over-shipped and someone accepted it. It becomes a commitment nobody approved. |
| Line closed with quantity outstanding | Fully Billed header with an unreceived quantity | Someone tidied up. Legitimate for a cancellation, a problem when it hides a shortage the planner still expects. |
The price-difference row deserves its own attention. Depending on how your account is configured, a bill priced differently from the receipt either adjusts item cost or lands in a variance account, and either way it changes item margin later. That is the same number covered in purchase price variance explained, and the purchase price variance calculator will size the annual exposure from a single line's difference.
Enter the standard and actual price with the quantity to see the variance, the percentage and what it annualises to if the price sticks.
Late suppliers: use the right date
This is the single most common reason a purchase order status report produces a nonsense on-time figure. A purchase order has a due date, which is a payment date derived from the vendor's terms. The delivery promise is the expected receipt date on the line. They are unrelated, and a report that measures lateness against the due date is measuring your payment terms.
Lateness is then a line-level subtraction: actual receipt date minus expected receipt date for received lines, and today minus expected receipt date for lines still open. Weight it by value, not by line count, or a 40-dollar box of gloves 30 days late counts the same as a 26,000-dollar casting.
Once the dates are real, the interesting output is not an average. It is the distribution: 78% of lines on time, 14% between 1 and 7 days late, 8% beyond a week — because the tail is what breaks production schedules. Feed that tail into your planning assumptions rather than an average, in the same way manufacturing lead time is built from the components rather than a single figure.
The cases that break the report
- Drop-ship and special-order POs are created from and controlled by a sales order, so their status transitions follow the order rather than your warehouse. Reporting them alongside stock replenishment makes both harder to read. Split them, and reconcile them against the sales side instead — the same visibility problem as open sales orders.
- Blanket commitments and their releases. If you use an umbrella agreement with releases against it, make sure the report counts the releases or the umbrella, never both. Double-counted commitment is how a purchasing report ends up showing more on order than the business has cash for.
- Lines that are never received. Services and expense lines can go from ordered to billed without a receipt. In a receipt-based open-commitment number they look permanently outstanding. Filter by whether the item is receivable, not by status.
- Foreign currency POs. The line rate is in the vendor's currency. A report that sums rate times quantity across a mixed-currency PO book produces a total in no currency at all. Group by currency or translate explicitly.
- Rejected and abandoned orders. A rejected PO is not closed, so a filter of 'not closed' pulls it in. So does the order somebody raised in error in 2023 and never cancelled. Add an age cap and review anything older than 180 days as a data-quality queue, not a commitment.
- Intercompany purchase orders. In a multi-subsidiary account these represent internal movement, not external spend. Leaving them in overstates committed spend by the whole of the internal transfer.
What good looks like: four views, not one report
| View | Audience | Sorted by | Key columns |
|---|---|---|---|
| Overdue receipts | Purchasing, daily | Days late × value, descending | Vendor, item, open qty, expected date, days late, buyer |
| Landing this week | Warehouse and planning | Expected receipt date | Expected date, vendor, item, open qty, dock capacity implications |
| Received not billed | Finance, at close | Age of uninvoiced quantity | Vendor, receipt date, uninvoiced qty × rate, days outstanding |
| Open commitment by period | Finance, weekly | Expected receipt month | Open commitment by month, by category, by currency |
Build the underlying line-level dataset once and derive all four from it. That single decision prevents the situation where purchasing quotes 4.1 million dollars of open commitment and finance quotes 3.6 million, and the difference turns out to be closed lines and intercompany orders. It also feeds cleanly into your payables picture, since committed spend by month is the front end of days payable outstanding — the DPO calculator will show what a change in payment timing does to cash once the commitment numbers are trustworthy.
The four views above cover the predictable questions. For the unpredictable ones — which vendors slipped more than five days on parts we are short of right now? — takes the question as a sentence, computes it against your own account, and shows the SuiteQL underneath so you can confirm it used expected receipt date and not the PO due date before anyone acts on it.
Frequently asked questions
What are the purchase order statuses in NetSuite?
Pending Supervisor Approval, Rejected, Pending Receipt, Partially Received, Pending Billing/Partially Received, Pending Billing, Fully Billed and Closed. The status shown on the record is a rollup of its lines, and it combines two independent dimensions — how much has been received and how much has been billed — into one label.
How do I report on open purchase orders in NetSuite?
Build it at line level rather than filtering on header status. For each line that is not closed, open quantity is quantity ordered minus quantity received, and open commitment is that quantity times the line rate. Group by expected receipt month and currency. Exclude intercompany, drop-ship and non-receivable service lines.
What is the difference between a PO due date and the expected receipt date?
The due date is a payment date, derived from the vendor's payment terms. The expected receipt date, held on the line, is the delivery promise. Measuring supplier lateness against the due date measures your payment terms instead of their performance, which is why on-time-delivery percentages so often look implausible.
Why is my received-not-billed balance growing in NetSuite?
Item receipts credit a clearing account for goods received and not yet billed, and the vendor bill clears it. A growing balance means receipts are being processed faster than bills are entered, or vendor invoices are not arriving. Report it as uninvoiced quantity times rate by age, and never book a manual accrual on top of it.
Can a purchase order be Fully Billed with quantity still outstanding?
Yes. If lines are closed short, the outstanding quantity is no longer expected and the header can reach Fully Billed with quantity ordered exceeding quantity received. That is correct for a cancellation and a problem when it hides a shortage the planner still expects, so report closed-short lines as their own exception list.
Should drop-ship purchase orders be in a purchase order status report?
Report them separately. Drop-ship and special-order POs are created from and driven by their sales order, so their transitions follow the customer order rather than your warehouse, and their lateness matters to the customer promise rather than to stock cover. Mixing them with replenishment orders makes both harder to read.
Calculators for this
Purchase price variance calculator: PPV from standard and actual price times quantity received, with favourable or unfavourable and annual exposure.
Calculate manufacturing lead time from queue, setup, run, move and wait time per operation. See total lead time, value-add ratio and flow efficiency.
Calculate days payable outstanding from your AP and COGS. See how far you sit from supplier terms and what five more days of DPO is worth in cash.
Keep reading
Purchase price variance explained: the formula, why a favourable PPV often signals a stale standard or over-buying, and who should actually own the number.
How to build an open sales orders report in NetSuite: what each status means, how to catch partially fulfilled lines, and where backorders hide.
DPO explained: the days payable outstanding formula, a worked example at 36.5 days, and where stretching supplier terms starts to cost you money.
Build a top customers by revenue report in NetSuite, and see why revenue, invoiced and collected give three different rankings of the same customers.