Restaurant Menu Profitability Report

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.

About this report

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.

14
Active menu items
$12.09
Menu avg. contribution margin / unit
0
Items flagged over food-cost target

Popularity vs. profitability quadrant

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.

Menu items

ItemCategoryQuadrantUnits sold RevenueFood 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%)

Food cost % by category

Metric definitions

Food cost %
The estimated cost of ingredients for one serving, divided by its selling price. Lower means more margin per sale. Estimated here from configurable category benchmarks, not audited invoices - see the admin Settings page.
Contribution margin
Selling price minus estimated plate cost - the dollars each sale contributes toward overheads and profit after ingredient cost. Shown both in dollars and as a percentage of price.
Popularity index
An item's share of total units sold. Compared against "fair share" (1 / number of menu items) to decide whether an item is a high or low seller.
Stars
High popularity, high profitability. Protect these - keep quality and visibility high.
Plowhorses
High popularity, low profitability. Popular but thin margins - consider a price or cost adjustment.
Puzzles
Low popularity, high profitability. Profitable but underordered - consider repositioning on the menu or better promotion.
Dogs
Low popularity, low profitability. Candidates for recipe rework or removal.

Development notes

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.

Tech stack

This project uses Python 3, Flask, SQLite, Jinja2, Chart.js, python-dotenv, gunicorn, and pytest.