The 90-day menu-engineering quadrant: stars, dogs, plowhorses, puzzles.
Plot every menu item on two axes — popularity and contribution margin — and you get four quadrants that tell you exactly what to promote, kill, reprice or rebuild. Here's the 90-day routine, the quadrant maths, and how to read the chart in 30 seconds.
Menu engineering plots every item on two axes — popularity (units sold) and contribution margin (€ profit per unit) — to sort the menu into four quadrants: stars (high margin, high volume), plowhorses (low margin, high volume), puzzles (high margin, low volume), and dogs (low margin, low volume). Each quadrant has a specific play. Run it every 90 days and the menu tunes itself.
Why a quadrant beats a list
Most café and restaurant owners look at their menu through two reports: a sales report (what sold) and a margin report (what made money). The problem is that the two reports rarely overlap in the right way. The best-selling item isn't always the highest-margin item. The highest-margin item often sells in tiny volumes. Reading either report alone leads to wrong calls — promoting a low-margin best-seller, or killing a high-margin slow-mover that just needs better placement.
The quadrant fixes this by forcing both dimensions onto the same picture. Every item lands somewhere on a 2x2 grid. The quadrant it lands in tells you what to do.
The two axes
X-axis: popularity. Units sold over the last 90 days. Use 90 days (not 30) so you smooth out weather, holidays and single-week anomalies.
Y-axis: contribution margin. Selling price minus variable cost (ingredients + portion of labour + payment fees). Not gross margin, not EBIT — contribution. Why? Because the menu decision is "should this item exist?" and contribution is the right cut: it's the money the item generates above its direct cost, before fixed overhead.
Split each axis at the median. The median of popularity = the middle-ranking item by units sold; the median of contribution = the middle-ranking item by € margin. The split lines carve the grid into four quadrants.
The four quadrants
| Quadrant | Popularity | Margin | Play |
|---|---|---|---|
| Star | High | High | Promote. Front of menu, mentioned by staff. Defend price. |
| Plowhorse | High | Low | Reprice or reformulate. Cut COGS, raise price 5-10%, or shrink portion. |
| Puzzle | Low | High | Reposition. Better placement, server upsell, photo on menu. |
| Dog | Low | Low | Kill. Replace with a new item that has star potential. |
The plays aren't suggestions — they're prescriptions. The only reason to keep a dog is if it's a strategic loss-leader (the gluten-free option that brings in a group, the kids' meal that brings in a family). Even then, you write down the strategic reason and review it next quarter.
Worked example: a Lisbon café
Café Olive in Lisbon ran the quadrant on their food menu (excludes drinks) for Q1 2026. Twelve items, 90 days of data. Median popularity was 320 units sold. Median contribution margin was €4,20.
| Item | Units (90d) | Contribution € | Quadrant |
|---|---|---|---|
| Avocado toast | 1.080 | €5,40 | Star |
| Pastel de nata | 2.640 | €0,80 | Plowhorse |
| Goat-cheese tartine | 180 | €7,20 | Puzzle |
| Smoked-salmon plate | 92 | €8,90 | Puzzle |
| Brioche French toast | 740 | €4,80 | Star |
| Granola bowl | 420 | €2,40 | Plowhorse |
| Tuna sandwich | 210 | €3,20 | Dog |
| Egg muffin | 880 | €4,90 | Star |
| Cinnamon roll | 610 | €3,80 | Plowhorse |
| Fruit salad | 140 | €2,10 | Dog |
| Acai bowl | 310 | €4,30 | On the border |
| Croque madame | 480 | €5,60 | Star |
The plays Café Olive ran:
- Stars (avocado toast, brioche French toast, egg muffin, croque madame): moved to top-left of the printed menu, staff trained to mention them on order. No price change.
- Plowhorses (pastel de nata, granola bowl, cinnamon roll): nata raised from €1,80 to €2,10 (sourcing locked at €0,50/unit). Granola bowl portion reduced 15g, price held. Cinnamon roll reformulated with cheaper butter blend, contribution lifted to €4,40.
- Puzzles (goat-cheese tartine, smoked-salmon plate): added small photos on the menu, server upsell prompt. Volume on tartine doubled in six weeks.
- Dogs (tuna sandwich, fruit salad): killed. Replaced with a chickpea-feta bowl (early data: 340 units in 30 days, €5,10 contribution — likely Star in next review).
Net result over 90 days: food-menu contribution rose 11,4% on flat covers. No price war, no concept change — just the four plays, executed on the right items.
The 90-day cadence
Re-run the quadrant every 90 days. Why 90? Two reasons:
- Shorter than 90 days, you don't have enough data on slow-movers to position them confidently. A puzzle that sold 18 units in 30 days might sell 60 in 90 — the picture stabilises.
- Longer than 90 days, you miss seasonal shifts. The avocado toast that's a star in summer is a plowhorse in February when the avocados arrive bruised.
The 90-day re-run takes about 45 minutes if your product margins are tracked in nouz — you export the per-item report, plot it (median × median), and run the four plays. Schedule it for the first Tuesday of each quarter.
I'd been thinking about the pastel de nata as my hero product because it was always the top seller. The quadrant showed me it was actually my biggest margin drag. I raised it 30 cents, lost zero volume, and added almost €800 to the month.
For the foundational pricing exercise to run on every star and plowhorse, see pricing the croissant. For the help-center walkthrough on the per-item margin report, see the per-product margin view.
FAQ
How many items do I need on the menu for this to work?
Eight or more. Below eight, the quadrants get too sparse to be meaningful — you're basically just ranking items. Above 25, split by daypart (breakfast / lunch / dinner) and run a quadrant per daypart.
Should I include drinks?
Run drinks as a separate quadrant. Drink margins are structurally different from food (often higher) so mixing them on one axis skews the medians.
What about combos and bundles?
Plot the bundle as its own item using the bundle's actual contribution. Then plot each component separately for the unbundled sales. Sometimes the bundle is a star while the standalone items are dogs — telling you the bundle is doing the work.
How do I handle a new item with only 30 days of data?
Mark it provisional and re-run at 90 days. Don't make kill/promote decisions on a new item without a full quarter.
What if I have no clear stars?
Three causes: prices set too low everywhere (plowhorse-heavy), portions too generous (every item lands low-margin), or the whole menu needs a refresh. Run the four-input pricing formula on your top three sellers first; the picture usually corrects itself.