Can Three-Way Match Catch Surcharge Persistence?

Three-way match checks price, quantity and receipt. Surcharges live outside that check. Here is what closes the gap. Part of the ValueXPA margin drift library.

Twitter LinkedIn WhatsApp
Ask AI: ChatGPT Claude Gemini Grok
Can Three-Way Match Catch Surcharge Persistence?

Margin drift is the gap between what a vendor contract says and what the invoice actually charges. Surcharge persistence, a fuel surcharge or peak surcharge that stays on the invoice after the condition that justified it has ended, is one shape that drift takes.

Many finance teams assume their existing controls already catch this. Three-way matching is the control already running in the AP department. This page asks a narrow question: does it actually test the surcharge, or only the parts of the invoice it was built to check.

Executive Summary

Three-way matching compares the invoice, the purchase order and the receiving record. It confirms the vendor billed the quantity that was ordered and received, at the unit price on the PO. That is a real control, and it catches real errors: wrong quantity, wrong unit price, an invoice with no matching receipt.

A surcharge is a different kind of line. It usually rides on the PO as an accessorial or miscellaneous charge with no independent price or quantity to check against, and its legitimacy depends on a condition stated in the contract, not on the purchase order: a fuel index level, a peak season window, an emergency response trigger. Three-way matching has no field that encodes that condition, so it cannot evaluate whether the condition still holds.

What changes this is a control that reads the contract clause itself, not just the PO and receipt, and re-tests the surcharge's trigger on every invoice cycle. That is a different control from three-way match, run alongside it rather than instead of it.

1. What does three-way match actually check?

Three-way matching compares three documents: the purchase order, the receiving record, and the invoice. It confirms the vendor billed the quantity actually ordered and received, at the unit price the PO specifies, and it blocks payment when any of the three disagree. It is a quantity and unit-price control built around a single transaction.

It was never designed to evaluate whether a separately stated charge is still contractually justified once the condition behind it has changed.

The control answers three questions only: did we order this, did we receive this, and does the price match. Each question resolves against a document that already exists at the time of the match.

A surcharge line does not fit neatly into any of the three. It often has no corresponding PO quantity, because it is priced as a percentage or flat add-on rather than a per-unit charge. Some ERPs route it through a miscellaneous or non-stock line that skips quantity matching entirely.

The result is a control that can approve an invoice cleanly while a stale surcharge sits on it, because nothing in the three documents being compared says whether the surcharge's underlying condition is still true.

  • Purchase order: States what was ordered and at what unit price, set before the invoice arrives.
  • Receiving record: Confirms the quantity that physically arrived, independent of billing.
  • Invoice: Is checked against the other two for quantity and price agreement, not against the contract clause behind a surcharge.

2. Why does a surcharge outlive its trigger?

A surcharge is attached to a condition stated in the contract: a fuel index band, a peak season date range, an emergency or expedite flag. The invoice line, once added to a vendor's billing template, keeps generating on every cycle unless someone removes it. Nothing in the AP workflow re-checks the triggering condition each period, because that condition lives in a contract document, not in the ERP fields the invoice touches on its way through approval.

A fuel surcharge tied to a diesel price index is added correctly when the index crosses the stated threshold. The billing template that generates it does not automatically remove itself when the index falls back below that threshold.

A peak season surcharge behaves the same way. It is added for a defined window and often persists past the window's end date because nobody on either side is tasked with removing it.

Three-way matching checks the invoice against the PO and receipt; it does not test a surcharge's expiration condition, because that condition is not a field either document carries.

Where three-way match tests a surcharge line, and where it does not.

Question Tested by three-way match? What actually answers it
Was this quantity ordered? Yes Purchase order
Was this quantity received? Yes Receiving record
Does the unit price match the PO? Yes Purchase order
Is the surcharge's trigger condition still true? No The contract clause and current index or date
Was the surcharge ever authorized at all? Partially Contract terms, not PO fields

3. Can a stronger three-way match close the gap?

Extending three-way match with tighter tolerances or more line-item detail improves quantity and price accuracy, but it does not add a field for the surcharge's contractual trigger, because that trigger was never part of the PO or receipt in the first place. Closing this gap requires a control that reads the contract clause directly and compares it against a current, external fact: an index level, a calendar date, or an event log, not the PO.

Some AP teams respond by tightening match tolerances or requiring more granular PO lines for accessorial charges. That reduces certain errors, a surcharge billed at the wrong rate, for instance, but it does not touch the underlying problem.

The underlying problem is that the surcharge's legitimacy depends on information three-way match was never built to hold: a rate schedule, an index threshold, a date range defined in a separate contract document.

A control that closes this gap has to ingest the contract clause itself, extract the trigger condition, and re-test it against a current external value on every billing cycle, independent of whether the PO and receipt agree with the invoice.

4. What does a control built for surcharge persistence look like?

