Start free

Stock documents: receipts, write-offs, stocktakes and production

Record stock movements, reconcile physical quantities, produce semi-finished goods and investigate order deductions.

22 min read Admin panel demo
On this page 20

Stock documents: receipts, write-offs, stocktakes and production

A document records why stock changed: a delivery arrived, an ingredient spoiled, stock was counted or a prep was produced. This article helps you choose the operation and check its result in cenaly.ge. Catalog setup, purchasing and suppliers are covered separately in the inventory overview.

What you need to get started#

What to prepare Why
Access to “Inventory” and the relevant location Staff work with warehouses within their access rights
A selected warehouse A manual document changes stock in that warehouse
Stock items with units of measure Quantities must match each item's unit
A supplier for a return A return is recorded against a specific supplier
A prep recipe for production It determines usage of the direct components
Permission to post a stocktake Counting and posting can be done by different staff

Open “Inventory” and check the selected warehouse before clicking “+ Operations”. The warehouse for a manual operation can differ from the location's sales warehouse.

Step 1. Receive a delivery#

Task: record the goods actually received and their purchase prices.

  1. Choose “+ Operations” → “Receive Goods”.
  2. Add the received items to the document lines.
  3. Enter actual quantities and prices; check units against the supplier's invoice.
  4. If you are entering the delivery on a later day, pick the day it arrived in “Document date”. It defaults to today.
  5. Check the warehouse and lines, then click “Save”.
  6. Find the document on the “Documents” tab and wait for confirmation of the stock change.

“Document date” sets the day the receipt enters stock and cost; the date in the supplier invoice field does not affect this. The field is also in purchase order receiving. A future date cannot be selected. After saving, the “Documents” feed opens on that receipt's month.

Result: the receipt increases stock in the selected warehouse. If the quantity is wrong, check the units first: a kilogram and a gram represent different quantities of the same delivery.

Use “Receipt from photo” to recognize an invoice. Review the recognized items, quantities and prices before clicking “Post receipt”. On cenaly.ru, “Receipt from photo” is not available.

Step 2. Record usage or a transfer#

Choose the operation that matches what happened to the stock.

Task Entry in “+ Operations” What to check
An ingredient spoiled or was used outside a sale “Write-off” Reason and quantity
Goods moved to another warehouse “Transfer” Source and destination warehouses
Goods were returned to a supplier “Return to supplier” Supplier and returned quantity

For a write-off, select a reason, add items and positive usage quantities, then click “Save”. For a transfer, also select the destination warehouse; for a return, select the supplier.

Write-off reason Example
“Spoilage / expired” An ingredient can no longer be used
“Waste / trim” Separately recorded preparation losses
“Breakage / defect” Damaged packaging or defective goods
“Staff meal” Ingredients used for staff meals
“Spill / tasting” A drink used outside a sale
“Shortage / theft” An identified shortage
“Other” None of the other reasons applies

If the built-in reasons are not enough, add your own — for example “Tasting” or “Food photo shoot”: see Custom write-off reasons and groups.

Transfer “by tech card”. To send the kitchen the ingredients for 20 portions of borscht, in the “Transfer” window use the “By tech card” block: choose the dish, enter the number of portions and press “Add ingredients”. The dish composition valid today (gross) is multiplied by the portions and added as lines; a product already in the form is summed. Takeaway/delivery-only packaging is not added, preps stay preps. You can edit the lines before saving; the note gets “by tech card: Borscht × 20”.

Replenish a bar or pantry to par. A secondary warehouse of a location (bar, pantry) can have its own par level: in the product card, in the per-warehouse thresholds block, set that warehouse’s “Target stock” (without it the product’s target stock applies, without that — the reorder point). When items on the “Stock” tab of such a warehouse fall below par — for example after a count — a banner “5 items are below this warehouse’s par level — …” appears with a “Replenish to par” button (the same entry is in “+ Operations”). It opens the “Transfer” window from the location’s main warehouse to this one: the lines top up to par, rounded up to the pack size, but never more than the main warehouse holds. Lemonade par at the bar is 30, the count found 15, packs of 6 → the transfer has 18. Anything limited by the main warehouse’s stock or missing there is shown above the lines — order it from the supplier in Procurement. Check the lines and press “Save”: the main warehouse goes down and the bar goes up. If you don’t save, the form stays as a draft.

