Avance Technologies

Odoo Accounting Guide · Updated August 2026

Why Odoo Inventory Valuation and the General Ledger Can Differ

The stock valuation report says one number and the balance sheet says another. Some of that gap is the system working as designed. The rest is a handful of specific causes, and each one leaves a trail you can follow.

In short

The inventory valuation report is built from stock moves. The general ledger is built from journal entries. They agree only where every stock move produced an entry and nothing else touched the account. The common breaks are manual valuation on a product category, entries posted directly to the stock account, adjustments and scrap whose loss account was never configured, and the two figures being read at different dates. Timing between receipt and bill matters too, but how it surfaces depends on the version: Odoo 19 posts perpetual valuation at the invoice and leans on a closing entry, where automated valuation on earlier releases posted at each stock move and held the counterpart in an interim account.

This guide is about how the mechanism behaves and how to reconcile it. If the setup itself needs attention, Avance Technologies implements and supports Odoo from Dubai, including the accounting configuration behind stock.

Key takeaways

  • The two numbers come from different ledgers — stock moves on one side, journal entries on the other.
  • A product category set to manual valuation produces no entries at all, so the ledger only moves when someone posts one.
  • Goods received but not yet billed are a timing difference rather than an error, though where it surfaces depends on the version.
  • Since Odoo 19, perpetual valuation posts at the invoice rather than at every stock move.
  • Landed costs apply to categories on average cost or FIFO, not to items left on standard price.
  • Reading the stock report as of today against a ledger balance as of month end produces a difference that does not exist.
  • The reconciliation is worth running monthly, because a month of movements can still be investigated line by line.

Two ledgers, two sources of truth

Odoo keeps stock value in the Inventory app, derived from the moves themselves: every receipt, delivery, adjustment, scrap and manufacturing order changes the value of what is on hand. Accounting keeps a separate record in the general ledger, built only from journal entries. Odoo's own documentation puts it plainly — the Inventory app maintains stock valuation in real time as goods move, while the Accounting app updates accounting inventory valuation when bills and invoices are posted, or when a closing entry is generated.

That is the whole basis of the problem. The two agree when each stock move has a matching entry and nothing else has touched the account. In practice, several things routinely break that assumption — and only some of them are faults.

The differences you should expect to see

Before hunting for errors, it is worth separating the differences that are meant to be there. Posting a balancing entry over one of these hides information the accounts are supposed to carry.

Expected differences, and where the value actually sits
SituationWhat it means
Received, not billedVersion-dependent. On Odoo 18 and earlier with automated valuation, validating the receipt normally moves the stock report and the stock valuation account together, with the counterpart held in Stock Interim (Received) — so what to look for is an unexplained interim balance rather than a valuation mismatch. On Odoo 19 perpetual-at-invoicing, a real difference can stand until the closing or accrual entry is run.
Delivered, not invoicedAlso version-dependent, and worth separating stock value from cost of sale. On Odoo 18 and earlier with automated valuation, the stock value normally leaves the valuation account at delivery; under Anglo-Saxon accounting it is COGS recognition that waits for the customer invoice. Odoo 19 uses the newer invoice-and-closing model.
Stock write-downSlow-moving or damaged stock carried below cost is an accounting judgement. The stock ledger keeps counting units at cost; the accounts should not.
Consignment stockGoods owned by someone else can sit in your warehouse without belonging in your inventory value.
Period cut-offThe stock report read today against a trial balance at month end is comparing two different dates.

Where the real breaks come from

