Production Orders
Building a batch from its recipe — the yield you actually got, what the output ends up costing, and the demand ticket that carries a batch from a branch's request to its shelf.
11 min read · Updated 10 Sep 2026
On this page
- Completing a run
- Yield: planned against actual
- What the batch costs
- How the finished product's cost is updated
- The precision limit
- Batch dates
- The Production Orders screen
- The three demand sources
- Filing a production order
- Statuses, and how one advances
- The delivery leg
- When a sales order is waiting
- Cancelling
- Where to go next
There are two halves to producing goods in Kassly, and they are worth keeping apart in your head.
The production run is the physical build: ingredients go out, finished goods come in, and a cost falls out of the arithmetic.
The production order is the paperwork around it: a branch says it needs 40 litres of sauce, someone approves it, the batch is built, and the goods are delivered. It writes no stock of its own — it drives the run and the delivery transfer that do.
Both need the Warehouse & Commissary add-on (₱500 per branch each month), plus Recipe Costing (₱350 per branch each month) for the recipes themselves. A production order raised against a B2B sales order additionally needs B2B Sales Orders (₱300 per branch each month).
Set-up, the producible flag, who can do what, and how a run is requested and approved are covered in Commissary. This page picks up at the moment you actually build.
Completing a run
Open an approved run — one showing Draft — from Inventory → Commissary and click Complete.
The dialog asks for one thing: the Actual yield, in the output product's own unit. It starts pre-filled with the planned yield, and you change it to what you really got out of the batch.
Underneath, Kassly tells you the difference as you type:
| What you entered | What it says |
|---|---|
| Less than planned | Short by 3.00 L — this raises the unit cost. |
| More than planned | Over by 2.00 L. |
Then Complete Run. In one step Kassly:
- Works out each ingredient's quantity — the recipe line multiplied by the batch multiplier, converted into the ingredient's own stock unit, then scaled up for that line's waste percentage.
- Writes one negative stock movement per ingredient at the run's location, stamped with the ingredient's cost.
- Writes one positive stock movement for the output, at the actual yield.
- Rolls up the batch cost and stamps the unit cost on that output movement.
- Blends the new batch cost into the finished product's standing cost price.
The run moves to Completed, which is terminal. It records who completed it and when.
An insufficient ingredient fails the whole run. If any input is short at that location, nothing is consumed, nothing is produced, and you get the server's message back on the dialog. Kassly will not produce a partial batch or quietly consume what it can find — so top the ingredient up, or lower the batch multiplier and raise a new run.
There is no way to reverse a completed run. Correct a mis-production with a manual stock adjustment, which leaves both the run and the correction on the record. See Stock adjustments.
Yield: planned against actual
Planned yield is the recipe's yield multiplied by the batch multiplier. Actual yield is what came out of the pot.
Once a run is completed its summary shows Planned yield, Produced and Yield variance side by side, with the variance signed so a short batch is obvious.
The variance is not just a statistic. Actual yield is the denominator of the unit cost, so a short batch makes every unit more expensive, and that is correct: the same ingredients had to be paid for either way.
| Batch | Cost in | Yield | Unit cost |
|---|---|---|---|
| Planned | ₱4,000 | 40 L | ₱100.00 |
| Actual, short | ₱4,000 | 32 L | ₱125.00 |
If a recipe is habitually running short, that is a signal to fix the recipe's yield or its waste percentages rather than to keep absorbing it. See Ingredients and recipes.
What the batch costs
The unit cost of the output is the whole batch cost divided by the actual yield:
unit cost = (ingredient cost + labor cost + overhead cost) ÷ actual yield
- Ingredient cost is each line's consumed quantity — waste included — multiplied by that ingredient's current cost price, added up.
- Labor cost and overhead cost are the amounts you typed on the run for this batch as a whole, not per unit.
Every one of those is visible before you commit: the New Production Run dialog previews Input cost, Output and Unit cost live as you change the recipe, the multiplier, or the two cost boxes.
Labor and overhead can only be set when the run is raised. The Complete dialog asks for the yield and nothing else, so a batch that turned out to need more labour than expected keeps the figure you entered up front. Cancel and re-raise the run if that matters to you.
Ingredient costs are read at the moment you complete the run, not from when the recipe was written. A batch built today costs today's ingredient prices.
How the finished product's cost is updated
A produced item — house sauce, portioned meat, par-baked bread — is never bought from anybody, so it has no purchase price to cost from. If Kassly left its cost price at zero, every dish made from it would show a food cost of zero.
So completing a run blends the batch into the product's standing cost price as a weighted average of what you already had and what you just made:
new cost = (on hand before × old cost + produced qty × batch unit cost)
÷ (on hand before + produced qty)
Two consequences worth knowing:
- The new cost is not simply the batch cost. Make a cheap batch on top of a large expensive stock and the standing cost barely moves. That is the point of a weighted average.
- It is one cost per product, across your whole business — not per branch and not per warehouse. Produce the same item at two sites at different costs and they average into one figure.
That standing cost is what every recipe using the item reads, which is how a dish made from house sauce ends up with a believable food cost.
The precision limit
Ingredient cost prices are kept to four decimal places, so a raw material that costs a fraction of a centavo per gram can be recorded honestly.
A produced item's cost price is rounded to two decimal places each time a run completes. So a produced good tracked in grams, or any item whose true unit cost falls below one centavo, cannot hold that cost exactly, and the rounding re-enters every time you produce it again.
If that matters for a particular item, track it in a larger unit — per litre rather than per millilitre, per kilo rather than per gram — so the unit cost lands somewhere the centavo can carry it.
Batch dates
A production run stores a manufacture date and an expiry date, and stamps both onto the output stock movement.
Neither dialog offers a field for them. The New Production Run and Complete Run dialogs do not ask, so in practice a produced batch carries no expiry date and will not appear in expiry alerts. If you need shelf-life tracking on prepped goods, that gap is real — see Batch and expiry for what does carry expiry dates today.
The Production Orders screen
Open Inventory → Production Orders. One row per order:
| Column | What it is |
|---|---|
| Reference # | PO-000001, counting up per business. |
| Output | The finished product being asked for. |
| Qty | The quantity requested. |
| Source | Where the demand came from — see below. |
| Destination | Where the goods have to end up. |
| Status | See below. |
| Due | Your requested date, if you set one. |
Production order references are formatted
PO-000001, which is the same shape purchase orders use. They are separate documents, counted separately, soPO-000004may well exist as both a purchase order and a production order. When you quote a reference to someone, say which screen it came from.
The three demand sources
A production order says why you are making something. The source decides where it will be produced and where the goods must end up.
| Source | Use it when | Produced at | Delivered to |
|---|---|---|---|
| Branch restock | A branch needs produced stock delivered to it | The commissary warehouse | The branch you name |
| Sales order | A B2B order needs a producible good its branch does not have | The commissary warehouse | The sales order's own branch |
| Make to stock | Planning ahead with no particular demand | The location you pick | The same location |
For Branch restock and Sales order you can name the warehouse to produce in; if you have exactly one active warehouse, Kassly uses it. With several warehouses and no choice made, it stops and asks you to pick one.
Make to stock is the one that skips a step. It produces directly into the branch or warehouse you choose, so there is no delivery to arrange and the order completes as soon as the batch does.
Filing a production order
Click New Production Order.
| Field | Required | Notes |
|---|---|---|
| Source | Yes | Branch restock, Sales order, or Make to stock. |
| Recipe | Yes | Producible, active recipes only. |
| Requested quantity | Yes | In the output product's unit. Greater than zero. |
| Destination branch | For Branch restock | Where the goods must end up. |
| Sales order | For Sales order | The B2B order driving this. |
| Produce into | For Make to stock | A branch or a warehouse — exactly one. |
| Due date | No | When you need it. |
| Notes | No | Up to 2,000 characters. |
Kassly turns your requested quantity into a batch multiplier by dividing it by the recipe's yield, then raises the production run for you. Ask for 100 portions from a recipe that yields 40 and you get a run at 2.5 batches.
As with a standalone run, what happens on save depends on your access. Hold Manage production and the button reads Create Order and the run is self-approved. Hold only Request production and it reads Submit Request, the order lands awaiting approval, and the commissary approvers are notified.
A sales order that has already been invoiced or cancelled cannot drive production, and Kassly says so.
Statuses, and how one advances
A production order's status is a reflection of the run and the delivery it drives — you never set it yourself.
| Status | What has happened |
|---|---|
| Awaiting Approval | Filed, waiting for a manager. |
| Approved | Signed off. The batch can be built. |
| Delivering | The batch is built and a delivery transfer is on its way. |
| Delivered | The goods are at the destination. Terminal. |
| Cancelled | Withdrawn before anything moved. Terminal. |
| Rejected | A manager declined it. Terminal. |
You approve or reject a production order by approving or rejecting its production run — there is no second approval round. The order mirrors whatever the run does, and the detail page links straight to the run with View run and Complete run.
The progress trail on an order also shows In Production and Produced steps, and the list filter offers In Production, Produced and Fulfilled. Nothing sets those three today: an order goes from Approved to Delivering the moment the run completes. Filtering by them returns nothing.
The delivery leg
When the run completes on a Branch restock or Sales order, Kassly creates the warehouse-to-branch stock transfer for you, back-linked to the order, at the actual quantity produced. It is not auto-shipped — the dock still ships it and the branch still receives it, exactly as with any other transfer.
The order's detail page carries a Delivery transfer panel with the transfer's status and a button that reads Ship transfer, Receive transfer or View transfers depending on where it has got to.
Shipping and receiving that transfer needs the Stock Transfers Between Branches add-on (₱300 per branch each month), because it is worked from the Transfers screen. Without it, the goods stay at the warehouse. Use a Make to stock order into the branch itself instead.
Once the branch receives the transfer, the order flips to Delivered. See Stock transfers.
When a sales order is waiting
An order sourced from a sales order does one extra thing on delivery: it marks the sales order as ready and notifies the person who raised it — Stock for SO-000012 is now at Cebu Branch — ready to confirm & invoice.
It stops there deliberately. Kassly will not confirm or invoice the sales order for you, because invoicing books real revenue and can raise a credit charge against the customer. That stays a decision someone makes. The order's detail page has a Generate Invoice button for when you are ready. See Sales orders and invoices.
Cancelling
Cancel order is available only while an order is Awaiting Approval or Approved — that is, before any stock has moved. Cancelling also withdraws the linked run, so you do not have to tidy up in two places.
Once the batch has been built, cancelling is refused: Only requested or approved production orders can be cancelled (production has already started or completed). At that point the goods exist. Deal with them as stock — deliver them somewhere useful, or adjust them out.
Where to go next
- Commissary — the site, producible recipes, and approvals
- Ingredients and recipes — yields, waste, and food cost
- Stock transfers — the delivery leg
- Inventory valuation — how produced cost reaches your stock value