Skip to content
Protocolzone Protocolzone

Data to Data · Retail & FMCG

Cutting food waste with markdown timing built into pricing

Waste shows up as a shrinkage variance after the period closes, so markdowns happen when someone notices the date, not when the margin has already gone.

This is a retail & fmcg problem we approach through our Data to Data service line.

The problem

Every business selling perishable stock runs a standing auction against the use-by date, and most run it blind. Stock arrives, sells at full price until someone notices the date, gets a sticker at whatever discount is house custom, and what does not clear goes in the bin. The bin is weighed, if at all, as a monthly shrinkage number that arrives too late to change anything.

The margin story is worse than the waste story. Marking down too late means the discount does not clear the stock and you take the write-off anyway — the markdown and the waste. Marking down too early gives margin away on stock that would have sold at full price. Both errors are invisible in a shrinkage variance, because the variance records what was lost, not what the alternative was worth.

And the outside world has started counting. Australia’s National Food Waste Strategy commits to halving food waste by 2030 — against an estimated 7.6 million tonnes a year costing the economy around $36.6 billion, roughly 70% of it edible. New South Wales has legislated phased FOGO source-separation mandates that reach supermarkets, cafes, hotels and hospitals, with donation-reporting obligations for large supermarkets. The EU adopted binding national reduction targets in 2025 — 10% in processing and manufacturing, 30% per capita across retail and consumption by 2030 — and France has required supermarkets above 400m² to donate unsold food since the Loi Garot in 2016. None of this is about your business specifically. All of it means waste is migrating from a private shrinkage line to a reportable, and in places regulated, number.

Why it’s hard

Wastage is usually not recorded as data. The single biggest obstacle is that the input does not exist. What was discarded, when, at what remaining shelf life, and why — spoiled, damaged, over-prepped — lives nowhere in most operations. A model asked to balance margin against waste with no waste record is optimising against half a ledger.

Markdown timing is a forecasting problem wearing a pricing costume. The right moment to mark a line down depends on how fast it is selling now, how much is left, and how long it has. All three vary per SKU, per site, per day. A blanket rule — 30% off the day before expiry — is precisely the thing that is wrong twice: too late for slow movers, needlessly early for lines that were going to clear.

Margin and waste pull the optimisation in opposite directions. Deep, early markdowns clear stock and destroy margin; holding price protects margin and fills the bin. The trade-off shifts with season, input cost and demand volatility, which is why it belongs inside a constrained optimisation rather than a policy memo. Written as a rule, it is out of date by the season after someone wrote it.

The discount changes the demand you forecast from. Markdowns distort the sales history — a line that cleared at 40% off looks like strong demand unless price is in the model. Naive forecasting on markdown-polluted history learns that discounts are demand and recommends more of them.

How we approach it

Wastage becomes a first-class input before anything is modelled. The first phase is capture: wastage logged where it happens, with a reason and a date, whether at the till, in the back room or at receiving. Our own point of sale, AmshPOS, is built to log wastage at the till; where another POS is in place, the same capture is a workflow and integration job. Either way, we do not start optimising until the bin is measured, because a model tuned against unmeasured waste flatters itself.

Spoilage risk sits inside the optimisation, not beside it. On the perishable-goods platform we built, the pricing recommendation came from a non-linear constrained optimisation — the class of problem the SciPy and Pyomo toolchain exists for — that carried spoilage risk, input-cost forecasts and margin targets together. Waste is a term in the objective, priced against margin, rather than a report someone reads after the prices are set. That structure delivered a 5–12% margin improvement in volatile seasons across 100+ SKUs.

Markdown timing falls out as an output. Once spoilage risk is in the model, “when to mark down, and how deep” stops being a separate question — it is the same optimisation evaluated over the stock’s remaining life, per line, per site. The recommendation arrives with its reasoning: velocity, stock remaining, days left, and the margin consequence of acting now versus waiting.

