Can AI Read Delivery Notes and Update Stock Automatically?

Coding Liquids tutorial cover featuring Sagnik Bhattacharya for Can AI Read Delivery Notes and Update Stock Automatically?
Coding Liquids tutorial cover featuring Sagnik Bhattacharya for Can AI Read Delivery Notes and Update Stock Automatically?

Yes, for printed delivery notes from regular suppliers. An AI model can read a photo or PDF, extract supplier, PO number, item codes and quantities, and post a goods receipt to your stock system. But stock should update automatically only when every line matches an open purchase order and the physical count; shortages, substitutions and handwritten changes should wait for a person.

The reading is the easy part. The hard parts are matching the supplier's codes to yours, handling units (a "box" of 50 against your "each") and remembering that a delivery note records what the supplier says it sent, not what arrived. Automations that skip the count at goods-in put the supplier's mistakes straight into your stock figures, where they surface weeks later as a stockout nobody can explain.

Follow me on Instagram@sagnikteaches

What AI reads well on a delivery note, and what it doesn't

Part of the noteHow well current models read itWhat to do about it
Printed table of lines, codes and quantitiesWell, from a flat, sharp photo or PDFAutomate
Supplier name, note number, date, PO referenceWell, if printedAutomate; hold if the PO reference is missing
Batch or lot numbersMostly, but 0/O and 1/I get confusedCheck against a pattern (e.g. two letters, six digits)
Handwritten amendments ("8 rec'd", crossed-out figures)PatchyAlways a person
Carbon copies, crumpled or shadowed photosPoorlyRescan, or type
Multi-page notesWell if all pages are in one fileScan as one document, not separate photos

Modern AI models read documents far better than older text-recognition software, because they understand layout and context rather than just characters. The difference is explained in AI document extraction versus traditional OCR. But "far better" still isn't "always", which is why the posting rules further down matter more than the choice of model.

Connect on LinkedInSagnik Bhattacharya

Why the delivery note can't be your only source of truth

Stock should change only when three things agree: what you ordered (the purchase order), what the supplier says it sent (the delivery note) and what your staff counted on the bench. Here's an illustrative set of lines where they don't:

Subscribe on YouTube@codingliquids
ItemPODelivery noteCountedWhat should happen
M8 hex bolts, zinc2,0002,0002,000Post automatically
Bearing 6204-2RS10010096Post 96; raise a shortage with the supplier
Shaft seal 25x40x75030, "balance to follow"30Post 30; leave 20 open on the PO
Bronze bush 20mm4040 of "20mm bush, sintered"40Hold: possible substitution

An automation that trusted the note alone would have booked four extra bearings and missed a substituted part. The count doesn't have to be slow: for small deliveries, staff confirm "count matches note" with a tap; only differences need typing. Running a stocktake faster with AI and a phone scanner covers quick counting methods that also work at goods-in.

The mapping table that does most of the work

Suppliers use their own codes, descriptions and units. Your stock system uses yours. The link between them is a mapping table, and building it is the biggest single job in this project. An illustrative extract for a manufacturer of spare parts:

SupplierSupplier codeSupplier unitYour SKUUnits per supplier unit
Fastener supplierHB-M8-30-ZBoxFAS-0831200
Bearing distributor6204-2RS-C3EachBRG-62041
Seal supplierOS254007PackSEA-254010
Steel stockholderEN8-BAR-40MetreRM-EN8-401 (metres)

The conversion column prevents the classic error: the note says "10 boxes" and the automation books 10 bolts instead of 2,000. Start the table from your last three months of purchase orders, which already pair supplier codes with your items, and let the automation add unknown codes to a "needs mapping" list rather than guessing. An AI model can suggest matches for unknown codes from the descriptions, which speeds things up, but a person confirms each new mapping once, and from then on it's a lookup.

How the pipeline fits together

  1. Capture. Goods-in photographs the note flat and in good light, or saves the PDF if the supplier emails one. Microsoft Lens has been retired, so use the scan feature in the OneDrive mobile app or Google Drive's scanner, which straighten and crop pages and save them to a watched folder.
  2. Extraction. An AI step reads the file and returns structured fields (see the prompt below). This can run in Zapier, Make or n8n with your own model key, or in a document-processing tool.
  3. Matching. A lookup finds the open purchase order, maps each line through the table and compares quantities with the PO and the count. This is plain logic, not AI.
  4. Posting. Lines that pass the rules are posted as a goods receipt through your stock system's API or a CSV import. In Shopify, for example, received stock is recorded on the purchase order in the admin (Products, then Purchase orders, then Receive inventory) with accepted and rejected quantities, per Shopify's help page on receiving inventory.
  5. Exceptions. Everything else lands in a queue with the photo, the extracted lines and the reason, for a person to resolve.