Once the expected differences are set aside, what remains usually traces to one of the following. They are listed roughly in the order we find them on live systems.

  • The product category is on manual valuation. Manual — periodic — valuation produces no journal entries from stock moves at all. The stock report keeps moving and the ledger stays where the last manual entry left it. Categories are configured individually, so a single category added later and left on the default is enough to open a gap while everything else reconciles.
  • Manual entries posted straight to the stock account. Opening balances, audit adjustments, provisions and correcting entries all land in the general ledger without a stock move behind them. Each one is a permanent difference against the stock report until it is either reversed or explained in the reconciliation.
  • Adjustment and scrap accounts left unconfigured. Odoo lets you set a loss account on the Inventory Loss location, and its own documentation treats that as optional. Where it is not set, an adjustment under automated valuation still produces an entry — it lands wherever the fallback sends it, which on Odoo 19 is the variation account, rather than where the accounts expect it. The usual symptom is a balance classified somewhere nobody reconciles, so check the loss location's accounting setup rather than assuming the entry is missing.
  • Backdated moves and a moving cut-off. A receipt validated today with last month's date, or a bill posted into a period already reported, moves one number and not the other. This is the difference most often chased for hours before someone checks the dates on both reports.
  • A category or costing method changed mid-life. Changing the costing method, or moving products into a category with different accounts, changes how new movements are valued while the history stays as it was. Odoo's documentation flags this directly and recommends talking to an accountant before making the change.
  • Landed costs applied to the wrong category. Freight, insurance, duty and clearing are absorbed into stock value through the landed costs feature, which requires the product category to be costing at average cost or FIFO. Items on standard price quietly do not take them, so the charge sits in expenses and the stock is carried below its true cost.
  • Negative on-hand quantities. A delivery processed before its receipt leaves a negative quantity carrying a value. When the receipt is finally posted the valuation corrects itself, but any reporting done in between is built on a figure the system will later revise.
  • Archived products and locations. Archiving hides a product from stock reporting without removing what it contributed to the ledger. The stock report gets shorter, the account balance does not move, and the difference has no visible cause.
  • Multi-currency receipts. Where the receipt and the bill are converted at different rates, the difference has to go somewhere. That is exchange movement rather than stock value, and it belongs in the reconciliation as such.

A worked example: 400 filters across a month end

A Dubai parts trader receives 400 oil filters on 24 August. The purchase order prices them at AED 12.40 each. The vendor's bill arrives on 3 September, after the August accounts have been reviewed.

What each side shows at 31 August

Receipt 24 Aug: 400 × AED 12.40 = AED 4,960 into stock

Vendor bill: not yet received on 31 Aug

Inventory valuation report at 31 Aug: +4,960

Payables at 31 Aug: nothing recorded against this supplier

Nothing has gone wrong. The business holds stock it has not yet been billed for, and the accounts have to say so — as goods received not invoiced, as an interim balance, or through the closing entry, depending on the version and configuration in use. What causes trouble is when nobody records it, and August closes showing stock the balance sheet cannot account for.

Then the bill arrives at AED 12.85 a unit rather than 12.40 — a price revision the buyer agreed and nobody passed on. What Odoo does with the difference depends entirely on the costing method set on that product category.

Where AED 180 goes, and why the closing stock figure changes

Billed: 400 × AED 12.85 = AED 5,140 · difference AED 180

Average cost (AVCO) → the estimated price is corrected on the bill, stock becomes 5,140

Standard price → 180 posts to the price difference account, stock stays 4,960

Both treatments are defensible and both are in normal use. They produce different closing stock, so they produce different profit. That is worth knowing before the year end rather than during it, because the reconciliation has to be prepared on the same basis the accounts were.

FIFO is deliberately left out of that comparison. It carries each receipt at its own cost rather than a moving average, and how a billed price difference is applied to an existing layer has varied between releases — so it is worth confirming on your own version with a test receipt rather than assuming it follows the average-cost behaviour above.

Multiply the same pattern across a container of mixed goods with AED 1,250 of sea freight and clearing to absorb, and the size of the question changes. Landed costs split that charge across the receipt by quantity, weight, volume, value or equally — and the split method chosen changes the unit cost of every item on the shipment, which changes the margin reported on each of them.

What Odoo 19 changed, and why it matters here

