Home / Help Center / pos-app-bakery / bakery / Production Schedule
📋 bakery

Production Schedule

Production Schedule is where you plan what to bake and when, track each run from Planned through In Progress to Done, and — when a run finishes — confirm the actual yield and let BazaarPOS automatically deduct the linked recipe's ingredients from stock.

📍 Menu path: Bakery → Production Schedule
👤 Who uses it: All roles can view and schedule runs; no plan-tier restriction

Overview

Every row is a production run: a recipe (or free-text item name) scheduled for a date and time with a planned quantity, optionally assigned to a staff member.

Runs move through a simple status flow — Planned → In Progress → Done — or can be Cancelled at any point before Done.

Marking a recipe-based run Done opens a Confirm Completion modal that deducts every linked ingredient from Inventory in one step, auto-calculates the batch's expiry date from the recipe's shelf life, and lets you record any yield variance.

Two extra tools sit above the run list: a Demand Forecast panel that suggests quantities based on recent sales history, and a Today's Bake List panel that aggregates demand from Cake Orders and Standing Orders due today, with a one-click Suggest PO for any ingredient shortfall.

Before You Start

Step-by-Step Guide

1 Schedule a production run

  1. Click Schedule Production (or the equivalent header button).
  2. Pick a Recipe from the dropdown, or leave it as "— No recipe (free text) —" and type an Item/Product Name instead.
  3. Set Date * (required), Start Time, Quantity to Produce and Assigned To (staff name), plus any Notes.
  4. If a recipe is selected, a live "Ingredients needed for N units" preview appears below, scaled automatically from the recipe's own yield — ingredients without a linked product show an orange ⚠ warning that stock will not auto-deduct for that line.
  5. Click Schedule.

2 Advance a run through its status

  1. Click Start on a Planned run to move it to In Progress.
  2. Click Mark Done on an In Progress run — if the run has a linked recipe, this opens the Confirm Completion modal instead of updating instantly; for a free-text run with no recipe it advances directly to Done.
💡 Click the ban icon to Cancel any run that has not yet been marked Done — Cancelled runs never touch stock.

3 Confirm completion and deduct ingredients

  1. In the Confirm Completion modal, review the Planned Qty and adjust Actual Qty Produced if the real yield differed — a variance badge (▲/▼ with a percentage) appears automatically when they differ.
  2. Confirm or adjust the Expiry Date, pre-filled from the recipe's Shelf Life Days (or the run's own existing expiry if the recipe has none set); leave blank if not applicable.
  3. Add optional Completion Notes, e.g. "Oven ran hot".
  4. Review the Materials to Deduct list — each ingredient's quantity is the recipe's ingredient quantity × planned quantity; ingredients with no linked product show a warning that stock will not change.
  5. Click Confirm & Deduct.
💡 If any deducted ingredient's remaining stock drops low after the deduction, a toast warning appears for each one, e.g. "Low stock: Butter (2 kg left)".

4 Use the Demand Forecast to schedule ahead

  1. Choose a forecast window — Next 3, 7, 14 or 30 days — and click Generate.
  2. BazaarPOS looks at recent sales history per recipe and suggests a daily quantity; recipes with no sales history are simply omitted from the list.
  3. Click Schedule next to any suggestion to open the Schedule Production Run form pre-filled with that recipe and its suggested quantity, dated for tomorrow.

5 Follow Today's Bake List

  1. The Bake List panel (only shown when there is at least one item needed) aggregates demand from today's Cake Orders and any Standing Orders due today into one combined list per product, with small tags showing which customer or order contributed to each quantity.
  2. Click Schedule next to any line to open a pre-filled production run for that product, dated today.

6 Turn ingredient shortfalls into a Purchase Order

  1. Click Suggest PO in the Bake List panel header.
  2. BazaarPOS analyses every planned run for that date and lists any ingredient that does not have enough current stock, showing how much is needed versus what is currently on hand.
  3. Pick a Supplier from the dropdown (or type a name manually if none exist yet) and an Expected Delivery Date.
  4. Click Create PO (N items) — only ingredients linked to a real Product are added; unlinked shortfalls are shown for visibility but excluded from the purchase order.

7 Print a batch label

  1. Once a run is Done, click the tag icon to open the Product Label preview — showing the recipe name, batch (production) date, Best Before date if an expiry was set, quantity, prepared-by staff name, and an allergen warning line if the recipe has any tagged allergens.
  2. Click Print to send it to your label or receipt printer.

8 Filter and clean up the run list

  1. Use the date picker to jump to any day, or click All dates to see every run regardless of date.
  2. Use the status tabs — All / Planned / In Progress / Done / Cancelled — to narrow the list.
  3. Delete a Done or Cancelled run permanently using the × icon once you no longer need it in the list.

