Odoo Opening Balance Guide: Opening Entries, Stock and Open Invoices
Odoo opening balance guide for Odoo 19 and 20: the opening journal entry, account 999999, open invoices, opening stock, bank balances and fixed assets.
Most Odoo accounting go-live problems come from opening balances loaded twice, dated wrong or never reconciled. Our Odoo implementation services treat the Odoo opening balance as a signed-off deliverable, not a last-day task.
Related service: Odoo implementation services — fixed-scope implementations with a named senior team.
This guide is for finance leads, controllers and project managers who are about to go live on Odoo 19 or Odoo 20. It covers the accounting cutover only. For the full project plan, use our Odoo implementation checklist.
What is an opening balance in Odoo and what must you load?

An opening balance in Odoo is the set of balances and open items that carry your old books into Odoo on the go-live date. Odoo's accounting onboarding guide splits this into four opening entries: the trial balance, open invoices and bills, the inventory count and bank transactions.
| Item | What you load | Odoo tool | Check after loading |
|---|---|---|---|
| Trial balance | Every account balance on the cutover date | Misc. journal entry import | Entry is balanced and posted |
| Receivables | Open customer invoices and credit notes | Invoice import to AR clearing | Aged receivables equals old AR |
| Payables | Open vendor bills and refunds | Bill import to AP clearing | Aged payables equals old AP |
| Stock | Counted quantity, location, lot and cost | Physical Inventory import | Stock value equals inventory accounts |
| Bank and cash | Balance per statement on the cutover date | First bank statement | Starting balance equals the bank |
| Fixed assets | Cost, date and depreciation to date | Asset import | Register equals asset accounts |
Moving history is a separate decision. If you plan to move it, read our Odoo database migration guide
When should you go live with Odoo accounting?
The best go-live date for Odoo accounting is the first day of a new fiscal year, because the old system closes the year and you only carry balance sheet balances. Odoo lists three options and recommends against one of them.
- Start of the fiscal year: the easiest option, with the least data to move.
- End of a tax period: workable; you post either all entries for the period or only the closing balances.
- Middle of a tax period: not recommended, because one tax return then needs data from two systems.
If you go live mid-year, the trial balance also carries year-to-date income and expense lines. Odoo's own sample opening entry includes a sales account and an expense account for exactly this case. Your reports for the year then stay complete inside Odoo.
Agree the cutover date with your auditor early, freeze posting in the old system, and keep signed copies of the final reports.
How do you create the Odoo opening balance journal entry?
You create the Odoo opening balance journal entry by importing the old trial balance into Odoo as one Miscellaneous journal entry, then reviewing and posting it. Odoo gives a ready template for this under Journal Entries.
Follow these steps for the Odoo trial balance import:
- Export the trial balance from the old system on the cutover date, with each account as a debit or a credit.
- Map every old account to an Odoo account. Odoo 20 makes account codes optional, so use external IDs if you do not use codes.
- In Accounting, open Journal Entries, choose Import and download the Misc. Operations template.
- Fill in Reference, Date and Journal on the first line only, so Odoo builds one entry with all lines.
- Put each amount in either Debit or Credit, never both, and never 0.00 or a negative value.
- Replace Accounts Receivable with an AR Clearing account and Accounts Payable with an AP Clearing account.
- Import, open the draft entry, check the totals and click Post.
The Odoo 20 version of the guide adds the external ID option for accounts. Date the entry on the last day before go-live, for example 31 December 2026 for a 1 January 2027 start.
There is a second route. When you import the chart of accounts with Opening Debit and Opening Credit columns, Odoo builds a draft entry called Opening Journal Entry in the Miscellaneous journal. It dates it the day before the opening date and balances any gap automatically.
Once the opening move is posted, Odoo refuses further opening balance imports until you reset it to draft, so post only after finance signs off.
What is the undistributed profits losses account in Odoo 19 and 20?
The undistributed profits losses account is the equity account, code 999999, where Odoo puts the automatic balancing line when an opening entry does not balance. In Odoo 18 it was named Undistributed Profits/Losses; Odoo 19 and 20 name it Profit or Loss Appropriation.
Its account type is Current Year Earnings. Odoo creates it on demand, and if code 999999 is taken, it uses the next free code below it.
A balance on it after go-live is a warning sign. On the Odoo forum, a user who loaded opening balances and invoices as manual entries found the 999999 account would not clear to zero and showed on the balance sheet.
The fix is to load retained earnings as its own line in the opening entry, so nothing falls through. Since Odoo 19, the prior year's result also shows as a Result Brought Forward line, which you clear with a manual entry, as the Odoo year-end closing guide explains.
Here is an illustrative opening trial balance for a 1 January 2027 go-live. The figures are made up to show the structure.
| Account | Debit | Credit |
|---|---|---|
| Bank | 42,000 | |
| Inventory valuation | 30,000 | |
| AR Clearing (replaces AR) | 18,500 | |
| Fixed assets at cost | 60,000 | |
| Accumulated depreciation | 22,000 | |
| AP Clearing (replaces AP) | 12,500 | |
| VAT payable | 3,000 | |
| Bank loan | 25,000 | |
| Share capital | 20,000 | |
| Retained earnings | 68,000 | |
| Total | 150,500 | 150,500 |
If the retained earnings line were left out, Odoo would post 68,000 to the 999999 account as an automatic balancing line. The entry would look balanced, but the balance sheet would be wrong.
How do you import open invoices and bills without doubling AR and AP?
Import each open invoice and bill as a real document whose line posts to the AR or AP clearing account, so the clearing account nets to zero and receivables appear only once. This is the core of a clean Odoo open invoices import.
Odoo's guide shows why: with 1,000 of open invoices, loading both the trial balance AR and the invoices shows receivables of 2,000.
Prepare each open invoice with one line only, for the remaining amount due:
- Partner: must match a contact in Odoo exactly.
- Number: the original number, with the year in the number matching the invoice date.
- Due date or payment terms: one or the other, never both.
- Account: the AR clearing account for invoices, the AP clearing account for bills.
- Amount: total minus partial payments already received or made.
- Negative amounts: import them as credit notes or refunds with a positive value.
Single-line import keeps tax accounts from being hit twice. Import as draft, then select all and use Confirm Entries.
For foreign currency invoices, create a historical exchange rate for each invoice date before you import. Later payments then post exchange differences correctly. Our Odoo multi-currency accounting guide covers rates and revaluation.
Expect some import errors on the first pass. On one Odoo forum thread about the opening balances import process, several users hit an unbalanced entry error. The advice was to test each file on a copy of the production database first.
How do you load opening stock quantities and valuation?
Load Odoo opening stock by setting the correct cost on each product first, then importing the counted quantities through Physical Inventory with an opening inventory reason. Odoo says this process is the same for every valuation method.
- Update the Cost field on every stocked product, by hand or by import.
- Download the Inventory Adjustments template from Inventory, Physical Inventory.
- Fill in Product, Counted quantity, Location if locations are on, and one line per lot or serial number.
- Use the product external ID when variants share a name.
- Import, click Apply All, enter a reason such as Opening inventory and a counting date, then Update Quantities.
For FIFO products bought at several costs, set one cost, import that quantity, then repeat for each cost layer.
Then check the total. Quantity times cost, summed across all products, must equal the inventory accounts in the opening trial balance. Odoo's example uses 10 desks at 250, 8 tables at 350 and 15 chairs at 50, giving 6,050.
With automated valuation, the stock count also posts a valuation entry. Check the inventory account after both loads, and make sure the trial balance line and the count do not add up to double the stock value. Test this order in a copy first.
Odoo 20 changed parts of stock valuation. Read our Odoo 20 inventory valuation changes guide before you choose FIFO or AVCO for go-live.
How do you set opening bank balances in Odoo?
Set the opening bank balance in Odoo by giving each bank, cash and credit card journal a first statement whose starting balance equals the real balance before the first transaction. The trial balance line and the statement must agree.
Create the first statement once the first transactions arrive, by hand, by import or through bank sync. If bank sync pulls in transactions dated before the trial balance date, delete them, or the balance will be counted twice.
Uncleared cheques and deposits need a plan. In our projects we load them as open payments against the clearing account, then match them when they clear. Odoo's bank reconciliation then works from a clean start.
How do you bring fixed assets into Odoo?
Bring fixed assets into Odoo by importing each asset with its original value, acquisition date and depreciation already booked, so Odoo only plans the remaining depreciation. The trial balance already carries cost and accumulated depreciation.
The Odoo 20 assets guide shows a Depreciated at import field for this. In Odoo 19 the same idea sits under Value at Import, as Depreciated Amount, and needs developer mode. Imported assets start as drafts and must be confirmed.
Before you confirm them, check three totals. Asset cost in the register must equal the asset accounts, depreciation to date must equal accumulated depreciation, and the next depreciation date must follow the go-live date. Use depreciation models to keep methods consistent.
How do you reconcile the opening trial balance after the Odoo opening entries?
Reconcile the opening trial balance by proving that every Odoo report on the go-live date matches the signed reports from the old system. Do this before users post anything new.
Run this checklist for your Odoo opening entries:
- Balanced entry: the opening entry is balanced and posted, with no automatic balancing line on 999999.
- Receivables: open invoices minus credit notes equal the old AR, and the AR clearing account is zero.
- Payables: open bills minus refunds equal the old AP, and the AP clearing account is zero.
- Stock: stock valuation equals the inventory accounts in the trial balance.
- Bank: each journal balance equals the bank statement on the cutover date.
- Assets: the asset register agrees with cost and accumulated depreciation.
- Tax: VAT or GST payable and receivable match the last return and its workings.
When the clearing accounts are at zero, Odoo's guide says to change their account type to Off-Balance Sheet, so they drop out of reports. Then set a lock date on the cutover date, as our Odoo year-end closing checklist describes.
Odoo opening balances by industry
The opening balance steps are the same in every business, but the hard part changes with the industry. The table shows where each type of company usually needs extra care at Odoo accounting go-live.
| Industry | Pain or cost driver | Odoo approach | How iVentureTeam helps |
|---|---|---|---|
| Wholesale and distribution | Thousands of SKUs, lots and locations | Physical Inventory import per location and lot | Count plan, cost clean-up, value check |
| Manufacturing | Work in progress and open orders | Finish or count WIP before cutover | WIP cut-off rules, BOM cost review |
| Retail and eCommerce | Gift cards, deposits, POS floats | Open items as documents, cash journals | Map channels and liabilities |
| Professional services | Unbilled time, retainers, deferred revenue | Open invoices plus deferred entries | Retainer and deferral mapping |
| Exporters and importers | Invoices in several currencies | Historical rates per invoice date | Rate tables and FX checks |
How iVentureTeam helps with Odoo opening balances