This is the part most likely to catch out anyone applying older knowledge. Before version 19, perpetual valuation posted a real-time journal entry at every stock movement. Odoo's documentation gives the reason for changing it: the volume of journal items created a problem for performance, general ledger clarity and auditability.

Since version 19, the perpetual method updates the stock valuation account when bills and invoices are posted, and the closing entry carries the rest — bills to receive, invoices to be issued, deferred revenue, prepaid expenses and the remaining gaps between inventory value and accounting value. Accounting settings now offer Perpetual (at invoicing) or Periodic (at closing), with the closing process itself set to manual, daily or monthly.

Where the difference lives, by version
VersionWhen accounting movesWhat to reconcile against
Odoo 18 and earlier, automatedAt each stock move, plus the bill or invoiceThe stock valuation account together with the interim received and interim delivered accounts
Odoo 19, perpetual at invoicingWhen the bill or invoice posts, plus the closing entryThe review screen that compares accounting stock value with inventory value, and the accrual entries behind it
Any version, manual or periodicOnly when a closing or manual entry is postedThe stock report at the closing date, against whatever entry was posted for it

The practical consequence is that a gap between the stock report and the ledger means something different on Odoo 19 than it did on Odoo 17. On the older behaviour it points at a break. On the newer one it may simply mean the closing entry has not been generated yet. Diagnosing it without first establishing which version and which setting is in use tends to produce a correcting entry that makes the position worse.

A month-end routine that holds up

The reconciliation itself is not complicated. What makes it work is doing it the same way every month, so that the differences are recognisable and the unexplained ones stand out early.

  • Fix the date first. Run the stock valuation report as at the same date as the trial balance. Odoo can value stock at a prior date; the report defaults to now, and that alone accounts for a good share of reported mismatches.
  • Compare the full set of accounts. Stock valuation on its own is not the whole picture. Interim accounts, or the accrual position on newer versions, hold value that is genuinely inventory in transit between receipt and bill.
  • Isolate entries with no stock move behind them. Filter the stock journal for entries without a source document reference. Those are the manual postings, and they are usually the largest single component of a stubborn difference.
  • Check the adjustment and scrap trail. Any count, write-off or scrap in the period should have both a stock effect and an accounting effect. Where it does not, the loss location is missing an account.
  • Scan for negative quantities and archived items. Both distort the stock side without touching the ledger, and both are quick to check once you know to look.
  • Write the difference down, with a reason per line. A reconciliation that names each component — received not billed, provision, adjustment in transit — is a document an auditor can accept. A single balancing figure is not, and it is the line that draws questions.

Why this matters more in the UAE than it used to

Closing stock is one of the larger numbers on a trading company's balance sheet, and it feeds straight into reported profit. With corporate tax now part of the picture, the financial statements an auditor signs are also the starting point for the return, and the closing stock figure moves both. A difference between the stock system and the ledger that was tolerable when it was an internal irritation becomes something a business has to be able to explain.

The useful discipline is unglamorous: reconcile monthly, keep the same basis year to year, and record why each difference exists rather than clearing it. Businesses that do this find the year-end request for the stock reconciliation is a document they already have. For related context on what stock costs look like in practice, see our auto parts inventory guide, which covers how dead stock forms and what it ties up.

What this guide does not cover

  • Which costing method your business should adopt — that is a decision for your auditor, based on your stock profile and your prior-year treatment.
  • The tax treatment of stock write-downs and write-offs, which depends on circumstances and is worth confirming with a qualified adviser.
  • Manufacturing valuation in depth: work in progress, by-products and scrap have their own accounting behaviour.
  • Configuration steps screen by screen, which vary by version — the account structure matters more than the menu path.
  • Migrating historical stock value from a previous system, which is an implementation exercise rather than a reconciliation one.

Talk to our Odoo team in Dubai → We implement and support Odoo for UAE and GCC businesses, including product category and account configuration, landed costs, and getting a stock reconciliation into a shape your auditor accepts.

