Every order line, checked.
Suppliers send PDFs. Linekeeper reads them, checks every line against your order, and flags only what's wrong. Confirm the exceptions and a clean record goes to your system.
Three of your own documents free, no card. The demos are always free, with no account.
No ad trackers, nothing sold, and your documents never train anything. Visits are counted with Cloudflare's cookie-free analytics. Privacy policy.
| Source | Unit price | Line total | Verdict |
|---|---|---|---|
| Your order | 35.00 | 420.00 | expected |
| Their PDF | 39.00 | 468.00 | PRICE_MISMATCH |
One real line, off one real supplier PDF, against PO-10432. The 39.00 was written on by hand.
Your supplier has no API. They send a PDF.
Someone checks each one by eye: quantities, prices, ship dates. Most match, so the time is wasted. The few that don't get caught late, as a short shipment or a price you never agreed to.
Text extractors pull the words off the page and stop. Linekeeper checks them against your order. On that document, two lines matched and never reached a person. The gasket line was $48 over and another line was missing, both caught before an invoice.
Four steps. A person touches only one of them.
Every document takes the same path from a supplier's inbox to your order book.
The document arrives
Upload it, or have suppliers email an intake address. Every file is kept and hashed.
It's read into fields
Every field, header to line items. Unclear values come back empty with a confidence score, never a guess.
It's matched against your order
Matched to your open order by PO number, row by row, within a tolerance you set.
You confirm the exceptions
Clean documents pass straight through. Only flagged lines need a look, and corrections are remembered for that supplier.
What a person actually sees.
Every row flagged, every field editable. A correction re-matches the document and teaches that 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.
Your order book fills itself.
Import orders from a CSV, paste them as JSON, or connect a purchasing system that already has them.
Cin7 Core
Katana
Unleashed
Shopify
BigCommerce
WooCommerce
Ecwid
Squarespace
Wix
Adobe CommerceCin7 Core, Katana and Unleashed bring your open orders. The rest lend their catalogue.
Xero
QuickBooks
MYOBConnect your accounting system and each confirmed document goes straight in as a Bill. Volume plan.
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 the same shape of record 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.
Three free documents, no card, demos never count. One workspace, unlimited suppliers. If it doesn't save real time in the first week, don't pay.