Matching fails because the goods receipt has not been posted yet
In short
An exception that clears itself if left alone for 2 days is a timing artefact, and it should never reach a human on the first attempt. Compare each exception's age against that site's own receipting lag: inside the 90th percentile, hold and recheck automatically; beyond it, escalate to the named receiver rather than parking it in the AP queue.
Key takeaways
- Measure receipting lag per site and per receiver before touching the matching rules. The 50th and 90th percentiles set every threshold that follows.
- Hold and recheck automatically inside the normal lag window. An exception a person opens and closes without doing anything is pure waste.
- Escalate to the named receiver, not to accounts payable. AP cannot post a receipt, so routing it there guarantees a second hop.
- Drop-ship and service lines have no receiving event by design. They need a substitute confirmation, not a longer wait.
- Period close is the hard stop: an unmatched invoice at cut-off becomes an accrual decision, so the recheck window has to end before the ledger does.
If the same exception disappears when nobody touches it, the process is generating work rather than finding problems. Goods arrive on Monday, the invoice arrives by email 3 hours later, and the receipt is keyed on Wednesday when the warehouse supervisor does the week's paperwork. Between Monday and Wednesday the match fails for a reason that is about clocks, not about goods.
The distinction that matters is between a receipt that is late and a receipt that is never coming. The first needs patience the system can supply on its own. The second needs a named person at a specific site, and no amount of waiting will produce it. Everything below is about telling them apart on arrival rather than after a week in a queue.
Compare the exception's age with your own receipting lag
There is no industry number for this and there does not need to be one: your own history contains it. Receipting lag is the elapsed time from delivery date to receipt posting date, and it varies enormously between a distribution centre that scans at the dock and a small branch where a manager keys receipts on Friday afternoons.
- Take 6 months of posted receipts and compute lag as posting timestamp minus delivery date, in working hours rather than calendar days.
- Report the 50th and 90th percentiles per site, per receiver and per supplier, and keep 12 months of history so seasonal sites are visible. One receiver at one site usually accounts for most of the long tail.
- Overlay the age of your current unmatched invoices on the same scale. Anything younger than the site's 90th percentile is presumed timing.
- Count how many of last quarter's receipt exceptions were closed with no action beyond a recheck. That number is the size of the prize.
- Split the residue by whether a receiving event was ever possible: stock delivered to a site, goods drop-shipped to a customer, or a service with nothing to receive.
- Recompute quarterly. Lag moves when a site changes process, and thresholds set once and forgotten become the reason exceptions escalate too early.
Four reasons the receipt is absent, only one of which is timing
They present identically — an invoice with no matching receipt — and they need 4 different responses. The confirming signal for each is available at the moment the exception is raised, which is what makes automatic routing possible.
| Cause | Confirming signal | Action and owner |
|---|---|---|
| Receipt not yet keyed | Exception age is inside the site's 90th percentile lag; the site has a history of batch keying | Hold and recheck automatically; nobody is told until the window expires |
| Receipt posted against a different line or PO | A receipt exists for the same supplier and period with quantity that reconciles across lines | Automatic re-match across the supplier's open receipts, then buyer confirmation of the correction |
| Delivery went straight to a customer | PO is flagged drop-ship, or the delivery address is not a company site | Match against carrier proof of delivery or the supplier's dispatch advice, not against a receipt |
| Nothing was ever receivable | Service or subscription line with no material, and no receiving step in the flow | Confirmation by the requisitioner or contract owner, standing in for the receipt |
The hold-and-recheck loop, and the numbers that set it
A timing exception should be a state on the invoice, not an item in anyone's work list. The invoice is held, rechecked on a schedule, and only becomes visible to a human when the schedule runs out. Three parameters define the loop, and all 3 come from the lag measurement rather than from a vendor default.
- Recheck frequency. Every 4 hours for the first working day, then once a day. More often just re-reads the same tables; less often wastes a day of terms.
- Hold window, per site, set at that site's 90th percentile lag rounded up to the next working day. Most timing cases resolve inside it without anyone knowing they existed.
- Escalation target: the named receiver for that site, with the delivery reference and the supplier's dispatch advice attached, because the person who can post the receipt is never in AP.
- Hard stop at close. Whatever the window says, stop holding 3 working days before period cut-off and force a decision, because an unmatched invoice at close is an accrual question.
- A visible countdown on the invoice. Anyone who opens it should see how long it has been held and when it escalates, or the hold looks like the invoice being lost.
Holding is not free, which is why the window has a cap. If your terms run from invoice date, every day held is a day of the payment period consumed, and an early-payment discount can be lost while the invoice sits in a state nobody is watching — the reason the choice of clock matters, argued in which invoice date starts the payment clock.
Deliveries nobody was ever going to receive
Two categories break the 3-way match by design rather than by delay, and treating them as slow receipts guarantees they age out to a human every single time. Drop-shipped goods go directly to a customer, so no company site ever handles them. Services produce nothing to count: the work happened, and there is no dock, no scan and no receiving line.
- Flag these lines at PO creation, not at invoice time. A matching engine cannot infer that a delivery address is a customer's warehouse.
- Substitute an evidence source. Carrier proof of delivery, or the supplier's dispatch advice arriving over EDI or a portal, for drop-ship; a confirmation from the requisitioner or contract owner for services.
- Make the substitute a first-class object with a timestamp and an owner, so the audit trail shows what the match ran against instead of a receipt.
- Route milestone and retention billing to the contract rather than to a receipt. What is being verified is a contractual event, and it is closer to a non-PO approval than to a match.
- Keep the coding consistent with whatever the substitute implies, since a service confirmation often carries the cost centre — the ground covered in automatic GL and cost-centre coding a controller will accept.
Why period close ends the argument
An invoice held past cut-off stops being an AP workflow item and becomes a reporting problem. Goods received not invoiced (GRNI) and invoiced not received are the 2 halves of a clearing balance the controller has to explain, and a growing hold queue quietly inflates one of them. This is where holding invoices out of the ledger and posting them provisionally diverge sharply, and the answer depends on where your books live — the trade-off in a hosted ledger against an in-house ledger.
What escalation should look like when the window runs out
The failure mode here is routing an expired hold into the AP exception queue, where a clerk who cannot post a goods receipt looks at it, emails a site, and marks it pending. That is a hop with no decision in it, and repeated a few hundred times a month it is a large part of why an AP exception queue grows faster than it clears.
- Escalate to the person who can act: the named receiver at that site, with the supplier, delivery reference and quantity in the message.
- Give them 1 action. Post the receipt, or state that nothing was delivered — a binary answer that changes the invoice's state without a conversation.
- Escalate on a clock, not on a queue position. Silence for 2 working days goes to the site manager, and the invoice's state records both hops.
- Feed the outcome back into the lag data. A site whose escalations always resolve as "already posted, wrong line" has a matching problem rather than a receipting one.
- Keep it out of approval routing. An invoice waiting for a receipt is not waiting for an approver, and mixing the 2 is how invoices stall in approval with nobody able to say what they are waiting for.
The whole fix is small: a state machine, a scheduler, per-site thresholds derived from your own data, and 1 escalation path to a named human. It is the sort of thing we scope as an MVP and product build around an existing ERP for finance teams across fintech and financial operations, and the rest of the invoice-to-pay and AP automation cluster covers the matching and queue design it plugs into.
Frequently asked questions
Short answers to the follow-ups this page tends to raise.
How long should an invoice be held before someone is told?
Until the site's own 90th percentile receipting lag has elapsed, rounded up to the next working day, and never past 3 working days before period close. A dock that scans on arrival justifies a window of 4 to 8 hours; a branch that keys receipts weekly justifies 4 or 5 days. Using one global number guarantees you escalate too early at one site and too late at another, and both errors are expensive in different ways.
Should the invoice be posted to the ledger while it waits?
That depends on whether your close process would rather explain a clearing balance or an unposted backlog, and it is a controller's decision rather than an AP one. What is not optional is that every held invoice has a stated position at cut-off: accrued, matched, or disputed. A hold with no accounting position is how goods-received-not-invoiced balances become unexplainable.
Why not just pay against the invoice and the PO, without a receipt?
Because the receipt is the only evidence that anything arrived. A 2-way match against the PO confirms that you agreed to buy something at a price, not that it was delivered, which leaves duplicate deliveries, short shipments and phantom deliveries undetectable. 2-way matching is a legitimate choice for defined categories with a compensating control, but it should be an explicit policy per category, not a workaround for slow receipting.
What if the receipt exists but was posted against a different PO line?
Re-match across the supplier's open receipts before escalating anything. A receipt keyed against the wrong line of a multi-line order is common and mechanically detectable, because the quantities reconcile at supplier and period level even when they fail line by line. Detecting it automatically also stops a buyer from correcting the same mis-key by hand every month.
- three-way match
- goods receipt
- accounts payable
- exception handling
The work behind this page
Builds from our portfolio that this page draws on.
Read next
- Three-way matching: the documents, and the fields the join runs onThe purchase order, the goods receipt and the invoice each assert something different. Matching them is a join on 8 fields, and every one is a place it can fail.definition
- The invoice quantity is right and the match fails: unit-of-measure driftThe extraction is right, the totals reconcile, and the line still fails on quantity. When the ratio between the two quantities is a clean pack multiple, nobody is over-billing you.diagnostic
- Your exception queue is growing: it is a defect list, not a headcount gapA queue that grows faster than it clears is almost never evenly spread. Pivot it by exception type against supplier and entity, and a handful of cells will be carrying most of the volume.diagnostic
- Invoices sit in approval for days: find the hop where it diedStop chasing approvers and start aging the hop. Time-in-hop, the resolved principal and the notification result identify the stall in minutes, and four of the five causes are configuration rather than behaviour.diagnostic
- Non-PO invoices: what an automated flow can match them against insteadNo purchase order means no agreed quantity, price or delivery to join against. Four substitute commitments, in order of strength, and what each one lets a system clear.definition
- The same invoice got paid twice: finding the near-duplicate your check missedThe exact-match check passed because the second document differed in one of the three fields it compares. Five ways one bill becomes two, the fuzzy key that catches each, and where the sweep belongs.diagnostic
Working on something in this space?
Tell us where you are in a sentence or two. We'll tell you honestly whether we're the right team, and what a sensible first slice of the work looks like.
Start the conversation