Hoja gratis del operador · Se queda en tu navegador

Resumen mensual de
P&G.

Un P&G de una página que el operador lee en 90 segundos — no la versión del contador. Ventas por daypart, costo de mercancía, mano de obra, ocupación, marketing.

Paquete: Operaciones y Márgenes Cadencia: Mensual Privado — corre en tu navegador

Llénala

Resumen mensual de P&G

Mete tus números — la matemática corre en tu navegador. Imprime, exporta a CSV o guárdala en el Taller.

Ejemplo trabajado Restaurante de 80 asientos solo cena, suburbios de DC Ve cómo se ve un llenado de un martes en la mañana
Ventas totales (abril, 30 días)$187,400
Costo de mercancía — comida + bebida$58,300
Mano de obra total (por hora + planilla + impuestos)$61,500
Costos variables (comisiones + suministros)$11,200
Costos fijos (renta + seguro + servicios)$33,400
Costo principal63.9% · verde
Utilidad operativa del restaurante$23,000
Margen operativo12.3%

Banda verde en costo principal, margen operativo de dos dígitos — un mes saludable. La línea a vigilar son los costos fijos al 17.8% de ventas: su contrato se renueva en octubre, y un aumento de renta de un solo dígito empuja el siguiente trimestre a amarillo. La conversación es la renta antes que cualquier cosa en la cocina.

Números compuestos típicos — no un local real. Usa el ritmo, no las cifras.

Period
Sales (net of sales tax)
Cost of goods sold
Labor (fully loaded)
Variable costs (other)
Fixed costs
Total sales $0.00
Prime cost (COGS + labor) $0.00
Prime cost % of sales 0.0%
Contribution margin % 0.0%
Operating profit (before tax) $0.00
Breakeven sales / day $0.00

Type the period numbers above. Independent full-service typically targets prime cost in the 55–65% band; profit lives in the gap below 65%.

Try a scenario — what if labor, COGS, or rent shifts?

Slide one or more, the verdict re-runs on top of your typed numbers. Lease-renewal pressure is one-sided — rent goes up or it stays.

Read the long version What the month adds that the week can't see, the three numbers operators conflate (operating profit vs cash flow vs owner's pay), the breakeven sales-per-day number, and what to do when the lease renewal slider goes red. Where the month lands — What the monthly P&L tells you that weekly can't →

