Back to all articlesAccounting

Importing Opening Balances in Odoo: An APAA Migration Playbook

A complete APAA walkthrough of migrating opening balances into Odoo Accounting — general ledger, open receivables and payables, and the bank balance — using the suspense-account technique to avoid double-counting.

APAA
Importing Opening Balances in Odoo: An APAA Migration Playbook

At APAA, the moment a Hong Kong SME decides to move off its old accounting software, one question always comes up: "What happens to all our existing balances?" Migrating to Odoo is not just installing fresh software — your accounts have to start from exactly where the old system left off, down to the cent, or every report you run afterwards will be wrong.

That is what an opening-balance import does. Done carelessly, it double-counts your receivables or leaves your bank balance hanging with nothing to reconcile against. Done properly, your trial balance in Odoo ties out perfectly to your old system on day one. This playbook is the method we use with clients, including the suspense-account technique that makes the whole thing balance.

What an Opening Balance Actually Covers

When you switch to Odoo, you import your opening entries so each account begins at the right figure. Skip this and your Odoo records are simply incomplete.

A typical migration breaks into four parts:

  • General ledger — the balance of every account
  • Open receivables and payables — unpaid customer invoices, vendor bills, and credit notes
  • Bank balance — your current bank balance (the same process repeats for each account)
  • Current inventory accounts — only if you use manual inventory valuation

Get These Right Before You Touch Odoo

A clean migration depends on clean source data. Before importing, we always confirm the following:

  1. Use end-of-period figures. Cut over using data from the end of your financial year or tax period — not a random mid-month date.
  2. Confirm the ledger balances. Total debits must equal total credits.
  3. Reconcile receivables. The accounts-receivable balance in the general ledger must equal the sum of unpaid customer invoices minus unpaid customer credit notes.
  4. Reconcile payables. The accounts-payable balance must equal the sum of unpaid vendor bills minus vendor credit notes.

If these do not tie out in your old system, they will not tie out in Odoo. Fix them first.

The Suspense-Account Technique (and Why You Need It)

You cannot just dump the general ledger into Odoo as-is. Here is the trap.

When you create an invoice or bill in Odoo, it automatically posts to accounts receivable or payable. If you have also imported the receivable balance from the general ledger, that account now holds twice the real amount.

Diagram showing double-entry problem when importing receivables directly

Stripping receivables and payables out of the ledger is no fix either, because then the ledger no longer balances.

The solution is a suspense account that temporarily parks those balances:

  • On the general-ledger import, replace the receivable and payable accounts with a single suspense account.
  • When you import the open invoices and bills, they also post against that same suspense account.
  • The two sides cancel out — the suspense account nets to zero, and your real receivable and payable accounts end up correct.

Handling the Bank Balance the Same Way

The bank account has a parallel problem. Import the balance straight into the bank account and there is nothing for the opening bank transaction to reconcile against later.

The fix: on the general-ledger import, replace the bank account with the bank outstanding receipts account if your balance is positive. If it is negative, use the bank outstanding payments account instead. You will clear it when you reconcile the bank in the final step.

Preparing Your Import Spreadsheet

Your import file needs several sheets.

Sheet 1: General Ledger (Balance)

ColumnContent
DateThe opening-balance date
JournalA dedicated "Opening Balance" journal (short code OPB)
ReferenceA label for the entry
Account CodeThe account number for each line
DebitDebit amount (a line cannot carry both debit and credit)
CreditCredit amount

The two key edits to your old export:

  • Swap receivable/payable accounts for the suspense-account code.
  • Swap the bank account for the outstanding-receipts account.

Spreadsheet showing the general ledger sheet with highlighted accounts to change

Spreadsheet showing the balance sheet ready for Odoo import with replaced accounts

Sheet 2: Receivables

One line per unpaid invoice:

  • Customer name, invoice number, dates, and total amount due
  • A column marking the source (e.g. "Opening Balance")
  • The suspense-account code — it must match the one on the general-ledger sheet

Spreadsheet showing the receivables tab with invoice lines and suspense account

Sheet 3: Payables

The same structure, for vendor bills:

  • Use a "Bill" prefix in the number sequence instead of "INV"
  • The reference column can list purchase orders from the old system
  • The reference is optional if you have nothing to record

Spreadsheet showing the payables tab with vendor bill lines

The Import, Step by Step

Step 1: Create the Opening Balance Journal

  1. Go to Accounting > Configuration > Journals.
  2. Create a journal named "Opening Balance".
  3. Set the type to Miscellaneous.
  4. Set the short code to OPB.

Odoo journal creation form with Opening Balance journal configured

Step 2: Import the General Ledger

  1. Go to Accounting > Journal Entries.
  2. Click Action > Import Records.
  3. Upload the spreadsheet and select the general-ledger sheet.

Odoo import records dialog with file uploaded and balance sheet selected

  1. Odoo auto-maps columns by name — check each mapping.
  2. Skip the "Account Name" column if you are identifying accounts by code.

Column mapping screen showing auto-mapped fields with Account Name skipped

  1. Click Test to validate before committing.
  2. Click Import.
  3. Remove the "Posted" filter to find your draft entry.
  4. Open it, review, and click Post.

Draft journal entry ready to be posted in Odoo

Step 3: Import Customer Invoices

  1. Go to Customers > Invoices.
  2. Click Action > Import Records.
  3. Upload the same file and select the receivables sheet.
  4. Test, then import.
  5. Select every imported invoice and post them in one batch.

Imported customer invoices selected for bulk posting

Step 4: Import Vendor Bills

  1. Go to Vendors > Bills.
  2. Click Action > Import Records.
  3. Upload the file and select the payables sheet.
  4. Test, then import.
  5. Select every imported bill and post them in one batch.

Imported vendor bills selected for bulk posting

Step 5: Reconcile the Bank Balance

  1. Open the Accounting Dashboard.
  2. Click New Transaction on your bank account.

Accounting dashboard with New Transaction button highlighted

  1. Enter "Opening Balance" as the label.
  2. Set the date to your opening-balance date.
  3. Paste in the bank balance amount.
  4. Save and close.

Bank transaction form with opening balance details filled in

  1. Click Reconcile — Odoo suggests the matching opening entry.
  2. Select it and click Validate.

Bank reconciliation screen showing suggested opening entry match

Check Your Work

Once every step is done, open the general ledger and confirm:

  • The suspense account is fully balanced at zero.
  • Receivable and payable accounts show the correct balances.
  • The bank account reflects the correct balance.
  • The outstanding receipts/payments account is balanced.
  • Your Odoo general ledger matches your old system exactly.

Final general ledger showing all accounts correctly balanced after import

The Migration at a Glance

StepActionImport Model
1Create the OPB journal
2Import the general ledgerJournal Entry
3Import open invoicesCustomer Invoice
4Import open billsVendor Bill
5Reconcile the bank balanceBank Transaction

This is a standard, reliable approach that covers the vast majority of SME migrations. Edge cases — multiple currencies, manual inventory valuation, partial credit notes — sometimes need extra adjustments, and getting them wrong at cut-over is expensive to unwind later.

If you are planning to move your Hong Kong business onto Odoo and want the opening-balance migration handled cleanly from the first day, speak to the APAA Odoo team.

Tags:odooaccountingmigrationopening-balancehong-kong-sme

Considering Odoo for your business?

Talk to APAA about a tailored Odoo implementation for your Hong Kong SME.

Enquire about Odoo services
Importing Opening Balances in Odoo: An APAA Migration Playbook | APAA