Result: usage has a recorded reason, and a transfer records goods leaving one warehouse and entering another. If an operation is unavailable, check that items, another warehouse or a supplier exist, and check your access rights.

Step 3. Reconcile stock with a count#

Task: compare recorded stock with the actual quantities on the shelves.

  1. Open “+ Operations” → “Stocktake”.
  2. On “What to count”, choose the scope and click “Start count”.
  3. Enter actual quantities. A blank field means “not counted”; 0 means “counted, none left”.
  4. Review “Expected”, “Variance” and “Value”.
  5. Open “Variance report” and check the discrepancies.
  6. Click “Post stocktake” if you have the required permission.

Expected stock is captured when counting starts. If movements occur after a line was counted, the wizard flags them: check sales and recount any uncertain items.

When the location's accounting requires a review, “Accountant review” appears. Each discrepancy needs a reason; a staff member with approval rights completes the step with “Approve and post”.

Result: the posted count adjusts stock based on the count results. Preparing a count, counting by zones from phones and analysing losses are covered in Stocktake. If posting is unavailable, save the draft and pass it to a staff member with the appropriate rights.

Step 4. Record prep production#

Task: record raw materials becoming a semi-finished product, such as a sauce.

  1. Prepare a stock item for the prep with a recipe per unit of output.
  2. Choose “+ Operations” → “Production”.
  3. Select the prep and enter the quantity produced.
  4. Review component usage and “Estimated cost of this output”.
  5. Click “Save” and check the document and stock balances.

Result: the selected warehouse gains the prep and uses its direct components. If the cost estimate is incomplete, check purchase prices: an unknown price does not mean the raw material is free. The server calculates the final cost when it applies the document.

The production window includes “Auto-produce semi-finished goods on shortage”, a location setting. When enabled, order realization records production of the missing prep quantity in the sales warehouse. It is off by default; changing it requires settings access.

Auto-production handles one level: it does not automatically produce a nested prep. Cancelling an order returns the prep itself to stock; the recorded production remains.

How to use yesterday's prep in a new dish#

Task: use a prep already recorded in stock without deducting its original raw materials again.

  1. Check that the original preparation is a prep item and its balance is recorded in the right warehouse.
  2. Create another prep, for example “Prep for the new dish”.
  3. If both preps are counted in pieces and usage really is one-to-one, include 1 piece of the original prep per unit of new output.
  4. Record “Production” of the new prep in the same warehouse.
  5. Use the new prep in the new dish's recipe.

Result: production reduces the original prep balance and increases the new one. The original prep's nested recipe is not expanded again: manual production uses direct components.

If the preps are measured in kilograms or the yield differs, enter the actual usage rate in the appropriate units. This records a stock transformation; whether yesterday's preparation is suitable for use must be assessed separately.

Custom write-off reasons and groups#

Task: write stock off with a clear reason — “Tasting”, “Photo shoot”, “Treat for a guest” — and see losses by your own groups.

  1. Open “+ Operations” → “Write-off” and click “Write-off reasons…” under the reason field (or the same button in the “Write-offs” block on the “Losses” tab).
  2. Click “Add reason” and enter a name, for example “Tasting”.
  3. In “Group”, type your group, for example “Marketing”, or leave it empty — the reason then goes to the group of its base reason.
  4. In “Counted as”, choose the built-in reason used in accounting and marking reports — for tasting this is “Spill / tasting”.
  5. Click “Save”. Your reason appears in the write-off reason list under “Your reasons”.

Result: a write-off with the reason “Tasting” carries your name and group in the document and in the summary, while accounting sees the base reason. A reason you no longer need can be hidden with “Hide” — write-offs already made with it stay in the summary under the old name. The list is edited by staff with the ⚙️ Settings level for “Inventory”. Custom reasons also appear in write-offs on the phone: they follow the built-in ones and show up after the phone refreshes its warehouse data. If one phone write-off has lines with different reasons, posting creates a document for each reason.

Built-in group Reasons
“Spoilage & waste” “Spoilage / expired”, “Waste / trim”, “Breakage / defect”
“Staff” “Staff meal”
“Marketing” “Spill / tasting”
“Shortage” “Shortage / theft”
“Other” “Other”

Butchering: one carcass into several cuts#

