Rejected, Not Disputed
03 September 2026
Invoice 9107 went out on the 3rd: $18,270 of hauling, 126 loads, every ticket real and every rate right. It's now the 19th of the following month and it hasn't paid. Nobody called. Nobody emailed. In the customer's AP portal, if you knew to log in and look, its status has read "unmatched" since eleven minutes after you sent it.
That word is doing a lot of work, so slow down on it. A dispute means a person on the other side read your invoice and disagrees with something on it. Disputes are loud. They come with a name, a phone number, and usually a specific line: this load, this rate, this ticket we never signed. A rejection means no person read your invoice at all. Their system tried to match your lines to an open purchase order, couldn't, and parked the whole thing. A dispute has an owner and some urgency. A rejection has a status code.
Your billing office can't see the difference from the outside. Both look like an invoice that hasn't paid yet. But they age differently, and they end differently, and the second kind is yours to fix.
You're billing into their reference data
The PO number came out of the customer's procurement system, and their AP runs on it. At contractors, DOTs, co-ops, and plants big enough to run a match rule, an invoice line pays when it matches an open PO with balance remaining, and sits when it doesn't. No judgment involved. The match is the payment decision.
Now look at where that number lives on your side. The scale operator doesn't know it. The driver heard "the Route 9 job" from a foreman, so that's what the ticket's PO field says, when it says anything. The clerk keys the real number later, from the job folder, and the folder holds the quote, the contract, and the PO from the first release back in March. That chain breaks in three places, and each break lands differently.
The miskeyed number is the cheap one. 4500118276 keyed as 4500118267 matches nothing, and a transposed PO doesn't look wrong to anybody. A human reviewer would read right past it. The matching system just returns silence, and the invoice sits until your collections call finally excavates it, at which point you fix one digit and restart the clock. You lost 45 days on a typo.
The exhausted blanket costs real money. A blanket PO gets cut for a not-to-exceed amount, say $160,000 against an estimated season. The season runs long, the way seasons do. Some load in October crosses the cap, and every line after it bills against nothing. Their AP won't pay past the cap, and shouldn't: that's the control working as designed. Paying you now requires a change order, and a change order requested in December for October's hauling is a different conversation than one requested the week the balance got thin. The PM has to justify it upward, after the fact, against a closed budget. Some of those loads get paid in full. Some get shaved in the settling. The hauling was never in doubt; the paper aged past its leverage.
The closed PO is the quiet one. The PM marks the job complete, procurement closes the order, and your last invoice, the one carrying the straggler tickets, arrives a week later. It isn't late by your rules. It's addressed to a door that no longer exists.
flowchart TD
A["126 tickets keyed onto invoice 9107"] --> B{"PO checked at capture?"}
B -- no --> C["Invoice sent with the folder's best guess"]
C --> D["AP match fails: status, not phone call"]
D --> E["Found at day 45 by a collections call"]
B -- yes --> F{"PO open, balance covers the line?"}
F -- "exhausted or closed" --> G["Flagged the same day, chased while the job is open"]
F -- yes --> H["Line matches: paid on terms"]
Your aging report is grading your paperwork
Here's the claim your controller may want to argue with: a meaningful share of your over-45 AR isn't slow customers. It's invoices no one on the other side has ever been able to accept, and that share belongs to your billing office, not to collections.
The standard read of an aging report is a ranking of payment habits. Fine. Now run the other read. Take the over-45 bucket and write one word next to each invoice: "disputed," if a person over there has actually pushed back on it, or "silent." The silent ones are the tell. A customer sitting on an invoice they agree with is a cash decision, and you'll hear the usual story when you call. An invoice aging in silence at a PO-driven customer usually isn't a decision at all. It's unmatched, unowned, and invisible to every human being on both sides, wearing your customer's name while it does.
The cost is hard to see because almost none of it books as an error. The carrying cost on $18,270 for an extra 60 days you can compute. The shaved change order books as a concession. And the invoice against the closed PO of a finished job, rebilled twice, then written off in March because the PM changed companies and nobody inherits a dead argument, books as bad debt, filed under the customer's credit instead of your own paperwork.
Bill into the match, not at it
None of this asks the customer to change anything. It asks your side to treat the PO like what it is: reference data, with a number, a balance, an effective window, and a link to the customer and job it belongs to. Owned and current, not a line in a folder.
Once it lives there, the rest is counting. A ticket digitized at turn-in lands against its PO the day it arrives. A ticket with an empty PO field, or a number the reference data doesn't recognize, gets flagged that same day, while the foreman who said "Route 9" still remembers saying it. That's Termco's lane: the tickets captured, the ones that don't reconcile flagged, the PO list kept as managed reference data instead of a page in a folder, billing rules deciding which jobs bill to which release so the clerk stops guessing, and invoice totals assembled only from tickets that verified against a live PO, which makes the invoice leaving your office one their machine can read. There's a side effect that may matter more than any of it. When every ticket draws against a known order, the blanket running thin is visible in September, while the season still has weeks in it and the PM still needs your trucks. The call asking for the next release is still yours to make. Now you know to make it.
There's a one-afternoon version you can run first. Pull everything over 45 days, do the disputed-or-silent sort, and call your AP contact about the silent ones. Ask for status, not payment. Every "we show that as unmatched" you collect is an invoice your own office could have fixed a month ago, and the count tells you whether this is your leak.
If you'd rather start from the paper, send 10-20 sample tickets to hi@termco.ai, along with the PO they were supposed to bill under if you have it handy, and we'll send back what we find within 48 hours.
More from the Termco blog.
September 02, 2026
Paid at the Window, Billed to Nobody
Cash sales feel finished the moment the money changes hands. That makes the cash lane the least reviewed paper in the operation, and it leaks.
Read postSeptember 01, 2026
The Radio Is Not a Rate Sheet
Mid-job price changes get agreed by phone and honored by everyone except the invoice. A spoken rate that never reaches billing bills at the old one.
Read postAugust 31, 2026
The Month Ends Before the Tickets Do
Invoices go out on the 2nd. Tickets from the 30th are still in trucks. That seam decides whether those tickets bill twice, once, or never.
Read post