Open the planner
How it works prototype · synthetic data

Right product, right bar, right day.

Cortado is a working prototype of the planning tool a Retail Demand Planner would run at Wakuli: a store-and-SKU forecast for every bar, an order proposal for every delivery, and the KPIs to steer waste against availability. It is built around the way the bar network actually runs: a central hub, fixed delivery days, four menu changes a year, monthly coffee rotations and bars that open before they have any history.

What is real and what is not. The bar names come from Wakuli's public store locator. Everything else (volumes, SKUs, prices, stock, waste, events) is simulated in the browser when the page loads, so the tool can be shown without touching any Wakuli data. Swap the simulated feed for Lightspeed and Odoo extracts and the same logic runs on the real network.

1. The weekly rhythm

The tool is organised around the decisions a planner takes every week, not around the models behind them.

Every nightSales, stock and deliveries land from Lightspeed and Odoo. Forecasts refresh for every bar and SKU.automatic
Order dayEach bar gets a proposal per delivery: fresh and chilled for the next day, ambient for Monday and Thursday. Lead baristas confirm or adjust.Overview, Replenish
ExceptionsThe planner works the short list: stock-outs before the next delivery, expiring stock, waste risk, sales far off forecast.Overview
Store feedbackWhat the numbers cannot see goes in as an override with a note: road works, a new office next door, a marketing push.Forecast, Bars
Friday reviewAccuracy, bias, waste and availability per bar and category. Launches and menu changes for the coming weeks.Accuracy, Launches

2. Data in, decisions out

Data in
  • Lightspeed POS: units sold per bar, SKU and day. Drink sales are exploded into ingredients through the recipes (bill of materials) in Odoo, so milk, syrups and bar beans are forecast in their own units.
  • Odoo: stock per bar, deliveries in transit, delivery calendar, pack sizes, shelf life, cost and price.
  • Stock counts by lead baristas (and later the camera count), which set the position the proposal starts from.
  • Calendar: menu seasons, launches and phase-outs, promotions from Marketing, local events per bar, bar openings.
  • Weather: a 10-day forecast and the climatological normal, for cold drinks and iced items.
Decisions out
  • Order proposals per bar and delivery, with the calculation visible on every line, exportable as CSV or pushed to Odoo as purchase orders and transfers.
  • Minimum levels per bar and SKU that follow the forecast instead of going stale.
  • Allocations for launches, rotations and new bars, and run-down plans for phase-outs.
  • Network forecast by SKU for the Master Production Schedule in Odoo, so roasting and packing see the same numbers as the bars.
  • KPIs for the S&OP meeting: accuracy, bias, availability, waste, lost sales, fresh sell-out rate.

3. The forecast

Every bar x SKU series goes through the same five steps. Nothing is a black box: the Forecast page shows which model is in use, how it scored, and which drivers it found.

  1. Clean the history. A bar that sold out at 11:00 recorded less than it could have sold. Days with a stock-out are lifted to the recent same-weekday level, so the model does not learn that demand is low because the shelf was empty.
  2. Strip the known factors. Promotions, local events, holidays, menu windows, launch ramps and the monthly rotation of Discover Monthly are known in advance. They are divided out of the history before fitting and multiplied back into the horizon, which is how Marketing's calendar becomes part of the number.
  3. Fit candidate models on the daily baseline: a 4-week moving average with a weekday shape, Holt-Winters exponential smoothing with a weekly season and damped trend (parameters chosen by grid search), the same model scaled by a category annual index built from last year, last year's same week scaled by this year's growth, and Croston's method for slow, lumpy items such as merch.
  4. Backtest and pick. Each model forecasts two 4-week folds it has not seen (origins 8 and 4 weeks ago) and is scored on weekly WAPE. The best one wins; if a blend of the top two scores better, the blend wins. On this network, simple methods win on stable items, the annual index on seasonal cold drinks and gifting beans, last-year on items with a strong calendar shape.
  5. Add what the data could not know. A regression of residuals on the temperature anomaly gives each SKU a weather sensitivity (cold brew: about +4% per degree above normal), applied to the 10-day weather forecast. Planner overrides, with a reason, sit on top. An 80% range comes from the model's residuals so the proposal can size safety stock.

New bars and new products

