Menu engineering
Menu engineering answers a question revenue reports never show: what to do with a specific dish. One dish is ordered often but barely feeds the business. Another has an excellent margin but nobody notices it on the menu. A third does neither and simply takes up a line.
Open Admin Panel → Menu, click the chart icon "Item statistics" in the toolbar (admin.cenaly.ge/menu/statistics) and switch to the "Menu engineering" tab.
The method is the classic Kasavana & Smith matrix (1982): two dimensions, four quadrants, one recommendation per quadrant.
How the quadrants are calculated#
Every dish is compared inside its own menu category, not against the whole menu: comparing a dessert with a main course is meaningless — they have different prices and different order frequencies. A "Whole menu" toggle lets you look at the cross-category view as well.
Popularity threshold. If demand were even, each of the N dishes sold in a category would take a 1/N share. A dish counts as popular if it reaches at least 70 % of that bar — i.e. its share in units is ≥ 0.7 × (1/N). That is the method's canonical factor.
Margin threshold. A dish's margin here is its unit contribution margin: average selling price over the period minus portion cost. The bar is the category's quantity-weighted average margin, not a plain arithmetic mean: otherwise one expensive dish sold twice would raise the bar for the whole category.
Portion cost comes from the dish recipe (components × purchase prices — see Inventory).
Besides the table, the tab draws a scatter plot: popularity on one axis, unit margin on the other, both thresholds shown as dashed lines. You see not only which quadrant a dish is in, but how far it is from the border.
The four quadrants#
| Quadrant | Popularity | Margin | Recommendation |
|---|---|---|---|
| ⭐ Stars | high | high | Keep it featured — don't touch quality or portion size, put it at the top of its section and into recommendations |
| 🐴 Plowhorses | high | low | Raise the price or cut the cost — guests love it, so it will absorb a modest price increase; the alternative is reworking the recipe |
| ❓ Puzzles | low | high | Move it up the menu — rename it, add a photo, suggest it in the room and at the till; demand is limited by visibility, not by the dish |
| 🗑 Dogs | low | low | Take it off the menu — nobody orders it and it doesn't feed you, while its ingredients still occupy stock |
The "What to do" column is filled in automatically from the quadrant — it is a fixed rule of the method, not an AI suggestion.
Rows inside a category are sorted by total margin over the period (what actually feeds you comes first), and categories by revenue.
Margin by channel#
A dish with an average in-house margin can go negative in an aggregator that takes 30 %. That's why there is a "Margin by channel" block under the matrix:
| Column | What it is |
|---|---|
| Channel | own channel, Wolt, Glovo, Yandex Eda and so on |
| Gross | channel revenue before the platform's cut |
| Commission | the cut: a percentage of revenue plus the allocated share of the per-order fixed fee |
| Net | what actually reaches your till |
| Margin | net minus the cost of goods sold |
Commission rates are set per location + channel pair in the location's integrations (see Finance). Until they are filled in, commission counts as zero and net equals gross — an optimistic picture.
Channel cost is computed only from dishes with a complete recipe, while revenue counts all of them; how many of the channel's dishes are left without cost is shown as a separate number.
Sales by item for a period#
The everyday "what sold and how much" report is the "Dish Statistics" view of the same page. It works for a shop as well as a café: the rows are all menu items that sold, even though the page headings still call them dishes.
- Open Menu and click the "Item statistics" icon in the toolbar.
- Choose the period: "7 days", "30 days" (default), "90 days", "12 months" or "All time".
- If you have several locations, pick one from the list or keep "All locations". Staff see only their own locations.
- Keep the "Dish Statistics" view and read the table: "Qty", "Revenue", "Avg price", "Share", "ABC", "Trend" and "Last sale". Click a column header to sort.
- To see the margin, click "Margin →": cost price comes from tech cards and purchase prices, and a manual item cost takes priority. Without them the cell shows "—".
- Click a row to expand the item's details: sales by day, margin and food cost.
Revenue and quantity are already net of discounts and refunds; cancelled orders are excluded. A refund is subtracted on the day it was made, not on the day of the sale. The item table has no CSV export: CSV is available for the menu engineering matrix (with quantity, revenue and average price per item), for the "Categories" view and for the "Combos" block.
Average price and combos#
The dish table on the Dish Statistics tab and the matrix have an Average price column — what a portion cost on average over the period: revenue ÷ quantity, after discounts and refunds. If it is well below the menu price, the dish often goes out with a discount or in a promotion. You can sort by the column; in the menu engineering CSV it follows revenue. The average price of a category is in the Categories view.
If the menu has combos (business lunch, “build a set”), a Combos block appears below the dish table:
- combos — how many were sold, revenue, average price and how many dishes go into one combo on average;
- combo components — for each dish: how many portions went into a combo, how many were sold separately and the share in combos.
A three-slot combo sold once gives one combo and three components. Revenue stays with the combo: a dish inside a combo has no price of its own, so the component is not counted twice in the Revenue column of the dish table. The CSV button exports both lists. The block counts combos whose order line records the chosen dishes — orders from the register and the online menu after this report appeared.
What the matrix needs to appear#
- Sales for the period. The period uses the same selector as the statistics tab: 7 / 30 / 90 days, 12 months, "All time".
- Dish recipes with purchase prices filled in for the ingredients — without them a dish has no cost and therefore no quadrant.
- Channel commissions — only for the "Margin by channel" block; the matrix itself works without them.
If not a single dish has a complete cost, the tab says so plainly instead of showing an empty table.
The ⇩ CSV button exports the whole matrix — handy for discussing the menu with your chef in a spreadsheet or attaching it to a price-review record.
Limitations#
- Without cost of goods the matrix cannot be built. You need recipe cards with purchase prices; if not a single item has a full cost, the view says so honestly instead of showing an empty table.
- On a short period the quadrants are unstable. A couple of sales move a dish from "puzzles" to "stars" and back — look at 30 or 90 days.
- Channel commissions are estimated rates from your settings, not the marketplaces' actual deductions; the "Margin by channel" block is only as accurate as those rates.
- There is no single metric glossary yet — revenue in Finance, in Statistics and at the POS may be computed differently, so compare identical periods and identical slices.
- The section is computed on the analytics database of the AWS contour — on the Russian brand sales statistics falls back to computing from orders.
Troubleshooting#
The view is empty. There are no sales for the period, or not a single item has a full cost of goods.
A dish is missing from the matrix. It has no recipe card with ingredient prices, so it has no margin — there is nothing to measure.
A quadrant looks implausible. Check the period: 7 days is too small a sample. And check ingredient prices — a stale purchase price distorts margin more than anything else.
The numbers do not match the Finance section. Compare the period and the slice: there is no single "truth about the number" between sections yet.
Related sections#
- Menu statistics — sales per dish, ABC, trend and "frequently bought together"
- Inventory — recipes and purchase prices behind the portion cost
- Finance — channel commissions and net margin for the whole venue
- Demand forecast — how many of this dish will sell tomorrow
FAQ#
Why is a dish in no quadrant at all?#
Either it had no sales in the selected period, or it has no complete portion cost: the recipe is missing, or some ingredients have no purchase price. In both cases the dish stays in the table with a flag but without a quadrant.
Can I change the 70 % popularity threshold?#
Not in the interface — the canonical factor of the method is used. What you can change is the grouping: compare dishes inside a category (default) or across the whole menu.
The matrix says to remove a dish, but we need it on the menu "for the range". What now?#
The recommendation is a consequence of two numbers, not a verdict. A dish that doesn't feed you but keeps guests coming (a kids' item, a vegetarian alternative, "that one dish" for regulars) can stay on the menu deliberately. The matrix is useful here precisely because it shows the price of that decision.
Why does the channel margin differ from the matrix margin?#
The matrix computes margin from the gross selling price; the channel block computes it from revenue after the platform's cut. The difference between the two is the price of the channel.