Task: cut, for example, a 10 kg chicken carcass into 4 kg of fillet, 3 kg of thigh and 3 kg of bones and split its cost between the cuts.

  1. Create stock cards for the input (“Chicken carcass”) and the cuts (“Fillet”, “Thigh”, “Bones”).
  2. Open “+ Operations” → “Butchering”.
  3. In “Item to cut”, choose the carcass and enter the “Quantity” — 10 kg. The input cost is shown under the field.
  4. Add the cuts and their actual “Yield”: fillet 4, thigh 3, bones 3. The yield percentage is calculated for you, and the loss (input minus cuts) is shown below.
  5. Leave “Cost share, %” empty to split the cost by weight (40/30/30). To put more of the cost on the fillet, enter the shares yourself, for example 65/35/0: a cut with 0 % (bones, trimmings) is received without cost.
  6. Check the “Cost per unit” column and click “Post”.

Result: the carcass is written off the warehouse, the cuts are received, and the whole cost of the carcass moves into the cost of the cuts; the loss is already included in it. In “Documents”, butchering appears as production documents marked “🔪 Butchering · Chicken carcass” — one for each cut that takes a share of the cost. A wrong document is corrected with the usual ✎.

To avoid entering shares every time, type a “Template name” and click “Save as template”: the template stores the yield of each cut as a share of the input. Next time choose the carcass, enter the weight and pick the template in “Template” — yields are recalculated for the new weight, and you only adjust the actual ones. You can also cut on a phone used as a TSD at the prep table: the same templates and the same calculation, and the server posts the documents (from the next app version).

Monthly write-off summary#

Task: see where write-off money went: by reason, group, item, warehouse and employee.

  1. Open the “Losses” tab of “Inventory” — the “Write-offs” block comes first.
  2. Choose the month with the arrows.
  3. Switch the cuts: “Reason”, “Group”, “Item”, “Warehouse”, “Author”.

Result: the block shows the total and the number of write-off documents of the month across all warehouses available to you, and each cut breaks down the same total: the rows of any cut add up to the total. A corrected write-off is not counted twice: the reversal reduces the amount.

The amount is valued at the average cost on the write-off date: the warehouse records the unit cost when it posts the write-off, so a later receipt at a different price does not revalue past write-offs. A corrected write-off and its reversal are valued at the same cost and add up to zero. Write-offs posted before 28 October 2026 that carry no such cost are valued at the current average cost — the block shows how many such lines there are. Lines of items without a known cost are left out of the total — the block shows how many of those too. The author is recorded for write-offs made from 29 October 2026; earlier ones show “Not recorded” in the “Author” cut. The block does not depend on loss analytics between counts and works even before any stocktake cycle exists.

Step 5. Find, correct and print a document#

Task: correct an entry error while keeping its history.

  1. Open “Documents” and find the operation.
  2. If ✎ is available, open the correction and enter the correct data and a reason.
  3. Click “Post correction”: the system creates a reversal of the original movement and a replacement document.
  4. Use 🖨 for a printable form.

Among the operations covered here, corrections are available for eligible receipts, write-offs, supplier returns, production documents and transfers. The original document remains; a correction already created cannot itself be corrected again through ✎. If all quantities are set to zero, only the reversal is created, with no replacement document.

Result: the history shows the original operation and its correction. If ✎ is missing, check your editing permission and the document type and state: not every document supports this change.

Document numbering and closed periods#

Task: give receipts, write-offs and other documents a clear sequential number, and stop anyone from changing a reconciled past period.

Numbering. Every document saved in Inventory gets a number from its own series: receipt — RCV-000123, write-off — WO-…, transfer — TRF-… (the same on the outgoing and incoming halves), stocktake — INV-…. On cenaly.ru the default prefixes are Cyrillic (ПР-000123, СП-…, ПМ-…, ИНВ-…). The server assigns the number when the document is saved, sequentially and without gaps: two tills or two storekeepers never get the same number, and a save retried after a lost connection gets the same number. The number is shown in the “Documents” feed next to the type and in the header of the printable form (🖨). Documents created before numbering and automatic “Order deductions” have no number — the order identifies them.

Closed period.

  1. In Inventory, click “🔒 Numbering & closing”.
  2. In “All warehouses closed through”, choose the last day of the closed period — for example, the day of the last stocktake or of reconciliation with the accountant.
  3. If one warehouse closes later, expand “Separate date for a warehouse” and set its date: the later of the two applies.
  4. If needed, change the series prefixes and the number of digits, then click “Save”.