A bar with no history is forecast from its cluster (city centre, neighbourhood, office and commuter, student) scaled by a size index, ramping from 65% to 100% over four weeks. As its own sales come in, the weight shifts from the analog to its data over eight weeks. A new product borrows a sister SKU (Speculaas syrup starts at 85% of Pumpkin spice) with a three-week ramp, until it has a history of its own.

4. The order proposal

Bars are replenished on a fixed calendar, so the proposal is a periodic-review calculation: a delivery has to cover demand until the next delivery, with a buffer sized to how much the forecast can be wrong.

position at delivery = stock still within shelf life at the delivery date + arriving, minus demand until then (expiring units are eaten first)
minimum level = forecast demand from this delivery to the next + safety stock
safety stock = z x forecast error x sqrt(days of exposure)
order = minimum level minus position, rounded to packs
CategoryDeliveryBuffer ruleWhy
Fresh bakery (1 to 3 days)DailyNewsvendor: service level equals margin / (margin + cost of a wasted unit), about 70%Balances waste against a missed sale explicitly. Selling out about 30% of days is the cost-optimal outcome, not a failure.
Dairy, cold drinks, juiceMon, Wed, Fri93 to 96% service level, pack chosen by expected costShort shelf life: a pack too many is waste, a pack too few is a stock-out on the busiest day.
Bar coffee, syrups, retail beansMon, Thu95 to 98% service level, rounded upThe ingredients every drink needs; a stock-out closes part of the menu.
PackagingMon, Thu99% service levelCheap to hold, expensive to run out of.
Merch, giftcardsMon, Thu90%, Croston forecastSlow, lumpy, no shelf life.

Two guards sit on top. A shelf-life cap never delivers more than sells before expiry. A stock projection runs day by day until the delivery lands and flags lines that run out before it, with the shortfall, so the planner can ask the hub for a top-up or move stock between bars.

5. Menu changes, launches, phase-outs

Four menu changes a year, a monthly coffee rotation and several launches mean the lifecycle is part of the forecast, not an afterthought.

6. The KPIs and what they mean

KPIDefinitionTarget on this network
Forecast accuracy1 minus WAPE: sum of absolute errors over sum of sales, weekly, per bar and SKU, forecast made one week ahead. Weighted, so cups and beans count more than giftcards.88%+ at bar x SKU level
BiasSum of (forecast minus sold) over sum of sold. Positive means the forecast runs high and stock builds up.within ±2%
AvailabilityShare of bar-SKU-days without lost sales, fresh bakery excluded.97%+
Lost salesUnits short on stock-out days, valued at retail price or, for ingredients, at the drink revenue they carry.trend down
WasteExpired units over expired plus sold, perishables only, valued at cost.under 5% network, 15% fresh bakery
Fresh sell-out rateShare of bakery days that sold out. The cost-optimal rate at a 70% critical ratio is about 30%; far below it means waste, far above it means empty baskets at 10:00.25 to 35%

7. What changes with real data

The prototype assumes clean stock positions. On the real network the first job is data quality: stock counts that are late or wrong make every proposal wrong in the same direction. The tool is built to make that visible (a bar whose availability and waste are both high is usually a counting problem, not a forecasting one) and to degrade gracefully: when a count is missing, the proposal falls back to the projected position and says so.

With a year of real history the model set would grow: a gradient-boosted model across all bars with calendar, weather, price and promotion features typically beats per-series smoothing on a network this size, and the backtest decides whether it earns its place. The structure stays the same: clean, strip, fit, test, re-apply, explain.

8. A 90-day plan for the role

WeeksFocusDone means
1 to 4Listen and measure. Visit bars, sit with lead baristas on order day, map the Lightspeed to Odoo flow, audit stock counts. Put a forecast accuracy and waste baseline in place per bar and category.One shared KPI sheet the S&OP team trusts; the top five root causes of stock-outs and waste, with numbers.
5 to 8Replace the manual weekly forecast with a backtested statistical one for the bars; publish minimum levels per bar and SKU in Odoo; run the exceptions list every order day.Proposals in use at the first bars; waste and availability moving on the dashboard; the winter menu planned with allocations and run-downs.
9 to 13Automate the data feed and the nightly refresh, connect the network forecast to the MPS, add the weather feed and the promotion calendar, document the process so it survives a holiday.Planning scales to 27 bars without more hands; a written process; a roadmap for ML and the camera stock count.