Ledgr/Documentation/Inventory

Inventory

Watch the 2 lessons: Add a product with opening stock (2:01), Count stock with a stock take (2:03).

Stock that stays honest across locations, with a movement history you can trace back to the document that caused it.

Plan.

Inventory is included from Business upwards.

On Starter it can be bought on its own as the Inventory add-on at R149/mo — one charge, however many companies you run. See pricing.

Products and variants

  1. Inventory → Add Product

    Name, SKU, category, unit, cost price, sell price and VAT rate.

  2. Add variants if the product has them

    Capacity, colour, size — each variant carries its own SKU and price and holds its own stock. A laptop in 16GB/512GB and 32GB/1TB is one product with two variants, not two products.

    A variant's stock is counted, never typed. Give a new variant the units already on the shelf as its opening stock, then choose the variant when you Receive Stock; an invoice line for the variant takes its units out. Each of those moves the Inventory account with it.

  3. Choose a costing method

    FIFO, earliest expiry first or weighted average, set per product. This decides what cost of sales is posted when a unit is sold, so change it only at a period boundary. Earliest expiry first sells the batch that goes out of date soonest, then batches with no expiry date.

    No LIFO. SARS does not accept LIFO for tax, and IFRS and IFRS for SMEs do not permit it, so a product cannot be set to LIFO. A product that was on LIFO has been moved to weighted average: IFRS for SMEs requires the change, it applies from the day it was made, and no stock quantity, stock value or past sale was restated. Sales from then on are costed at the average cost of what is in stock.

Whole units, or fractions of one

Stock is counted in whole units unless you say otherwise. Each product carries its own quantity precision — 0 to 4 decimal places — because whether half of something is a real thing is a fact about the goods rather than a setting for the whole business.

  • Leave it at 0 for anything you sell by the item. Nothing you already sell changes.
  • Set 2 or 3 for metres of cable, litres of resin, kilograms of powder — anything a supplier delivers 2.5 of.
  • A serialised product is fixed at 0: half a serial number is not a thing.

It matters most on the way in. With whole units only, receiving 2.5 of something would book 3 units that never arrived, and receiving 0.4 would book none while still raising the bill.

Locations and transfers

Stock is held per location, not as a single global number. Create a location for each place you actually hold stock, then move units between them with a transfer — which records an out at the source and an in at the destination so the total never drifts.

When you save a location with its street address and town, Ledgr places it on the map, so deliveries can be sent from the nearest branch. It does this only when the address points to exactly one place. If it points to more than one, or to none, the location is still saved and its card tells you why it could not be placed. Add the town or suburb to the address to settle it.

Which branch an order ships from

With more than one location, every order, delivery note and invoice shows Ships from: the branch its goods leave from, and why — for example Durban — nearest with stock. Ledgr picks the branch nearest the customer's delivery site that holds every item in full; failing that, the nearest that holds some of it; then the customer's own branch; then your main location. Tap another branch to choose it yourself. The order reserves its stock there, and the delivery and the invoice take the goods from there — the other branches' stock does not move. A location that is not on the map is never picked as the nearest.

Your main location is your oldest active location: deactivating a branch stops it being used.

Reorder points, per branch

A product's reorder point compares the total on hand against one number. That is the right check for one shop, and the wrong one for two: 40 units in Johannesburg and none in Cape Town reads as perfectly healthy right up until the Cape Town counter cannot fill an order. The stock is real, it is just in the wrong province.

Open Stock Levels and any branch shortfall appears at the top. Use Thresholds on a row to say what each location should hold, and optionally how much to bring in when it drops — Ledgr keeps the trigger and the order size separate, because plenty of businesses know the first without having decided the second.

Two rules worth knowing. A location with no threshold of its own falls back to the product's reorder point, so nothing changes for a single-location business. And a branch is only reported short of something it is meant to carry — either it holds stock of it, or you set a threshold there. Otherwise every branch would be told it is short of every product it has deliberately never stocked, and a warning list nobody can read is a warning list nobody reads.

On hand, reserved and available

A sales order holds its stocked items for the customer who ordered them. The product shows three figures: on hand is what is on the shelf, reserved is what open sales orders are holding, and available is what is left to sell. Reorder points and the low-stock list judge the available figure, so ten on the shelf with eight promised reads as two.

Nothing leaves the shelf when an order is raised. Converting the order to an invoice releases the reservation, and the goods come out when you issue that invoice; cancelling the order releases it too. An order can reserve more than you have — it says by how much, so you know what to buy — but the invoice will not issue until the stock is there.

