This report computes food cost %, contribution margin ($ and %), and item velocity (units sold) per menu item. Based on this data, the report classifies every item into the classic menu-engineering matrix — Stars, Plowhorses, Puzzles, Dogs — based on popularity vs. profitability and renders an HTML dashboard with a quadrant scatter plot and other helpful illustrations. See below for actionable menu engineering notes such as reprice, reformulate, remove, promote.
Note that food cost % here is estimated from configurable category benchmarks — the target food cost percentages for Appetizers, Main Course, Desserts, and Beverages that you can edit at any time from the admin Settings page. Those targets are seeded on first run from deployment configuration and then live in the database, so revising a benchmark never requires a redeploy; each item's estimate is its category target plus a small deterministic per-item variance. This differs from the Recipe Summary Analysis Report, which does not use the benchmarks as cost inputs at all: it builds each recipe's cost from the bottom up out of that recipe's actual ingredient quantities, yields, and per-gram costs, and uses the category targets only as a comparison line.
Each dot is a menu item, sized by revenue. Position (not color) determines the quadrant - the shaded zone and label name it directly. A red-ringed dot means the item's food cost % breaches its category target; see the notes list below.
| Item | Category | Quadrant | Units sold | Revenue | Food cost % | Contribution margin |
|---|---|---|---|---|---|---|
| Chicken Chop | Main Course | Star | 4517 | $174,160.83 | 5.8% | $39.42 (94.2%) |
| Kaya Toast Set | Appetizers | Plowhorse | 10374 | $124,095.32 | 8.8% | $11.34 (91.2%) |
| Beef Rendang | Main Course | Puzzle | 2391 | $106,039.97 | 8.0% | $45.06 (92.0%) |
| Spaghetti Carbonara | Main Course | Puzzle | 2458 | $100,906.22 | 4.7% | $46.17 (95.3%) |
| Nasi Lemak | Main Course | Plowhorse | 9209 | $100,478.37 | 13.8% | $10.13 (86.2%) |
| Cendol | Desserts | Plowhorse | 7269 | $65,259.26 | 10.4% | $8.66 (89.6%) |
| Teh Tarik | Beverages | Plowhorse | 15535 | $59,911.05 | 9.7% | $3.67 (90.2%) |
| Mushroom Soup | Appetizers | Puzzle | 2518 | $45,369.09 | 7.7% | $17.65 (92.3%) |
| Iced Lemon Tea | Beverages | Plowhorse | 6841 | $34,244.32 | 5.6% | $5.09 (94.4%) |
| Char Kway Teow | Main Course | Puzzle | 0 | $0.00 | 16.4% | $17.90 (83.6%) |
| Chicken Rice | Main Course | Puzzle | 0 | $0.00 | 11.5% | $14.24 (88.5%) |
| Laksa | Main Course | Dog | 0 | $0.00 | 28.1% | $10.93 (71.9%) |
| Roti Canai | Appetizers | Dog | 0 | $0.00 | 28.1% | $1.75 (72.0%) |
| Tandoori Chicken | Main Course | Puzzle | 0 | $0.00 | 9.4% | $23.14 (90.6%) |
This application consists of a data importer, metrics/analytics engine, and this live web app. It was built as a deliberately gated, three-phase build (data import → metrics/analytics engine → web app).
A small pre-built dataset (the Kaggle CSV's richest-menu restaurant) is committed
to the repo and copied into place automatically the first time the app runs against a
DATABASE_PATH that doesn't exist yet. A newer export refresh, or a different location,
can be imported using the functionality embedded in the application.
This project uses Python 3, Flask, SQLite, Jinja2, Chart.js, python-dotenv, gunicorn, and pytest.