A person commits the price. Recommendations, with the trade-off visible — not automatic repricing. The human checkpoint is what catches a bad feed before customers see it, and it is what makes the numbers trusted enough to act on.

What we do not do. We do not promise a waste percentage for your business in advance — the honest figure comes out of your own data in the first season, not out of a proposal. We do not do continuous surge-style repricing of food, which burns customer trust for cents. And we would not deploy markdown optimisation ahead of wastage capture, however keen everyone is to skip to the model.

What it takes

Wastage capture as a workflow change. Staff log what is binned, with a reason. This survives only if a manager owns it and the till or back-room tooling makes it a ten-second act, which is why the capture phase is designed before the modelling phase is scheduled.

Dated stock data. Deliveries with dates attached, so the model knows the remaining life of what is on hand. Where receiving does not capture dates, that is the second workflow change.

A season of history, ideally two. Seasonality is where the 5–12% lived on the engagement behind this page — volatile seasons are when gut-feel pricing is furthest from optimal. The model earns most where the year swings hardest, and it needs to have seen the swing.

A markdown policy owner. Legal floor prices, brand rules about discount depth, donation arrangements for what still does not clear. The optimisation respects constraints; someone has to state them.

Where this has been done

The optimisation behind this page is delivered work. The perishable-goods pricing platform in the linked case study ingested daily sales, inventory and wastage data for a manufacturer’s catalogue of more than 100 SKUs, forecast volatile input prices at better than 90% accuracy, and ran a constrained optimisation balancing margin against spoilage risk — delivering a 5–12% margin improvement in volatile seasons, under confidentiality. Applying the same structure at the shelf edge — markdown timing per line, per site — is the same optimisation with retail constraints, and wastage capture through a point of sale such as our own AmshPOS is the input path; that retail-edge configuration is not itself a shipped reference, and we say so rather than blur it.

Position on this page

Evidence

Related delivery experience

Industry

Retail & FMCG

Written for

Commercial, Operations, Compliance

Outcome

Spoilage risk priced into every SKU's recommendation, with markdown timing computed per line from its own sales velocity and shelf life instead of guessed at the shelf.

Jurisdictions

  • NSW

Regulators

  • NSW EPA

Questions we get asked

Straight answers.

Is markdown optimisation the same as dynamic pricing?
No. Dynamic pricing moves prices with demand in both directions and often continuously. Markdown optimisation answers a narrower question: for stock with a date on it, when does discounting recover more value than holding price and risking the bin. The output is a timing and a depth per line, and it is a recommendation a person commits — not an algorithm repricing the shelf on its own.
What results has this approach produced?
On the perishable-goods pricing platform we built, constrained optimisation that carried spoilage risk alongside margin delivered a 5–12% margin improvement in volatile seasons, across a catalogue of more than 100 SKUs, with input-price forecasts running at better than 90% accuracy. Those figures belong to that engagement — a manufacturer's catalogue with strong input seasonality — and we would size expectations for a different business from its own data, not from these.
What data does markdown optimisation need?
Three feeds: transaction-level sales, stock with dates attached (received, use-by or best-before), and wastage recorded as data — what was discarded, when, and why. The third is the one most operators do not have, and without it the model cannot see the cost of holding price. Getting wastage captured at the till or in the back room is usually the first phase of the work.
Why is food waste becoming a compliance issue rather than just shrinkage?
Because governments have started writing it into law. Australia's National Food Waste Strategy targets halving food waste by 2030, and New South Wales has legislated phased source-separation mandates for food businesses through the FOGO Recycling Act 2025. The EU adopted binding national food-waste reduction targets in 2025, and France has required supermarkets to donate unsold food since 2016. Waste a business used to absorb quietly as shrinkage is progressively becoming a number someone outside the business gets to see.

Read next

Related work.

Other use cases

Platforms involved

Is this your problem?

Bring the constraint that makes your version harder than this one. That is the part worth an hour.