Skip to content
NetSuite reporting

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.

ERPray teamUpdated 8 min read
Short answer

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.

StatusWhat it meansWhat it does not tell you
Pending Supervisor ApprovalEntered but not approved, so it is not yet a commitment to the vendorWhether it has been sitting there for six weeks
RejectedApproval declined; the order is dead but the record remainsNothing — but it will pollute a report that filters only on 'not closed'
Pending ReceiptApproved, nothing received yetWhether it is already past its expected receipt date
Partially ReceivedSome quantity received on at least one lineWhich lines, how much, or whether the shortfall is 2 units or 2,000
Pending Billing/Partially ReceivedSome quantity received and billed, more still to comeThe split between what is awaiting receipt and what is awaiting an invoice
Pending BillingFully received, no vendor bill yetHow long the accrual has been sitting in the received-not-billed account
Fully BilledEvery open line has been billedWhether lines were closed short to get there
ClosedNo further receipt or billing expectedWhether it completed or was abandoned
Eight statuses, two underlying dimensions: how much has been received, and how much has been billed.

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
Four line-level calculations that replace the status column entirely.
  • 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 breakWhere it shows upWhat it usually means
Received > billed, agingGrowing clearing-account balance; lines with uninvoiced quantity older than 45 daysVendor invoices are not arriving, or they arrive and nobody enters them. Real cash timing risk at close.
Billed > receivedUninvoiced quantity goes negativeThe bill was entered against the PO without a receipt, so inventory was never increased. Common with warehouse backlogs.
Bill price ≠ PO priceA variance balance, or an unexplained change in item costPrice increases the buyer did not confirm, unit-of-measure mismatches, or freight billed on the goods line.
Quantity received > quantity orderedOver-receipt within tolerance, or a line receipt exceeding the orderVendor over-shipped and someone accepted it. It becomes a commitment nobody approved.
Line closed with quantity outstandingFully Billed header with an unreceived quantitySomeone tidied up. Legitimate for a cancellation, a problem when it hides a shortage the planner still expects.
Every one of these is invisible in a header-status report and obvious in a line-level one.

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.

Free calculator
Purchase price variance calculator

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

ViewAudienceSorted byKey columns
Overdue receiptsPurchasing, dailyDays late × value, descendingVendor, item, open qty, expected date, days late, buyer
Landing this weekWarehouse and planningExpected receipt dateExpected date, vendor, item, open qty, dock capacity implications
Received not billedFinance, at closeAge of uninvoiced quantityVendor, receipt date, uninvoiced qty × rate, days outstanding
Open commitment by periodFinance, weeklyExpected receipt monthOpen commitment by month, by category, by currency
One line-level dataset, four saved views. Building four separate searches is how the numbers start disagreeing.

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.

Your ERP already knows. Start asking.

ERPray computes answers like these live from your own ERP account and shows the exact query behind every number. Early access is open for NetSuite teams — free plan at launch.