FlowParse
Tool August 2026 16 min read

Job costing from vendor invoices

A job shop's real cost sits scattered across dozens of supplier invoices for materials, outside processing and freight — each one referencing a job number, a PO, or nothing at all. FlowParse reads those invoices and matches every line to the job it belongs to.

FlowParse
flowparse.io
flowparse.iosound off is fine
0:00 / 0:00

The cost is real; the paper trail isn't

Ask a job shop owner what a specific job actually cost to run, and the honest answer is often a shrug followed by an estimate. Not because the information doesn't exist — it does, spread across a stack of supplier invoices for raw stock, a plating house's bill for an outside operation, a freight charge for an expedited shipment — but because nobody has sat down and sorted every one of those invoices back to the job that actually consumed the cost.

That sorting is tedious in a way that resists shortcuts: each invoice has to be opened, read, and its line items matched against whatever job numbering the shop uses, one at a time, month after month. Skip it for a quarter and the job-cost picture goes stale exactly when a bid for similar work needs it most.

FlowParse
flowparse.io

Why matching invoices to jobs is harder than it sounds

A single-job shop with one customer at a time barely needs this. A shop running a dozen open jobs simultaneously, each drawing on materials and outside services at different points, runs into several problems at once.

References are inconsistent between suppliers

One supplier prints your job number exactly as given; another abbreviates it, puts it in a free-text field, or only cites their own PO acknowledgment number instead.

One invoice often covers several jobs

A stock supplier ships materials for three open jobs on one delivery and one invoice, with the job breakdown buried in line-item descriptions rather than called out clearly.

Outside processing costs arrive separately from the part

A part sent out for heat treat or plating comes back weeks later with the invoice arriving separately still, easy to lose track of by the time it lands.

Shared costs don't belong to any one job

Freight, small tooling, and shop consumables often can't be attributed to a single job at all, and forcing them onto one distorts that job's true cost.

None of these are signs of a disorganized shop — they're the ordinary shape of running multiple jobs against a supplier base that has its own invoicing habits, and they're exactly why matching by hand, invoice by invoice, eats hours that a shop owner would rather spend quoting the next job.

What this doesn't do, stated up front

Doesn't invent a cost code

It matches on the job number, PO or cost code that already exists on the invoice or the linked purchase order. Where none exists, the line is flagged, never assigned by inference.

Doesn't decide direct versus overhead

Whether a cost is a direct job charge or shop overhead is a costing-policy decision your accounting or engineering team makes — this reads and matches what the invoice says, not what it should mean.

Doesn't replace your ERP or MES

Scheduling, routing, inventory and labor tracking stay exactly where they already run. This handles one specific input: vendor invoices.

Doesn't capture labor cost

Time clocks and labor tickets are a separate data source. This reads external costs — materials, outside processing, freight — that arrive on paper.

What's left is deliberately narrow, and it's the part that consumes the most unglamorous hours every month: turning a stack of supplier invoices into a job-by-job cost breakdown.

What gets read

FieldSource
Invoice date, number and totalSupplier invoice
Line-item description and amountSupplier invoice
Job number, PO number or cost code, where printedSupplier invoice
Job or cost-code reference, where the invoice cites a PO insteadPurchase order, if uploaded alongside
Cost type — materials, outside processing, freightRead from the invoice's own description

Five sources of truth, read as printed — not summarized, and not assumed to agree with your job list until the matching step actually checks.

FlowParse
flowparse.io

How a line finds its job

Matching starts with whatever reference the invoice line actually carries, and falls back in a fixed order rather than guessing.

Reference foundResult
Job number printed directly on the invoice lineMatched with high confidence
Only a PO number is printedMatched via the PO's own job reference, when the PO is available
A partial or slightly garbled referenceMatched with a flag for a quick confirm
No reference at allLeft unassigned, visible as its own group

A line that matches cleanly on a printed job number needs no review at all. A line that only resolves through a partial reference is exactly the case surfaced for a person to confirm — never silently accepted because it looked close enough.

FlowParse
flowparse.io

One invoice, several jobs

A stock supplier who ships materials for three open jobs in one delivery usually invoices it as one document, with the job breakdown living in the line-item descriptions rather than as three separate bills. Reading that invoice as a single total and dropping it against whichever job happens to be open would silently overstate one job and understate the other two.

Each line is read and matched on its own, so an invoice with rows for job 4471, job 4483 and a shared shop consumable splits into exactly those three destinations — two job-coded amounts and one line flagged as shared cost — rather than landing as one lump sum anywhere.

A month of supplier invoices, worked

A ten-person job shop, one month, 74 supplier invoices covering materials, two outside-processing vendors and a freight carrier.

ResultCount
Lines matched with high confidence211
Lines matched, flagged for a quick confirm18
Lines left unassigned — no reference found9
Invoices split across more than one job13

The 9 unassigned lines were mostly shop consumables and one supplier who never includes a job reference on anything — a five-minute pass to code those by hand, against 211 that needed no attention at all. The 13 split invoices were almost entirely the two main stock suppliers, whose deliveries routinely cover more than one open job at a time.