Frequently asked questions

Why does the Odoo inventory valuation report not match the stock valuation account?

Usually for one of a handful of reasons: the product category is set to manual valuation, so no journal entries are produced at all; someone posted a manual entry directly to the stock valuation account; an inventory adjustment or scrap ran through a loss location whose accounts were never configured, so the entry landed somewhere the accounts do not expect; or the two figures are being read at different dates. Each of those has a different fix, so the first job is identifying which one applies rather than posting a balancing entry.

Is a difference between stock value and the ledger always a mistake?

No. Some differences are the design working as intended. Goods received on the last day of the month with the vendor bill still to come will show in stock before they show as a payable, and in Odoo 19 that gap is what the closing entry exists to record. A write-down for slow-moving or damaged stock is an accounting judgement the stock ledger does not make on its own. What matters is that each difference can be named and evidenced, not that the two numbers are identical.

What changed in Odoo 19?

Before version 19, perpetual valuation posted a journal entry at every stock move. Odoo's documentation states that since version 19 the perpetual method updates the stock valuation account at the invoice level instead, with a closing entry used to record bills to receive, invoices to be issued and other gaps between inventory value and accounting value. The practical effect is fewer journal entries and a legitimate gap between the two figures between a receipt and its bill, which the closing process resolves.

Do freight and customs clearing belong in the value of the stock?

Costs incurred bringing goods to their present location and condition are generally treated as part of inventory cost, which is what Odoo's landed costs feature is for. It splits shipping, insurance, duty and similar charges across the products on a receipt by quantity, weight, volume, value or equally. One constraint is worth knowing before relying on it: landed costs apply to product categories costing at average cost or FIFO, so items left on standard price will not absorb them.

Which costing method should a UAE trading company use?

It is a decision to take with your auditor rather than a setting to pick in a hurry. Average cost suits businesses buying the same item repeatedly at moving prices, which describes most parts and consumables traders. FIFO tracks each receipt at its own cost and gives the closest match between what was sold and what it cost, at the price of being sensitive to data quality. Standard price is simplest and works where costs are stable, with variances expensed. Worth noting: Odoo's documentation records that LIFO is available as a picking strategy but is not permitted as a valuation method under IFRS.

Can we switch from manual to automated inventory valuation mid-year?

It can be done, and Odoo's own documentation warns that switching may cause discrepancies between stock valuation and the accounting journals. The approach it suggests is to clear existing stock with an adjustment, change the setting, then bring the stock back in at its original value so the entries are generated cleanly. Doing this at a period end, with the closing balance agreed beforehand, avoids arguing later about which side of the change a difference came from.

How often should stock and the ledger be reconciled?

Monthly is a reasonable rhythm for most SMEs, because a month of movements is still small enough to investigate line by line. Leaving it to the year end tends to mean the difference is large, the people involved have forgotten the transactions, and the audit is already underway. Businesses running high volumes or several branches often review it weekly for the value alone, then reconcile properly at month end.

What will the auditor ask for?

In practice: the stock listing at the reporting date, the general ledger balance it is meant to support, an explanation for the difference between them, the basis of the costing method and evidence it was applied consistently with the prior year, and support for any write-down. A reconciliation that already exists and is prepared the same way each month turns that request into a document you send rather than an exercise you run.

Written by the Avance Technologies team in Dubai, from implementing and supporting Odoo for UAE businesses. Product behaviour described here follows Odoo's published documentation for versions 18 and 19; features and menu names change between releases, so confirm against the version you run. Figures in the examples are illustrative. This is guidance on how the software behaves, not accounting or tax advice — decisions on costing method, provisioning and disclosure belong with your auditor or tax adviser. Reviewed August 2026.

Stock and the ledger not agreeing?

Tell us which Odoo version you are on and roughly how far apart the two figures sit, and we will tell you where to look first. Most differences we see resolve to two or three causes, and finding them is faster than posting around them.

CallWhatsAppDemo