Goods Received Not Invoiced (GRNI) Report: Template + Automation

← Back to Blog

Accounts Payable & Procurement

Goods Received Not Invoiced (GRNI) Report: Template + Automation

Every month-end, the same question surfaces: how much have we received but not been billed for? The answer lives in the GRNI report, and getting it wrong means your accruals are off, your balance sheet is misstated, and your auditors have questions. This guide walks through what a GRNI report is, what it should contain, how teams build one manually, where the process breaks, and how to automate the reconciliation so it takes minutes instead of days.

What Is GRNI (in Plain English)

GRNI stands for Goods Received Not Invoiced. It captures the gap between two events in the procurement cycle:

  1. Goods receipt: your warehouse or team confirms delivery against a purchase order.
  2. Invoice receipt: the vendor sends a bill for what was delivered.

In theory, these happen close together. In practice, invoices can lag receipts by days, weeks, or months. Every open receipt without a matching invoice represents an unrecorded liability: you owe money, but your AP ledger does not reflect it yet.

This concept is central to three-way matching, where the purchase order, goods receipt, and invoice are compared before payment is approved. The GRNI report is effectively the "missing invoice" column of that three-way match.

Why GRNI Matters: The Balance Sheet and Month-End Close

An unrecorded GRNI balance understates your liabilities and overstates your income. If you received $200,000 in materials last month and none of those invoices have arrived, your balance sheet is off by $200,000 unless you post an accrual.

The typical accrual journal entry looks like this:

Account Debit Credit
Inventory / Expense (depending on item type) $200,000
GRNI Accrual (liability) $200,000

When the invoice finally arrives and is matched, the accrual reverses and the standard AP entry takes over. The risk is in the gap: if GRNI is not tracked accurately, the accrual is either too high (overstating liabilities) or too low (understating them). Both create audit findings.

Controllers care about GRNI for three reasons:

  • Financial statement accuracy: unrecorded liabilities distort margins, working capital, and covenant calculations.
  • Audit readiness: auditors will sample GRNI items and trace them to supporting documents. A stale, unreconciled GRNI list triggers deeper testing.
  • Cash flow forecasting: outstanding GRNI items represent future cash outflows. If AP does not know about them, treasury cannot plan for them.

What a GRNI Report Should Contain

A useful GRNI report needs enough detail to act on each line item. At minimum, include these columns:

  • Vendor Name: who you owe.
  • PO Number: the purchase order the receipt was booked against.
  • PO Line Item: for POs with multiple lines, track at the line level (partial receipts are per-line, not per-PO).
  • Receipt Date: when the goods or services were confirmed received.
  • Receipt Quantity: how many units were received on this line.
  • Unit Price: the agreed price per unit from the PO.
  • Extended Amount: receipt quantity multiplied by unit price. This is the accrual exposure for this line.
  • Aging (Days): calendar days since receipt date. This is the most important column for prioritization.
  • Invoice Status: not received, partially matched, in dispute, or pending approval.
  • Notes / Follow-Up Action: free text for the analyst to document what they have done or what is needed.

Some teams add a "Last Contacted" date column and a "Responsible Buyer" field to track vendor follow-up accountability. If your organization uses cost centers or project codes, add those too so the accrual can be allocated correctly.

How Teams Build a GRNI Report Today (Step by Step)

The manual process varies by system, but the core workflow is the same across SAP, Oracle, NetSuite, QuickBooks, or any ERP that tracks purchase orders:

Step 1: Export Open PO Receipts

Pull a report of all goods receipts that have not been fully matched to an invoice. In SAP, this is typically the ME2M or MB5S transaction. In NetSuite, run a Saved Search on Item Receipts with "Invoice Pending" status. Export to CSV or Excel.

Step 2: Export the Invoice Register

Pull all invoices received during the same period. You need the PO number, invoice amount, and invoice date at minimum. This is your matching source.

Step 3: Match Receipts to Invoices

