Start free

Inventory

Stock, recipes, preps, suppliers, AI invoice photo import

23 min read Open this screen in the demo
On this page 19

Inventory

The Inventory section tracks stock of ingredients and goods. The core idea: you describe each dish's recipe once, and then components are deducted automatically when an order is completed — stock stays accurate without manual bookkeeping.

Open: Admin panel → Inventory. Tabs: Stock, Procurement, Forecast, Losses, Documents, Suppliers (Russian locations also get Marking, incoming veterinary documents for Mercury and ЕГАИС).


Stock#

  • A product = an ingredient or a stock item: name, unit, current quantity.
  • Unit cost is calculated automatically as a moving average of receipts; the tooltip also shows the last purchase price.
  • A backdated receipt (the invoice date is earlier than sales and write-offs already posted) takes its place in the history on its own date: the quantity and the average cost are recalculated along the whole chain from that day — as if the receipt had been posted on time. The cost of sales posted before the receipt was entered does not change in menu statistics — it is fixed at the moment of sale.
  • Minimum stock — when the quantity drops below this level the row is highlighted: time to reorder.
  • A product can be archived — it disappears from the list but stays in the document history.
  • The “CSV” button next to the search downloads the rows currently shown (search and view filters apply): item, barcode, unit, quantity, reorder point, unit cost and value. The file opens in Excel without the import wizard.
  • The Lasts column shows how long stock will last: the quantity divided by average daily usage over the last 14 full days, rounded down. For example, cream used at 2 kg a day with 9 kg in stock shows “~4 d”. Usage includes sales by recipe, write-offs, prep production and transfers out of the warehouse; receipts, returns to suppliers and stocktake corrections are excluded. Hover over the number to see average usage. ~2 d or less is highlighted red, up to ~5 d yellow; ample stock shows as “60+ d”. The column appears once usage has been calculated for at least one item in the warehouse; a new item needs at least 3 days of history. Usage is recalculated with the finance database, usually within an hour of sales. On a phone the same figure appears under the quantity. This is a rough purchasing horizon; the day-of-week “runs out by 7 pm” forecast is on the Forecast tab.

Set up an ingredient or product card#

A product card is whatever sits in your stock: a raw ingredient for recipes ("Flour", "Cream 33%"), a semi-finished product, or goods for sale. You need access to the Inventory section with edit rights.

  1. In Inventory, select the warehouse and click + Add Product.
  2. In the New Product window enter the Product Name. If a product with the same name or barcode already exists, the window warns you and offers Open it: two cards for the same item split the stock and the average cost between them, and a recipe writes off only one of them.
  3. Choose the Unit: g, kg, ml, l or pcs (a new card starts in grams). Stock, recipe quantities, write-offs and the unit purchase price are all kept in this unit. Need a bottle, a portion or an hour? Create it with 📏 Your units and pick it from the same list.
  4. If the item is counted in pieces but bought by weight or volume (or the other way round), fill in Weight or volume of one piece — without it, pieces and kilograms are not converted.
  5. Optionally fill in the Reorder point, the Procurement block (target stock, pack size, default supplier) and the Storage & details block (category, barcodes / SKU, storage, shelf life). The Short name for labels is printed on labels instead of the full name.
  6. Click Save. The item appears in the Stock list; it gets a quantity after a receipt, a count or setting the actual stock.

Choose the unit right away: stock is stored as a number in the card's unit, and changing the unit does not convert the quantity. A new product can also be created right in a line of a Receive Goods document without leaving it. A semi-finished product's recipe is filled in on the same card — see Semi-finished products.


View an item's stock movements#

The movement history helps identify which document changed the stock balance. You need access to the selected location's warehouse.

  1. In Inventory, select the warehouse and find the item.
  2. Click the 📜 History icon on its row. The Stock Movements window opens — check the item name under the title.
  3. Select the month and a period of 1, 3 or 6 mo — the selected month and the ones before it. If the period has operations of several types, narrow the list with the All operations filter.
  4. Compare the date, document, quantity change and balance after the movement. Next to the document type you see the order number, the supplier 🚚, the prep 🍳, the transfer location, the write-off reason and the note. When movements in the period carry a cost, an Amount column appears.
  5. Click a regular row to expand its whole source document, with all of its items. Click again to collapse it. Viewing the history does not change stock.