Result: the warehouse rejects documents dated on or before the closing date — the server replies “The warehouse is closed through 09/30/2026: documents dated on or before this day are not accepted”. Correcting (✎) a document of the closed period and reversing a stocktake posted in it are rejected the same way. Record a past-period mistake with a document in the current period: the correction gets a new date.

The owner, or a role with the “Stocktake posting” capability, can change these settings and post a document into a closed period as an exception: on rejection they are offered “Post anyway”, and the document gets a 🔓 mark in the feed. Managers and storekeepers without this capability see the settings read-only.

How order deductions are recorded#

When an order reaches realization, the system creates an “Order deduction” document from the sold items' recipes. It does not wait for the shift to close. Stock is deducted from the location's sales warehouse, not whichever warehouse you are currently viewing.

Event Stock accounting action
An order reaches realization Deducts recipe quantities, including item counts and selected options
A realized order is cancelled Reverses the quantities actually deducted
A realized order is changed Adjusts the difference; previously deducted lines retain their recorded usage rates
A deduction could not be saved Keeps pending work for automatic retry, including on the next order update
The same event arrives again Uses the same document identifier so the retry does not deduct stock again

The recipe version is selected by the order date. Changing a recipe today does not recalculate sales already recorded.

Sales without stock deduction: deduct past sales#

Task: find what was sold but did not leave the stock, and deduct it once the dish has a composition.

  1. Open the “Losses” tab → “Sales without stock deduction” block and pick the month.
  2. The list shows items of the warehouse location’s completed orders with no deduction document: portions, number of orders, last sale.
  3. For an item marked “no composition”, set the composition on the dish card (“Composition” tab).
  4. Press “Deduct now” on the item (or “Deduct all with a composition”) and confirm.

Result: the orders are queued; within ~15 minutes the sales warehouse is deducted by the composition valid on each order date and by its order type. If part of an order was already deducted, only the missing items are added; what was deducted is not recalculated. A repeat press does not deduct twice. Requires the stock “Edit” right.

Write-off check at the register#

Task: a bartender spilled two glasses of wine or a cook dropped a portion — the dish was not sold, but the products are gone. Write them off right at the register, with no payment and no sale.

  1. At the register, ring up the items on an ordinary new ticket — just like a sale: variants, options, combos.
  2. Open the ticket “⋯” → “🗑 Write off”. If the button is missing, the owner adds it from the library in “✏️ Customize screen” (the restaurant, cafe and bar starter layouts already have it under “⋯”).
  3. Pick a reason: a built-in one (“Waste (spilled, dropped)”, “Spoilage / expired”, “Breakage / defect”, “Tasting”…) or one of your account’s own reasons (see “Custom write-off reasons and groups”).
  4. Optionally add a note (table, what happened) and keep “Print the form (no prices)” ticked.
  5. Press “Write off”. If the employee’s role lacks the “Refunds and voids without approval” right, the register asks for a senior’s PIN — the same as when removing an item already sent to the kitchen.

Result: the ticket is cleared and the receipt printer prints a “WRITE-OFF” form — items with quantities, the reason, the employee and who approved it, no prices, marked “Not a sales receipt”. Within a few minutes the composition by today’s recipe cards leaves the location’s sales warehouse: two glasses of wine at 0.15 l — minus 0.3 l of wine. The document appears in “Documents” with the note pos-writeoff …, and in the “Write-offs” summary on “Losses” — with the reason and the employee who was at the register (by their PIN), not the terminal’s login.

Good to know How it works
Payment and receipt No money, no sales receipt, no revenue — it is a stock document
Which items Only a new ticket. Items of a saved order already sent to the kitchen are written off via “Remove” → “Write off as waste”
Item without a recipe Stock does not change for it; its name is recorded in the document
Pressing again One press — one document: a repeated request does not write off twice
Fixing a mistake Reverse the document in “Documents” (✎), like any write-off
Cenaly POS apps The same “🗑 Write off” button is in the Android, Windows and Ubuntu registers: 7 built-in reasons (your account’s own reasons — web register only for now), a note, the form on the bridge’s receipt printer. It needs an internet connection — offline the button is disabled and the ticket stays

Why was stock deducted differently?#