FlowParse
flowparse.io

How it works

1

Upload invoices, and POs if you have them

PDF or scanned supplier invoices for the period, plus purchase orders where the invoice only cites a PO number.

2

Each line is read

Description, amount and any job, PO or cost-code reference, kept linked to the source document.

3

Matched against job references

By printed job number first, PO reference second, with a confidence level per line.

4

Export

Excel, CSV or JSON — matched, split and unassigned lines kept as separate, labeled groups.

FlowParse
flowparse.io

Outside processing and subassemblies

A part sent out for heat treat, plating, anodizing or an outside machining operation generates its own invoice, often arriving weeks after the part itself came back and moved further down the router. By the time the invoice lands, the job it belongs to may no longer be top of mind for whoever opens the mail.

That invoice is read the same way as a materials bill: matched to the job number on the PO or router that sent the part out in the first place, so the processing cost lands against the job it actually belongs to rather than sitting in a generic outside-services expense line where it stops contributing to that job's true cost.

FlowParse
flowparse.io

Freight and consumables that don't belong to one job

Not every cost has a single home. A freight bill covering a mixed shipment, or a purchase of shop consumables used across every job in progress, can't honestly be attributed to one job number without distorting it.

Those lines are read and flagged as shared cost rather than forced onto whichever job happens to be open. What happens with a shared cost afterward — split evenly, allocated by a rule, or booked to overhead — is a costing decision for your accounting team, not something decided during matching.

When an invoice carries no job reference at all

Some suppliers simply don't print a job or PO reference on their invoices, no matter how many times you ask. Others send a one-off purchase — a replacement part for shop equipment, an office supply order — that was never going to belong to a job in the first place.

Both cases land in the same unassigned group: read in full, visible as their own list, waiting for someone with the context to decide where each one belongs. In practice this group is usually a small fraction of total invoice volume once a shop's regular suppliers are accounted for, and it shrinks further once a supplier is asked, once, to start including the job number on their invoices.

Actual cost against the estimate

A quoted job carries an estimated material and outside-processing cost from the bid. Once the matched invoice data accumulates against that same job number, the two sit side by side for the first time without anyone having to manually total a folder of paper against a spreadsheet estimate.

That comparison is where a job shop actually learns something — not from the invoice matching itself, but from seeing, job after job, whether the estimate was close or whether a particular material or a particular outside vendor consistently runs over. This tool produces the matched actuals; drawing the estimate-versus-actual comparison and acting on the pattern is covered in how to build a job costing workflow.

Feeding a work-in-progress schedule

For jobs still open at month end, the matched invoice lines are exactly the raw material a work-in-progress schedule needs — costs accumulated against a job that hasn't shipped or been invoiced to the customer yet.

Rather than duplicate that mechanic here, the specifics of building a WIP schedule from this same matched data are covered on their own page: work-in-progress schedule from invoices.

Who this is for

Job shops and contract manufacturers

Multiple open jobs at once, each drawing on materials and outside services at different times.

Shop owners who quote future work

A real cost history per job, instead of a gut feel, to price the next similar job against.

Bookkeepers serving manufacturing clients

The same matching process applied consistently across every client's supplier base and job numbering.

Controllers closing a monthly job-cost report

A matched, exportable dataset instead of a folder of invoices to sort by hand before the close.

This isn't an ERP or MES

Worth being precise about the boundary. A shop-floor or ERP system handles scheduling, routing, inventory levels and often labor tracking end to end. This does one specific thing underneath all of that: reading the vendor invoices that arrive on paper and matching them to the job they belong to.

For shops that already run an ERP with its own job-costing module, the output here is something to reconcile against it or import into it — a way to catch invoices that never made it into the system cleanly, not a second system competing with the one you already trust for production data.

FlowParse
flowparse.io

Moving off a spreadsheet

Most shops that reach for this have been coding invoices to jobs by hand for years — someone opening each PDF, checking it against the job list, and typing the amount into a spreadsheet column for that job. It works, in the sense that it eventually produces a number, but it doesn't scale past a handful of open jobs without eating a meaningful chunk of someone's week, and it leaves no record of how an ambiguous invoice was actually coded.

The transition doesn't require abandoning that spreadsheet on day one. A reasonable first step is running the automatic matching alongside the manual process for one month, comparing the two totals per job, and building confidence in where they agree before relying on the automatic result on its own.

What tends to convince a skeptical shop owner isn't a claim about speed — it's seeing their own supplier invoices land against the right job numbers on the first pass, with the handful of genuinely ambiguous ones already sorted out from everything that matched cleanly.

Privacy

Uploads go over TLS, encrypted end to end.

Processing runs on EU-hosted infrastructure.

Original documents are deleted immediately after extraction.

Supplier and job data are never used to train AI models.

For a shop handling supplier pricing and job-cost data, that's not a footnote — the details are on the security page.

Frequently asked questions

Match a real month of invoices

Upload a month of supplier invoices — no signup — and see how many lines match your job numbers on the first pass.

Keep reading