Free operator sheet · Stays in your browser

Waste & Spoilage
Log.

Translate "we throw a lot away" into a dollar number nobody can argue with. Item, quantity, reason code, cost.

Pack: Operations & Margin Cadence: Daily entry · weekly review Private — runs in your browser

Fill it in

Waste & Spoilage Log

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

Worked example 32-seat bistro, one slow week See what a Tuesday-morning fill-in looks like
Salmon, 6oz portions — 4 portions, $6.40 each, spoilage, Sunday$25.60
Mixed greens — 3 lb, $1.80/lb, overprep, Tuesday$5.40
Bread — 6 loaves, $2.20 each, staff meal, Mon-Wed$13.20
Heirloom tomatoes — 2 lb, $4.20/lb, spoilage, Thursday$8.40
Beurre blanc — 8 oz, $0.85/oz, dropped, Saturday$6.80
Total weekly waste$59.40
Pattern: spoilage$34.00 (57% of waste)
Pattern: where it landsSunday + Thursday — slow days following heavy prep

The waste-log is a pattern detector, not a moral ledger. Two weeks of entries make the spoilage line obvious — too much prep on Wednesday and Saturday for the Sunday and Thursday traffic that actually walks in. The fix isn't shouting at the line; it's the prep par sheet getting Sunday's salmon allocation cut by 30% next week.

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

Week ending
Waste entries
Item Qty Unit cost ($) Reason Day Line $
Weekly waste total $0.00
Weekly waste total $0.00
Top reason this week

Log every line. The first surprise is usually how much. Tuesday morning, sort by reason and act on the top one.

+ (Math.round(v * 100) / 100).toFixed(2); } function recalc() { var f = document.getElementById('sheet-fields'); if (!f) return; var total = 0; var byReason = {}; for (var i = 1; i <= 8; i++) { var qty = n(f['qty_' + i].value); var cost = n(f['cost_' + i].value); var reason = f['reason_' + i].value; var line = qty * cost; var out = f['line_' + i]; if (out) out.value = (qty && cost) ? fmt$(line) : '—'; if (line > 0) { total += line; if (reason) byReason[reason] = (byReason[reason] || 0) + line; } } f.total.value = fmt$(total); var bigEl = document.querySelector('[data-output="total_big"]'); if (bigEl) bigEl.textContent = fmt$(total); var top = null, topAmount = 0; for (var k in byReason) { if (byReason[k] > topAmount) { top = k; topAmount = byReason[k]; } } var topEl = document.querySelector('[data-output="top_reason"]'); if (topEl) topEl.textContent = top ? (REASON_LABEL[top] || top) + ' · ' + fmt$(topAmount) : '—'; var callout = document.querySelector('[data-output="callout"]'); if (!callout) return; if (total === 0) { callout.textContent = 'Log every line. The first surprise is usually how much. Tuesday morning, sort by reason and act on the top one.'; } else if (top === 'overprep') { callout.textContent = 'Overprep is leading. Trim par sheets back, especially for the days where it concentrates.'; } else if (top === 'spoilage') { callout.textContent = 'Spoilage is leading. FIFO discipline + dating + cooler-temp logs are the fix; the waste log surfaces the symptom.'; } else if (top === 'dropped') { callout.textContent = 'Drops are leading. Check the line layout, the speed-rack heights, and the trainee mix on the busiest shifts.'; } else if (top === 'comp') { callout.textContent = 'Comped sends are leading. The fix lives in expo discipline and cook-temperature targets, not in the waste log itself.'; } else if (top === 'staff_meal') { callout.textContent = 'Staff meal is leading. That is fine — but it is a labor benefit, not a margin leak. Re-categorize the line for next week.'; } else if (top === 'trim_loss') { callout.textContent = 'Trim loss is leading. Yield-test the protein and adjust the recipe-cost card; the leak is upstream of the line.'; } } function collect() { var f = document.getElementById('sheet-fields'); if (!f) return [['Field', 'Value']]; var rows = [ ['Field', 'Value'], ['Week ending', f.week_ending.value || ''], [], ['Item', 'Qty', 'Unit cost', 'Reason', 'Day', 'Line

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

When to use it

Pull this sheet out when —

  • Every time a kitchen lead drops something, throws spoiled prep, or hands off staff meal.
  • Tuesday morning, when the weekly review names the top three offenders.
  • Any time someone says "we throw a lot away" — make them cite the number.
Common mistakes

What operators get wrong

  • Mixing staff-meal with spoilage. Staff meal is a labor benefit; spoilage is a margin leak.
  • Skipping the reason code. Without the code, the log just says "we wasted things."
  • Not pricing the line. A waste log without dollars is a feelings journal.
Pairs with

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

Glossary

Reading

  • None yet.

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

], ]; for (var i = 1; i <= 8; i++) { if (!f['item_' + i].value && !f['qty_' + i].value) continue; rows.push([ f['item_' + i].value || '', f['qty_' + i].value || '', f['cost_' + i].value || '', REASON_LABEL[f['reason_' + i].value] || f['reason_' + i].value || '', f['day_' + i].value || '', (f['line_' + i].value || '').replace(/^—$/, ''), ]); } rows.push([]); rows.push(['Weekly waste total', document.querySelector('[data-output="total_big"]').textContent]); rows.push(['Top reason', document.querySelector('[data-output="top_reason"]').textContent]); return rows; } if (window.SheetPage) { window.SheetPage.register({ slug: 'waste-log', collect: collect, recalc: recalc }); } })();

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

When to use it

Pull this sheet out when —

Common mistakes

What operators get wrong

Pairs with

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

Glossary

Reading

  • None yet.

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