Choose migration or ongoing sync
Decide whether QuickBooks stays the ledger or Odoo Accounting replaces it. A migration moves master data and open items once, ideally at a fiscal year end. An ongoing sync needs a clear owner for every record type.
Connect Odoo and QuickBooks Online so invoices, bills and payments reach the books once, without re-keying, or move from QuickBooks to Odoo Accounting with clean opening balances. AIONDATA maps your chart of accounts, taxes and contacts first, then builds, tests and monitors the sync.
California-based leadership · Serving US and international teams
Companies run Odoo and QuickBooks Online together when operations move to Odoo but the accountant keeps the books in QuickBooks, when Odoo Community (Invoicing, not full Accounting) runs sales and stock, or during a staged move to Odoo Accounting. An Odoo QuickBooks integration posts Odoo customers, vendors, invoices, credit notes and bills to QuickBooks and returns payment status to Odoo. If you are leaving QuickBooks, we migrate master data and open items once instead of syncing forever. We build on the QuickBooks Online Accounting API with OAuth 2.0, webhooks and change data capture, and on Odoo’s JSON-2 or XML-RPC API.
These decisions shape the scope, cost and acceptance tests. The flows below describe possible implementation behavior, not a preinstalled connector or a guarantee for every product edition.
Decide whether QuickBooks stays the ledger or Odoo Accounting replaces it. A migration moves master data and open items once, ideally at a fiscal year end. An ongoing sync needs a clear owner for every record type.
List QuickBooks accounts with their type and detail type beside Odoo accounts, taxes, journals and payment terms. For US companies, decide whether QuickBooks automated sales tax recalculates tax or receives Odoo’s tax amount as an override.
Confirm the QuickBooks Online plan (inventory, classes and locations start at Plus), home currency and multicurrency, transaction numbering, and whether Odoo analytic accounts should become QuickBooks classes or locations.
Pick test cases for each document type, a cut-off date, who approves the first posted batch and who receives alerts. Include a month-end comparison of receivables and payables in both systems.
Field mapping
The records, match keys and triggers most implementations start from. Your scope confirms each row against your editions, custom fields and business rules.
| Source | Target | Match key | Direction | Trigger | Notes |
|---|---|---|---|---|---|
| Odoo res.partner (customer) | QuickBooks Customer | QuickBooks customer ID stored on the partner; DisplayName unique across customers, vendors and employees | Odoo → QuickBooks | First posted invoice, then partner changes | Billing and shipping addresses, email and terms. Names cannot contain colons, tabs or line breaks. |
| Odoo res.partner (vendor) | QuickBooks Vendor | QuickBooks vendor ID stored on the partner | Odoo → QuickBooks | First posted bill, then partner changes | A partner that is also a customer gets a distinct vendor display name. |
| Odoo product.product | QuickBooks Item | Item Name (unique, up to 100 characters) or SKU; QuickBooks ID stored | Odoo → QuickBooks | On product change | Service or non-inventory item with income and expense accounts. Quantity tracking, once switched on in QuickBooks, cannot be switched off. |
| Odoo account.account | QuickBooks Account | Mapping table: Odoo account code and company to QuickBooks account ID | Odoo ↔ QuickBooks | Set up once; new accounts on either side flagged | Matched by purpose and type. From Odoo 18, one account can serve several companies with a code per company. |
| Odoo account.tax | QuickBooks TaxCode | Mapping table | Odoo ↔ QuickBooks | Set up once; reviewed when tax rates change | For US automated sales tax, the invoice carries Odoo’s total tax and a tax code, which QuickBooks honors. |
| Odoo account.move (out_invoice) | QuickBooks Invoice | DocNumber = Odoo invoice number (up to 21 characters) | Odoo → QuickBooks | When the invoice is posted | Lines, taxes, terms and due date. Unique requestid on create; query by DocNumber before any retry. |
| Odoo account.move (out_refund) | QuickBooks CreditMemo | DocNumber = Odoo credit note number | Odoo → QuickBooks | When the credit note is posted | Applied against the original invoice through a QuickBooks payment when the credit is used. |
| Odoo account.move (in_invoice, in_refund) | QuickBooks Bill or VendorCredit | Odoo bill number and vendor reference; QuickBooks ID stored | Odoo → QuickBooks | When the bill is posted | Expense or asset account per line from the mapping. |
| QuickBooks Payment | Odoo payment and invoice payment status | LinkedTxn invoice ID mapped to the Odoo invoice | QuickBooks → Odoo | Payment webhook, plus a daily change data capture catch-up | A payment applied to several invoices is split per linked invoice. Payments registered in Odoo can flow the other way instead. |
| Odoo journal entry with analytic account | QuickBooks JournalEntry with Class or Department | Odoo entry reference stored as DocNumber | Odoo → QuickBooks | Daily or at period close | Stock valuation, cost of goods sold and accruals. Classes and locations need Plus or Advanced. |
Download this mapping as a CSV worksheet · no email required
Options, cost and timeline
A prebuilt connector is sometimes enough. This comparison shows when each route fits, what it typically costs and how long it takes.
| Approach | Typical cost | Typical time | Fits when | Watch for |
|---|---|---|---|---|
| Odoo Apps Store connector | One-time license per Odoo major version. Many QuickBooks Online connectors for Odoo 19 list at a few hundred US dollars (Odoo Apps Store list prices, checked Sep 2026). Add setup time. | Days to a few weeks to configure and test | Odoo.sh or on-premise, one company, standard invoices, bills and payments. | Cannot be installed on Odoo Online. Check automated sales tax handling, duplicate protection and which side owns payments. |
| iPaaS workflow | Platform subscription plus build time. Check the vendor’s current plan page. | A few weeks | Low volumes, few document types, and a team that already runs the platform. | Account, tax and duplicate rules still need design and testing. Odoo Online still needs the Custom plan for API access. |
| Custom sync service | Quoted after a short discovery of document types, companies and volumes. | Usually a few weeks for a standard scope including testing; typically two to three months for multi-company or multicurrency | Odoo Online, several companies, US automated sales tax, strict duplicate control or month-end reconciliation reports. | The QuickBooks company authorizes the app over OAuth and must reconnect it if the refresh token expires. Name who reviews held records. |
| One-time migration to Odoo Accounting | Quoted separately; no ongoing sync or connector license. | Planned around a fiscal-year or tax-period cut-off | Companies retiring QuickBooks for Odoo Enterprise Accounting. | Bring opening balances and open items through clearing accounts, and keep access to QuickBooks history for audits. |
Vendor prices are list prices from their public pages on the date shown; confirm current pricing with each vendor.
Map accounts by purpose, not by name. QuickBooks classifies each account by type and detail type; Odoo uses types such as Receivable, Current Assets, Income and Cost of Revenue. Receivable, payable and bank accounts need one-to-one matches, while income and expense accounts can map many-to-one.
Odoo 18 changed accounts: one account can serve several companies, with a code per company. Mappings for multi-company databases therefore key on both account and company.
Technical details last reviewed September 26, 2026. Product capabilities and prices change; confirm them for your edition.
Sources: Intuit: API call limits and throttles · Intuit: Set up OAuth 2.0 · Intuit: Configure webhooks · Intuit: Webhooks best practices · Intuit: Webhook payload data object · Intuit: Change data capture · Intuit: Minor versions · Intuit: IDs and field definitions (requestid, DocNumber) · Intuit: Automated sales tax for US locales · Intuit: Manage multiple currencies · Intuit: Customer entity · Intuit: Item entity · Intuit: Invoice entity (SyncToken) · Intuit: Payment entity · Intuit App Partner Program FAQ · QuickBooks Online pricing and plans · Claude connectors: Intuit QuickBooks · Odoo documentation: Accounting, get started (opening entries) · Odoo documentation: Export and import data (External ID) · Odoo Community vs Enterprise comparison · Odoo pricing and plan FAQ · Odoo 20 documentation: External JSON-2 API · Odoo Apps Store FAQ · Odoo Apps Store: QuickBooks listings for Odoo 19 · Odoo source: account.account, shared across companies (18.0) · Odoo 20 documentation: AI MCP server
Outcomes
Keep both when your accountant or reporting depends on QuickBooks, or when you run Odoo Community, which has Invoicing but not full Accounting. Migrate when you want one system, because an ongoing sync needs upkeep. Odoo calls a fiscal year end the easiest switch point and advises against switching mid tax period, because splitting a tax period across two systems complicates filing.
We load the chart of accounts first, renaming and recoding Odoo’s standard accounts rather than deleting them. Customers, vendors and products follow, with their QuickBooks IDs as External IDs so reloads update instead of duplicating. Then open invoices and bills, and the opening trial balance through clearing accounts. Without clearing accounts, receivables would count twice: once in the balance and once in the open invoices.
The QuickBooks Online Accounting API, a REST API authorized with OAuth 2.0. Access tokens last 60 minutes. Refresh tokens have a rolling 100-day expiry and a hard five-year lifespan, after which the company must reconnect. We always store the latest refresh token securely and alert you well before a reconnect is due.
Intuit allows 500 requests per minute per company and 10 per second per company and app, and throttles batch requests at 40 per minute. A throttled call returns HTTP 429, and Intuit asks apps to wait 60 seconds before retrying. A query returns at most 1,000 records. We queue writes per company, batch where it helps and back off on 429.
It can. Every QuickBooks app starts in the free Builder tier, which allows 500,000 CorePlus calls a month and blocks calls beyond that. Core calls, mostly creating and updating records, are not metered; CorePlus calls, mostly reads, queries and reports, are. Intuit’s own example prices the Silver tier at $300 a month with 1,000,000 CorePlus calls included (checked Sep 2026). We design reads around webhooks and change data capture to keep CorePlus use low.
US QuickBooks companies created after November 10, 2017 use automated sales tax, which calculates tax from addresses. If the integration sends a total tax amount with a tax code, QuickBooks honors it and prorates it across the code’s rates. We send Odoo’s tax amount so both systems show the same invoice total, and map each Odoo tax to a QuickBooks tax code. Non-US companies use a different QuickBooks tax model, mapped during design.
Three ways. The Odoo invoice number becomes the QuickBooks DocNumber, up to 21 characters, and we query for it before retrying a failed create, as Intuit recommends. Every write carries a unique requestid, so QuickBooks returns the original response instead of creating a second record. Updates send the latest SyncToken, so a stale update fails rather than overwriting newer data.
Yes, within your plan. Classes and locations need Plus, which allows 40, or Advanced, which is unlimited; we map them from Odoo analytic accounts or companies. Multicurrency is not available on Simple Start, is switched on only in the QuickBooks interface and cannot be turned off. Each customer or vendor holds one currency, so an Odoo contact invoiced in two currencies needs two QuickBooks records.
Yes. Intuit publishes a QuickBooks connector for Claude, and Odoo 20 includes its own MCP server. Each works inside one system. For questions that span both, such as which Odoo orders are invoiced in QuickBooks but still unpaid, AIONDATA can build a custom MCP server that uses the sync’s mappings, read-only first, with any write action approved by a person.
A standard sync of customers, vendors, products, invoices, bills and payments usually takes a few weeks including testing against a QuickBooks sandbox company and an Odoo test database. Multi-company setups, several QuickBooks companies, multicurrency or heavy customization typically take two to three months. A one-time migration is scoped separately around your cut-over date.
Other pairs involving Odoo or QuickBooks.
Share your objects, volumes, and timing needs — we'll come back with a written scope.
Please share the systems and workflow—not credentials or customer records. We’ll confirm API access, scope and next steps.
Part of NVIDIA’s program for startups building with AI and accelerated computing.
About the programPravin’s experience includes Google and SmartBear. Sravan previously held leadership roles at JPMorgan Chase and First Republic Bank.
Meet the founders9110 Alcosta Blvd Ste H345, San Ramon, CA 94583
US-led delivery, with engineering in India. Supporting US and international organizations.