Every order line, checked.
A supplier sends a PO confirmation, invoice, or quote as a PDF. Linekeeper reads it, matches every line against your open order, and surfaces only the lines that don't agree. A person confirms the exceptions — a clean structured record goes to your system.
The problem
Your supplier has no API. They send a PDF.
Someone on your team opens every confirmation, reads down the lines, and checks them by eye against what was ordered — quantities, unit prices, the promised ship date. Most of the time it all matches and the work was pointless. When it doesn't match, catching it late means a short shipment, a price you never agreed to, or a re-key error that rides the order all the way through.
Text extractors and Zapier-style flows pull the words off the page. They don't do the part that matters — reconcile the document against the order it belongs to, and tell you what changed.
A worked line
This is the whole job.
One line off a supplier's PDF, set against the matching line on your order PO-10432.
| Source | Unit price | Line total | Verdict |
|---|---|---|---|
| Your order | 35.00 | 420.00 | expected |
| Their PDF | 39.00 | 468.00 | PRICE_MISMATCH |
The other three lines on this order matched and never reached a person. This one did — a $48 difference that would otherwise have been found at invoice time, or not at all.
The review screen
What a person actually sees.
The whole document, with the two rows that need attention marked. Every field here is editable — correcting one re-matches the document and teaches this supplier's layout.
TOTAL_MISMATCH LOW_CONFIDENCE_LINE
| Match | SKU | Description | Qty | Unit | Line total |
|---|---|---|---|---|---|
| OK | BRK-14A | Bracket, 14mm, zinc | 40 | 6.50 | 260.00 |
| PRICE_MISMATCH | GSK-22 | Gasket set, viton | 12 | 39.00exp 35.00 | 468.00 |
| OK | PLT-09 | Cover plate, powder-coated | 8 | 69.50 | 556.00 |
| MISSING_IN_DOC | SHM-03 | Shim, 0.5mm stainless | — | —exp 100 @ 0.80 | — |
Two of four lines need a person. The other two are already done.
How it works
Four steps. A person only touches the last one.
The document arrives
Upload the PDF, or have the supplier reply to an intake address and it lands on its own. Every file is kept and addressable by hash.
It's read into fields
PO number, supplier, currency, totals, promised ship date, and every line — SKU, description, quantity, unit price. Illegible fields come back empty with a confidence score, not a guess.
It's matched against your order
Linekeeper finds the open order by PO number, lines up each row by SKU — falling back to description when the codes don't agree — and compares quantity, price, and totals within a tolerance you set.
You confirm the exceptions
Clean documents pass straight through. Only the ones with a flagged line need a look. Edit anything on screen — your correction re-matches the document and is remembered for that supplier.
What you see
The flags are the product.
Every line lands in one of these. Green passes without you. Amber and red are the only rows that need a person.
On confirm, your system gets one record with the same shape every time — whatever the PDF looked like:
{
"po_number": "PO-10432",
"supplier": "Kaimai Components Ltd",
"matched_order_id": "ord_e0185346d66f",
"currency": "NZD",
"promised_ship_date": "2026-09-09",
"totals": { "subtotal": 1284.00, "tax": 192.60, "grand_total": 1521.60 },
"lines": [
{ "sku": "GSK-22", "quantity": 12, "unit_price": 39.00,
"match": "PRICE_MISMATCH", "expected": { "unit_price": 35.00 } }
],
"exceptions": ["TOTAL_MISMATCH"],
"match_status": "NEEDS_REVIEW",
"review_status": "confirmed"
}
Pull it from GET /api/export/:id, or have it posted to your webhook the moment someone clicks confirm. Payload reference.
Who it's for
Drop-shippers and distributors
Dozens of supplier confirmations a week, every one a slightly different layout, every one checked by hand.
Small manufacturers
Buying components against POs, where a wrong quantity on line 7 becomes a line-down problem three weeks later.
Pricing
One workspace, unlimited suppliers, the full pipeline. If it doesn't save someone real time in the first week, it isn't for you and you don't pay.
What it doesn't do yet
Stated plainly.
- One order per documentNo partial shipments, multi-PO documents, or back-order splits.
- Single workspaceNo multi-tenant accounts or per-user roles.
The full list, and what's next, is on the changelog.