Separate inventory adjustment gains and losses in Odoo 19 and 20 (Stock Valuation Account Incoming and Outgoing are gone)
Inventory gains to an income account, inventory losses to an expense account, in real-time entries and the periodic closing

To separate inventory adjustment gains and losses in Odoo 19 or Odoo 20, the Inventory adjustment location needs a Gain Account next to its Loss Account: Odoo 18's Stock Valuation Account (Incoming) and (Outgoing) are gone, and the single Loss Account now receives both stock found and stock lost. Without an add-on, the workaround is a reclassification journal entry every period; with a Gain Account, stock found is credited to an income account such as Inventory Gain and stock lost is debited to an expense account such as Inventory Loss, in real-time entries and in the periodic closing. Below: what changed from Odoo 18, which side each amount goes to, the manual workaround and where it stops, and how to set it up, checked against the Odoo 18, 19 and 20 source.
- Odoo 18 had two accounts on a virtual location: Stock Valuation Account (Incoming) and Stock Valuation Account (Outgoing).
- Odoo 19 and 20 have one account per location. On the Inventory adjustment location it is labelled Loss Account, and both directions of a count use it.
- Periodic valuation makes it worse: the standard closing entry posts only the net for the location, so the gains are not visible anywhere in the accounting.
- The fix is a Gain Account beside the Loss Account: gains credited to income, losses debited to expense, the other side on the stock valuation account of the product category.
What changed from Odoo 18 to Odoo 19 and 20
In Odoo 18, every location could carry a Stock Valuation Account (Incoming) and a Stock Valuation Account (Outgoing). On the Inventory adjustment location this gave two sides: stock moved into the location (a count that found less than recorded, stock lost) used the Incoming account, and stock coming out of the location into your warehouse (a count that found more, stock found) used the Outgoing account. Setting them to two different accounts kept gains and losses apart.
Odoo 19 replaced the two fields with a single Stock Valuation Account per location. The location form shows it under Accounting Information as Loss Account on locations of type Inventory Loss (and as Cost of Production on production locations). Odoo 20 keeps the same single field. There is no setting that brings the second account back, which is what the Odoo forum question "inventory adjustments missing Stock Valuation Accounts (Incoming and Outgoing)" is about.
Which side do inventory adjustment gains and losses go to?
Take a product valued at 10 per unit. One count finds 3 more units than recorded (a gain of 30), another finds 5 fewer (a loss of 50).
- Stock found (gain of 30): debit the stock valuation account of the product category 30, credit the gain account 30.
- Stock lost (loss of 50): debit the loss account 50, credit the stock valuation account 50.
In standard Odoo 19 and 20 both lines land on the Loss Account, which ends the period at a debit of 20. The profit and loss shows a loss of 20; nobody reading it can tell that 30 was found and 50 was lost. With separate accounts it shows Inventory Gain 30 under other income and Inventory Loss 50 under expenses.
Real-time valuation and periodic closing in Odoo 19 and 20
Odoo 19 and 20 offer two valuation modes: Perpetual (at invoicing) and Periodic (at closing).
- Perpetual (real-time): each applied count posts its own journal entry. The gain and the loss are separate entries, but both use the Loss Account, so its balance and the profit and loss line are a net figure.
- Periodic (at closing): nothing is posted when you apply a count. When you close the period from the Inventory Valuation report, Odoo adds up the moves into and out of the location and posts their net balance on the Loss Account as a "Closing: Location Reclassification" line (one per stock valuation account). A product that went up on one count and down on the next leaves only the difference. The gross gains are not in the accounting at all.
The manual workaround: a reclassification entry, and where it stops
Without an add-on, you can move the gains out of the Loss Account by hand at the end of each period:
- Create an income account for gains if you do not have one (for example Inventory Gain, type Other Income).
- Work out the value of the stock found in the period, that is the stock moves that came out of the Inventory adjustment location into your warehouse.
- Post a miscellaneous journal entry: debit the Loss Account, credit Inventory Gain, for that value.
This gives the right totals for the period, but it has limits:
- It is manual every period. A recurring entry repeats the same amounts, while the gains change every month.
- In periodic valuation the figure is not in the books. The closing posts only the net, so the gains have to be rebuilt from stock moves outside accounting, and checked against the closing.
- Late counts break it. A count applied after you reclassified needs another correction.
- The Inventory Valuation report still shows one account. Its account lines for the location keep the net figure, so the report and your profit and loss do not match line by line.
A Gain Account next to the Loss Account
We made Inventory Adjustment Gain & Loss Accounts for this (GRAMSHIFT, Odoo 19 and 20, Community and Enterprise). It adds a Gain Account field right after the Loss Account on locations of type Inventory Loss. It is listed for Odoo 20, Odoo 19.
- Real-time valuation: each applied count posts the gain on the credit side of the Gain Account or the loss on the debit side of the Loss Account, with the other side on the stock valuation account of the product category.
- Periodic closing: the closing entry of the Inventory Valuation report has one line for the period's gains on the Gain Account and one line for the losses on the Loss Account, also when the same product went up and down in the period.
- Inventory Valuation report: the account lines of the inventory loss section show the Gain Account and the Loss Account separately, with the same amounts the closing entry posts. The section's headline amount stays the net of the period.
- Per location: a location without a Gain Account posts exactly as standard Odoo, so you can switch it on for one company or one adjustment location at a time.
- Multi-company: each company's adjustment location offers only that company's accounts, and each company's closing uses its own Gain and Loss Accounts.
Set-up, no code:
- Install the module. Nothing changes until you set a Gain Account.
- If needed, create the income account in Accounting (or Invoicing) > Configuration > Chart of Accounts, for example Inventory Gain, type Other Income. Receivable, payable, bank and credit card accounts cannot be chosen.
- Open Inventory > Configuration > Locations, remove the Internal filter and open Virtual Locations/Inventory adjustment (turn on Storage Locations in the Inventory settings if the Locations menu is not shown).
- Under Accounting Information, check the Loss Account (for example Inventory Loss) and choose the Gain Account. The Loss Account has to be set first. Save.
- Apply your next count in Inventory > Physical Inventory: quantities found go to the Gain Account, quantities lost to the Loss Account.
Limitations
- Entries already posted stay as they are. Counts applied after you set the Gain Account use it; for earlier periods a one-off reclassification entry is still the way.
- It applies only to the locations where you set a Gain Account. Production locations keep their Cost of Production account, and customer, vendor and internal moves are not affected.
- A Scrap location is also of type Inventory Loss. If you set a Gain Account on it, stock returned from scrap is credited to that account.
- No accounts are created. You choose existing accounts of your chart of accounts.
- Not for Odoo Online (odoo.com hosting), which does not allow installing third-party modules like this one. Tested on Odoo 19 and 20 Community, on-premise; Odoo.sh is not part of the test runs yet.
- There is no Odoo 18 version, because Odoo 18 locations still have the Stock Valuation Account (Incoming) and (Outgoing).
Frequently asked questions
How do I separate inventory adjustment gains and losses in Odoo 19 or Odoo 20?
Standard Odoo 19 and 20 have one Loss Account on the Inventory adjustment location, so gains and losses both post there. Without an add-on you move the gains out with a reclassification journal entry each period. With Inventory Adjustment Gain & Loss Accounts you set a Gain Account next to the Loss Account: stock found is credited to the Gain Account and stock lost is debited to the Loss Account, in real-time entries and in the periodic closing.
Where are the Stock Valuation Account (Incoming) and (Outgoing) in Odoo 19?
They were removed in Odoo 19. A location now has a single Stock Valuation Account, shown as Loss Account on the Inventory adjustment location under Accounting Information, and Odoo 20 keeps it that way. The Loss Account takes the place of the Incoming account (stock lost); a Gain Account added beside it takes the place of the Outgoing account (stock found).
Which side do inventory adjustment gains and losses go to, debit or credit?
A loss is debited to the loss account and credited to the stock valuation account of the product category. A gain is debited to the stock valuation account and credited to the gain account. In standard Odoo 19 and 20 the loss account receives both, so its balance is the net of gains and losses.
Can I separate inventory gains and losses in Odoo 19 without a module?
Yes, with a manual reclassification entry at the end of each period: debit the Loss Account and credit an income account such as Inventory Gain for the value of the stock found. It has to be redone every period, and with periodic valuation the gains must be rebuilt from stock moves because the closing posts only the net.
Does it work with periodic (at closing) inventory valuation?
Yes. With Inventory Adjustment Gain & Loss Accounts the closing entry of the Inventory Valuation report has one line for the period's gains on the Gain Account and one line for the losses on the Loss Account, and the report's account lines show the same split. Standard Odoo posts one net line for the location.
Do I need this on Odoo 18?
No. Odoo 18 locations still have the Stock Valuation Account (Incoming) and (Outgoing), so gains and losses can already go to different accounts. The module is listed for Odoo 19 and Odoo 20, Community and Enterprise (not Odoo Online).