Skip to content

Stock

Accounts can count the goods you hold. Switch Track inventory on for an item and Accounts keeps two numbers for it — how many units are on hand, and what those units cost — and moves both whenever a bill, an invoice or an adjustment moves the goods. Buying stock becomes an asset on the balance sheet instead of an immediate expense, and selling it turns that asset into a cost in the same journal as the sale, so gross margin is right in the month the sale happened.

This is bookkeeping inventory, for the finance team rather than the warehouse floor: one pool of stock per item, no warehouses, bins, lots or serial numbers. If you need those, they belong to Inventory, a separate product — Two stock ledgers at the foot of this page sets out which is which.

Stock is a per-item setting, on the item form (Items → New item, or Edit on an existing one).

  • Track inventory — off by default. An untracked item holds no stock at all; it is not “0 on hand”. The item page says so in words, and the Items list shows an em dash in the stock column rather than a zero. Services and one-off charges stay untracked.
  • Inventory account — the asset the goods sit in while you still own them. Required. The picker offers only accounts whose type is Inventory, and warns you up front if your chart of accounts has none.
  • Cost of goods sold account — where the cost lands the moment the goods are sold. Also required; the picker offers only accounts of type COGS.
  • Reorder level — optional. Falling to or below it flags the item as low and puts it on the reorder report.
  • Opening stock and opening stock rate — the units you already hold on the day you start, and what each of them cost you.

A tracked item must name both accounts. The API and the database both refuse a tracked item without them, so the failure lands when you configure the item rather than three weeks later in the middle of an invoice.

Turning tracking off again while goods are still on hand is refused — their value would be stranded in the inventory account with nothing left to relieve it. Sell the stock or write it off first.

Costing is weighted average, and only weighted average. FIFO is not offered.

The average is computed on value, never by averaging rates: ten units at 100 and thirty at 120 average to 115, not 110. A few consequences are worth knowing.

  • Stock cannot go negative. An invoice or an adjustment that would take out more than is on hand is refused with 422 INSUFFICIENT_STOCK, naming the item, the quantity asked for and the quantity available. Receive or adjust stock in first. The item row is locked while it moves, so two invoices racing for the last unit cannot both succeed — the second waits, then fails honestly.
  • The last unit out absorbs the rounding. When the quantity reaches zero the value reaches exactly zero, so an item you have sold out of never leaves a few stray paise of asset behind.
  • No stock on hand means no average, so Accounts shows a dash rather than a cost per unit, and refuses to bring goods in without a stated cost. Stock entering the books at zero would make every unit later sold from it show 100% gross margin, and nothing in the P&L would ever flag it.

Stock legs ride in the same journal as the document’s other legs — an invoice posts receivable, revenue, tax and cost of goods as one entry, not two — through the usual posting seam, inside the document’s own transaction.

Event When it posts Journal
Opening stock The item is created with an opening quantity and rate Dr Inventory · Cr the Equity control account
Bill line for a tracked item The bill moves DRAFT → OPEN Dr Inventory (in place of the line’s expense account) · Cr Accounts payable
Invoice line for a tracked item The invoice moves DRAFT → SENT Dr Cost of goods sold · Cr Inventory, at weighted-average cost — alongside the usual Dr AR · Cr Revenue
Stock adjustment in Immediately, when you save it Dr Inventory · Cr the counter account
Stock adjustment out Immediately, when you save it Dr the counter account · Cr Inventory
Voiding or cancelling a posted invoice or bill On the status change Every stock movement the document made is inverted at the value it originally recorded, and the journal is reversed, in one transaction

The cost a bill puts into inventory is the line net of tax where a tax account resolves — input tax is a recoverable asset with its own leg, not part of what the goods cost.

Purchase orders receive nothing. There is no goods-receipt step in Accounts: stock arrives when you open the bill for it.

Every warehouse has shrinkage, damage, breakage and miscounts, and an inventory asset nobody can correct is an inventory asset nobody can trust. Adjustments are the correction, and they are available from two places: the Adjust row action on the Items list (shown only for tracked items) and the Adjust stock button on the item page.

The dialog opens on what the books currently say — on hand, stock value, average cost — and takes the change either way round:

  • Change by — a delta. “Seven were damaged” is -7.
  • Counted quantity — a physical count. “The shelf says forty-seven” is 47, and the dialog shows you the delta it works out to before you save, because 47 is what you typed and +43 is what hits the books.