Batch tracking

Where it matters who supplied a unit and when it expires, receive stock in batches. A batch holds its id, received date, supplier and expiry date. Movements record the batch, so a recall or a short-dated line can be traced to the customers who received it.

Recalling a lot. On a product's page, each batch under Batch Tracking has a recall button. It lists every customer the lot went to — on an invoice, a delivery note or a job card — with the document and quantity, and how much is still on hand. Quarantine holds what is left: it stays in your stock value, but nothing can be sold, issued or built from it, and a sale only that lot could fill is refused with the lot's number. This works on any plan with Inventory; you do not need Manufacturing.

Expired stock is never sold, issued to a job or built into anything, whatever the costing method. If only expired stock could fill a sale, the invoice is refused and names the batch and its expiry date: write the batch off with a stock adjustment (which takes expired batches first), or sell from another batch.

Receiving stock without an order. Receive Stock asks what the stock is. Bought (the usual answer) is stock you owe the supplier for: Ledgr puts it in Inventory and in Goods Received Not Invoiced (2115), a liability, so a month-end between the delivery and the supplier's invoice does not show the goods as a negative cost of sales. When the invoice arrives, key it as a bill and name the product on its lines (category Stock or Purchases): Ledgr matches the lines to your oldest open receipts of that product and clears 2115. If the invoice charged a different price, the difference goes with the stock: onto the units still on the shelf, and into cost of sales for the units already sold. Found on a count is a stock gain and Already owned when the books opened is opening equity; neither is owed to anyone, so neither touches 2115. The receipts still waiting for an invoice are listed oldest first, with the days each has waited, under Awaiting Invoice, and their total ties to 2115 on the ledger health check. Besides a bill, an expense or a bank payment coded to Purchases can name the product and how many it paid for.

Recipes and assemblies

If you buy parts and sell something made of those parts, a recipe records what one run consumes and a build turns the parts into the finished product. Ledgr costs the finished units at what the components actually cost, not at their list prices — which is why the gross margin on something you made can be trusted.

  1. Inventory → Assemblies → New recipe

    Choose the finished product, list the components, and say how many units one run produces. If one mix makes twelve, put 12 there — the component quantities are then per mix, not per unit, so nothing has to be rounded.

  2. Add scrap where there is waste

    A workshop cutting 2.4m from a 2.5m length consumes the whole length. Enter that as scrap and Ledgr consumes what you really use, so purchasing stops under-ordering.

  3. Add labour and overhead per run, if you cost them

    These are capitalised into the finished stock — debited to Inventory, with labour credited to Salaries & Wages (6190) and overhead to Production Overheads Absorbed into Stock (6350) — because the value moved onto the shelf rather than leaving the business. They come out of the expenses that carried them, and reach cost of sales when the goods are sold. Leaving it unposted would overstate the month's costs and understate closing stock.

  4. Build

    The build sheet shows what the run needs, what is on hand, what it will cost per unit, and the most you could make right now. Components come off the shelf through the same costing method a sale uses, and the finished units are received at the total the build genuinely cost.

A recipe cannot contain the product it makes, directly or through a sub-assembly — Ledgr refuses it and shows the chain, because the cost would never resolve. A component that has its own recipe is flagged on the build sheet, so a shortfall you could build does not look like one you have to buy.

Short of stock, the build is refused. A component cannot go below zero — a negative batch would leave the inventory account carrying value no stock supports — so Ledgr names every component that is short and the quantity you can build now. Build that, or receive the missing parts first. Reversing a build returns the components at the cost the build charged for them and takes the finished units back off, so reversing and rebuilding leaves stock value where it started.

Serial numbers and warranties

A batch answers what a unit cost and when it expires. A serial answers where one particular unit is, who has it, and whether it is still under warranty — the question a customer asks while standing at your counter holding the thing.

  1. Switch it on per product

    Tick Track serial numbers when you add or edit a product, and set a warranty in months if the product carries one. Serialise the laptops, not the HDMI cables: turning it on for everything makes the till unusable.

  2. Capture a serial for each unit you receive

    On the receipt screen, enter one number per unit — the count has to match the quantity, because nine numbers for ten units leaves one unit permanently untraceable. Stock that arrives numbered in a run can be generated from a prefix and a starting number instead of typed. Scanning the same unit twice is reported by number rather than silently skipped.

  3. Sell as normal

    When a serialised product goes out on an invoice, Ledgr attaches the oldest unit in stock and marks the pick as automatic. If the customer took a different one, confirm the right serial against the invoice and the automatic flag comes off. Nothing is ever blocked for want of a serial — an invoice you cannot raise is worse than a unit you have to identify afterwards.

    Every other way a unit leaves the shelf takes its serial with it, oldest first, from the location it left: a stock adjustment down or a stock take that finds units missing writes the serial off, a transfer marks it in transit until the other location receives it, a part issued to a job card or built into a kit is recorded against that job or build (and comes back if the part is returned or the build cancelled), and a delivery note or supplier return sends it to the customer or supplier. An invoice only ever attaches a unit from the location it ships from.

  4. Answer the warranty question

    Inventory → Serials → Look up a unit: type or scan the number and you get the product, the receipt it arrived on, the invoice and customer it went to, and the days of cover left. The warranty runs from the date of sale, not the date you received the stock.