iVentureTeam prepares, loads and reconciles your Odoo opening balance as part of the go-live, with sign-off at each step. We have delivered 150+ ERP projects across 35+ countries with 40+ Odoo specialists over 13+ years.
- Cutover plan: go-live date, freeze rules and the reports to sign off, agreed with your accountant.
- Data preparation: account mapping, open item lists, stock counts and asset registers cleaned before import.
- Trial loads: every file tested on a copy of the database until the numbers tie out.
- Migration support: when history must move too, our Odoo migration services handle it, with the steps from our Odoo migration guide.
- Spreadsheet sources: for teams leaving Excel, we follow our Excel to Odoo migration plan.
Data migration in our projects typically runs from $1.2k to $9k, depending on the source system and years of history. For a first budget, try the Odoo implementation cost calculator.
Odoo go-live data case study: KMF Technologies
An IT services and hardware distributor in The Gambia replaced manual product tracking with Odoo, with a migrated product master and a local chart of accounts. The rollout took 8 weeks across seven phases.
KMF Technologies tracked products in hand-kept lists, with no live stock view, which led to overstocking and stock-outs.
We configured Sales, Purchase, Inventory and Accounting, defined warehouses, stock locations and units of measure, and built a custom chart of accounts for The Gambia. The full product master, including cost prices and sale prices, was imported with post-migration integrity checks.
The result was live stock across warehouses and fewer errors in stock entries. In the director's words, "Inventory in Odoo matches the shelf." Read the KMF Technologies Odoo inventory implementation case study.
The bottom line on Odoo opening balances
A clean Odoo opening balance is one balanced opening entry, open items loaded through clearing accounts, stock and assets that tie to the trial balance, and a signed reconciliation. Skip any of these and the errors surface at the first close.
Pick a fiscal-year or tax-period cutover, test every file on a copy, keep the 999999 account at zero, and lock the period once finance signs off.
Ready to load your Odoo opening balances right the first time?