Also on the form:

  • Unit cost, asked for only when stock is coming in. Leave it blank to bring the goods in at the current average; when there is nothing on hand there is no average, so the cost becomes mandatory and must be more than zero.
  • Reason, mandatory. It travels onto the movement row and into the journal description, so the write-off is still legible to someone reading the accounts in three years.
  • Counter account, optional. It defaults to the item’s own cost-of-goods-sold account; the picker offers expense accounts, so damage can land on a dedicated shrinkage line instead of being muddled into cost of sales.

Adjusting stock needs the items:write permission — the same one as editing the item — and is recorded in the audit trail against the item. An adjustment is not a document you can list on its own: it shows up as a movement on the item and as a journal in the ledger.

A tracked item’s page carries its movement history — every receipt, sale, return and adjustment, each with the unit cost it moved at, the signed quantity and value, the running balance it left behind, and the journal number it posted into. It is what you read when the shelf and the books disagree, because “the books say 4” is not something anyone can act on and “a sale on the 3rd took 6 out” is.

The list shows the most recent movements first, up to fifty.

Both live under Reports, need reports:read, and are screen-and-API only — unlike the financial statements, neither exports to CSV.

What the warehouse holds, and proof that the books agree with it. Each tracked item gives a row — code, name, inventory account, quantity on hand, average cost and stock value — under a total.

The panel above the table is the reason the report exists. It computes the same money twice, from two places that know nothing about each other:

Figure Where it comes from
Stock on the shelves The sum of every tracked item’s stock value, maintained by the stock ledger as goods move
Inventory GL accounts The balance of every account of type Inventory, read from posted and reversed journals
Difference The two, subtracted

They must be the same number. When they are not, the stock ledger has drifted from the general ledger, an asset is misstated, the balance sheet is wrong by exactly that difference — and nothing else in the system will tell you. The trial balance will not: both sides of a wrong journal are still equal. The panel says so in as many words, and turns red when the two disagree.

Tracked items that have fallen to or below their reorder level, worst first. Each row carries the shortfall (how many units you are actually short), the last purchase rate, an estimated cost to restock, and the vendor you last bought it from, read off the most recent bill line for that item.

The estimate is a planning figure, not a quote. Items with no purchase rate on file show a dash rather than a confident zero, and the footer names how many of them there are. Items with no reorder level set can never appear here — a level is how you tell Accounts what “running low” means for that item.

The Items list has the same idea in miniature: a Needs reorder filter and a Low badge on the affected rows.

Worth knowing before you rely on it, because in each case the document posts happily and simply moves no goods.

  • Credit notes and vendor credits. Their line grids let you pick an item to fill the line in, but the app does not carry that link through to the saved document, so a return raised here puts nothing back on the shelf and takes nothing off it. Put a customer return back with a stock adjustment, or — if the whole sale is being undone — void the invoice, which does reverse its stock.
  • Recurring invoice templates, for the same reason: the template editor does not carry the item link through, so a generated invoice books revenue with no cost of sale against it. Raise invoices for stocked goods directly.
  • Estimates, sales orders and purchase orders. Nothing moves on the order itself. An estimate or sales order does carry its item links through to the invoice it converts into, so the goods leave the shelf when that invoice is sent; a purchase order’s goods arrive with the bill you raise against it.
  • Expenses. They post to an expense account; they never touch inventory.

The Android app has a Stock screen — the tracked items with what is on hand, an “all stock” and a “needs reorder” view with the shortfall on each row, an item detail with its movement history, and the same adjustment sheet with both the delta and the counted-quantity modes. It reads live; there is no offline copy of stock. See Mobile.

Accounts has the stock module described on this page. Inventory is a separate product with warehouses, bins, cycle counts and FIFO or weighted-average cost layers. They are not two views of one thing, and Inventory is still being built — its own page says what has shipped so far.

Accounts is the ledger of record for both. Inventory never writes journals itself: once its stock movements are recorded, the ones with a money effect are sent to the Accounts journal API as ordinary manual journals — one journal per source document, carrying that document’s net movement value — using per-workspace account mappings you configure in Inventory (inventory asset, stock adjustment, COGS, opening-balance equity). Posting is deferred and durable: the movement commits first and the journal follows it, so if Accounts is unreachable or a mapping has not been set, the stock movement still stands and the journal waits. Waiting journals go out on the next posting run — the next document posted for that workspace, or a retry asked for in Inventory — and each Inventory ledger row records the journal it landed in, so nothing is lost quietly. The journal is dated the day the posting run happens, not the day the goods moved.

  • Receivables & payables — the invoices and bills that move the goods, and what voiding one does to them.
  • General ledger — the posting seam every stock journal goes through, and the chart of accounts the inventory and COGS accounts live in.
  • Reports — where the stock valuation and reorder reports sit among the rest.
  • Inventory — the separate warehouse product and the GL seam it posts through.