Skip to main content
iVentureTeam
Odoo Implementation

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.

Siddharth JambukiyaSiddharth JambukiyaOdoo Techno-Functional Consultant
November 14, 202613 min read1 view
Odoo Opening Balance Guide: Opening Entries, Stock and Open Invoices cover

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?

Odoo opening balance: What to load and how to check it

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.

ItemWhat you loadOdoo toolCheck after loading
Trial balanceEvery account balance on the cutover dateMisc. journal entry importEntry is balanced and posted
ReceivablesOpen customer invoices and credit notesInvoice import to AR clearingAged receivables equals old AR
PayablesOpen vendor bills and refundsBill import to AP clearingAged payables equals old AP
StockCounted quantity, location, lot and costPhysical Inventory importStock value equals inventory accounts
Bank and cashBalance per statement on the cutover dateFirst bank statementStarting balance equals the bank
Fixed assetsCost, date and depreciation to dateAsset importRegister 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:

  1. Export the trial balance from the old system on the cutover date, with each account as a debit or a credit.
  2. Map every old account to an Odoo account. Odoo 20 makes account codes optional, so use external IDs if you do not use codes.
  3. In Accounting, open Journal Entries, choose Import and download the Misc. Operations template.
  4. Fill in Reference, Date and Journal on the first line only, so Odoo builds one entry with all lines.
  5. Put each amount in either Debit or Credit, never both, and never 0.00 or a negative value.
  6. Replace Accounts Receivable with an AR Clearing account and Accounts Payable with an AP Clearing account.
  7. 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.

AccountDebitCredit
Bank42,000
Inventory valuation30,000
AR Clearing (replaces AR)18,500
Fixed assets at cost60,000
Accumulated depreciation22,000
AP Clearing (replaces AP)12,500
VAT payable3,000
Bank loan25,000
Share capital20,000
Retained earnings68,000
Total150,500150,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.

  1. Update the Cost field on every stocked product, by hand or by import.
  2. Download the Inventory Adjustments template from Inventory, Physical Inventory.
  3. Fill in Product, Counted quantity, Location if locations are on, and one line per lot or serial number.
  4. Use the product external ID when variants share a name.
  5. 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.

IndustryPain or cost driverOdoo approachHow iVentureTeam helps
Wholesale and distributionThousands of SKUs, lots and locationsPhysical Inventory import per location and lotCount plan, cost clean-up, value check
ManufacturingWork in progress and open ordersFinish or count WIP before cutoverWIP cut-off rules, BOM cost review
Retail and eCommerceGift cards, deposits, POS floatsOpen items as documents, cash journalsMap channels and liabilities
Professional servicesUnbilled time, retainers, deferred revenueOpen invoices plus deferred entriesRetainer and deferral mapping
Exporters and importersInvoices in several currenciesHistorical rates per invoice dateRate tables and FX checks

How iVentureTeam helps with Odoo opening balances

Budgeting go-live? Estimate it first

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?

Plan your accounting cutover

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.

We use cookies to improve your experience

Essential cookies make the site work; with your permission we also use analytics to improve it. See our cookie policy.