The supplier price-drift watcher: the increase that arrived without a letter
Every invoice line compared with what you paid last time, per kilo, litre or piece, so a quiet 6% shows up the week it happens instead of at year-end
- One unit per item decided up front - per kilo, per litre or per piece - because comparing a case against a bottle produces a month of false alarms
- Twelve months of paid invoices, or an accounting export of purchase lines, to seed the history: a supplier price list is what was quoted, the invoice is what you were charged
- The supplier's own item code on the invoice, or a stable description you are willing to map by hand once
- Your yearly volume per item, at least roughly, or the weekly list has no euro figure and nobody acts on it
- A machine that stays on, with about 8 GB of RAM free if you want the local model as a fallback parser
- One named person who makes the phone call when a line is flagged, and the mandate to renegotiate
Version history
Every line on every supplier invoice compared with what you paid for the same item last time, in price per kilo, litre or piece — so the quiet 6% shows up the week it happens, not at year-end when the margin is already gone.
The architecture
the same flow as text
▼
[ Paperless-ngx — one archive, OCR ]
│ supplier, date, document number
▼
[ Docling or pdfplumber — the line items ]
│ description · code · quantity · pack size · price
▼
[ n8n — the comparison ] price per unit, now against last time
├─ unchanged → nothing happens
├─ up beyond your threshold → FLAGGED
├─ same price, smaller pack → FLAGGED
└─ item never seen before → NEW, for you to name
▼
[ Grist — price history, one row per purchase ]
item · supplier · date · pack · price per unit · your yearly volume
One list, once a week: what moved, and what it costs over a year at what you buy.
Four parts, and the important one is the smallest. The archive stores documents, the parser turns a page into rows, the table remembers what you paid, and n8n does a subtraction and a percentage. The parser reads. The arithmetic decides. Nothing in this chain is asked whether a price looks fair.
The problem
Your input prices are moving right now, and the official numbers say by how much. Eurostat's release of 5 August 2026 puts euro-area industrial producer prices 4.6% above June 2025, and 3.0% higher excluding energy. In the US, the Bureau of Labor Statistics put final-demand producer prices 5.5% higher over the twelve months to June 2026, with goods at 7.9%. Those are averages across whole economies. Your basket is not the average: half your lines did not move at all, one moved 15%, and the average tells you nothing about which is which.
The reason it goes unnoticed is boring. A price rise does not arrive as a letter. It arrives as a different number on line 7 of an invoice you check for two things: does the total look normal, and did the delivery match. Both pass, so you pay it. Three months later the same order costs more, the margin is thinner, and nobody can name the item that did it.
The arithmetic is worth doing once. Buy €10,000 a month of goods and that is €120,000 a year. Two percentage points of drift you never spotted is €2,400 a year. For a business netting €30,000, that is 8% of the profit, and it is invisible on every single invoice that caused it.
Then there is the version with no price change at all. Same price on the line, 900 g in the box instead of 1 kg: an 11% rise that your accounting system will never see, because your accounting system counts lines, not contents. Consumer law now treats this as the price increase it is — France's arrêté du 16 avril 2024 has forced food retailers over 400 m² to label reduced-quantity products since 1 July 2024. That protection stops at the shop shelf. Nobody labels the pack change on your wholesale invoice.
The shelf you can buy this from is split in two, with nothing in the middle. Procurement and spend-analysis suites do it well and are priced for a company with a purchasing department. At the other end, if you already run an ERP, a module exists (see below). If you run neither — which is most small businesses — you build it out of four parts you can verify, and two of them you are probably running already.
Tool choices — and why
Setup outline
1. Fix the unit before anything else. Every line converts to price per kilo, per litre or per piece. Compare a case against a bottle once and you will spend a month untangling false alarms.
2. Seed twelve months of history from invoices you have already paid, or from your accounting export. A supplier price list is what they quoted; the invoice is what you were charged, and only one of those is evidence.
3. Give every item two keys: the supplier's code and your own name for it. Match on the code, report under your name. A description-only key breaks the first time "Flour T55 25kg" becomes "FLOUR T55 SACK 25 KG".
4. Build extraction for your five biggest suppliers first. They are most of the money and their templates rarely change. The long tail can wait, and some of it never needs doing.
5. Set the threshold at 3%, and never below the rounding error of your own unit conversion. Flag drops over 5% as well — sometimes it is a credit in your favour, and sometimes it is a cheaper product substituted into the same line.
6. Make the pack-size column mandatory and flag it on its own. Same price, less product is the rise nobody reports.
7. Track the invoice-level charges as if they were items: delivery, fuel surcharge, small-order fee, pallet deposit. Otherwise you will announce that prices are stable while the totals climb.
8. The weekly list has five columns and one that matters: item, supplier, old and new price per unit, percentage, and what it costs over a year at your volume. Nobody rings a supplier about 4%. People ring about €1,900.
9. Run it silent for a month. Check ten flags against the paper invoice, fix the extraction, then start sending the list.
Pitfalls — the real ones
Verified repos
Paperless-ngx — GPL-3.0, 44k stars, commit today (13/08/2026)
Docling — MIT, 65k stars, commit 12/08/2026
pdfplumber — MIT, 11k stars, last commit June 2026
Grist — Apache-2.0, 11k stars, commit 12/08/2026
Baserow — core MIT (premium/ and enterprise/ directories under Baserow's own licence), 5.6k stars, commit today
n8n — Sustainable Use License (free self-hosted internal use), 199k stars, commit today
Ollama — MIT, 178k stars, commit today
OCA account-invoicing (module account_invoice_supplierinfo_update) — AGPL-3.0, 304 stars, commit 12/08/2026
ERPNext — GPL-3.0, 38k stars, commit today
Material Price Control (ERPNext app) — 2 stars, last commit February 2026. Listed because it is the only ERPNext-native option found; read it before you rely on it.
Price sources: Eurostat, industrial producer prices, June 2026 (released 05/08/2026) · US Bureau of Labor Statistics, Producer Price Index, June 2026 · Arrêté du 16 avril 2024 (French reduced-quantity labelling, in force 01/07/2024). Repo figures verified 13/08/2026.