Daily Contribution Margin Heatmap (by item, by period)
A practical dashboard design with data model, POS join examples, metric definitions, visualization patterns (item-by-period heatmap, sales mix, labor-impact overlays) and a concise operational playbook with clear decision rules (promote, pull, reprice, revise recipe) plus an implementation checklist.
What this dashboard is for
Surface, in near real time, which menu items and dayparts are actually contributing to profit — not just producing sales. The goal is to make targeted, fast decisions (promote, pull, reprice, reformulate) with clear rules and an audit trail so managers act confidently and consistently.
Core idea
Show items as a matrix (rows = menu items, columns = dayparts or hourly periods) colored by contribution margin (or contribution margin %). Combine that view with sales mix and labor-impact overlays so teams can see where volume, margin, and labor interact.
Essential metrics and formulas
- Net Revenue (per item) = Item sales gross - item-level discounts - coupons - comps (or record comps separately).
- Standard Item Food Cost (per unit) = sum(ingredient_qty * ingredient_cost_at_standard_yield).
- Item Contribution Margin (total) = Net Revenue - (Item Food Cost * Qty Sold) - Item-level variable costs (packaging, delivery commission).
- Contribution Margin % = Item Contribution Margin / Net Revenue (handle zero revenue safely).
- Contribution per Unit = Item Contribution Margin / Qty Sold.
- Contribution per Labor Minute = Item Contribution Margin / Allocated labor minutes for that item (see labor allocation options below).
Data model & key POS joins (practical guidance)
You'll need joined data from POS sales, recipe/item-to-ingredient maps, ingredient costs, and labor/timeclock or labor allocation data. Below is a simplified join sketch you can adapt to your schema.
-- pseudo-SQL (adapt field names to your system) SELECT s.sale_date, DATEPART(hour, s.sale_ts) AS hour, CASE WHEN hour BETWEEN 6 AND 10 THEN 'Breakfast' ... END AS daypart, i.item_id, i.item_name, SUM(s.qty) AS qty_sold, SUM(s.net_price) AS net_revenue, SUM(r.standard_cost * s.qty) AS item_food_cost, -- optional: variable packaging, commission SUM(s.net_price) - SUM(r.standard_cost * s.qty) - SUM(s.variable_costs) AS contribution_margin FROM pos_sales s JOIN menu_items i ON s.item_id = i.item_id LEFT JOIN recipe_costs r ON i.item_id = r.item_id -- join labor allocation if available LEFT JOIN labor_alloc_la l ON (l.shift_date = s.sale_date AND l.hour = DATEPART(hour, s.sale_ts)) GROUP BY s.sale_date, hour, daypart, i.item_id, i.item_name;
Notes:
- Decide how to treat modifiers and combos: either expand to base items or calculate combo-level costs.
- Track comps and voids separately so they don't falsely inflate 'sales' but you still see margin impact.
- Use a consistent 'standard cost' table refreshed weekly or when invoices change.
Suggested visualizations
-
Item x Period Heatmap (primary)
Rows = items (sorted by overall contribution or sales), Columns = daypart or hourly buckets. Color = contribution margin per period (absolute value) or contribution margin %. Use a diverging palette with neutral near zero, red for drains, green for strong contributors. Provide tooltip with Qty, Net Revenue, Food Cost, Margin, Margin%.
-
Sales mix strip
A horizontal bar showing % of revenue by item (top 10/20). Clicking an item filters the heatmap and other panels.
-
Labor impact overlay
Small chart or secondary heatmap showing contribution per labor minute (or contribution margin after allocating labor). Highlights items that need too much labor for the margin they produce.
-
Trend sparkline
Per-item recent trend (7-day moving average of contribution) to catch declines early.
-
Action panel
Quick suggested action badges (Promote, Pull, Reprice, Revise Recipe) based on decision rules (see playbook). Include a button to log the action (see implementation ideas).
Simple decision rules / playbook (operational)
Use these as starting rules. Pair rules with a short experiment design (A/B promotion, price test).
- Promote — When Contribution % >= 25% and Sales Rank in bottom 40%: run a 3-day promotion or highlight as staff recommendation. Track lift in sales and margin.
- Pull (temporarily) — When Contribution % < 0 and Qty sold < threshold (e.g., <10/day): remove from menu or delist until reformulated.
- Reprice — When Contribution % < target (e.g., <15%) but item has strong sales (top 30%): consider price change, round-dollar experiments, or bundle monetization. Model price elasticity if possible.
- Revise recipe — When Contribution per Unit is low, labor per unit high, or ingredient costs spike — run a recipe review to reduce yield loss, swap ingredients, or change portioning.
- Urgent action — If Contribution declines > 30% week-over-week for top 20% items, trigger immediate review and manager notification.
How to run tests and measure success
- Define the hypothesis (e.g., promoting Item X will increase weekly contribution by Y%), the metric (contribution margin), and the test window (3–7 days).
- Use control groups or non-promoted dayparts where possible.
- Log every intervention with date, manager, action taken, and expected outcome.
- Measure net contribution uplift, not just sales. Report results in next weekly huddle and iterate.
Implementation checklist
- Map POS fields to: sale_ts, item_id, qty, unit_price, discounts, comps, voids.
- Maintain a recipe-cost table with standard yields and current invoice costs (refresh weekly or on vendor price changes).
- Decide on labor allocation method: per-item minute estimates, per-station allocation, or shift-level apportionment.
- Enable filters for location, outlet, menu section, daypart, and date range.
- Set an hourly or near-real-time refresh cadence depending on POS integration capabilities (daily minimum).
- Create a simple logging form so managers can record actions taken against items (who, what, why, expected outcome).
Common pitfalls and how to avoid them
- Using gross sales alone — hides margins. Always compute net revenue.
- Poor recipe cost discipline — stale or inconsistent costs will break decisions. Keep standard costs current and versioned.
- Ignoring labor — an item with high margin but extreme labor cost can still be a net loser when throughput is constrained.
- Small-sample noise — avoid changing recipes or prices based on one busy/slow day. Use moving averages or confidence thresholds.
Next steps and customization ideas
Consider packaging this as a reusable toolkit for other restaurants in your group: the heatmap dashboard, a standard cost data model, the playbook, and a manager action log. Add alerting for rapid declines and an experiment template for promotions.
Quick reference: KPI targets (example starting points)
- Target Contribution % by item: >= 20–30% (industry and menu dependent).
- Flag for review: Contribution % < 10% or week-over-week decline > 30% for high-volume items.
- Top priority items: top 20 items by total contribution — protect and experiment here first.
Use this dashboard to make faster, evidence-based decisions that protect and grow contribution, not just sales.
Discussion
Comments and conversation will live here.