For the extraction step, a prompt along these lines works with most current models:

Read this delivery note. Return JSON only with: supplier_name,
delivery_note_number, date (YYYY-MM-DD), po_number (null if absent),
lines: [{supplier_code, description, quantity, unit, batch}],
handwriting_present (true/false), handwriting_text,
pages_seen, confidence_notes.
Copy codes and numbers exactly as printed. If a value is unclear,
use null and explain in confidence_notes. Do not guess.

An illustrative result for a two-line note:

{"supplier_name": "Bearing distributor", "delivery_note_number": "DN-448210",
 "date": "2026-09-22", "po_number": "PO-3187",
 "lines": [
  {"supplier_code": "6204-2RS-C3", "description": "Deep groove bearing", "quantity": 100, "unit": "EA", "batch": "BX220917"},
  {"supplier_code": "6205-2RS-C3", "description": "Deep groove bearing", "quantity": 50, "unit": "EA", "batch": null}],
 "handwriting_present": true, "handwriting_text": "only 96 rec'd",
 "pages_seen": 1, "confidence_notes": "Batch on line 2 obscured by stamp"}

What you'd check: the handwriting note refers to line 1 but the JSON doesn't say so, which is exactly why handwriting sends the whole note to a person. And the null batch on line 2 is correct behaviour: a model that invented a plausible batch number would be much more dangerous than one that admits it can't read it.

Rules for when stock updates without a person

SituationAction
PO found, every line mapped, note equals count, within PO quantity, no handwritingPost automatically
Part delivery clearly marked, count matches notePost received quantity; leave balance open on the PO
Count differs from noteHold; post the count after a person confirms; log a supplier discrepancy
Unknown supplier code or unitHold; add to "needs mapping"
No PO number, or PO already fully receivedHold; possible duplicate or wrong delivery
Delivery note number already processedReject as duplicate scan
Handwriting, damage noted or confidence notes presentHold for a person

What the person sees in the exceptions queue decides how fast they can clear it. A useful entry has the photo, the extracted lines and a one-line reason, with the likely action pre-filled. An illustrative entry:

HOLD: DN-448210, bearing distributor, PO-3187. Reason: handwriting present ("only 96 rec'd") and count differs on line 1 (note 100, counted 96). Suggested: post 96 of BRG-6204, post 50 of BRG-6205, log a shortage of 4 against the supplier. [Approve] [Edit] [Reject]

Most holds then take under a minute. If people regularly have to open the stock system to work out what to do, add the missing context to the entry.

Start stricter than this: for the first month, hold everything and let a person approve each posting with one click. Once a month of approvals shows the automatic path would have been right, switch it on. Adding human approval steps to AI automations shows how to build the one-click approval.

Worked example: 35 deliveries a week at a spare-parts manufacturer

An illustrative manufacturer of spare parts for packaging machinery receives about 35 deliveries a week (roughly 150 a month) from around 40 suppliers: bar stock, bearings, seals, fasteners and bought-in electrical parts. Its goods-in clerk used to key each note into the stock system and check it against the PO: about 10 minutes a note, or nearly six hours a week. Stock accuracy at quarterly counts was poor, and nobody tracked supplier shortages.

The build, on an automation platform with an AI step, took about 25 hours spread over a month: 12 of them on the mapping table (about 900 supplier codes from past POs), 6 on the automation, and 7 on testing. Running costs were small. Each note uses a handful of automation tasks (more for long notes), which fitted within an entry-level paid tier. AI costs depend on the model and how many tokens a page image uses, which varies by model and resolution; on an assumption of about 3,000 input tokens and 400 output tokens per note, Claude Sonnet 5 ($2 and $10 per million) costs about a cent a note, and OpenAI's gpt-5.6-luna ($0.20 and $1.20) about a tenth of a cent. At 150 notes a month, that's under $2 either way.

MeasureBeforeMonth 1Month 3 (illustrative)
Clerk time on goods-in paperwork per week5.8 hours3.5 hours1.8 hours
Notes needing a personAllAll (approval mode)About 1 in 5
Supplier discrepancies loggedNot tracked117
Items off at the quarterly count38 SKUsn/a12 SKUs

The exception rate fell mainly because the "needs mapping" list shrank as new codes were confirmed. Across a month, the clerk's time fell by about four hours a week, roughly 17 hours a month, which paid back the 25-hour build in under two months. The discrepancy log turned out to be a bonus: two suppliers accounted for most of the shortages, which gave the buyer something concrete to raise with them.

Tests to run before you trust it