+ (Math.round(abs * 100) / 100).toFixed(2); } function fmtPct(v) { return (Math.round(v * 10) / 10).toFixed(1) + '%'; } // D8 · Read what-if slider state. All three are multiplicative // percent deltas applied on top of the typed line items. function whatif() { var f = document.getElementById('sheet-fields'); if (!f || !f.whatif_labor) return { labor: 0, cogs: 0, occ: 0 }; return { labor: n(f.whatif_labor.value), cogs: n(f.whatif_cogs.value), occ: n(f.whatif_occ.value), }; } function recalc() { var f = document.getElementById('sheet-fields'); if (!f) return; var w = whatif(); var sales = n(f.sales_lunch.value) + n(f.sales_dinner.value) + n(f.sales_bar.value) + n(f.sales_togo.value) + n(f.sales_other.value); var rawCogs = n(f.cogs_food.value) + n(f.cogs_bev.value); var rawLabor = n(f.labor_hourly.value) + n(f.labor_salary.value) + n(f.labor_taxes.value); var rawOcc = n(f.fixed_occupancy.value); // D8 — multiplicative deltas on top of the typed line items. var cogs = rawCogs * (1 + w.cogs / 100); var labor = rawLabor * (1 + w.labor / 100); var occ = rawOcc * (1 + w.occ / 100); var prime = cogs + labor; var variable = n(f.var_cc_fees.value) + n(f.var_supplies.value); var fixed = occ + n(f.fixed_utilities.value) + n(f.fixed_insurance.value) + n(f.fixed_marketing.value) + n(f.fixed_other.value); var primePct = sales > 0 ? (prime / sales) * 100 : 0; var contribPct = sales > 0 ? ((sales - prime - variable) / sales) * 100 : 0; var profit = sales - prime - variable - fixed; // Breakeven: sales such that contribution covers fixed. // Contribution rate = (sales - prime - variable) / sales = contribPct/100. var contribRate = contribPct / 100; var breakevenMonth = contribRate > 0 ? fixed / contribRate : 0; var days = Math.max(1, n(f.days.value)); var breakevenDay = breakevenMonth / days; // Update what-if output labels. if (f.whatif_labor_out) f.whatif_labor_out.value = (w.labor >= 0 ? '+' : '') + w.labor.toFixed(0) + '%'; if (f.whatif_cogs_out) f.whatif_cogs_out.value = (w.cogs >= 0 ? '+' : '') + w.cogs.toFixed(1) + '%'; if (f.whatif_occ_out) f.whatif_occ_out.value = '+' + w.occ.toFixed(0) + '%'; document.querySelector('[data-output="total_sales"]').textContent = fmt$(sales); document.querySelector('[data-output="prime_dollars"]').textContent = fmt$(prime); var primeEl = document.querySelector('[data-output="prime_pct"]'); primeEl.textContent = fmtPct(primePct); // D9 — band routes through centralized benchmarks. Same // metric key as weekly-prime-cost-worksheet so the two // sheets agree on what "healthy" means. if (window.Bench && window.Bench.evaluate) { var bp = window.Bench.evaluate('prime_cost_pct', primePct); if (bp && bp.band) primeEl.dataset.band = bp.band; } else { primeEl.dataset.band = primePct < 60 ? 'good' : (primePct < 65 ? 'warn' : 'bad'); } var contribEl = document.querySelector('[data-output="contrib_pct"]'); contribEl.textContent = fmtPct(contribPct); contribEl.dataset.band = contribPct > 30 ? 'good' : (contribPct > 20 ? 'warn' : 'bad'); var profitEl = document.querySelector('[data-output="profit"]'); profitEl.textContent = fmt$(profit); profitEl.dataset.band = profit > 0 ? 'good' : (profit === 0 ? 'idle' : 'bad'); document.querySelector('[data-output="breakeven_per_day"]').textContent = fmt$(breakevenDay); var callout = document.querySelector('[data-output="callout"]'); if (!callout) return; if (sales <= 0) { callout.textContent = 'Type the period numbers above. Independent full-service typically targets prime cost in the 55–65% band; profit lives in the gap below 65%.'; } else if (profit < 0) { callout.textContent = 'This month booked a loss of ' + fmt$(Math.abs(profit)) + '. The fix is almost always in prime cost (' + fmtPct(primePct) + ' here) before fixed costs — labor or food, name the bigger driver and act this month.'; } else if (primePct >= 65) { callout.textContent = 'Prime cost above the 65% ceiling. This month was profitable on the back of low fixed costs; the model breaks the moment rent or utilities tick up.'; } else if (primePct >= 60) { callout.textContent = 'Prime cost in the warning band. Tight discipline next month — small drift here compounds quickly.'; } else { callout.textContent = 'Healthy month. Prime cost ' + fmtPct(primePct) + ', operating profit ' + fmt$(profit) + '. Breakeven sales runs ' + fmt$(breakevenDay) + ' per day.'; } } function collect() { var f = document.getElementById('sheet-fields'); if (!f) return [['Field', 'Value']]; return [ ['Field', 'Value'], ['Period', f.period.value || ''], ['Operating days', f.days.value || ''], [], ['Lunch / brunch', f.sales_lunch.value || '0'], ['Dinner', f.sales_dinner.value || '0'], ['Bar & beverage', f.sales_bar.value || '0'], ['To-go & delivery', f.sales_togo.value || '0'], ['Catering & other', f.sales_other.value || '0'], ['Total sales', document.querySelector('[data-output="total_sales"]').textContent], [], ['COGS — food', f.cogs_food.value || '0'], ['COGS — beverage', f.cogs_bev.value || '0'], [], ['Labor — hourly', f.labor_hourly.value || '0'], ['Labor — salaried', f.labor_salary.value || '0'], ['Labor — taxes & benefits', f.labor_taxes.value || '0'], [], ['CC processing', f.var_cc_fees.value || '0'], ['Supplies / paper', f.var_supplies.value || '0'], [], ['Occupancy', f.fixed_occupancy.value || '0'], ['Utilities', f.fixed_utilities.value || '0'], ['Insurance & licenses', f.fixed_insurance.value || '0'], ['Marketing & subs', f.fixed_marketing.value || '0'], ['Other fixed', f.fixed_other.value || '0'], [], ['Prime cost ($)', document.querySelector('[data-output="prime_dollars"]').textContent], ['Prime cost (%)', document.querySelector('[data-output="prime_pct"]').textContent], ['Contribution margin (%)',document.querySelector('[data-output="contrib_pct"]').textContent], ['Operating profit', document.querySelector('[data-output="profit"]').textContent], ['Breakeven / day', document.querySelector('[data-output="breakeven_per_day"]').textContent], ['Callout', document.querySelector('[data-output="callout"]').textContent], ]; } // 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_cogs) f.whatif_cogs.value = 0; if (f.whatif_occ) f.whatif_occ.value = 0; f.dispatchEvent(new Event('input', { bubbles: true })); } }); if (window.SheetPage) { window.SheetPage.register({ slug: 'monthly-pnl-snapshot', collect: collect, recalc: recalc }); } })();

Teclado: ⌘P imprimir · ⌘S bajar CSV · ⌘↵ guardar en el Taller

Cuándo usarla

Saca esta hoja cuando —

  • Primera semana de cada mes, contra el mes anterior cerrado por tu contador.
  • Antes de sentarte con un socio, prestamista o casero a hablar del negocio.
  • Después de un cambio de menú, alza de precios o reset de mano de obra — mira qué se movió de verdad.
Errores comunes

Lo que los operadores hacen mal

  • Sumar el draw del dueño dentro de mano de obra. El pago al dueño es distribución; mano de obra es la línea que paga al staff.
  • Olvidar las comisiones de tarjeta como costo variable. 2.6% en cada peso de mesa no es error de redondeo.
  • Contar marketing como fijo cuando la mitad es subsidio de promo de plataforma. El subsidio se acaba; el costo se queda.
Va con

Las herramientas, términos y artículos al lado de esta hoja.

Gratis, sin registro. Tus números nunca dejan esta página.