All work

Case study · Growth decomposition

Coffee Shop Sales

Revenue doubled on footfall alone. The AOV baseline was 27% too low.

Scale
149,116 transaction lines · 3 NYC stores · 6 months
Role
Sole analyst — raw extract to dashboard

Three coffee shops in New York more than doubled revenue over six months. Before anyone credits the new menu or the marketing, it’s worth checking which lever actually moved.

Revenue is Orders × Average Order Value. More people through the door is a location and hours problem; a bigger basket is a menu and pricing problem. Which one grew decides where the next effort goes.

A public dataset of 149,116 transaction lines across three stores over six months, with timestamp, store, product, unit price and quantity.

The grain was wrong. transaction_id looks like an order ID and was being used as one, but it identifies a line item — a customer buying a latte and a croissant produces two “transactions”. Average order value was coming out at $4.69; grouping the lines back into orders puts it at $5.98, 27% higher.

$4.69 is a believable average for a coffee shop, which is how an error like this sits in a dashboard for years, quietly breaking every metric with an order count underneath.

Revenue = Orders × AOV. Split it, and look at each part on its own.

Over the six months, orders grew 104% while average order value moved −0.1%. That turns “why is revenue up” into “what’s bringing more people in, and can we do more of it”.

The other correction was the time comparison. A straight month-over-month total makes February look like a decline, purely because it’s three days shorter than January.

Bar chart of revenue per trading day by month from January to June. February, highlighted in green, is slightly above January at about $2,700 per day, and the series then rises steadily to about $5,500 per day in June.
Revenue per trading day. Normalised for month length, February grew 3.2%.

Growth was 100% traffic and 0% basket — and the true AOV was $5.98, not $4.69.

The corrected AOV replaces $4.69 as the baseline for every metric that divides by order count. And the effort belongs on footfall — six months of trading didn’t move basket size at all.

The traffic itself turns out to be heavily concentrated.

Bar chart of revenue by daypart. Morning Peak is the tallest at about $255,000, roughly double Midday and Afternoon at about $125,000 each, with Evening near $105,000 and Early Morning lowest at about $85,000.
Morning Peak (08:00–10:59) accounts for 36.7% of revenue in three of fifteen trading hours.

I’d point staffing and counter throughput at those three hours first, since that’s where a queue costs the most, and treat the quieter parts of the day as a separate question.

Six months of trading from one business, with no control period and no price history. The split describes how the growth arrived, not what caused it.

  • Python
  • pandas
  • Plotly
  • Market-basket analysis
  • KPI design