Returns and write-offs are separate on purpose. A return puts the unit back on the shelf and ends the warranty, because the guarantee never ran its course — but it keeps the customer and invoice on the record. A write-off retires the unit for good. A sold unit cannot be deleted, because that record is somebody's warranty.

The Serials tab also reports two mismatches rather than hiding them: units on hand with no serial captured, which happens when you switch tracking on for existing stock, and serials on file for units the stock ledger does not have. Neither stops you trading; both tell you what to fix.

Movement history

Every product has a movement log: date, type, quantity in or out, the document behind it and the running balance afterwards. When a stock take shows a variance, this is where you find out what happened.

Stock valuation, stock aging and adjustments by reason

Inventory → Reports has three reports; valuation and aging each have an Export CSV.

  • Stock valuation — what your stock was worth on a date you choose, product by product, beside the Inventory account in your ledger on the same date and the difference between the two. Today's figure is read from your batches and should differ by R0.00. An earlier date is rebuilt from the stock movements since, and is marked as an estimate: a cost added to a batch later, such as a landed cost, is not taken back out.
  • Stock aging — how long your stock has been on the shelf, from each batch's received date: 0–30, 31–90, 91–180 and over 180 days. It adds up to your stock value.
  • Adjustments by reason — every stock adjustment this month, grouped by its reason: how many, the units added and taken away, and their value at cost. The rows add up to every adjustment, so one made without a reason is shown as No reason given rather than left out. A stock take's commit is counted as a count correction.

Stock worth less than it cost

Your statements carry stock at the lower of what it cost and what it can be sold for, less the costs of selling it (its net realisable value). When a product's selling price falls below its cost, open the product and choose Write down to net realisable value, enter the value of one unit, the date if it is not today, and what the figure rests on, such as two quotes. Ledgr lowers the cost of the stock on hand to that value without moving a unit, and charges the difference to Inventory Write-off (5070) against your Inventory account, so the stock valuation report and the ledger still agree. The answer shows the stock value before and after. If the price recovers, do the same with the higher value: Ledgr puts back what it took off, and never more than the stock cost, so a recovery cannot book a profit on stock you still hold. Stock bought afterwards is carried at its own cost.

Stock takes

  1. Inventory → Stock Takes → New Stock Take

    Choose the location and, if you want, restrict it to one category. Only the stock-tracked products in that category go on the count sheet.

  2. Count

    Type counted quantities against the expected ones, or tap Scan to count: each scan adds one to the line whose barcode — or SKU — matches, and a code that is not on the sheet is named rather than ignored. Save counts as you go.

  3. Review the variance

    Ledgr shows the difference per line in units while you count. Once the take is committed it also shows each line's variance in value — the amount actually posted to the ledger, not an estimate.

  4. Commit

    Commit (it needs the approve permission for inventory) writes the counts back to the on-hand quantities and posts the variance: a shortfall to Inventory Write-off / Shrinkage (5070), a find back from it, against Inventory (1310). A find is valued at what the stock it joins costs (the average for weighted-average products, the latest cost layer otherwise); a product with no cost at all is refused until you give it a cost price. The stock take stays on file as the reason.

Cycle counts, bins and adjustment reasons