Get your trial balance, open items and stock into Odoo with a reconciled sign-off. Plan your Odoo accounting cutover with us, call +91-90235-15208, or email business@iventureteam.com.
Frequently Asked Questions
How do I enter opening balances in Odoo?
+
Import your old trial balance as one Miscellaneous journal entry dated the day before go-live, with AR and AP replaced by clearing accounts. Then import open invoices, bills, stock and assets, and reconcile everything.
What date should the Odoo opening entry have?
+
Use the last day before go-live, for example 31 December for a 1 January start. Odoo's own opening move defaults to the day before the opening date, so reports on the go-live date show the right balances.
What is account 999999 in Odoo?
+
It is the Current Year Earnings account Odoo uses for automatic balancing lines. Odoo 18 named it Undistributed Profits/Losses; Odoo 19 and 20 name it Profit or Loss Appropriation. After go-live it should be zero or explained.
Why are my receivables doubled after importing open invoices?
+
You loaded both the AR balance in the trial balance and the open invoices against AR. Point the trial balance line and the invoice lines to an AR clearing account instead, so the clearing account nets to zero.
Should I import open invoices with all their lines and taxes?
+
No. Odoo recommends one line per invoice for the remaining amount due, posted to the clearing account. The tax was already reported in the old system, so full lines would hit tax accounts twice.
How do I import opening stock in Odoo?
+
Set product costs first, then import counted quantities through Inventory, Physical Inventory with location and lot details. Apply them with an Opening inventory reason, and check the value against the inventory accounts.
Can I change the opening balance after it is posted?
+
Yes, but you must reset the opening entry to draft first, because Odoo blocks opening balance imports on a posted move. Make the change, re-check every total, post again and then set a lock date.
Do I need to migrate old transactions to Odoo?
+
Not always. Many companies load only opening balances and open items, and keep closed years in the old system or an archive. Moving full history is a larger migration with its own cost and testing.
How long does loading opening balances take?
+
For a clean small business, a few days of preparation and trial loads is common. Many SKUs, currencies, assets or a mid-year cutover add time, so plan at least one full rehearsal before go-live.
Free written answer from a certified consultant
Getting stock under control in Odoo?
Tell us how stock moves through your business. We map warehouses, routes and replenishment in Odoo and show what to configure first.
Free, with no obligation. A senior consultant replies within 12 business hours.
Free Odoo tools
All tools- Odoo Health CheckVersion, modules, findings and upgrade cost
- Odoo App SelectorWhich apps you need, by industry
- Odoo Project EstimateIndicative cost and timeline in minutes
- Odoo Implementation Cost CalculatorImplementation cost and timeline, in minutes
- Odoo Migration Cost CalculatorVersion jump or legacy ERP, priced in minutes
Continue reading
Spreadsheets After ERP Implementation: Why Odoo Users Keep Excel
Why teams keep Excel after an Odoo go-live, the hidden risks of shadow spreadsheets, and a fix plan using Odoo 20 Spreadsheet, Dashboards and imports.
Odoo ERP Implementation in Saudi Arabia: ZATCA, Arabic, Cost, Timeline
Odoo ERP implementation in Saudi Arabia: Odoo 19 vs 20, ZATCA Phase 2 onboarding, Arabic invoices, GOSI and WPS payroll, hosting, cost and timelines.
ERP Rollback Plan for Odoo: Cut-Over Criteria, Backups and Go/No-Go
Build an ERP rollback plan for your Odoo go-live: cut-over criteria, backups on Odoo Online, Odoo.sh and on-premise, a go/no-go gate and fallback steps.
