Skip to content

Scan a delivery

A delivery arrives with no paperwork on the system side. The chef called the supplier yesterday by phone. A small producer just pulled up unannounced with a crate of vegetables. A new supplier is piloting with the venue and there’s no purchase order on file yet. In every case the kitchen has a piece of paper in its hand and no PO to open. Scan a delivery is the path that bridges the gap: take a photo, let the AI read it, confirm what arrived, stock moves.

This path is built on the same final step as the manual flow — every line ends up adding stock and stamping cost on the right pantry row. What’s different is the front half: the operator doesn’t pick a PO from a list, doesn’t type quantities, doesn’t match line items by hand. The AI does the boring work and asks for a confirmation on what it wasn’t sure about.

Why this page exists

A delivery note is a piece of paper with six to thirty lines on it. Each line names a product, a quantity, a unit, a price, a line total. Typing all of that into a phone twice a day is the kind of work nobody does well — it gets postponed to the evening, then to “tomorrow”, then it’s a guess at the end of the week. The kitchen ends up with a pantry that lies and dish costs that drift.

The AI dissolves that problem. The operator photographs the paper, the page reads the lines in five to fifteen seconds, and a list of extracted items appears next to the photo. The names the supplier wrote in Italian on the note — Basilico Genovese fresco, Pomodoro a grappolo, Cipolle bianche dolci — are translated to the canonical English names the pantry uses — Basil, fresh, Tomato on the vine, White onion, sweet. Lines the AI is sure about confirm themselves. Lines it isn’t sure about land in a queue for a one-tap confirmation each.

What’s left for the operator is judgment, not typing.

The rule

The photo is the source. The AI is the reader. The operator is the judge. Stock only moves when the operator confirms — but the operator confirms only what the AI wasn’t sure about, not the whole invoice.

How to use it

Open /admin/receiving. Tap the blue Scan-first button at the top right (the alternative to Receive a delivery, which assumes a PO exists). The scan dialog opens.

Tap Choose files, photograph the delivery note with your phone. Any phone works — iPhone or Android — so just snap the note as it is; the photo is prepared for you automatically. For a multi-page invoice, photograph each page and add them to the same upload — the AI reads them as one document. Each thumbnail shows a check mark once uploaded. Tap Scan.

Five to fifteen seconds later a panel appears telling you what happened. There are four possible outcomes, depending on how confident the AI is:

  • Auto-received against PO-… (green). The AI recognised the supplier, found a matching PO in the open list, every line matched, every price was within tolerance — stock has already gone up. You can close the dialog; the work is done. If there were small price differences flagged, the panel tells you how many; you can review them on the PO later.
  • Saved for review (amber). The AI found a likely PO match but wasn’t confident enough to auto-confirm — usually because the supplier’s name on the note doesn’t quite match a known supplier, or some line names didn’t map. Open the Pending Review tab to finish it.
  • Saved as ad-hoc delivery (amber). The supplier is recognised but no open PO matched. This is the typical case for a phone order the chef placed without writing it up. Open Pending Review to confirm the items; the system creates a synthetic PO behind the scenes so the audit trail stays clean.
  • Forwarded to invoicing (purple). The AI didn’t recognise the supplier at all. The photo goes to the accounting team’s invoicing app — they own the financial side from there. If you recognise the supplier yourself, two inline shortcuts let you fix it on the spot: Pick supplier manually brings the receipt back into receiving under Pending Review; Re-forward resends the photo to accounting if the first send failed.

In every outcome the photos are kept. You can always go back to the scanned receipt — or the PO it ended up linked to — and see the original paper.

What happens behind the scenes

When you tap Scan, the system stores the photos, sends them to the AI model that reads invoices, and gets back a structured list: supplier name, invoice number, invoice date, currency, and one entry per line (description, quantity, unit, unit price, line total). If the cheaper primary model returns garbled text, the system silently retries once with a stronger model — you see a successful result either way, or a clean “couldn’t read” message if both attempts fail.

Names on the paper rarely match the pantry exactly. The supplier writes Basilico Genovese fresco; the pantry has Basil, fresh. The AI normalises during extraction — it translates Italian product names to the canonical English ones used in the inventory catalogue and tries to map each extracted line to an existing supplier product (the named pack the supplier sells, with its size and unit, that’s already on the supplier’s price list).

Two confidence checks decide which of the four outcomes you see. First the supplier match: the supplier name extracted from the paper is fuzzy-matched against the venue’s supplier list. No match → forward to invoicing. Second the line match: how many extracted lines correspond to lines on an open PO from that supplier, with a tolerance on quantities and prices. Strong match → auto-receive. Weak match → save for review. No PO at all but supplier is known → save as ad-hoc.

If the same photo is scanned twice (image hash check), the second attempt is silently rejected with a pointer to the existing record — no double charge, no duplicate stock.

The lines that auto-confirm follow exactly the same code path as the manual receive flow: stock goes up, cost gets stamped on the pantry row, the recipe cascade fires, the PO transitions. The lines that don’t auto-confirm wait for you in Pending Review.

Worked example — Wednesday’s ad-hoc vegetables

It’s Wednesday morning at your venue. A small producer — Orto di Mauro, the new biodynamic farm the chef met at the market last weekend — pulls up at 9:00 with a crate. No PO was ever written. The driver hands Sara, the line cook prepping for service, a paper note. Six lines, in Italian, with handwritten quantities.

Sara opens /admin/receiving on her phone, taps Scan-first. She photographs the note with the phone camera, taps Scan. Eleven seconds later the panel appears.

The AI extracted six lines: 5 kg pomodoro (mapped to Tomato, fresh), 2 kg basilico (mapped to Basil, fresh), 10 kg patate (mapped to Potato), 3 kg cipolle (mapped to White onion), 1 kg aglio (mapped to Garlic), 8 kg zucchine (mapped to Zucchini). Invoice total: €87.40. The supplier name extracted from the paper — Orto di Mauro — fuzzy-matches the venue’s supplier list. Three of the six lines match named products already on the supplier’s price list, with quantities and prices in the expected range; the other three (basil, garlic, zucchini) are products this supplier hasn’t sold to the venue before, so the AI can’t map them confidently.

Because no open PO exists for this supplier, the panel reads Saved as ad-hoc delivery — open Pending Review. Sara taps the Pending Review tab. The receipt is at the top with a count badge of 1.

She opens it. The triage dialog shows the photo on the left and the line table on the right, all six lines pre-filled, three of them already mapped to inventory items, three with a dropdown waiting for her to pick. She picks Basil, fresh for the basil line, Garlic for the garlic, Zucchini for the zucchini. She taps Confirm ad-hoc receipt.

Stock goes up across all six pantry rows. The total invoice — €87.40 — is recorded. A synthetic PO is created and marked as received against Orto di Mauro so reports can tell ad-hoc deliveries apart from planned ones. The recipe cascade fires; every dish that uses any of the six ingredients picks up its fresh cost on tomorrow’s dashboard.

Total time from photo to confirmed: under a minute. Without the AI it would have been five minutes of typing and one of the lines would probably have been wrong.