The Cycle counts card on Inventory → Stock Takes counts a little at a time instead of everything at once.

  • A schedule counts one location weekly, monthly or quarterly — everything there, one ABC class (A, B or C, from each item's planning class), or one bin. Saving it raises this period's stock take at once; after that Ledgr raises exactly one a period, which you count and commit like any other.
  • Bins are named places inside a location — an aisle, a shelf, a cage. Add them on the card and keep a product in one; a count by bin puts only that bin's products on the sheet. Bins name where a product is kept: quantities are still held per location.
  • Adjustment reasons — Damaged, Expired, Lost or stolen, Found, Count correction, Own use, Sample or promotion, Opening stock and Other — are offered on every Adjust Stock, beside a free-text note. Add your own on the card, and turn on Require a reason there; from then on an adjustment without one is refused and names the remedy.

Picking and backorders

Inventory → Picking is the list of what the stock room has to fetch: every open delivery note at its full quantity, and every open sales order at what is still to deliver on it, added up per product and sorted by location and bin. Where less is on hand than the list asks for, the line says the pick will be short.

  1. Pick an order

    Tap Pick beside a sales order and enter what you took off the shelf. Ledgr raises a delivery note for exactly that, from the order — its prices, VAT and bins — and refuses more than the order still has open.

  2. The rest is a backorder

    Anything you picked less of stays owed on the order. It is listed under Backorders on the Picking tab, line by line, and goes back on the pick list for next time. An order nothing has been picked from yet is simply open, not backordered.

Barcodes

The scanner opens from the product list and from a stock take's count sheet. Scan to find a product, or to count it during a take. Camera scanning works on a phone or tablet; on a computer, type the code or use a USB barcode scanner in the box below the viewfinder.

A product can also carry its GTIN, the number GS1 issued for it. It is kept apart from the barcode, which may be any code on the shelf: a GTIN with the wrong last digit is refused, naming the right one. Scanning the product's GTIN, or the GS1-128 on a lot, case or pallet label printed from Production, finds the product.

Price lists and quantity breaks

A price list holds the prices one group of customers pays — trade, wholesale, a key account — set under Inventory → Price lists and given to a customer on their contact. A product the list does not price sells at its own price. Prices on a list exclude VAT, exactly as a product's sell price does.

A list can also price a product by quantity: under the product's list price, add a break — say from 100 units, R8.00. A line of at least that many units is priced at the break, and the highest break the line reaches wins, so 99 units are at the ordinary list price and 100 are at the break. Change the quantity on an invoice, quote or sales order line and its price follows; the customer portal's basket, deal lines and job card parts read the same breaks.

Inventory on invoices

Products added to an invoice as product lines carry their price and VAT rate across. When the invoice is sent, the stock movement is recorded and cost of sales is posted using the product's costing method — which is why the income statement's gross margin can be trusted without a manual journal at month end.

Common problems

Most of these are Ledgr refusing something on purpose. Each refusal names the figures involved, and the reason is nearly always that the alternative would leave stock and the balance sheet disagreeing with nothing to reconcile them.

What you seeWhat to do
"On-hand cannot go below zero" An adjustment, transfer, build or job-card issue would take a bin negative. Ledgr names the shelf and both numbers. Count what is actually there and adjust to that figure, or transfer from the branch that holds it. A negative bin is not a warning you can work past — it puts a value in the inventory account that no batch supports.
"Not enough components to build N" The build is refused rather than part-completed, and Ledgr names every component that is short and the quantity you can build now. Build that quantity, or receive the missing parts first.
A product will not delete It still has stock on hand, and Ledgr says how much. Write the stock off with a stock adjustment first — deleting it while it holds value would leave that value on the balance sheet with nothing to reconcile against. The same applies to a location that still holds stock.
"SKU is already used by …" A SKU is unique per business, ignoring case. Ledgr names the product using it.
The Inventory Value tile does not match the balance sheet They should agree to the cent: the tile is the sum of what your open batches cost, which is the same figure the inventory account carries. An invoice takes its stock out when it is sent — the same moment it reaches the ledger — so a draft holds no stock and cannot come between them. If they differ, look for a draft invoice saved before 15 September 2026: drafts from before then took their stock the moment they were saved. Send it or delete it and the two agree again.
A quantity will not accept a decimal Fractional quantities are a per-product setting — 0 to 4 decimal places, defaulting to whole units, and pinned to whole units for a serialised product because half a serial number is not a thing. Set the precision on the product.
A recipe will not build Only an active recipe can be built, and Ledgr names the status it is in. A draft or pending recipe needs approving first — see bills of materials.
Stock take counts will not save Counts can only be saved while the stock take is in progress. Ledgr names the status it is in. Variance is written as you save counts rather than only at commit, so a count with a shortfall shows up before anybody commits it.
A serialised unit was scrapped and the count did not move Writing a unit off drains its own batch at that batch's cost and posts the write-off. Only a unit that is in stock can be scrapped; a sold one is refused, because deleting it would erase the customer's warranty record.