A shelf price checker on AWS for about $25 a month
The largest store in a five-store independent grocery chain had a price change process that everybody believed worked. Head office changed prices in the till system on Tuesday night, a list printed on Wednesday morning, and somebody swapped the labels. The first time anybody photographed every shelf and compared it with the till, 97 labels showed a lower price than the customer would be charged.

Key takeaways
- A label that says less than the till is a legal problem. A label that says more is margin.
- Photograph the shelf and read it blind. The model never sees the till price.
- Compare against the price in force when the photo was taken, not the price now.
- Unit pricing is a per-store obligation, because the small shop exemption is per store.
- Designed on AWS for about $25 a month.
The whole system on one page
Before any code, here is the shape of what we are designing.
- Machine learning
- Analytics
- Front-end & mobile
Why labels drift in a business that is otherwise well run
Because a price lives in two places and only one of them is automatic. The till system takes a price change overnight, for every store at once, with an audit trail. The shelf-edge label takes the same change when a person with a printer and a roll of labels reaches that bay, and nothing records whether they did.
The process is usually fine on the day. Somebody prints the Wednesday list, works through it before the doors open, and misses a handful because a bay was being filled or the printer jammed. Nothing marks the handful, so they stay wrong until the next change to the same product, which for a slow line can be months away. Promotions make it worse: the start of one arrives with a box of point-of-sale material, and the end of one arrives with nothing at all.
What runs (the inside)
- The walk. A phone, a browser page and a bay number. Staff photograph the shelves and every label in every photo is read. Part 2.
- The match. Each label tied to a product, and to the price the till held at the moment of the photo. Part 3.
- The ranking. Which mismatches to fix before opening, which this week, and which are a question for head office. Part 4.
- The gap. A swap list in walking order, and a measure of how long labels actually lag the till. Part 5.
One store, one full walk
- Management
- Analytics
- Front-end & mobile
In plain words
A member of staff opens a page on their phone, types the bay number printed on the end of the aisle, and photographs the shelves section by section. Each photo lands in the account with its store, its bay and its time, and a vision model reads every shelf-edge label it can see: the description, the price, the unit price and its unit, any promotion wording and end date, and the barcode where it is legible.
The model is told nothing about what the labels should say. It does not see the till price file, the promotions calendar or the previous walk. That is deliberate, and part two explains why a reader that knows the expected answer is a reader that finds it.
Each label is then matched to a product, by barcode where the label carries a readable one and by description, size and position in the bay where it does not. The comparison is with the price the till held at the moment the photo was taken, including any promotion live at that moment, because the price file keeps changing after the walk and a later price makes a correct label look wrong.
Every mismatch is classified by direction before size. A label lower than the till is a customer overcharged, which is where the legal exposure sits. A label higher than the till is margin given away. A missing or wrong unit price is a fault only in a store that has to show one. What comes out is a list for the store manager in the order the store is physically walked, with the overcharges marked at the top.
Design rules that shaped every decision
- The label is read blind. The model never sees the price it is being checked against.
- Compare against the price in force at the photo’s timestamp, never the current price.
- Direction before size. An overcharge of 4p outranks an undercharge of 40p.
- A correct label in the wrong place is a wrong price, so position is part of the match.
- Store obligations are store data. Floor area decides whether unit prices are required.
- Nothing changes at the till automatically. A person decides whether to fix the label or the price.
What it does not do
It does not set prices. The till price file is the system of record, and the checker’s only opinion about a price is whether the shelf agrees with it. Head office decides what a tin of tomatoes costs; this decides whether the customer in aisle four can find that out.
It does not print labels either. Every shelf-edge label system already has a print queue, and the output here is the list that feeds it, ordered by bay.
And it does not look at competitors. Whether your prices are right is a different question from whether your shelves say them, and mixing the two produces a report nobody acts on.
The next four posts walk through each piece: reading a label from a photograph, matching it to the till at the right moment, deciding which mismatch to fix first, and measuring the gap between a price change and a label change. One diagram per post, a cost breakdown, and an engineering reference at the end.
All posts