Billing check

Every shipment checked against the customer's PO before it's billed.

A small tool that finds everything you've shipped and not yet billed, checks each one against the price on the customer's own PO, and sends your billing person one email every morning: what's safe to bill and what needs a look first. When the invoice goes out, it files the PDF where it belongs. It never sends an invoice itself. Your people still do that.

ShippedReadCheckedBilledFiled

2:40 PM. A shipment goes out the door.

ERP
Packing list 60412 shipped
CustomerKestrel Motion Systems
Job51206
Customer POKMS-88213
Lines3
ShippedOct 7, 2:40 PM
InvoicedNot yet

Until now, somebody pulled up the customer's PO next to the invoice and checked every line by hand before billing it.

What happens next

The clean ones don't get rechecked. Here's every step, and everything it sends.

Each step is marked with what does the work. The AI reads the customer's PO. Plain software checks, decides, emails and files.

01
Plain software

It finds what shipped and hasn't been billed

Every weekday morning it reads your ERP and pulls every shipment from the last 60 days that has no invoice against it yet. Anything already invoiced is left off, so nothing on the list can be billed twice.

Found
5 shipments not yet invoiced · Oct 8
TicketJobCustomerShipped
6041251206Kestrel Motion SystemsOct 7
6041351197Pinecrest Fluid PowerOct 7
6041551188Alder Creek PumpsOct 6
6041751202Northfield GearOct 7
6041951211Tamarack IndustrialOct 7
02
AI

It reads the customer's PO

