Skip to content

Sellable products

Products lists the finished goods your production runs booked, ready to sell: what is available to promise, the unit cost, the last batch, the soonest expiry. The Available column is the shelf minus what is held and what open orders reserve; muted counts beside it (“+2 held”, “−30 reserved”) rebuild the physical total, and the six words are defined in Availability. This module is part of the larger plans.

The products list

A recipe can sell in up to 8 formats. A 250 ml jar and a 1 L pouch are two presentations of the same sauce, each with its own stock count, packaging, and unit cost. Add presentation in the page header creates one: a format noun (jar, pouch, tube), an optional fill size and unit, and what happens when you produce it:

  • Sell all of it: every batch is packaged and sold.
  • Fill some, keep the rest as bulk: at completion you say how many you filled; the rest books as bulk in the recipe’s unit, ready for another recipe.

Each format gets a pill under the header; click one to open its own stock line. When you plan a production run, pick which format the batch produces under Produce as. Edit renames the product, adjusts the format’s fill, and sets its variant and SKU. Add presentation takes the variant too, so two scents created together are told apart from their first pill.

Two fields on Edit tell a recipe’s formats apart without renaming the product. Variant is one short word for the version this format sells: a scent, a flavor, a colorway. It composes after the recipe name wherever the product shows (“Whipped body butter · Lavender”), with the format as a badge beside it. SKU is your own code for the format, unique in your workspace and stored in capitals. Leave the box empty and it shows a suggestion built from the recipe code, the variant and the fill (“BB-WHIP-LAVE-200G”); Use suggestion fills it in, and nothing is ever saved that you did not accept. The SKU reads under the name in the products list, trails the name in every picker, and prints on a label through the SKU field. Search in the products list and in the pickers finds it, and the variant as well.

The SKU here is your code for what you sell. The vendor SKU on an offer is your supplier’s code for what you buy; the two never meet.

A Name of your own still wins whole: type one and it replaces the composed name, badge included. Clear it to go back to the recipe name and the variant.

The Edit dialog with the variant and the SKU

Cost and margin holds the four figures: Unit cost, Average sale price, Margin, and Margin %. The unit cost is what one unit costs you all in: the batch cost per unit, plus the jar, lid and label counted per unit. When labor, equipment or overhead count for your organization, they are already inside that figure: see what counts in a unit cost. The sale price and the margin come from the sales you record, so the card says what is missing until the first one lands. With pricing on, the card becomes Cost, price and margin: your list prices, a suggested price and the planned margin beside the realized one. Pricing a product walks through it.

A product page with cost, packaging, and stock activity

If your organization sets Release batches to hold (see organization settings), a batch that completes without a passing finished-product check books its output as held: made, counted, but not available to sell or draw. The product page says so next to the available figure, with the quantity that is waiting.

A held batch releases by reverting it, recording the check result, and completing again. Until then it is out of the available figure everywhere: the page header, the list, and every picker read only released stock, which is the point of the setting. A connected shop never sees held stock either: stock push only offers what is released.

Each format carries its packaging set: which items one unit consumes and how many (1 jar, 1 lid, 2 labels). Runs consume packaging in whole packages, and low or out-of-stock items are flagged on the product page. Manage the items themselves under packaging.

Stock enters through completed runs. It leaves through Record what leaves:

  • Sold: a quantity plus an optional total price received. Sold prices feed the margin line.
  • Spoiled: what you had to throw out.
  • Expired, thrown away: an expired batch you binned. The ledger keeps the reason, so real expiry waste never hides inside spoilage.
  • Sample or gift: what you gave away.
  • Count correction: a negative number lowers the count, a positive one raises it. It asks for a Reason too, preset to Correction, so a shelf that came up short says whether that was breakage, theft, or paperwork.

The dialog’s From batch field can name the exact batch the units came from. Picking one pre-fills what that batch still holds, and the movement draws that batch alone instead of the oldest stock first. Leave it on automatic for the everyday sale.

Every movement lands in the product’s ledger with date, quantity, balance, lot, and batch.

Wrote the wrong lot code on a batch, or the wrong note on a sale? Correct on the ledger row fixes the paperwork: the lot code, the expiry date, and the note. Each change writes a line under the row saying what it was, what it became, and who changed it, so a record you tidied stays visibly a record you tidied.

On a row a production run produced, the lot code and the expiry are shown but locked. The batch record owns them, and that is where to fix them. A row a set build booked is locked the same way: its build record owns the code, and reverting the build is how you change it. The note stays editable everywhere.

Quantity, unit cost, and sale price are never editable. They move stock and money, and both already have an honest path: revert the entry and record it again.

The list flags an item Expired (or shows an amber date within 30 days) while a batch that still holds stock is past its date. The flag is a to-do, not a verdict: open the product, find the batch in the Batches card, and use Record a leave on its row. The dialog opens on that batch with its remainder pre-filled; throw it away as Expired, sell it off at a discount, or record what actually happened. Once the batch is empty, the flag clears. Because the leave names the batch, a later recall knows those exact units were binned, not sold.

Sold covers the sale that begins and ends at the counter. When anything was agreed before it ships (a shop’s weekly 24 jars, a promise for Friday), record a sales order instead: confirming holds the stock, shipping books this same movement, and the buyer keeps a history. With more than one location, the dialog asks where the units left from and draws that place’s lots; the page header says how much sits in each place.

A product with stock or history cannot be deleted; it can be archived. Archive in the page’s menu takes the format out of every picker and out of the default list: the run dialog’s Produce as, the sales-line and channel-mapping pickers, the gift-set inputs, the label context picker. Its page stays alive: the ledger, the batches and Record what leaves keep working, so the last cases of a discontinued format can still be sold off or thrown away. A batch already planned into it completes and books as usual.

The Archived pill on the products list shows what you archived, and search finds an archived product only there. An archived format keeps its SKU, so a shop or a spreadsheet that learned the code never lands on a different product. While it still holds stock, a count sheet lists it and the valuation report counts it; once it is empty, both leave it alone. Restore in the same menu brings a format back, as long as the recipe is not already at its eight formats.

The products list, archived view

You do not need a completed batch to set a product up. New product creates the line from a recipe, so you can add formats and packaging first and have the numbers ready when the first real batch books. To bundle several products into a gift set, see assemblies.

To have BatchDash plan the next batch when a product runs low, set a replenishment rule on its page.