Leverage this report to assess the need for price increases, portion adjustments, and/or recipe re-costing.
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.
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 | Puzzle | 4517 | $174,160.83 | 33.6% | $27.78 (66.4%) |
| Kaya Toast Set | Appetizers | Star | 10374 | $124,095.32 | 25.6% | $9.25 (74.4%) |
| Beef Rendang | Main Course | Puzzle | 2391 | $106,039.97 | 35.2% | $31.75 (64.8%) |
| Spaghetti Carbonara flagged | Main Course | Puzzle | 2458 | $100,906.22 | 36.2% | $30.89 (63.8%) |
| Nasi Lemak | Main Course | Plowhorse | 9209 | $100,478.37 | 28.3% | $8.42 (71.7%) |
| Cendol | Desserts | Plowhorse | 7269 | $65,259.26 | 26.3% | $7.12 (73.7%) |
| Teh Tarik | Beverages | Plowhorse | 15535 | $59,911.05 | 17.3% | $3.36 (82.6%) |
| Mushroom Soup | Appetizers | Puzzle | 2518 | $45,369.09 | 28.1% | $13.75 (71.9%) |
| Iced Lemon Tea | Beverages | Plowhorse | 6841 | $34,244.32 | 19.3% | $4.35 (80.7%) |
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.