If there are no entries, check the item, warehouse, period and filter first. A loading error does not mean there were no movements: click Retry and wait for the log to load. A row marked Auto: debt write-off is an automatic adjustment of negative stock on a receipt; it has no document to expand. If the source document is not stored (a system correction or an older record), the window says so.

The Investigate button next to an item on the Losses tab opens the same history, already on the month the cycle closed.


Set the actual stock of one item#

Use this to correct one item without a full stocktake — for example, after recounting a single shelf.

  1. In Inventory, select the warehouse and find the item.
  2. Click ⚖️ Set actual stock on its row. The icon is shown to the owner, the manager and staff whose role has the Inventory section with edit rights plus the Stocktake posting right.
  3. The Actual quantity in stock field already holds the current balance — replace it with the counted quantity (in the item's unit).
  4. Optionally write the reason in Note, for example "recount after the shift". The field is optional free text: there is no list of reasons here.
  5. Click Save. The balance immediately becomes the number you entered, and the system records an adjustment document — it shows up as Adjustment with your note in the item history and on the Documents tab.

The adjustment sets an absolute quantity rather than adding or subtracting a difference. That is why it is not reversed: a mistake is fixed with a new count or by setting the actual stock again. If goods were spoiled, lost or used for staff meals, record a Write-off instead — the reason is mandatory there and lands in the write-off summary. For many items at once use the Stocktake wizard.


Recipes: auto-deduction on orders#

Each dish (in the Menu section) gets a recipe — which products and how much go into one serving. When an order is completed:

  • components of every order item are deducted according to their recipes;
  • for combo sets, the deduction unfolds the recipe of every dish inside the combo;
  • all movements are visible in the Documents tab.

To link products to dishes quickly there are AI suggestions: the system analyzes your menu and proposes which dishes use a product — you just confirm.


Keep stock of a menu item itself#

A bakery, a bar or a shop often finds it easier to count finished pieces — "Croissant", "Water 0.5 l" — than to write out a recipe. For that a menu item becomes a stock item and deducts itself when sold.

  1. In the Extensions store switch on Dishes as stock items (the extension is off by default). The Inventory section must be on as well.
  2. Open the item in the menu section and go to its Stock tab — the tab appears only with the extension on.
  3. Tick Track stock for this dish. Stock fields appear below — unit, reorder point, procurement, storage (as on a product card in Inventory).
  4. Save the item. It appears in Inventory as a product; its name is edited only in the menu editor, and the stock card reminds you of that.
  5. Bring in the stock with a receipt or a count — from then on every sale reduces it.

To stop tracking, untick the box and save: the stock card is archived, and past documents stay in the history.

If the item has a recipe, the checkbox has no effect. A sale deducts ingredients by the recipe and the item's own stock does not change — the Stock tab shows the warning "The recipe wins" and exactly what one sale deducts. To keep stock of the finished item, clear its recipe.

Product variants (SKUs) in the shop have their own stock-tracking mark in the variants table — selling a variant deducts its own stock, see Shop.


Semi-finished products (preps)#

For preps (sauces, dough, broths) a product gets its own recipe. The Production operation creates a production document: the prep is added to stock while its components are deducted. In dish recipes a prep is used like any other product.

How to put a prep into stock:

  1. On the product card fill in the Prep recipe (per 1 unit) block: the components and how much of each goes into one unit of the prep (per 1 kg of sauce, per 1 pc of dough). A product with a recipe is a prep: it gets a Prep badge in the list and a 🍳 button on its row.
  2. Click 🍳 on the prep's row, or + Operations → Production, and select the prep.
  3. Enter the Quantity produced — how much is ready, in the prep's unit. If the recipe has a batch, the Batch: … button fills in its yield.
  4. Check the Will be deducted block: the usage of each component with its current stock next to it. A component you have less of than needed is shown in red; this does not block production — the stock goes negative.
  5. Look at the Estimated cost of this output and the per-unit cost. If some ingredients have no purchase price, the estimate is understated, not zero; the server calculates the final cost when the document is applied.
  6. Add a note if needed and click Save.

Result: the prep's stock grows by the quantity produced, the components' stock goes down, and a Prep production document appears on the Documents tab and in the item history. Direct components are deducted: a nested prep is deducted as a product and is not unfolded down to raw ingredients. Usage follows the recipe version in effect on the production date. Auto-production on shortage, butchering and correcting a document are covered in Stock documents.


Goods receipt#

Two ways to register incoming goods:

  1. Manually — the "Receipt" button: pick products, quantities, prices and the supplier.
  2. By invoice photo — snap a photo of the delivery note: AI recognizes line items, quantities and prices and matches them to your products. You review and confirm. New products can be created right from the recognized invoice. If a product with the same name is already in your list, the line shows that it goes into that product and converts the quantity to its unit ("2 kg" → 2000 g). Packs such as "3 boxes × 12 l" are recognized and offered as a conversion to litres or millilitres — quantity and price change only when you press "Apply".

Every receipt is stored as a document linked to a supplier — purchases flow into Finance (food cost, gross profit).

Purchase price control on receiving#

On receiving, every line is compared with the median price of that product over the last 30 and 90 days. If the price is noticeably higher, a badge like "+18% above median" (the median itself in brackets) lights up next to the line — the storekeeper sees the increase at the moment of receiving, not a month later in a report.

A few details that matter:

  • the sample unit is the invoice, not the line: a supplier who splits a delivery into five lines does not shift the median five times harder;
  • fewer than three deliveries is not a sample, so no badge appears;
  • a discrepancy confirmed by the storekeeper lands in the supplier's journal — the counterparty gets a history of price shifts and a marker on the "Suppliers" tab;
  • the same median feeds the "purchase price spike" risk rule — the owner sees it in the "Cash risks" block, see Loss control. The storekeeper's and the owner's numbers match, because they are computed once, on the server.

Suppliers#

The Suppliers tab is your counterparty database: legal name, tax ID, bank and account, address, contact persons, phone, email. A supplier is selected when registering a receipt, so each counterparty has a purchase history. An archived supplier disappears from the list but stays in documents.

A supplier can have several contact persons — each with a role and their own channels. For every contact you pick where the order should be sent — the "Send via" field: e-mail, WhatsApp or Telegram. The list only offers channels that are actually filled in for that person, so an order can never be addressed to nowhere. The chosen channel comes first in the send dialog and is marked with a star; and it decides what the daily auto-order does: e-mail is sent by the system itself, while for a messenger it prepares a ready draft order — nobody but a human can write into a messenger first — and you send it in one click.


Write off spoiled or lost stock#

+ Operations → Write-off reduces stock by hand: spoiled, broken, lost, used for staff meals. One operation can include several products. A reason is mandatory:

Reason When to use it
Spoilage / expired Spoiled or out-of-date goods
Waste / trim Trimmings and cleaning losses during preparation
Breakage / defect Broken dishes, damaged packaging
Staff meal Food used for staff meals
Spill / tasting Tastings, losses when pouring
Shortage / theft A shortage found with no established cause
Other Anything else — explain it in the document note
  1. Select the warehouse you are writing off from and open + Operations → Write-off. The item is active once at least one product exists in the section; you need edit rights for Inventory.
  2. In the Stock Write-off window add lines: the product and the quantity that left, as a positive number in the product's unit.
  3. In Reason pick a reason from the table above or one of your own — custom reasons are listed as a separate Your reasons group. One reason applies to the whole document: record different reasons as separate write-offs.
  4. Optionally add a Note — for example "the fridge was off overnight".
  5. Click Save. The window closes and a write-off receipt appears above the list: "Posted … of …; failed …", the reason and the warehouse. Send any lines that failed again with Retry.

Stock goes down, and the document appears on the Documents tab, in the item history (with the reason) and in the Write-offs summary on the Losses tab. A user with access to settings adds custom reasons — for example "Food photography" — with the Write-off reasons… button under the reason field: see Custom write-off reasons and groups. A wrong write-off is corrected from the Documents tab (✎), not deleted.


  1. Select products: tick them in the Stock list and click 🏷️ Print labels on the orange selection bar. For a single product use the 🏷️ icon on its row. + Operations → Print labels prints the ticked products or, with nothing ticked, all non-archived products of the section.
  2. In the Print labels window pick a Label type: Warehouse (name, barcode with digits, unit, storage, expiry date), Price tag (name and a large price) or Shelf tag (name, price, barcode, category). The type only pre-fills a set of fields.
  3. In Show on label switch fields on or off: name, price, barcode, barcode digits, QR code, unit, category, storage, expiry date, print date, supplier. The preview on the left shows the first product.
  4. Choose the Label size — rolls of 58×40, 50×30, 40×30, 40×60, 30×20 mm, A4 sheets with 24, 10 or 14 labels, or the last option for a custom size. For sheet printing set the Sheet layout: A4 or Letter, columns, rows, margin and gutter.
  5. Barcode: keep Auto in Barcode type or choose CODE128, EAN-13, EAN-8, UPC-A. The first barcode of the product card is printed; if there is none and Auto internal barcode when none is on, the label gets the product's internal code.
  6. Set Copies — the default number for each product — and adjust individual products in the list below if needed (1 to 99).
  7. Check the price in the preview and the notes under it (see below), then print:
    • 🖨️ Print (N) opens the browser's print dialog: a regular printer or "Save as PDF". If the browser blocked the window, you are asked to allow pop-ups — allow them and click again;
    • 🖨️ Thermal prints to a label printer through the hardware bridge. The button is active only while the bridge is connected; after printing the bottom of the window shows "Printed: N" and, if any, the number of failures.

Printing does not change stock, so staff with view-only access to Inventory can print too. The window remembers its settings for next time. A thermal printer reliably prints the barcode, QR, price and Latin text; Cyrillic, Georgian and other non-Latin text is omitted on a thermal label — for such names print with Print (office printer or PDF) or fill in a Latin Short name for labels.

Which price goes on the tag. For a catalog item — the price in effect today at the warehouse's location, the same one the POS charges (an own price from the stock card is marked "*"). For a product outside the catalog — its Price-tag price, and if there is none, the latest purchase price from receipts of the current and previous month. While the catalog is loading, the print buttons stay disabled if the Price field is on; if the catalog could not be read, the window warns that tags print the stock-card prices.

Expiry date on the label — the print date plus the card's Shelf life. For products under the shelf-life control option, the template label prints without an expiry date: dated labels are printed from a specific batch.


Variance: where the difference went#

The "Losses" tab answers a question invisible in both sales and receipts: between two stocktakes more left the store than was sold. Consumption over the cycle is split into three parts:

Part What it is
Sales cost of goods sold, recorded at the moment of sale from recipes
Explained waste write-offs, production of semi-finished items, transfers between locations
Unexplained (variance) what the stocktake found: expected quantity minus counted quantity

The third line is the loss: an inaccurate recipe, portions served "by eye", unrecorded waste, or theft. It has to be read together with the first two — otherwise you cannot tell "we served more than the norm" from "we wrote it off as waste".

An honest caveat: a manual stock adjustment inside the cycle stores an absolute value rather than a delta, so part of the "unexplained" is in fact explained by an operator's hand — such documents are counted separately and shown alongside.

Losses exceeding theoretical consumption by more than a configured percentage raise the "consumption above norm" rule — see Loss control.


Demand forecast and prep plan#

The "Forecast" tab turns sales history into a plan for tomorrow: how many dishes will sell on this weekday, what has to be prepped (with recipes exploded and a "be ready by" hour), what to order from suppliers, and what risks running out before the day ends.

Details — Demand forecast.


Products by weight and labels#

Products by weight. A product can be measured in kilograms/litres rather than pieces: stock, recipes and write-offs all use those units. If scales are connected to the till through the hardware bridge, the weight is filled in automatically — both on receiving and when selling a dish priced by weight (canteen, deli). Price-by-weight is configured on the dish card, see POS.

Shelf labels. Products get warehouse labels with a barcode, name, price and an expiry date: if the product has a shelf life in days, the expiry is computed as the print date plus that period (for products under the shelf-life control option the date comes from the batch). Step by step — Print labels and price tags with a barcode. The price on a tag is the same one the POS charges — the catalog price (the location's own price if set). A different in-store price is set in the stock card with «Set own price…» and a reason: both the tag (marked «*») and the POS use it, the online store keeps the catalog price. This is not the same as order stickers — those are printed by the kitchen, see Kitchen and front-of-house printing.


What you need to get started#

  • The "Inventory" section — it is on by default; at 30 or more SKUs the system will suggest setting it up itself.
  • Ingredient and product cards with units of measure and pack sizes.
  • Recipe cards on dishes — without them automatic write-off on sale will not work.
  • Purchase prices — otherwise cost of goods, food cost and menu engineering cannot be calculated.
  • Permissions: posting a stocktake and ⚖️ setting the actual stock are available to the owner, the manager and roles with the Stocktake posting right.
  • The bridge and a label printer — for prep labels and price tags.

Limitations#

  • Inventory analytics (“Losses”, “Forecast”) works in both clouds, including cenaly.ru.
  • Negative stock is allowed deliberately: an incoming delivery "forgives" the shortfall rather than blocking a sale.
  • There is no batch tracking or FEFO in stock quantities. Batch and prep dates are kept by the shelf-life control option, but it does not change quantities; FEFO in marking suggests which opened pack to finish.
  • One unit per card, no automatic stock conversion: stock is kept in the card's unit. Conversion happens only on input — for example, a receipt line entered in kg is converted to the card's grams, and pieces ↔ kg only if the card has a Weight or volume of one piece.
  • Option compositions are counted when set: an option has its “Stock & tax”; without it only the main dish composition is written off. A product variant (SKU) deducts its own stock if tracking is on for it, and in a kit set to deduct its components on sale — its own composition or the product's.
  • Stocktake from a phone — via the scanner app (see Phone as a scanner); counting in the browser — with the “Stocktake” wizard.
  • Auto-ordering works from the reorder point, not from the forecast: the daily cron builds a purchase order for items below the reorder point (opt-in switch in "Procurement → Alerts"), sends it by e-mail itself and leaves a draft for messenger channels; ordering by forecasted demand does not exist yet.
  • The email digest of what to order exists (an opt-in switch with its own address); push notifications are sent on the AWS contour only.
  • EGAIS and Chestny ZNAK are Russian specifics: those views appear only for locations with the country set to Russia; live exchange with the state marking system over API is not connected (submission is semi-manual), and the regulator's EGAIS test contour has not been passed. VetIS (Mercury) works on mocks — the API access key has not been obtained.

Troubleshooting#

Stock was not written off after a sale. The dish has no recipe and Track stock for this dish is off, the add-on has no stock composition, or stock tracking is off for the sold variant (SKU). If an item is tracked as stock but has a recipe, the ingredients are deducted, not the item itself.

Stock went negative. By design: the system does not block a sale, and the shortfall is closed by the next delivery.

Cost of goods is empty. Purchase prices for ingredients are not filled in — without them neither food cost nor the menu-engineering matrix can be built.

I do not see the marking or alcohol views. They appear only for a Russian location.

A stocktake cannot be run. Running one is available to the owner and the manager; other roles get read-only access.

No purchasing email arrives. The “what to order” digest is switched on separately (see “Notifications”): check the switch and the digest email address (empty — it goes to the owner's email). The email only comes when items are below the reorder point.


  • Supplier orders — from “Need to order” to receiving, short deliveries and the supplier invoice
  • Stocktake — counting, reviewing the count sheet, posting and loss analysis
  • Stock documents — receipts, write-offs, production, custom write-off reasons and correcting documents
  • Demand forecast — prep plan, purchase draft and run-out risk
  • Loss control — the "consumption above norm" and "purchase price spike" rules
  • Menu engineering — what to do with a dish once its cost is known
  • Finance — purchases, food cost and gross profit
  • Orders — completing an order triggers deduction
  • QR menu — dishes and combo sets the recipes are attached to
  • Shop — the stock level is visible to the buyer on the storefront: "only a few left" or the exact number

FAQ#

Do all dishes need recipes?#

No. Start with your bestsellers and add the rest gradually. Dishes without recipes simply don't deduct stock.

What happens when an order is cancelled?#

Deduction is tied to order completion: cancelled orders don't touch stock.

Which languages do invoice photos work with?#

The AI handles typical delivery notes in the region's main languages (Georgian, Russian, English and others). You always review the result before confirming.

Can I run inventory across several locations?#

Yes, stock and documents are kept per location — pick the location at the top of the page.