For each shipment it opens the PO from the job folder, the file the customer actually sent, scanned ones included. It reads every line: the part numbers (the customer's and yours, which customers often bury in the description), the quantity, and the price per piece. When the folder holds more than one revision, it reads all of them.

Read
KMS-88213_RevB.pdf
Customer
Kestrel Motion Systems · PO KMS-88213
LnPart on the POQtyPrice each
1KM-4410 bracket, your part 7731-220200$14.60
2KM-4415 spacer, your part 7731-225400$2.35
3KM-5002 housing, your part 7740-10050$88.00
03
Plain software

It checks every line

Plain software takes it from there. It finds each shipped part on the PO, even when the customer uses their own part number or leaves a character out of yours. Then it checks: does the invoice price match the PO to the cent? Has more shipped than was ordered, counting every shipment on that line? Do two PO revisions disagree? Does this shipment owe freight, going by how it actually shipped? A collect shipment never gets freight added. A prepay-and-add shipment always does.

The AI only reads. The checks decide.

Checked
Ticket 60412 against PO KMS-88213
  • All 3 shipped parts found on the POmatched on your part numbers in the customer's descriptions
  • Invoice prices match the PO to the cent3 of 3 lines
  • Not shipped over the ordered quantitycounted across every shipment on each line
  • PO revisions agreeRev A and Rev B carry the same prices and quantities
  • No freight to addships collect, on the customer's own carrier account
04
Plain software

One email every weekday morning

At 7:00 every weekday your billing person gets one email: what's safe to bill, and what needs a look first, with the reason. Up top it shows which checks ran and how many shipments passed each one, so the ready list can be trusted instead of rechecked. Held items come back every morning until they're billed or fixed.

If its own PO reader ever breaks, the subject line says so in plain words and a red warning goes above everything else, so a broken check never passes for an ordinary morning.

From
Billing Check
Subject
Billing Check: 3 ready, 2 to review (Oct 08, 2026)

What we checked automatically

  • Price matches the customer's PO: 4 of 5
  • A price is on the order: 5 of 5
  • Not shipped over the ordered quantity: 5 of 5
  • Freight: 5 of 5 (1 needs freight added)

Ready to bill (3)

  • JOB 51206 · Kestrel Motion Systems · $8,260.00
  • JOB 51197 · Pinecrest Fluid Power · $1,512.50
  • JOB 51202 · Northfield Gear · $3,045.00

Hold, needs a human (2)

  • JOB 51188 · Alder Creek Pumps: price doesn't match the customer's PO
  • JOB 51211 · Tamarack Industrial: add freight, everything else checks out
05
Plain software

Every hold says why, and what to do about it

A hold is a work instruction, so each one names the real problem: the price differs from the PO, the PO lists the part twice at different prices, there's no PO on file, or the PO didn't scan clearly enough to trust. When freight is the only thing left, it says everything else checks out. When your ERP is set to bill a held shipment automatically, it says so in red. Once someone has looked at a hold, one click sets it aside, and it comes back on its own if the reason changes.

Hold
JOB 51188 · Alder Creek Pumps
Ticket60415 PO fileACP-30771.pdf Amount$6,120.00 WhyPrice doesn't match the customer's PO. Check before billing.
  • Your ERP will auto-bill this. Fix it before the billing run.
Reviewed: set aside
Hold
JOB 51211 · Tamarack Industrial
Ticket60419 PO fileTI-5520.pdf Amount$2,210.00 WhyAdd freight: key in the actual carrier charge.

Everything else checks out. Add the freight and this is good to bill.

Page
Set aside ticket 60415?

It will stop appearing in the morning Billing Check email until its reason changes or it's billed in your ERP.

SET ASIDEOne click from the email
06
Plain software

It files the invoice when it goes out

When your billing person emails the invoice, a copy goes to a shared invoice mailbox. The tool picks up the PDF and saves it twice: in that customer's invoice folder, following whatever month-folder habit that customer's folder already has, and in the job folder. It names the file the way your files are already named.

Out-of-office replies, bounces and its own email are ignored. If it can't tell yet whose invoice it is, it waits and tries again rather than filing it somewhere wrong.

Filed
Invoice #60412.pdf
CustomerKestrel Motion Systems
Invoice folderInvoices / Kestrel Motion / 2026 / 10 OCT
Job folderJobs / Open / JOB 51206 / Invoice
FiledOct 8, 9:14 AM
StatusFiled
07
Plain software

Job folders close only when everything is billed

When the last invoice on an order goes out, it moves the job folder from open jobs to closed, into the right number bucket. It only does that when every line has shipped and every shipment on the order has been invoiced. An order billed in pieces stays open until the last piece is billed.

Job folder
JOB 51206 moved to closed
Lines shipped3 of 3
Shipments invoiced2 of 2
Moved toClosed Jobs / 51000-51999 / 51200-51299
StatusClosed
08
Plain software

The invoice that never arrived still gets caught

A tool that only watches its own inbox can't see an email that never came. So every morning it also compares what your ERP invoiced against what it has on file. Any invoice with no saved copy a day later goes at the top of the morning email in red, and stays there until someone sends it again or files it by hand.

An invoice that was saved but couldn't be copied into its job folder gets its own list, carried every morning until it lands. A folder the tool is never allowed to reach can be taken off that list with one click.

In the email
Invoices we never received (1)

Your ERP raised this invoice, but no copy ever reached the invoice mailbox, so no PDF has been saved anywhere. It needs sending again, or filing by hand, before it drops off this list.

InvoiceCustomerInvoice dateDays
60388Bayview ComponentsOct 17

Where the AI is, and where it isn't

AI reads the customer's PO. Plain software does everything else.

AI
  • Reading the customer's PO, whatever layout they use, scanned copies included
  • Pulling out each line's part numbers, quantity and price per piece
  • Saying how sure it is of its reading, so a poor scan gets held for a person
Plain software
  • Finding what shipped and hasn't been billed
  • Matching each shipped part to its PO line, and every price, quantity and freight check
  • The morning email, the invoice filing, closing job folders and the missing-invoice check

AI is very good at reading a document it has never seen before. It isn't exact, so here it only reads. Every number it reads is compared by plain software, a poor reading is held for a person, and nothing is marked ready to bill on the AI's say-so.

The numbers so far

Its totals matched the ERP's own billing report on day one.

12 of 12 Shipment dollar totals that matched the ERP's own billing report to the penny, the first day it ran, so it reads the ERP right before it checks a single price against the customer's PO.

As of August 2026, from the tool's own records. I tune each of these tools every month on what it got wrong the month before, so the numbers climb over time. The first month is always the worst one.

It had to earn it

Almost every tool I've built broke the first time it met real data. This one did too.

The first version checked each invoice against the price on the order in the ERP. That price is the one somebody typed in from the customer's PO, so it agreed every time. A number checked against itself always passes. On the first real batch of twelve shipments, it called eleven of them ready to bill and held one, for freight.

11 ready, 1 held6 ready, 6 held The same twelve shipments, once it read the PO the customer actually sent

So I rebuilt it to read the customer's own PO and compare every price against that. Every one of the six holds was real: two were billed in progress payments, so the price didn't match the PO on purpose, two had no PO on file, one PO didn't name the part, and one needed freight added. I caught it before the billing office ever got a morning email. That's what making one of these hold looks like: keep putting real shipments through it until the strange ones stop surprising it.

Built once, adapted to yours

This is the baseline. Yours bills the way you do.

Everything above is the tool as it runs today. The parts that do the hard work stay the same. The parts that touch your systems, your customers and your billing rules get fitted to how you already work.

What stays
  • Finding everything shipped and not yet billed
  • Reading the customer's PO and checking price, quantity and freight
  • One morning list of what's ready and what needs a look
  • Filing invoices, and catching the ones that never went out
What gets adapted
  • Your ERP and your accounting system
  • Your freight rules, customer by customer
  • Where your customer POs and invoices live
  • Who gets the morning list
Blanket orders

Each shipment checked against what's left on the blanket and its release price.

Progress billing

Long jobs billed in stages, each invoice checked against the stage it covers.

Distributors

Prices from contracts and price lists instead of one PO per order.

How it gets set up

It runs next to your people before it runs on its own.

  1. Connect it to your ERP, your file storage and an invoice mailbox.

    It reads your ERP and never writes to it. Nothing gets replaced.

  2. Set it up around your billing.

    Which customers get freight and how, where the customer POs live in your job folders, how your invoice folders are laid out, and who gets the morning email.

  3. Run it alongside your current process.

    It builds the morning list without sending it to your billing office, so you can check its ready and hold calls against the way you bill today.

  4. Turn it on.

    The morning email goes to your billing person and invoice filing switches on. Closing job folders comes on once filing has proven itself. Anything it can't verify stays on the hold list for a person.

Quoted up front, no hourly billing. I host it and keep it running, and a care plan covers fixes and changes as your operation changes. The code is yours, and I'll transfer it to you at any time.

Linked Operations · AI implementation for manufacturers

If someone in your operation checks invoices against POs by hand, let's talk.

Tell me how billing works today, from the shipment to the invoice to where the paperwork gets saved. I'll tell you straight whether a tool like this fits, whether something lighter would do, or whether it isn't worth it for you.

Email Jason →

Jason Markham

Nearly 25 years in manufacturing, including a decade running a machine shop. I build these tools myself, and they run every day.

I help manufacturers and distributors implement AI, automate workflows, and reduce errors with small, focused software builds that take over the back office work: the data, the paperwork, the busywork between the systems they already run.

[email protected]