Free operator sheet · Stays in your browser

Weekly Prime Cost
Worksheet.

The single most important number a small operator can track. Plug in food, beverage, and labor costs against net sales. See your prime cost percent and where it sits versus the 60 percent ceiling.

Pack: Operations & Margin Cadence: Weekly · Tuesday for prior week Private — runs in your browser

Fill it in

Weekly Prime Cost Worksheet

Type your numbers — the math runs in your browser. Print it, save it as a CSV, or save it to your Workshop.

Worked example 60-seat coffee bar, Brooklyn See what a Tuesday-morning fill-in looks like
Net sales (all channels)$48,200
COGS — food + beverage (after inventory swing)$15,580
FOH wages$7,900
BOH wages$8,400
COGS as a % of sales32.3%
Labor as a % of sales33.8%
Prime cost66.1% · yellow

Their 13-week trailing average is 64.0%, so this week ran a touch hot. The back-of-house wage line is the lever — Tuesday was staffed for a busier night than the one that showed up. The Wednesday huddle gets a one-cook-down trial.

Composite-typical numbers — not a real shop. Use the rhythm, not the figures.

Week ending
Sales (net of sales tax)
Cost of goods sold
Labor (fully loaded)
Net sales $0.00
COGS (food + bev, used cost) $0.00
Total labor (fully loaded) $0.00
Prime cost $0.00
Prime cost as % of sales 0.0%

Type your numbers above. The healthy band for full-service independents runs 55–65% — anything above 65% is a margin emergency.

Try a scenario — what if labor or food shifts?

Slide one or more, watch the verdict re-run on top of your typed numbers. Nothing saves until you click Reset and refill, or use the Workshop save with the scenario flag.

Read the long version The math, the four lies operators tell themselves, the verdict bands, and a four-week protocol for getting stable. The trunk number — Why weekly prime cost is the only number that matters →

+ (Math.round(v * 100) / 100).toFixed(2); } function fmtPct(v) { return (Math.round(v * 10) / 10).toFixed(1) + '%'; } // D9 · Verdict band uses the centralized Bench.evaluate(metric, value) // when available (built from data/benchmarks.json), with the // pre-Bench band ladder as a graceful fallback. Updating // benchmarks.json's prime_cost_pct thresholds cascades to // every sheet that calls Bench.evaluate('prime_cost_pct', ...). function band(pct) { if (pct <= 0) return { band: 'idle', msg: 'Type your numbers above. The healthy band for full-service independents runs 55–65% — anything above 65% is a margin emergency.' }; if (window.Bench && window.Bench.evaluate) { var verdict = window.Bench.evaluate('prime_cost_pct', pct); if (verdict && verdict.msg) return { band: verdict.band, msg: verdict.msg }; } // Fallback ladder (shipped before centralized benchmarks). if (pct < 50) return { band: 'good', msg: 'Below the typical band. Double-check that you included employer taxes and salaried managers in labor — under-counting labor is the most common cause of an artificially low prime cost.' }; if (pct < 60) return { band: 'good', msg: 'Healthy. Keep the cadence; this is the number that protects the rest of the P&L.' }; if (pct < 65) return { band: 'warn', msg: 'In the upper-healthy band. Watch food cost trend week-over-week; small drift here compounds fast.' }; if (pct < 70) return { band: 'warn', msg: 'Above the healthy ceiling. Identify the bigger driver — food (vendor pricing, waste, portion) or labor (over-scheduling, salaried mix) — and act on it this quarter.' }; return { band: 'bad', msg: 'Margin emergency. At this level, every additional dollar of sales loses you money once fixed costs are in. Cut here is non-optional.' }; } // D8 · Read what-if slider state. Returns {labor, food, sales} // as point/percent deltas applied on top of the typed inputs. function whatif() { var f = document.getElementById('sheet-fields'); if (!f || !f.whatif_labor) return { labor: 0, food: 0, sales: 0 }; return { labor: n(f.whatif_labor.value), food: n(f.whatif_food.value), sales: n(f.whatif_sales.value), }; } function recalc() { var f = document.getElementById('sheet-fields'); if (!f) return; var w = whatif(); // D8 — apply scenario deltas on top of the typed numbers. // Labor delta is in PERCENTAGE POINTS of sales; food delta is // in PERCENTAGE POINTS of sales; sales delta is in PERCENT // (multiplicative). var rawSales = n(f.sales_dinein.value) + n(f.sales_togo.value) + n(f.sales_other.value); var sales = rawSales * (1 + w.sales / 100); // Used-cost convention. var rawCogs = n(f.cogs_food_purchases.value) + n(f.cogs_bev_purchases.value) - n(f.cogs_inv_adjustment.value); var cogs = rawCogs + (w.food / 100) * sales; var rawLabor = n(f.labor_hourly.value) + n(f.labor_salary.value) + n(f.labor_taxes_benefits.value); var labor = rawLabor + (w.labor / 100) * sales; var prime = cogs + labor; var pct = sales > 0 ? (prime / sales) * 100 : 0; // Update what-if output labels. if (f.whatif_labor_out) f.whatif_labor_out.value = (w.labor >= 0 ? '+' : '') + w.labor.toFixed(1) + 'pt'; if (f.whatif_food_out) f.whatif_food_out.value = (w.food >= 0 ? '+' : '') + w.food.toFixed(2) + 'pt'; if (f.whatif_sales_out) f.whatif_sales_out.value = (w.sales >= 0 ? '+' : '') + w.sales.toFixed(0) + '%'; document.querySelector('[data-output="net_sales"]').textContent = fmt$(sales); document.querySelector('[data-output="cogs_total"]').textContent = fmt$(cogs); document.querySelector('[data-output="labor_total"]').textContent = fmt$(labor); document.querySelector('[data-output="prime_cost_dollars"]').textContent = fmt$(prime); var pctEl = document.querySelector('[data-output="prime_cost_pct"]'); pctEl.textContent = fmtPct(pct); var b = band(pct); pctEl.dataset.band = b.band; var rec = document.querySelector('[data-output="recommendation"]'); if (rec) rec.textContent = b.msg; // D9 · Anomaly flags. Bench.flag(slug, outputs) walks // data/benchmarks.json's anomalies array and returns any // operator-relevant warnings. var anomEl = document.querySelector('[data-output="anomalies"]'); if (anomEl && window.Bench && window.Bench.flag) { var flags = window.Bench.flag('weekly-prime-cost-worksheet', { prime_cost_pct: pct }); if (flags && flags.length) { anomEl.innerHTML = flags.map(function (f) { return '