A control built for this problem parses the contract clause that authorizes the surcharge, stores the trigger condition as a rule, and re-evaluates that rule against the current invoice period rather than against the purchase order. It flags any surcharge line still billing after its stated condition, index level, or date window has lapsed. This is a rule that lives outside the PO-receipt-invoice loop three-way match runs on.

The mechanism has three parts. First, the contract clause is read and the trigger condition is captured as a discrete rule: an index threshold, a date range, an event definition.

Second, each invoice cycle is checked against that rule using a current external value, the index reading for that period or the calendar date, rather than against anything the PO contains.

Third, a surcharge line that no longer satisfies its trigger is flagged for review before payment, separately from whatever three-way match already approved.

A. Rule capture

The contract clause defining the surcharge, its rate, and its trigger condition is extracted once and stored as a structured rule rather than left as free text in a PDF. This is the step three-way match has no equivalent for, since it works from PO and receipt fields, not contract language.

B. Period re-test

Each billing period, the rule is checked against a current fact: a published index value, today's date against a stated window, or a logged event. The test runs independent of whether the invoice quantity and price already matched the PO.

5. Where does this fit alongside AP's existing controls?

A surcharge-persistence check runs alongside three-way match, not instead of it. Three-way match still confirms quantity and unit price agree with the PO and receipt, and it should keep doing that. The surcharge check adds a second pass that reads the contract clause and tests the trigger condition, catching the class of error that occurs precisely when the first three documents already agree with each other.

Removing three-way match would be a mistake. It catches quantity errors and unit-price errors that a contract-clause check was never built to find.

The two controls test different failure modes. Three-way match tests whether the invoice matches what was ordered and received. A surcharge-persistence check tests whether a specific line is still contractually justified at all, regardless of whether it matches the PO.

An invoice can pass three-way match cleanly and still carry a surcharge that should have dropped off two billing cycles earlier, because passing the match only confirms internal consistency between three documents, not consistency between the invoice and the contract's current terms.

6. How do you find surcharge persistence already sitting in past invoices?

Finding surcharge persistence that has already been paid means pulling the contract clause for each surcharge type, identifying its trigger condition, and re-running that test against the historical index or calendar values for the periods already billed. This is retrospective work distinct from the forward-looking control described above, and it is the kind of review a margin drift diagnostic performs across freight, contract labor, and other service categories where surcharges recur.

Past invoices carry no flag showing whether a surcharge's trigger was still valid at the time. Finding it means reconstructing the trigger from the contract, then checking it against the historical value for each period already invoiced.

This work spans categories beyond freight. Contract labor agreements carry shift and premium surcharges with their own trigger conditions, and IT service contracts carry expedite or after-hours surcharges with the same structure.

A structured review of this kind sits inside a broader contract compliance audit, one of the categories covered by a full freight and 3PL audit or an IT and professional services audit, where surcharge terms are checked line by line against what was actually billed.

For the wider pattern this sits inside, start with the margin drift guide.

7. Frequently Asked Questions (People Also Ask)

Does three-way matching catch a fuel surcharge that should have expired?

No. Three-way matching checks that the invoice quantity and unit price agree with the purchase order and receiving record. A fuel surcharge's validity depends on an index threshold stated in the contract, a fact none of those three documents contains, so the match can approve the invoice while the surcharge is stale.

Why does my ERP's three-way match not flag surcharge lines?

Most surcharge lines route as miscellaneous or accessorial charges with no independent PO quantity to check, so the match either skips them or checks only that the total ties out. The trigger condition behind the surcharge lives in the contract, not in a field the ERP compares.

Is a surcharge that outlives its trigger the vendor's fault or ours?

It is usually neither an error nor bad faith. The billing template that generates the surcharge does not remove itself when the underlying condition lapses, and no party is specifically tasked with catching that on a recurring basis unless a control is built for it.

What contract language should I check first for surcharge persistence?

Start with any clause that ties a surcharge to a fuel index, a defined date range, or an event like peak season or emergency response. Extract the exact trigger and threshold, then compare it against what actually applied in the billing period, not just against the purchase order.

Can I add a surcharge check inside my existing three-way match workflow?

You can route surcharge lines for separate review, but the check itself needs the contract clause and a current external value, an index reading or a date, neither of which the PO or receipt carries. It functions as an added rule, not an extension of the existing quantity and price match.

Does this only affect freight surcharges?

No. The same structure appears in contract labor agreements with shift and overtime premiums, and in IT and professional services contracts with expedite or after-hours charges. Any surcharge tied to a condition rather than a fixed rate can persist past its trigger.

How is surcharge persistence different from accessorial charge creep?

Surcharge persistence is a charge that was once valid and stays on the invoice after its trigger lapses. Accessorial charge creep covers a broader set of add-on fees appearing or growing without contractual basis at all. The two overlap but are not the same drift type.

What is the first step to check if this is happening in our AP data?

Pull every recurring surcharge line from the last several invoice cycles per vendor, then match each one against its contract clause's stated trigger and the corresponding index or date for that period. A line that fails the trigger test in more than one period is worth investigating.

Margin Drift Resources