Optimization
Case 07 / 13
Location-level assortment optimization
Fleet-wide menu and assortment strategy. The product mix is tailored per location from sell-through velocity and free public demographic data, and lifted sales 33%.
Crave Robotics · 2026 · Sole owner
- A campus and an office should not stock the same products.
- Velocity drives the mix; public census data covers new machines with no sales history.
- Analyzing product and location performance drove a 33% sales increase through better product positioning.
- Declining categories were rescued, with their sales up 26%.
The numbers
- +33%Sales increase
- +26%Declining categories rescued
- 28Machines covered
- Public census data
- Machine telemetry
- PostgreSQL
Explore the platform
Interactive — synthetic dataClick through the sidebar — each module is a real screen from the platform, populated with synthetic data.
Preset Menus
Corporate office
University campus
Transit hub
This is the actual Preset Menus module of the operating platform. Location names and product lists are synthetic; the screen and its layout are real.
How it fits together
- 1Per-machine velocity history
- 2Public demographic profile of catchment
- 3Product scoring
- 4Slot allocation
- 5Velocity feedback
Read the full case study Hide the case study
The problem
Every machine carried a similar product assortment regardless of where it was placed. A university campus and a corporate office have different demand profiles, and a uniform menu leaves revenue on the table at both while generating waste on slow movers.
Why it mattered
Slot capacity in a vending machine is fixed and scarce. Every slot given to a slow mover is a slot not earning, and unsold frozen inventory eventually becomes waste rather than markdown. Assortment is one of the few revenue levers available without deploying more capital.
What I built
A location-level assortment recommendation combining observed per-machine per-product sell-through velocity with publicly available demographic characteristics of each location’s catchment area — age distribution, household income, and daytime population, all sourced free from public census data.
Velocity is the primary signal wherever it exists. The demographic layer exists to solve the cold-start problem: a machine installed last week has no sales history, and the alternative to a demographic prior is stocking it with the fleet average and waiting a month to find out it was wrong.
The analysis behind it went product by product and location by location: which items earn their slot where, and which categories were declining rather than genuinely weak. Improved product positioning drove a 33% increase in sales, and categories that had been in decline recovered, with their sales up 26%. I am also developing supplier partnerships for in-house branded food products, so the menu is not limited to what the market already sells us.
What I learned
Demographics are a useful prior and a poor substitute for observed behaviour. The recommendation is only as good as the handoff from demographic prior to velocity-driven optimization once real sales data arrives.
What I would do next
A formal cold-start-to-velocity blend with an explicit confidence weight. Margin weighting rather than velocity alone. Slot-level constrained optimization instead of ranked scoring. Controlled A/B testing of assortment changes, so the effect of each lever can be separated from the others.
Described without confidential information. The demo and any figures inside it use synthetic data.