NiravProof of work
← All projects

Optimization

Case 07 / 10

Location-level assortment optimization

Product mix tailored per machine using sell-through velocity and free public demographic data.

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.
  • Shipped, but not yet measured. No impact number claimed.
Cold start assortment for machines with no sales history
  • Public census data
  • Machine telemetry
  • PostgreSQL

Explore the platform

Interactive — synthetic data

Click through the sidebar — each module is a real screen from the platform, populated with synthetic data.

app.craverobotics.com/menus
Inventory

Preset Menus

Corporate office

  1. Garlic Chicken Pasta
  2. Protein Bowl
  3. Cold Brew

University campus

  1. Beef Burrito
  2. Garlic Noodles
  3. Energy Drink

Transit hub

  1. Grab-and-go Wrap
  2. Garlic Chicken Pasta
  3. Bottled Water

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

  1. 1Per-machine velocity history
  2. 2Public demographic profile of catchment
  3. 3Product scoring
  4. 4Slot allocation
  5. 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.

I have deliberately not published an impact figure here, because I do not have one that I trust. The methodology shipped; the controlled measurement of its effect has not been run.

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 is measurable.

Described without confidential information. The demo and any figures inside it use synthetic data.