This guide explains which QuickBooks Online records Odoo's standard import tool can load, the order to load them in, and what happens to the files attached to your invoices and bills. The short answer: the chart of accounts, contacts, open invoices and bills, and journal entries all import from spreadsheets, and taxes are usually mapped to the ones Odoo already provides. Attachments can be imported, but only as encoded text inside the import file with a technical column filled in, so in practice they need a script-generated file. Paid history and old payments are usually better carried as opening balances.
It is written for accountants and owners planning the switch. The steps were verified on Odoo 19.
Before you start
- Version and edition: Odoo 19. The import tool works in Community and Enterprise. The Accounting Import Guide page and the Trial Balance and Aged Receivable reports are Enterprise only.
- Apps: Accounting (called Invoicing in Community). Customers and vendors can be imported from its own menus.
- No QuickBooks format: standard Odoo has no importer that reads QuickBooks files directly. Everything goes through CSV or Excel files you prepare from QuickBooks reports or exports.
- Terms used: the import tool is the Import records option in the gear menu of most Odoo lists, which maps spreadsheet columns to fields. An external ID is a unique key you give each imported row so later files can refer to it. A clearing account is a temporary account that holds an amount until the matching entry offsets it. The cutover date is the day Odoo becomes your book of record.
What imports natively, record by record
- Chart of accounts. Odoo installs a chart with your country's localization. Rename and recode its accounts to match yours where they serve the same purpose, and import only the ones that are missing. The list offers an Import Template for Chart of Accounts. In Enterprise, an imported row whose code matches an existing account updates that account instead of creating a duplicate.
- Taxes. The localization also installs taxes, and each Odoo tax carries Distribution for Invoices and Distribution for Refunds lines that decide which account and tax report line it posts to. Map each QuickBooks tax code to an existing Odoo tax rather than importing taxes.
- Customers and vendors. Contacts import with the Import Template for Contacts. Give each one an external ID based on the QuickBooks customer or vendor ID.
- Open invoices and bills. Customer invoices, credit notes, vendor bills and refunds each have a template in their own list. They arrive as drafts.
- Journal entries. The Journal Entries list offers an Import Template for Misc. Operations, used for the opening balance entry and any adjustments.
- Payments. Payment records can be imported, but importing does not reconcile a payment with the invoice it paid, so each one would still have to be matched by hand.
Step by step: the import order
Each file can only point to records that already exist, so load them in this order. Every list below is reached from the Accounting app; open the gear icon next to the list title and click Import records, where the template download link also appears.
- Chart of accounts: Configuration > Accounting > Chart of Accounts. Fix names and codes before anything refers to them.
- Taxes: review Configuration > Accounting > Taxes and note which Odoo tax replaces each QuickBooks code.
- Contacts: Customers > Customers, then the vendor list. Click Test before Import to catch errors without saving anything.
- Open invoices and credit notes: Customers > Invoices. Import one line per invoice for the amount still owed, posted to an AR clearing account, keeping the original date and number.
- Open bills and refunds: Vendors > Bills, the same way, against an AP clearing account.
- Opening balance entry: Accounting > Journal Entries. One entry dated the day before cutover, with each account's balance from the QuickBooks trial balance, replacing receivables and payables with the two clearing accounts.
- Post the drafts: select the imported invoices and bills, open the gear menu and choose Confirm Entries, then post the opening entry.
The clearing accounts are what stop receivables from being counted twice: the invoices and the opening entry each hit the clearing account from opposite sides, so it nets to zero once both are posted.
What happens to attachments
In QuickBooks Online, an attached file is stored as its own record linked to the transaction, so it does not travel inside an invoice export and has to be downloaded separately, usually through the QuickBooks API.
On the Odoo side, the invoice import does expose an Attachments sub-table. Three columns make a file land on the right invoice:
- Attachments / Name: the file name, such as INV-1042.pdf.
- Attachments / Resource Model: the text account.move, the technical name invoices and bills share. Leave it empty and the file is still created, but it is not linked to the invoice and does not appear on it.
- Attachments / File Content (base64): the whole file encoded as base64 text, which is a way of writing a binary file as plain characters.
With all three filled, the file shows in the attachments area of the invoice's chatter, the message and history panel beside the record. The import tool's other ways of loading files, by web address or by uploading files named in the sheet, only apply to file fields stored on the record itself, such as a product image, so they do not help here. Encoding hundreds of PDFs into a spreadsheet is a job for a script, which is why attachments are usually a second pass after the invoices exist, keyed on the external IDs given in step 4.
What to leave as opening balances
- Paid invoices and bills. They no longer affect anyone's balance, and importing them with their payments means rebuilding every reconciliation.
- Historical journal entries. The opening entry carries their net effect; the detail stays in a QuickBooks export kept for reference.
- Old bank transactions. Start each bank journal at its balance on the cutover date. If you connect bank synchronization, remove anything it pulls in from before that date.
Choosing a cutover at a fiscal year end or the end of a tax period keeps the split between the two systems clean.
Check that it worked
- Open Reporting > Trial Balance for the cutover date and compare every account with the QuickBooks trial balance.
- Open Reporting > Aged Receivable and Aged Payable. Totals should equal your open invoice and bill lists.
- Look up both clearing accounts. Each should show a zero balance. Then change their Account Type to Off-Balance Sheet so they drop out of the reports.
- Open one invoice that had a file attached and confirm the file appears in its chatter.
Version notes
The attachment columns above were tested on Odoo 19. In Odoo 20 the base64 file content field was removed from attachments, so that method was not checked there and may need a different column.
Steps verified on Odoo 19. Menus and labels can differ on other versions.
Common questions
Can Odoo import QuickBooks Online files directly?
No. Standard Odoo has no QuickBooks importer, so data moves through CSV or Excel files mapped with Odoo's Import records tool.
Do invoice attachments come across when importing into Odoo?
Only if the import file includes them. In Odoo 19 the invoice import accepts Attachments columns for the file name, the resource model account.move and the file content as base64 text, and without the resource model the file does not show on the invoice.
In what order should QuickBooks data be imported into Odoo?
Chart of accounts first, then the tax mapping and contacts, then open invoices and bills, then the opening balance journal entry. Each file can only refer to records that already exist.
Should paid QuickBooks invoices and payments be imported into Odoo?
Usually not. Importing a payment does not reconcile it with its invoice, so paid history is normally summarized in the opening balance entry and kept in a QuickBooks export for reference.
Talk to the team.
If you are setting this up, or Odoo is not behaving the way this guide describes, book a 30-minute call. We will look at your configuration and tell you what it needs. Calgary studio, in-house team, no offshore handoffs.
Book the call →