Marlowe & Finch Back of house · Costing
Supplier invoices

Read every invoice. Catch every creep.

A supplier PDF lands; the system reads each line, matches it to the recipe it feeds, and flags where a price has crept up — so margin doesn't erode quietly. Nothing touches the recipe costs until a human says so. Read by Eleanor Marlowe, Chef & Owner

Invoices read this week
38
Across 11 suppliers, snapped or emailed in
Line items captured
214
Matched to recipe ingredients automatically
Flagged for review
6
Low-confidence reads & price spikes — held, not applied
Biggest price move
+18%
Coffin Bay oysters vs last delivery

One invoice, read into line items

Each line matched to the recipe ingredient — and the dish — it feeds.
Tanjong Pagar Seafood & Provedore Pte Ltd
Blk 18 Fishery Port Road, Jurong · GST Reg M2-0148823-7 · Wet & dry delivery, Tue/Thu/Sat
InvoiceTPS-24817
Date29 May 2026
DeliveryThu a.m.
Terms7 days
Read by OCR on receipt · 7 of 8 lines captured at high confidence · 1 line held for review (below). Vendor cites ~98% character accuracy on clean scans — we treat that as a claim, not a guarantee, so low-confidence reads always go to a human.
Item (as read) Qty Unit price Line total Matched to
Coffin Bay oysters, liveRead confidence 99% 9.0 doz $31.50/doz $283.50 Oysters Coffin Bay → snack · plate cost $14
Barramundi fillet, skin-onRead confidence 99% 7.2 kg $38.50/kg $277.20 Barramundi en papillote → main · plate cost $24
Ocean trout, Tasmanian, whole sideRead confidence 98% 5.4 kg $32.00/kg $172.80 Smoked ocean trout → entrée · plate cost $13
Crocodile tail filletRead confidence 97% 3.0 kg $44.00/kg $132.00 Crocodile boudin blanc → main · plate cost $19
Samphire, freshRead confidence 98% 1.5 kg $26.00/kg $39.00 Barramundi en papillote → garnish
Macadamia, whole rawRead confidence 99% 2.0 kg $33.00/kg $66.00 Charred broccolini → side · plate cost $4
Finger lime, by punnetRead confidence 96% 12 punnet $6.50/ea $78.00 Oysters Coffin Bay → garnish
Ocean trout roe, jar  ◴ smudgedNeeds a human 2 ? $48.00 / ?? $96.00 ? No confident match — see review queue
Subtotal (7 captured lines) · 1 line excluded pending review $1,048.50

Quantities are kept metric and as billed (kg, dozen, punnet); the system stores the supplier's unit and the per-kg equivalent so a "per dozen" oyster line and a "per kg" fish line can both be price-tracked over time.


What crept up this month

Unit cost over the last four deliveries. A rise here pushes the plate cost — which feeds the margin model.

Coffin Bay oysters

+18%
$26.70$28.20$31.00$31.50

Per dozen, over four deliveries. The oyster dish sits below the margin floor in UC07 already — this lifts its plate cost above the $14 we've costed it at. Market-priced dish: the lever is the supplier, not the menu price.

Barramundi fillet

+7%
$36.00$36.50$38.00$38.50

Per kg. The barramundi en papillote is the worst margin breach in the menu model at 54.5% food cost — a steady $1/kg creep here is exactly the silent erosion this tool exists to surface.

These deltas are surfaced, not applied. The recipe cost stays at its last confirmed value until someone in the kitchen accepts the new figure — which is when it flows into the plate-cost and margin model.


Two things wanting a human

Nothing auto-updates a recipe cost. Each change is confirmed by a person.
Low-confidence read

One line we won't guess at

The "ocean trout roe" line came through smudged — the OCR isn't confident on the quantity or the unit (is it 2 jars, or 2 kg, at $48 each or $48 per kg?). Rather than push a maybe-wrong number into the books, it's held out of the subtotal and parked here.

As read
Ocean trout roe · 2 ? · $48.00 / ??
Confidence
41% (below the 85% threshold)
Status
Excluded from total · awaiting a person
Open scan & correct Re-request from supplier

OCR accuracy is a vendor claim, not a promise. Treating low-confidence lines as "needs a human" rather than silently accepting them is the guardrail that keeps a misread digit out of the cost books.

Price-spike alert

Oysters up 18% in a month

The Coffin Bay oyster unit price jumped from $26.70 to $31.50 a dozen across four deliveries. That's above the +10% threshold, so it's flagged the moment it hits an invoice.

"Confirm this, and I'll move the oyster plate cost from $14 to $16 — and let UC07 re-rank the menu."

Move
$26.70 → $31.50 / doz (+18%)
Effect
Plate cost $14 → ~$16 if confirmed
Status
Proposed · not yet applied
Confirm new cost Hold — chase a quote

Confirming is one tap, but it is always a tap. The system proposes; the kitchen decides; only then does the figure feed the margin model.

Under the hood What this is today — and where it should go next

Today this is OCR plus a reconciliation layer: a hosted OCR engine reads the invoice into structured line items, a matcher links each line to a recipe ingredient by fuzzy description, and a variance rule compares the unit price to the last few deliveries. For a real 60-seat venue the honest recommendation is to buy a Singapore-native tool (FoodRazor does exactly this — invoice OCR, line-item catalogue, price alerts); for this demonstrator we run the OCR engine ourselves (AWS Textract AnalyzeExpense in the Singapore region, for data residency) and build the matching and variance flags on top. It reads and flags well; it does not, and should not, write a cost without a person.

On the roadmap

  1. Match the purchase order, not just the recipe. Compare each line to what was actually ordered, so an over-bill or a short delivery is caught — the box of oysters you paid for but didn't receive.
  2. Learn each supplier's quirks. The same barramundi is "barra fillet S/O" from one provedore and "Barramundi, skin-on" from another. Per-supplier description mapping cuts the low-confidence reads over time.
  3. Yield-aware costing. A 7.2 kg fish delivery isn't 7.2 kg of plate — trim, bone and skin come off. Folding yield into the per-portion cost makes the figure that reaches UC07 the true one.
  4. Daily food-cost close. With invoices read on arrival, the day's COGS can be struck the same evening rather than at month-end — turning a quarterly surprise into a nightly number.
  5. The guardrails don't move. Low-confidence lines stay human-reviewed; price changes stay human-confirmed; the OCR's accuracy stays a vendor claim we verify, never trust blindly. The system proposes — it never silently rewrites a cost.
Full use-case write-up — the problem, benefits and vendor landscape: UC08 — Supplier invoice OCR → Feeds the plate-cost model in the UC07 menu-engineering mock-up → · illustrative data, not a live system.