Using VLOOKUP, INDEX/MATCH, or a pivot table, try to match each receipt line to an invoice line by PO number and line item. Mark matched items as resolved.

Step 4: Calculate Aging

For every unmatched receipt, calculate the number of days since the receipt date. Sort descending: the oldest items are your highest-priority follow-ups.

Step 5: Investigate and Follow Up

For each aging item, determine the root cause. Is the invoice in transit? Was the receipt quantity wrong? Is there a price dispute? Document findings in the Notes column and email the vendor or buyer as needed.

Step 6: Post the Accrual

Sum the extended amounts of all unmatched receipt lines. This total is your GRNI accrual for the period. Post the journal entry (debit inventory or expense, credit GRNI accrual liability).

This process works, but it takes a skilled analyst 4 to 8 hours per entity per month, and the manual matching step is where most errors are introduced.

Why GRNI Reports Break: Partial Receipts, UOM Mismatches, and Invoice Timing

If the process above sounds straightforward, it is, until real data gets involved. Here are the failure modes that turn a 4-hour task into a multi-day headache:

Partial Receipts

You ordered 1,000 units. The vendor shipped 800, and the remaining 200 are on backorder. The receipt is recorded for 800, but the invoice arrives for the full 1,000 (or just 800, or 600 because the vendor made an error). The PO line now has a receipt, a partial invoice, and an open balance that does not cleanly match either document.

Unit of Measure (UOM) Mismatches

The PO says "12 cases." The receipt says "144 units." The invoice says "12 cases at $50/case." If your system does not handle UOM conversions, the VLOOKUP fails silently: the quantities do not match, so the line appears unmatched even though it is fully received and invoiced.

Backorders and Blanket POs

Blanket purchase orders with multiple releases over time create dozens of receipt lines against a single PO number. Matching becomes a many-to-many problem: multiple receipts, multiple invoices, and no clean one-to-one correspondence.

Invoice Timing Gaps

Some vendors invoice weekly or monthly in batch, not per-shipment. A receipt from January 5 might not get invoiced until the vendor's January 31 billing run. During that window, the item sits on the GRNI report and inflates the accrual. If your close date falls in the gap, you accrue for something that will resolve itself in days.

Price Discrepancies

The PO says $10.00 per unit. The invoice says $10.50. The three-way match fails on price, so the invoice gets routed to a buyer for approval. Meanwhile, the receipt remains unmatched and ages on the GRNI report, even though the invoice exists. This is a process issue, not a missing-invoice issue, but it looks the same on the report. Price variances also surface in duplicate payment prevention workflows, where near-matches with slightly different amounts require human review.

Each of these scenarios is manageable individually. In combination, across hundreds or thousands of PO lines, they turn manual GRNI reconciliation into a significant time sink. For a broader look at how exception-based workflows surface anomalies across spend data, see AI spend anomaly detection from Excel.

Downloadable GRNI Report Template

Rather than building the spreadsheet from scratch, start with a pre-formatted template that includes the column structure, sample data rows, and conditional formatting for aging thresholds.

What's Inside

  • grni_report_template.csv: column headers with 5 sample rows covering common scenarios (full match, partial receipt, missing invoice, UOM mismatch, price hold).
  • vendor_followup_tracker.csv: a companion sheet for tracking vendor outreach, response dates, and resolution status.
  • accrual_summary.csv: a roll-up template that aggregates GRNI exposure by vendor, cost center, and aging bucket (0-30, 31-60, 61-90, 90+ days).
  • README.txt: column definitions and quick-start instructions.

Email me the GRNI template pack

Enter your email and we'll send the templates immediately. You'll also get a short follow-up with tips on setting aging thresholds and vendor follow-up cadence.

We'll email the download link immediately. No spam. Unsubscribe anytime.

Automate GRNI Reconciliation with Zedly

The manual process described above works, but it depends on a skilled analyst, clean data exports, and a quiet close week. Zedly replaces the spreadsheet matching with an automated exceptions workflow:

Step 1: Upload Your Files