Every Field & Button, Explained

Field / ButtonWhat it does
Schedule Production (header button)Opens the Schedule Production Run form.
Date filter + All datesRestricts the list to one date, or clears the date filter entirely.
Status tabsAll / Planned / In Progress / Done / Cancelled.
Demand Forecast panelDay-window selector (3/7/14/30 days) and Generate button; suggests quantities per recipe from recent sales history.
Today's Bake List panel + Suggest POCombined demand list from Cake Orders and Standing Orders due today; Suggest PO opens the shortfall-based purchase order helper.
Date / Recipe-Item / Planned / Actual / Time / Assigned To / Status / Actions columnsThe production run table.
StartAdvances a Planned run to In Progress.
Mark DoneAdvances an In Progress run to Done — opens Confirm Completion first if the run has a linked recipe.
Cancel (ban icon)Cancels a run that has not yet been marked Done; no stock is affected.
Print label (tag icon)Only shown on Done runs; opens the batch label preview and print dialog.
Delete (× icon)Only shown on Done or Cancelled runs; permanently removes the run from the list.
Recipe dropdown / Item-Product NamePick an existing recipe, or type a free-text item name if none applies.
Date * / Start Time / Quantity to Produce / Assigned To / NotesThe core fields of the Schedule Production Run form.
Scaled ingredient previewLive ingredient quantities scaled from the recipe's yield to the entered production quantity, shown while scheduling.
Actual Qty Produced *Entered in the Confirm Completion modal; compared against Planned Qty to compute the yield variance.
Yield variance badge▲ or ▼ with a percentage, shown whenever Actual Qty differs from Planned Qty.
Expiry Date (completion)Pre-filled from the recipe's Shelf Life Days; editable or can be left blank.
Completion NotesFree-text notes recorded against the completed run.
Materials to Deduct listShows exactly what will be deducted from Inventory before you confirm.
Confirm & DeductApplies the completion — deducts linked ingredients, sets status to Done, records actual quantity and expiry.
Suggest PO shortfall list + Supplier + Expected Delivery Date + Create POThe Bake Plan PO helper — analyses planned runs, lists ingredient shortfalls, and creates a purchase order for the linked ones.

Tips & Best Practices

Troubleshooting & FAQ

Marking a run Done didn't ask me anything, it just changed status.
That happens for runs with no linked recipe (free-text item name) — there is nothing to deduct, so the Confirm Completion modal is skipped entirely.
Some ingredients weren't deducted after I completed a run.
Only ingredients linked to a real Product on the recipe get deducted. Ingredients without a Link Product selection show a warning in both the schedule preview and the completion modal, and never touch stock.
The Expiry Date field was empty when I opened Confirm Completion.
The recipe has no Shelf Life Days set. Go to Recipes, open the recipe, and fill in Shelf Life (days) so future runs auto-fill this field.
Suggest PO shows a shortfall but I can't add it to the PO.
That ingredient has no linked Product, so BazaarPOS has no product record to put on a purchase order. Link it from the recipe editor first.
I don't see a Demand Forecast suggestion for a recipe I know sells well.
Forecasts only include recipes with matching sales history inside the selected day window. Try a longer window (14 or 30 days), or check that sales are actually linked to that product.

🧑‍💻 Developer Notes

Source component(s):

  • frontend-app/packages/pos-react-lib/src/pages/fnb/ProductionPage.jsx

Backend endpoints used:

  • GET /bakery/production
  • POST /bakery/production
  • PUT /bakery/production/:id
  • DELETE /bakery/production/:id
  • POST /bakery/production/:id/complete
  • GET /bakery/production/demand-forecast
  • GET /bakery/production/bake-plan
  • GET /bakery/production/bake-plan-po
  • GET /recipes
  • GET /recipes/:id
  • GET /suppliers
  • POST /purchaseorders

Related tables (db-core repositories):

  • ProductionRun
  • Recipe
  • Inventory
  • StockMovement
  • CakeOrder
  • StandingOrder
  • Supplier
  • PurchaseOrder

Redux slices:

  • None — local component state only

Feature flag key: production

Exported as FnbProductionPage from pos-react-lib. The label print uses a React portal (ReactDOM.createPortal) rendered directly under <body> together with a print-only CSS rule that hides everything else on the page during window.print(), so only the label itself is sent to the printer. Deduction quantities are always recipe ingredient quantity × the run's planned quantityToBake — entering a different Actual Qty Produced only affects the recorded variance, not how much stock is deducted.