Build a test set of 30 past delivery notes whose correct entries you know, including awkward ones: a part delivery, a note with handwriting, a two-page note, a photo taken at an angle and a supplier with odd units. Run them through and score every field, not just "did it work". Failures to expect, and how they show up:

  • Unit errors: "10" booked where 10 boxes of 200 arrived. Shows up as a stock figure 1% of what's on the shelf. Fix with the conversion column and a rule that every supplier unit must be mapped.
  • Character confusion in batch numbers: "BX22O917" with a letter O. Shows up when a quality recall can't find the batch. Fix with a pattern check.
  • Duplicate scans: two people photograph the same note. Shows up as double stock. Fix by rejecting any delivery note number already processed.
  • Missing PO numbers: some suppliers print them only on the invoice. Shows up as a pile of held notes from the same supplier. Fix by asking the supplier to print it, or by matching on supplier plus items plus open POs, with a person confirming.
  • Rolled-up lines: a note lists "fixings kit" that your PO split into six items. Shows up as a permanent mapping exception. Fix with a one-to-many mapping row.

Aim for every field correct on at least 28 of the 30 before switching on even approval mode, and for the misses to be caught by a rule rather than slipping through. If handwritten goods-in forms are part of your process too, turning handwritten forms into spreadsheet data with AI covers the extra checks handwriting needs.

When a supplier's own data beats reading the paper

AI is the answer for paper and PDFs you can't avoid. For your biggest suppliers, ask first whether they can send the delivery details electronically. Many distributors can email an advance shipping notice (a file listing what's on the lorry, often sent the evening before) or a CSV of each delivery, and some print barcodes on each line that a phone scanner can read. Structured data like that is exact, needs no extraction and costs nothing per note.

An illustrative wholesaler receiving 60-line pallets from three large suppliers took this route: those three sent delivery files that were imported directly and checked against the count, while AI handled the remaining 30 smaller suppliers' paperwork. The three large suppliers covered nearly half the lines received, so the AI pipeline had much less to do and far fewer long, dense notes to read. It's worth one email to each of your top five suppliers before you design anything.

An off-the-shelf feature or a build of your own?

Before building anything, ask your stock or accounting system's vendor four questions: Can it capture delivery notes itself, or only supplier invoices? Can it receive against individual PO lines, including part deliveries? Does it have an API or a CSV import for goods receipts? And can it flag a receipt that differs from the PO? Many systems handle supplier invoices well and delivery notes barely at all, because invoices drive payments and get more attention from vendors.

A wholesaler whose stock lives in Shopify, for instance, can record receipts on purchase orders in the admin since Shopify's Stocky app stopped working on 31 August 2026; a custom automation would feed those receipts rather than replace them. A manufacturer on a small ERP might find a CSV import is the only route in, which works fine for a daily batch. If invoices are your bigger pain, matching supplier invoices to purchase orders automatically uses the same matching logic, and many businesses build both together. The broader picture of turning scans into data is in AI document processing.

How to tell it's working after a month

  • Cycle counts: count 20 fast-moving SKUs that the automation has posted. If they match, the chain from note to stock works.
  • Exception rate: the share of notes needing a person should fall as the mapping table fills. If it doesn't, look at which rule triggers most.
  • Time at goods-in: ask the clerk, and time a few deliveries. The saving should be visible within weeks.
  • Discrepancy log: shortages and substitutions per supplier. A log that stays empty probably means counts aren't being done.

If those four look right, you have what the question asked for: delivery notes that update stock automatically, with a person looking only at the ones that deserve it.

Delivery notes and AI: other questions

Can AI read handwritten changes on a delivery note?

Often, but not reliably enough to post stock on its own. Current models read neat handwriting such as '8 rec'd' or a crossed-out quantity reasonably well, and misread rushed scrawl, carbon copies and notes written over printed text. Treat any handwriting as a trigger for human review: the AI's job is to spot that an amendment exists and show it to someone, not to decide what it says.

Does it work with delivery notes in other languages?

Mostly, yes. The large models read common languages well, and item codes and numbers are language-neutral anyway. The weak spot is product descriptions and unit words, where a translated 'carton' or 'pack' may map to the wrong unit. Rely on supplier item codes and your mapping table rather than descriptions, and test a sample of each foreign-language supplier's notes before automating them.

Do staff still need to sign the delivery note?

Keep whatever signing or checking your suppliers and carriers require, because a signed note is often your evidence in a shortage or damage claim. Better still, have staff note shortages or damage on the paper before signing, then photograph it. The photo becomes the record the AI reads, so an amendment written at the door flows straight into the exceptions queue.

Further reads

Sources: Shopify help pages on purchase orders and receiving inventory; facts sheet (Microsoft Lens retirement, Shopify Stocky shutdown, API token prices, automation platform pricing). The business, volumes and test results are illustrative.

Want goods-in to update your stock without the typing?

On a 1:1 call we'll look at your delivery notes, purchase orders and stock system, decide which lines can post automatically, and design the exceptions queue for the rest.

Book a 1:1 call with me