Hoja gratis del operador · Se queda en tu navegador

Tarjeta de costo de
receta.

Mete ingredientes, precios AP y rendimientos. Llévate el costo del plato, el precio objetivo a tu meta de costo de comida y una tarjeta imprimible para la carpeta.

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

Llénala

Tarjeta de costo de receta

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

Ejemplo trabajado Medio pollo asado, lote de 4 platos Ve cómo se ve un llenado de un martes en la mañana
Pollo entero — 1.5 lb c/u, $3.20/lb, rendimiento 72%$4.80 AP / plato
Aceite de oliva — 0.5 floz, $0.18/floz, rendimiento 100%$0.09
Sachet de hierbas (romero, tomillo) — 0.25 oz, $1.40/oz, rendimiento 90%$0.39
Papas asadas en sartén — 6 oz, $0.12/oz, rendimiento 88%$0.82
Jugo de limón-chalote — 1.5 floz, $0.28/floz, rendimiento 100%$0.42
Costo del plato (ajustado por rendimiento)$6.52
Al 30% de costo de comida objetivo, precio objetivo$21.73
Precio charm (redondeado a .95)$21.95

El control deslizante de rendimiento es la palanca — los pollos de invierno vienen con más hueso y el 72% baja a 68%. A 68%, el costo del plato llega a $6.91, y el mismo objetivo mueve el precio a $23.95. La decisión no es si subir el precio del menú — es cuándo. Mueve el control deslizante de rendimiento ahora y ve a cuánto debería subir el precio.

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

Recipe
Ingredients
Ingredient Qty Unit AP $/unit Yield % Line cost
Total ingredient cost $0.00
Cost per plate $0.00
Plate cost $0.00
Target price (at your food-cost goal) $0.00
Suggested charm price $0.00
Try a scenario — what if vendor prices, yield, or your target shifts?

Slide one or more, the plate cost and target price re-run on top of your typed numbers. Yield drop is one-sided — kitchens lose yield in winter, on holidays, with new line cooks.

Read the long version AP vs EP, why the food-cost target is a policy decision (not a math one), the four lies in dish-level costing, and when to actually raise a menu price. The yield slider — Why dish pricing is a guess until you do this math →