What you noticed What to check How to fix it
A dish's ingredients were not deducted Whether it has a recipe; on “Forecast”, check “Not covered by the plan: dishes without a recipe” Fill in the recipe; record missing past usage with a manual “Write-off”
The recipe changed after a sale, but the old usage remains The order date and the recipe version effective then Do not wait for recalculation: reconcile the difference and enter a “Write-off” or “Receive Goods”
Stock became negative Missing receipts or production, units and usage rates Record the missing event or correct an incorrect document; negative quantities are red
You see “Document accepted, posting is delayed” The server has not yet confirmed application Click “Check again”; do not recreate the same document
Usage appeared in another warehouse The location's sales warehouse Check the sales warehouse assignment and its movements; select the right warehouse for manual documents

A dish without a recipe does not deduct ingredients. However, an item tracking its own stock can deduct itself; selected options with their own recipes are also accounted for separately. A negative recipe-ingredient balance alone does not block a dish sale. Availability checks for the item itself, variants and the stop list apply separately.

Inventory in bookkeeping: entries and month-end close#

If bookkeeping is connected for the organisation, its books and “Month close” belong to the legal entity, not an individual location or warehouse. Availability depends on activation and the accounting package: setting the account country to Russia does not itself enable stock documents to feed the books. Automatic inventory entries are not yet available to all users.

Where closing is enabled, someone with the required permission reviews the checklist and chooses “Close month”. “Close with exception” requires separate permission and a reason; “Lock” permanently protects the period. Only the owner can “Reopen” an ordinarily closed month, with a reason; this does not reopen a locked period. With the inventory feed connected, a cost correction affecting a closed period is recorded in an open month without rewriting the closed one. The warehouse's own closing date is set separately — see “Document numbering and closed periods”.

Limitations#

  • Stock documents cannot be exported to 1C; the 1C integration imports the catalog.

  • Custom bookkeeping accounts cannot be assigned by product group or warehouse.

  • There is no scheduled stock-document export.

  • The number counter does not reset by year and cannot be edited manually; a number never changes after saving.

  • A stock document is not saved without a connection to the server: only the server assigns the number and checks the closed period. The form stays open with what you entered.

  • One manual production document produces one prep; output and component usage belong to one warehouse.

  • Butchering is posted within one warehouse; the input is one item.

  • Write-off by shelf-life lot is available with the reason “Spoilage / expired” or a custom reason counted as “Spoilage / expired”. A lot cannot be written off with a custom reason based on another built-in reason.

  • The production date is the time of saving; the form does not let you choose a past date.

  • A stocktake starts at the current time; this wizard cannot backdate it.

  • “Order deduction” cannot be corrected through ✎; order changes are handled through the POS and order accounting.

  • A stocktake is not corrected with the ordinary reversal-and-replacement pair: run a new count.

  • “Receive Goods” has no Excel upload; opening balances use the migration page's “Step 2 — Warehouse stock”.

  • “Receipt from photo” is unavailable on cenaly.ru.

Troubleshooting#

Symptom Cause What to do
“Save” is unavailable for a write-off No reason or positive quantity Select a reason and fill in at least one line
A supplier return cannot be saved No selected supplier or items Add the supplier and return lines
Transfer cannot be selected There is no other warehouse Set up a destination warehouse and check access
There is no prep to select for production No prep with a recipe exists Fill in the stock prep's recipe
A stocktake cannot be posted Missing rights or reasons for the accountant review Save the draft; pass it for posting and fill in the reasons
The stock balance is not confirmed after saving Posting is delayed Use “Check again”, then check the document and warehouse
“No connection to the server…” on save The server's reply did not arrive, so the document may not have been saved Check the connection and click “Save” again without closing the page: no second document will appear
“The warehouse is closed through …” on save The document's date, or the corrected document's date, is on or before the closing date Record the document with today's date or ask the owner to post it as an exception

Frequently asked questions#

Must I manually write off ingredients for every dish sold? No. With a recipe configured, order realization handles this. Use manual write-offs for separate events and verified discrepancies.

Why is sauce stock negative while the raw materials remain? A sale uses the prep itself. Check whether its production was recorded or auto-production is enabled.

Can documents be printed? Yes. Use 🖨 on the “Documents” tab.

Why do older documents have no number? Numbers go to documents saved after numbering was introduced; past documents are not renumbered so that printed forms stay valid.