meal-kit-analytics

A dbt project modeling a plant-based meal kit subscription business end to end, from raw landing tables through to marts a BI tool can point at. 523,000 orders, 20,000 customers, 24 months.

16models
147tests
525korders modeled
22sfull build

What the project answers

The paid membership recovers 21 cents on the dollar

A $9.99 monthly tier buys free delivery and 5% off meals. It collects $383,696 against $1,788,961 of benefit given away, and recovery falls from 0.78 on light users to 0.21 on heavy ones. Free delivery is worth most to the people who order most, so they are the ones who buy it. See the economics →

Raising the price to $14.99 does not fix it

Recovery improves to 32.2% and the programme still loses $1.21M. Break-even sits at $46.58 a month, because the benefit scales with usage while the fee is flat. This turns out to be a benefit-structure problem wearing the costume of a pricing problem. See the sensitivity →

Not all support contact predicts churn

A meal-quality complaint raises the cancel rate by 21.7 points and a delivery complaint by 16.3. A billing question moves it by under half a point. Treating “contacted support” as one signal averages a strong effect together with nothing at all. See the comparison →

Retention decays fastest in the first three months

Cohorts lose roughly 20% by month two and 30% by month three, then flatten. Censored cells are flagged so incomplete cohorts do not get read as churn. See the triangle →

Profiling found the bottleneck in the wrong place

The slowest operator in the project was a row_number() window in a staging model at 1,932 ms, thirty times the range join I went looking for. Materializing that one model as a table cut total build time 29%. See the profile →

The shape of the work

Two of these needed a modeling decision before they became true. The membership question needed a ratio, because a profitable box hides an unprofitable programme and a simple profit test returns nothing. The churn question needed a confound removed, because the first version had the sign backwards on two categories. Both are written up on their tabs.