+ (Math.round(v * 100) / 100).toFixed(2); } function charm(v) { // Round target price up to nearest .95 charm endpoint. if (v <= 0) return 0; var whole = Math.floor(v); var frac = v - whole; if (frac <= 0.45) return whole + 0.95; if (frac <= 0.95) return whole + 0.95; return whole + 1 + 0.95; } function lineCost(qty, unit, ap) { // ap is already $ per the user's chosen unit (e.g., $/lb, // $/oz, $/cup). Line cost = qty * ap. Yield is applied // after; yield reduces effective EP qty available for the // recipe — equivalently, raises the unit cost. return n(qty) * n(ap); } // D8 · Read what-if slider state. AP drift is multiplicative, // yield drop is additive on the typed yield (one-sided), target // delta is additive in percentage points. function whatif() { var f = document.getElementById('sheet-fields'); if (!f || !f.whatif_ap) return { ap: 0, yld: 0, target: 0 }; return { ap: n(f.whatif_ap.value), yld: n(f.whatif_yield.value), target: n(f.whatif_target.value), }; } function recalc() { var form = document.getElementById('sheet-fields'); if (!form) return; var w = whatif(); var apMult = 1 + w.ap / 100; var total = 0; for (var i = 1; i <= 5; i++) { var qty = n(form['ing_qty_' + i].value); var rawAp = n(form['ing_ap_' + i].value); var ap = rawAp * apMult; // Effective yield: typed minus the (one-sided) drop, floor 1. var rawYld = Math.max(1, n(form['ing_yield_' + i].value)); var yld = Math.max(1, Math.min(100, rawYld + w.yld)); // Yield % expresses what's usable after trim. Effective // unit cost goes UP by the inverse: $/EP = ($/AP) / (yield/100) var line = (qty * ap) / (yld / 100); total += isFinite(line) ? line : 0; var out = form['ing_cost_' + i]; if (out) out.value = qty && ap ? fmt$(line) : '—'; } var plates = Math.max(1, n(form.plates_yielded.value)); var perPlate = total / plates; var rawPct = Math.max(1, Math.min(60, n(form.target_food_cost_pct.value))); var pct = Math.max(1, Math.min(60, rawPct + w.target)) / 100; var target = pct > 0 ? perPlate / pct : 0; form.total_ingredient_cost.value = fmt$(total); form.cost_per_plate.value = fmt$(perPlate); // Update what-if output labels. if (form.whatif_ap_out) form.whatif_ap_out.value = (w.ap >= 0 ? '+' : '') + w.ap.toFixed(0) + '%'; if (form.whatif_yield_out) form.whatif_yield_out.value = w.yld.toFixed(1) + 'pt'; if (form.whatif_target_out) form.whatif_target_out.value = (w.target >= 0 ? '+' : '') + w.target.toFixed(2) + 'pt'; var pc = document.querySelector('[data-output="plate_cost"]'); if (pc) pc.textContent = fmt$(perPlate); var tp = document.querySelector('[data-output="target_price"]'); if (tp) tp.textContent = fmt$(target); var cp = document.querySelector('[data-output="charm_price"]'); if (cp) cp.textContent = fmt$(charm(target)); } // 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_ap) f.whatif_ap.value = 0; if (f.whatif_yield) f.whatif_yield.value = 0; if (f.whatif_target) f.whatif_target.value = 0; f.dispatchEvent(new Event('input', { bubbles: true })); } }); // Per-sheet collect: shape rows for CSV export — recipe header, // then ingredients table, then summary outputs. Mirrors what // an operator would paste into Sheets/Excel. function collect() { var f = document.getElementById('sheet-fields'); if (!f) return [['Field', 'Value']]; var rows = []; rows.push(['Recipe', f.recipe_name.value || '']); rows.push(['Plates yielded', f.plates_yielded.value || '']); rows.push(['Target food-cost %', f.target_food_cost_pct.value || '']); rows.push([]); rows.push(['Ingredient', 'Qty', 'Unit', 'AP $/unit', 'Yield %', 'Line cost']); for (var i = 1; i <= 5; i++) { var name = f['ing_name_' + i].value; var qty = f['ing_qty_' + i].value; if (!name && !qty) continue; rows.push([ name || '', qty || '', f['ing_unit_' + i].value || '', f['ing_ap_' + i].value || '', f['ing_yield_'+ i].value || '', (f['ing_cost_'+ i].value || '').replace(/^—$/, ''), ]); } rows.push([]); rows.push(['Total ingredient cost', f.total_ingredient_cost.value]); rows.push(['Cost per plate', f.cost_per_plate.value]); var tp = document.querySelector('[data-output="target_price"]'); var cp = document.querySelector('[data-output="charm_price"]'); if (tp) rows.push(['Target price', tp.textContent]); if (cp) rows.push(['Charm price', cp.textContent]); return rows; } if (window.SheetPage) { window.SheetPage.register({ slug: 'recipe-cost-card', collect: collect, recalc: recalc, }); } })();

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

Cuándo usarla

Saca esta hoja cuando —

  • Vas a meter un plato nuevo y necesitas un precio que respete tu objetivo de costo de comida.
  • Subió el precio de una proteína al recibir y quieres saber si el plato sigue rindiendo.
  • Tu jefe de cocina pregunta por qué la porción de cordero tiene que bajar un cuarto de onza.
Errores comunes

Lo que los operadores hacen mal

  • Usar el precio AP como costo — la cocina paga el costo EP, después de merma y rendimiento.
  • Olvidar la guarnición, el pan, los pickles, la salsa. Suman.
  • Costear con cost-plus-50% sin mirar a qué precio está el plato del restaurante de enfrente.
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.