26
documents processed
24 unique dispatch notes — 2 exact duplicates caught
1,279
line items extracted
1,202 after de-duplication
12,816 kg
food moved over 6 weeks
≈ 30,000 meal-equivalents at 420 g
26 / 26
totals reconciled exactly
extracted line weights = stated note total, ±0.000 kg
What the Medway Sustainable Food Policy asks — and what this service already measures
One monthly invoice forward — or purchasing through AgileChain dynamic procurement — covers five of the eight policy KPIs automatically. The rest is a one-page quarterly declaration.
| Policy KPI (Feb draft) | Measured automatically? | Demo result (this flow) | What we need from the caterer |
| Local Spend — baseline +5% Y1 | YES when provenance is named | 0% — surplus documents carry no provenance, so none can be credited | Invoices naming suppliers/origin, or purchasing via AgileChain dynamic procurement |
| Plant-Rich — >30% spend on fruit/veg/pulses | YES | 52% by weight | Invoices only |
| Protein Shift — −10% meat volume | YES where units given | meat 9.8% of weight | Invoices only |
| Freshness Ratio — pre-prepared ≤40% of spend | YES | 24.9% pre-prepared (by weight) — inside trigger | Invoices only |
| Biodiversity — ≥20 plant species per menu cycle | YES | 40+ distinct plant types in 6 weeks | Invoices only |
| Nature Positive — % LEAF Marque / organic produce | PARTIAL | 0.45% organic-labelled | Supplier certification declarations / register match |
| Medway Healthy Food Standard (App A) — welfare, MSC, free-range, Fairtrade, RSPO, additives | EXCEPTION-FLAGGED | 14 lines flagged in this demo (see below) | Annual one-page certification declaration; flags target the annual deep-dive spot check |
| Economic Support — 95% SME invoices paid in 30 days | DECLARED | n/a | One line on the quarterly declaration |
Standard audit — exception flags raised on this flow (demo)
The Standard’s product rules can’t be certified from an invoice line — but they can be screened. The pipeline reads product names and flags likely non-compliance for the deep dive, turning the annual spot check from random into risk-based:
- Eggs (free-range rule): 11 egg lines found — 2 resolved free-range by brand (St Ewe), 9 flagged: line gives no production method, certification to be confirmed by declaration.
- Fairtrade categories (tea, coffee, sugar, bananas): 5 lines flagged — coffee and banana purchases with no certified marking on the line.
- Fish (MCS avoid list): species named on every fish line (salmon, cod, prawns, bass, mackerel) — none on the avoid list. 0 flags.
- Meat welfare (Red Tractor or equivalent): 0 of 183 meat lines carry accreditation text — not flaggable from lines; verified by annual declaration + deep dive.
Design principle: the dashboard exists to support institutions adopting the policy to track progress — not to add audit burden. Caterer pricing is never shown to any buyer; the council sees compliance measures only.
Eatwell plate alignment PROOF-POINT LAYER
Alignment is measured from documents, so it can be confirmed or denied — not asserted.
All food moved, by weight — including what sits outside the plate
Eatwell Guide plate — reference proportions
Fruit & vegStarchyProteinDairyOilsDiscretionary (12% — no place on the plate)Composite & other
Segment by segment — measured vs guide, within the plate-mappable share
Measured (this flow)Eatwell Guide reference
Surplus flows skew fresh: fruit & veg runs ahead of the guide share, starchy staples behind. Discretionary (1,529 kg) and composite (928 kg) are reported honestly rather than force-fitted to a plate segment.
Sourcing metrics ASSUMPTION LAYER
Solid fill = what these documents evidence today. Dashed markers = assumed year-1 and year-5 targets [to confirm with partners].
Named Kent grower or producershare of food volume traceable to a named local grower/producer
measured today: 0.0% (0 kg of 12,739 kg traces to a named grower on-document)
Agroecologically grown (certified or verified)certified organic or equivalent verified practice
measured today: 0.45% (58 kg carries an organic label)
Invoices alone may miss these details — a line can name a product without naming the farm. KFP is engaging growers to use AgileChain, which will enhance this view considerably: purchases made there carry provenance automatically, and everything else is matched against the county grower register.
What moved, by food group
kg across the 24 unique notes, grouped from the notes’ own food taxonomy
Discretionary (sweets, snacks, drinks)
Cold-chain split
Chilled · 7,814 kg (61%)Ambient · 3,676 kg (29%)Frozen · 1,326 kg (10%)
Flow by week
kg per week commencing, 13 Apr – 22 May 2026 (unique notes)
Data-quality flags raised automatically
- Exact duplicates: notes 1981662 and 1962359 were each uploaded twice; second copies excluded from all totals.
- Near-duplicate pairs held for review: 1990468/1989883, 1988915/1987981, 1977112/1976161, 1973922/1973248 and 1961361/1961141 share most content on the same or adjacent days — flagged for a human decision, not silently merged.
- Weight-only documents: no £ values exist on these notes; spend metrics await supplier invoices, which carry prices and flow through the same pipeline.
Reconciliation — the accuracy check
Sum of extracted line weights vs the total printed on each note. One row per document; duplicates greyed.
| Note | Date | Lines | Extracted kg | Stated kg | Diff | Status |
| 1990468 | 22/May/26 | 52 | 473.243 | 473.243 | +0.000 | MATCH |
| 1989883 | 22/May/26 | 53 | 477.243 | 477.243 | +0.000 | MATCH |
| 1988915 | 20/May/26 | 76 | 664.767 | 664.767 | +0.000 | MATCH |
| 1987981 | 20/May/26 | 76 | 666.567 | 666.567 | +0.000 | MATCH |
| 1985876 | 15/May/26 | 57 | 576.180 | 576.180 | +0.000 | MATCH |
| 1985514 | 18/May/26 | 67 | 443.400 | 443.400 | +0.000 | MATCH |
| 1981662 | 13/May/26 | 37 | 342.424 | 342.424 | +0.000 | MATCH |
| 1984009 | 15/May/26 | 59 | 581.580 | 581.580 | +0.000 | MATCH |
| 1981662 | 13/May/26 | 37 | 342.424 | 342.424 | +0.000 | DUPLICATE |
| 1979897 | 11/May/26 | 41 | 428.900 | 428.900 | +0.000 | MATCH |
| 1979681 | 11/May/26 | 41 | 430.900 | 430.900 | +0.000 | MATCH |
| 1977112 | 06/May/26 | 42 | 544.640 | 544.640 | +0.000 | MATCH |
| 1976161 | 06/May/26 | 43 | 572.640 | 572.640 | +0.000 | MATCH |
| 1973922 | 01/May/26 | 58 | 624.530 | 624.530 | +0.000 | MATCH |
| 1973248 | 01/May/26 | 59 | 624.770 | 624.770 | +0.000 | MATCH |
| 1970951 | 29/Apr/26 | 46 | 756.522 | 756.522 | +0.000 | MATCH |
| 1968679 | 27/Apr/26 | 35 | 544.075 | 544.075 | +0.000 | MATCH |
| 1967251 | 24/Apr/26 | 48 | 373.948 | 373.948 | +0.000 | MATCH |
| 1964831 | 22/Apr/26 | 44 | 504.556 | 504.556 | +0.000 | MATCH |
| 1962428 | 20/Apr/26 | 56 | 613.432 | 613.432 | +0.000 | MATCH |
| 1962359 | 17/Apr/26 | 40 | 526.614 | 526.614 | +0.000 | MATCH |
| 1962359 | 17/Apr/26 | 40 | 526.614 | 526.614 | +0.000 | DUPLICATE |
| 1961361 | 17/Apr/26 | 43 | 539.734 | 539.734 | +0.000 | MATCH |
| 1961141 | 17/Apr/26 | 45 | 548.659 | 548.659 | +0.000 | MATCH |
| 1959028 | 15/Apr/26 | 40 | 502.540 | 502.540 | +0.000 | MATCH |
| 1956575 | 13/Apr/26 | 44 | 454.060 | 454.060 | +0.000 | MATCH |