A guide to migrating accounting to Odoo from other bookkeeping or ERP software

This guide provides some basics that can help you prepare and execute an accounting migration into Odoo. This can be used if you plan to migrate from QuickBooks, Sage, NetSuite, or other software to Odoo. Although this guide is detailed and extensive, be mindful that there is more than one way to get bookkeeping moved to Odoo successfully. No matter the Route you choose, care and judgment are needed to get it done well.
Configuration needs in the Odoo accounting app
Some accounts created via the default chart of accounts (COA) that must remain (used for specific things in Odoo) - do not delete them, rename and change codes as needed instead.
- Account Receivable
- Configured on “contacts” - invoice totals and payments will go against this account defined for each “contact”.
- Account Payable
- Configured on “contacts” - vendor bill totals and payments will go against this account defined for each “contact”.
- Account Receivable (POS)
- This will be used for receivables created via POS orders – it’s okay to mark it as “deprecated” if POS is not used.
- Liquidity Transfers
- Used to create journal entries for transfers of funds from one bank account to another, configured via the Accounting app settings.
- Stock Valuation
- Account with the value of inventory - there can be multiple stock value accounts defined for various types of products.
- Stock Interim (Received)
- Account connecting journal entries are created when receiving inventory from vendors and recording vendor bills for the same products (when the product is configured to have “automated” inventory valuation).
- Stock Interim (Delivered)
- Account connecting journal entries created when shipping inventory to customers and recording customer invoices for the same products (when the product is configured to have “automated” inventory valuation).
- Tax Receivable
- Configured on sales tax groups – money collected as tax will be routed to this account.
- Tax Payable
- Configured on purchase tax groups – money collected as tax will be routed to this account.
- Product Sales
- Account used to record revenues for products – this can be defined on product categories or individual products, allowing revenues from different products to flow into different accounts.
- Expenses
- The default account used to record the cost of goods sold for products – this can be defined on product categories or individual products, allowing COGS from different products to flow into other accounts. COGS accounts on products are usually changed to another account (COGS type), and the generic Expenses account can be used as “other expenses” or as a “fallback” account intended not to be used; thus, if a balance is added to it, the accountant will know that some product is misconfigured.
- Foreign Exchange Loss
- Used to write off differences in receivables/payables and related payments when the two are in different currencies, or when a change in currency exchange rates happened between the time the invoice and payment were created, configured in the Accounting app settings.
- Cash Difference Loss
- Used to write off differences in recorded balance and counted balance on POS sessions upon closure.
- Undistributed Profits/Losses
- This is for the net income amount transferring from the Profit and Loss statement to the Balance Sheet before being “distributed” to retained earnings, dividends, or other.
- Bank Suspense Account
- This account is used during bank reconciliation in Odoo. Upon uploading bank statement lines, Odoo directly posts bank balances to the book balance and creates offset entries in the Suspense Account until they are reconciled with payment records in the books.
- It is recommended to use separate Suspense accounts for each bank account that gets reconciled in Odoo and to rename the “default” suspense account to be a “do not use” account, whereupon, if balances appear in it, it will be known that something is misconfigured.
- Default/fallback is configured in the Accounting app settings.
- Outstanding Receipts
- This account is used when doing bank reconciliation in Odoo. Upon posting a book entry for an incoming payment in Odoo, Odoo posts the entry towards an “Outstanding Receipts” account instead of directly to the account itself. When the funds post to the bank itself, Odoo would make the entry to the account and offset to the Suspense account (see above), and upon reconciling a book payment record to the bank statement line record – Odoo removes both the “outstanding” and the “suspense” records and marks the payment and the statement line as “reconciled”
- It is recommended to use separate Outstanding Receipts accounts for each bank account that gets reconciled in Odoo and to rename the “default” outstanding account to be a “do not use” account, whereupon, if balances appear in it, it will be known that something is misconfigured.
- Default/fallback is configured in the Accounting app settings.
- Outstanding Payments
- This account is used when doing bank reconciliation in Odoo. Upon posting a book entry for an outgoing payment in Odoo, Odoo posts the entry towards an “Outstanding Payments” account instead of directly to the account itself. When the funds post to the bank itself, Odoo would make the entry to the account and offset to the Suspense account (see above), and upon reconciling a book payment record to the bank statement line record – Odoo removes both the “outstanding” and the “suspense” records and marks the payment and the statement line as “reconciled”
- It is recommended to use separate Outstanding Payments accounts for each bank account that gets reconciled in Odoo and to rename the “default” outstanding account to be a “do not use” account, whereupon, if balances appear in it, it will be known that something is misconfigured.
- Default/fallback is configured in the Accounting app settings.
Other accounts needing special setup in Odoo
Bank accounts, merchant accounts, credit cards, etc.
A bank account requires a “journal” to be used for payments in Odoo. Journal setup depends on whether bank reconciliation will be done in Odoo or not:
If no bank reconciliation will be done via Odoo for the account:
- Create a new “journal” for the money account (Accounting app > configurations menu > journals), set its “type” to be “Bank”, add a “short code” which will be used as a prefix to journal entry IDs created in this journal
- Upon creating the journal, an account will be generated in COA
- On the “Incoming Payments” tab – enable the “Outstanding Receipts accounts” column, and for any payment methods that must be available for this journal, specify the account to be the same as the primary journal account (from the “Bank Account” field on the Journal Entries tab)
- This will prevent Odoo from expecting you to do bank reconciliation in the system – book records will go directly into the bank account instead of routing via an interim account meant for reconciliation/matching
- Do the same for the “Outgoing Payments” tab for the “Outstanding Payments accounts” column
If bank reconciliation will be done via Odoo for this account:
- Create a new “journal” for the money account (Accounting app > configurations menu > journals), set its “type” to “Bank”, add a “short code” which will be used as a prefix to journal entry IDs created in this journal
- Upon creating the journal, an account will be generated in COA
- Go to the “Chart of Accounts” and create three accounts (Accounting app > configurations menu > Chart of Accounts):
- “Account Name – Outstanding Receipts”, add a desired code, Type=current assets, Allow Reconciliation=True
- “Account Name – Outstanding Payments”, add a desired code, Type=current assets, Allow Reconciliation=True
- “Account Name – Suspense Account”, add a desired code, Type=current assets, Allow Reconciliation=False
- Go back to the newly created journal to update fields as specified below
- Journal Entries tab – Suspense Account should be set to the newly created account “Account Name – Suspense Account”
- With this setting, when you bring bank statements into Odoo, Odoo will post bank account transactions against the account created for this journal, and it will generate offset entries against this “suspense account”, where the balances will be held until being reconciled with “book entries”
- Incoming Payments tab - enable the “Outstanding Receipts accounts” column, and for any payment methods that must be available for this journal, specify “Account Name – Outstanding Receipts” account
- With this setting, when you make book entries in Odoo for this payment journal, Odoo will post entries into this “outstanding” account instead of directly into the bank account, and the balance will stay there until you reconcile book entries with bank statement lines. This allows tracking of payments that were posted in Odoo but might still be in processing by the bank and not showing in your bank statement (and your actual bank balance).
- Outgoing Payments tab - enable the “Outstanding Payments accounts” column, and for any payment methods that must be available for this journal, specify the “Account Name – Outstanding Payments” account
Accounts needed for inventory operations and accounting migration to Odoo
Need to create some accounts for various adjustment purposes (in the chart of accounts). These will be configured in specific places in Odoo, as described below.
- Inventory Adjustment Expense/Allowance
- Type is Current Asset or Expense
- Allow reconciliation = False
- Where to use: Inventory app > Configuration > Locations: remove “internal” filter, and find the location called “Inventory Adjustment” - set this new account as “Stock Valuation Account (Incoming / Outgoing)”
- Inventory Scrap Expense/Allowance
- Type is Current Asset or Expense
- Allow reconciliation = False
- Where to use: Inventory app > Configuration > Locations: remove “internal” filter, and find the location called “Scrap” - set this new account as “Stock Valuation Account (Incoming / Outgoing)”
- Inventory in Production WIP
- Needed if the Manufacturing app is installed
- Type is Current Asset
- Allow reconciliation = False
- Where to use: Inventory app > Configuration > Locations: remove “internal” filter, and find the location called “Production” - set this new account as “Stock Valuation Account (Incoming / Outgoing)”
- Purchase Price Difference Expense/Allowance
- Type is Current Asset, Expense, or COGS
- Allow reconciliation = False
- Where to use: Inventory app > Configuration > Product Categories: on all product categories that will be used for “storable products” and that are set to have “Inventory Valuation = Automated” - set this new account as “Price Difference Account”
- Migration Balances
- Type is Current Asset
- Allow reconciliation = False
Migration Steps and Considerations
Up-to-date bank reconciliation in prior software will help minimize the amount of cleanup that would be needed in Odoo.
Accounts that get their balances from special records
Bank accounts that will have bank reconciliation done in Odoo
Bank statement records will set the opening balances for each bank account.
Before importing real statements or setting up automatic synchronization for the bank to send data into Odoo:
- Manually create a bank statement with a single line for the “opening” balance taken from a prior bank statement ending balance – this statement line will set the book account balance to that number.
- Click to “reconcile” the account, switch the reconciliation type to “Manual”, and reconcile the line to a “Migration Balances” account – that will result in the book balance being set for this account and will mark that balance as “reconciled”.
Things that may affect the bank balance and cause mismatches between the opening balance as set in Odoo vs the book balance on the account in the prior system:
- The prior system had book entries that updated the account balance. Still, some of those book entries haven’t been posted to the bank yet. These may be booked receipts where checks haven’t cleared through the bank, or outgoing checks that were made but haven’t been deposited by vendors, so they haven’t caused funds to be withdrawn.
- How to deal with it: After migrating to Odoo, once a transaction like this posts to your bank statement and gets into Odoo as a statement line, it will update the bank balance. An accounting user should click to “reconcile” that transaction, switch to “Manual” reconciliation, and reconcile the line to a “Migration Balances” account.
- How to deal with it: Upon creating the “opening statement entry”, you can calculate the difference between the bank balance in Odoo and the book balance in the old software, and post that difference as a manual journal entry into Odoo into a separate new account titled “Migration - Bank balances” or “Migration - Bank ABC balance” or similar, and instead of reconciling bank statement lines to a general “Migration Balances” account as in point a. above – you’d use a more specific account, with an assumption that once all the missing records post to the bank – your special migration account(s) will return to $0 balances, thus validating that you are caught up on the migration for that account.
- The prior system had “undeposited” accounts linked to bank accounts, where the account balance may be spread across multiple accounts for various reasons.
- How to deal with it: For Odoo, consider adding the sum of the bank account and its related “undeposited” account to compare with the balance in Odoo.
- The prior system had errors in bank reconciliation, incomplete bank reconciliation, or errors in dates on some account moves.
- How to deal with it: This will require re-verifying bank reconciliation in the old system, which may result in changes to the general ledger. Such changes to the general ledger would need to be transferred into Odoo upon discovery.
Accounts payable
Balance made up of open vendor bills, credit memos, and unattached outbound payments or refunds
- Import or enter all the open payable-related records one by one. Once they are all imported, the total balance on Accounts Payable in Odoo should equal the balance in the prior system.
- Individual records are necessary because payable records must be reconciled to their payments in Odoo once they are issued.
- Individual open bills or credit memos may either have itemized lines on them, with details about each as was logged in the prior system, or may also have a single line with the necessary total per bill, routing to a “Migration Balance” balance sheet account.
Accounts receivable
Balance made up of open customer invoices, credit memos, and unattached inbound payments or refunds
- Import or enter all the open receivable-related records one by one. Once they are all imported, the total balance on Accounts Receivable in Odoo should equal the balance in the prior system.
- Individual records are necessary because receivable records must be reconciled to their payments in Odoo once they are received and logged.
- Individual open invoices or credit memos may either have itemized lines on them, with details about each as was logged in the prior system, or may also have a single line with the necessary total per invoice, routing to a “Migration Balance” balance sheet account.
Stock Valuation
Balance made up of quantities of “storable” products in stock, multiplied by each product’s accounting cost (AVCO, FIFO, or standard)
- To set a proper stock value on your balance sheet, update the “Cost” field on all storable products that have stock at the time of the migration.
- It is a good practice also to update the “Cost” for any product that may be returned from a customer following the migration (so it gets logged with a reasonable cost).
- After updating the costs, import stock counts into the Inventory Adjustments list – import the product identifiers, locations where the stock is stored (it may be a generic “Stock” location, or individual shelf/bin location IDs), and the “Counted Quantity” numbers with the product counts as reported in the prior system upon migration.
- Upon importing the inventory adjustment lines, select all lines at once in Odoo and click “Apply” to update Odoo inventory counts and create accounting entries adding the product value to your balance sheet and creating offset entries into an account specified as the Inventory Adjustment account on the Inventory Adjustment location (as configured in a prior step).
- Optionally, before applying the inventory counts, a special “Inventory migration” account can be created and set as the “incoming” and “outgoing” account on the Inventory Adjustment location. Upon this update, go back to the Inventory Adjustments view, “Apply” all adjustments to bring in inventory and set inventory values (this way inventory value offset account will be the new “inventory migration” account), and upon completion of this process, switch the accounts used on Inventory Adjustment location back from the inventory migration account.
Other account balances are set via a journal entry
Other accounts whose balances are desired in Odoo will be set via a journal entry, with any balance going against a “Migration Balance” account.
- Balance sheet accounts, except the ones outlined above, would need to be set up this way.
- Profit and loss accounts for a specific period can be set if desired – should be set as of the last day of the period.
- It is viable to create multiple journal entries for monthly P/L and balance sheet reports (or annual) in Odoo, allowing for the examination of past financial totals without importing all granular data. However, this would require manual calculation of the necessary entries for each date to achieve the desired results.
- If entering P/L entries for past periods, would need to include entries to move earnings from an “Undistributed Profits/Losses” account into the proper retained earnings accounts.
The above steps should complete most or all of the accounting migration into Odoo, although different companies may have special cases that require attention or additional steps. The cleaner the accounting books are in the previous system before migrating, the easier and quicker the migration to Odoo will be. If records were messy, there is a risk that transferring the books and switching to Odoo would require significant efforts to clean up the data after the migration, with transactions needing edits for a few weeks or months following the migration. The quicker you move the data and get bank reconciliation under control, the sooner you’ll get to a good place with managing your financials.
Related posts

Log Shipping Expense onto Delivery and Invoice in Odoo
Attribute shipping costs into invoices for total profitability per invoice, so the invoice has product revenue, shipping revenue, COGS, and shipping expense lines.

Odoo SO Deposits and Down Payments Applying to Multiple Invoices
Simplifying Complex Invoice Management: Allocate Deposits Against Multiple Invoices in Odoo

Migrating from Quickbooks to Steersman's Odoo ERP
Migrating from Quickbooks to Steersman’s Odoo ERP solution with the built in Accounting module safely and efficiently to ensure reliability of the data, efficiency of operations, and quality of the overall output.

How to Assign a Pricelist to a Customer in Odoo
Instructions for how to assign a pricelist to a customer account in Odoo.