' + f.replace(/[<>]/g, '') + '

'; }).join(''); anomEl.hidden = false; } else { anomEl.hidden = true; anomEl.innerHTML = ''; } } } // D8 · Reset scenario sliders. document.addEventListener('click', function (ev) { if (ev.target && ev.target.matches && ev.target.matches('[data-whatif-reset]')) { ev.preventDefault(); var f = document.getElementById('sheet-fields'); if (!f) return; if (f.whatif_labor) f.whatif_labor.value = 0; if (f.whatif_food) f.whatif_food.value = 0; if (f.whatif_sales) f.whatif_sales.value = 0; f.dispatchEvent(new Event('input', { bubbles: true })); } }); function collect() { var f = document.getElementById('sheet-fields'); if (!f) return [['Field', 'Value']]; var rows = [ ['Field', 'Value'], ['Week ending', f.week_ending.value || ''], [], ['Sales — dine-in', f.sales_dinein.value || '0'], ['Sales — to-go & delivery', f.sales_togo.value || '0'], ['Sales — bar & catering', f.sales_other.value || '0'], ['Net sales', document.querySelector('[data-output="net_sales"]').textContent], [], ['Food purchases', f.cogs_food_purchases.value || '0'], ['Beverage purchases', f.cogs_bev_purchases.value || '0'], ['Inventory adjustment', f.cogs_inv_adjustment.value || '0'], ['COGS (used cost)', document.querySelector('[data-output="cogs_total"]').textContent], [], ['Hourly & tipped wages', f.labor_hourly.value || '0'], ['Salaried wages', f.labor_salary.value || '0'], ['Employer taxes & benefits', f.labor_taxes_benefits.value || '0'], ['Total labor', document.querySelector('[data-output="labor_total"]').textContent], [], ['Prime cost (dollars)', document.querySelector('[data-output="prime_cost_dollars"]').textContent], ['Prime cost (% of sales)', document.querySelector('[data-output="prime_cost_pct"]').textContent], ]; return rows; } if (window.SheetPage) { window.SheetPage.register({ slug: 'weekly-prime-cost-worksheet', collect: collect, recalc: recalc, }); } })();

Keyboard: ⌘P print · ⌘S download CSV · ⌘↵ save to Workshop

When to use it

Pull this sheet out when —

  • Tuesday morning, closing the prior week. Before payroll. Before the produce reorder.
  • A cost just jumped — you want to see if it landed in the prime cost number or got absorbed.
  • You are talking to a partner or lender and need a one-number answer about restaurant health.
Common mistakes

What operators get wrong

  • Forgetting employer payroll taxes and benefits inside labor — the result reads 4 to 6 points low.
  • Using sales tax-inclusive revenue. Net of sales tax, every time, or the percent is wrong.
  • Counting only food in COGS — beverage prime cost runs different and needs its own line.
Pairs with

The tools, terms, and articles this sheet sits next to.

Free, no signup. Your numbers never leave this page.