Upload three things to a Zedly Desk session:

  • PO receipt export (CSV or Excel from your ERP)
  • Invoice register (CSV, Excel, or individual invoice PDFs)
  • PO master list (optional; used to pull in unit prices and vendor details if your receipt export lacks them)

Zedly ingests the files, normalizes column headers, and detects the document type automatically. No manual column mapping required.

Step 2: Automated Three-Way Match

Zedly matches receipt lines to invoice lines by PO number, line item, quantity, and amount. It handles the edge cases that break manual matching:

  • Partial receipts: matches are made at the line-item level, not PO level, so partial shipments resolve correctly.
  • UOM normalization: if "12 cases" and "144 units" appear on the same PO line, Zedly flags the discrepancy and suggests the conversion.
  • Price tolerance: configurable tolerance bands (e.g., 2%) allow near-matches to resolve without manual intervention.
  • Many-to-many: blanket POs with multiple releases and invoices are matched using a waterfall approach: exact match first, then fuzzy match on date and amount.

Step 3: Review the Exceptions Queue

Everything that matched is marked as resolved. Everything that did not match lands in an exceptions queue with a reason code: missing invoice, quantity mismatch, price variance, duplicate receipt, or unrecognized PO. Each exception links back to the source row in your upload, so you can trace every decision.

Step 4: Generate Outputs

From the matched and unmatched results, Zedly produces:

  • GRNI aging report: unmatched receipts grouped by vendor and aged by receipt date (0-30, 31-60, 61-90, 90+ days).
  • Vendor follow-up list: exportable list of vendors with outstanding receipts, contact details, and suggested follow-up dates.
  • Accrual support schedule: summarized by cost center or GL account, ready to support the journal entry your controller needs to post.

The entire workflow runs in an ephemeral session: your files are processed, results are delivered, and nothing is stored after the session ends. For teams already using Zedly for bank reconciliation or bank statement analysis, the GRNI workflow uses the same interface.

Upload Your PO Export and Invoices

Frequently Asked Questions

What is a goods received not invoiced report?

A GRNI report lists every purchase order line where goods (or services) have been received into the warehouse or system, but the corresponding vendor invoice has not yet arrived or been matched. It is used to estimate accrued liabilities at period end and to identify procurement bottlenecks.

What is the GRNI reconciliation process?

GRNI reconciliation involves comparing your open purchase order receipts against invoices received, identifying unmatched items, aging each exception by receipt date, and either resolving the mismatch (by requesting the invoice, correcting quantities, or reversing the receipt) or carrying an accrual into the next period.

What is the difference between GRNI and accrued liabilities?

GRNI is a specific subset of accrued liabilities. Accrued liabilities cover any expense incurred but not yet invoiced, including payroll, utilities, and interest. GRNI specifically covers procurement: goods or services received under a purchase order where the vendor invoice is still outstanding.

How often should you run a GRNI report?

At minimum, monthly as part of period-end close. High-volume procurement teams run it weekly to catch aging items before they become month-end surprises. Weekly cadence also gives AP time to follow up with vendors before close deadlines.

What aging threshold should trigger vendor follow-up?

Most teams set a 30-day threshold: if goods were received more than 30 days ago and no invoice has arrived, the vendor gets a follow-up email. For high-value line items (above a materiality threshold you define), a shorter window of 14 days is common.

Can you automate GRNI reconciliation without an ERP?

Yes. If you can export your PO receipts and invoice register to CSV or Excel, you can match them programmatically. Tools like Zedly accept file uploads (PO exports, invoice PDFs, receipt logs) and produce a GRNI exceptions report without requiring direct ERP integration.

What causes a GRNI balance to grow over time?

Common causes include vendors sending invoices to the wrong address or contact, partial shipments where the receipt was recorded but the invoice covers a different quantity, price discrepancies that stall invoice approval, and receipts entered against the wrong PO number. Without regular review, these items accumulate and inflate accrued liabilities on the balance sheet.

Ready to get started?

Private-by-design document analysis with strict retention controls.