ERP migration
Field-level mapping, validation, and rollback between Odoo ERP and Microsoft Dynamics 365 Business Central. We move data and schema; workflows are rebuilt natively in Microsoft Dynamics 365 Business Central.
Odoo ERP
Source
Microsoft Dynamics 365 Business Central
Destination
Compatibility
13 of 15
objects map 1:1 between Odoo ERP and Microsoft Dynamics 365 Business Central.
Complexity
BStandard
Timeline
6-8 weeks
Try the reverse
Overview
Odoo ERP and Microsoft Dynamics 365 take fundamentally different approaches to accounting architecture, which shapes every migration from the source side. Odoo stores accounts, journals, and fiscal positions directly within each record and uses analytic tags for cost segmentation; Dynamics 365 separates the Chart of Accounts into dedicated tables referenced by Dimensions (financial dimension sets) applied at the posting layer. We do not copy Odoo's Automation rules or Odoo Studio customizations as code; we deliver a written inventory of every active automation, Studio-created field, and custom module for the customer's admin team to rebuild in Dynamics. The migration scope covers master data, transactional history, and manufacturing structures, with a dedicated reconciliation phase for posted invoices and stock quants because these are non-editable on the destination platform once committed.
Every standard and custom field arrives verified.
AI proposes the map; you confirm before any record moves.
Parent–child, lookups, and ownership stay linked.
Calls, emails, meetings — with original timestamps.
Documents, uploads, and inline notes move with the record.
Source platform
Odoo ERP platform overview
Scorecard, SWOT, gotchas, and pricing for Odoo ERP.
Destination platform
Microsoft Dynamics 365 Business Central platform overview
Scorecard, SWOT, gotchas, and pricing for Microsoft Dynamics 365 Business Central.
Data migration guide
The complete Dynamics 365 Business Central migration guide
Data model, import mechanisms, field mapping strategy, pitfalls, and cutover — by the engineers running it.
Source platform guide
Odoo ERP migration guide
Understand the data you're exporting from Odoo ERP before mapping it.
Destination checklist
Dynamics 365 Business Central migration checklist
Pre- and post-cutover tasks for moving onto Microsoft Dynamics 365 Business Central.
Source checklist
Odoo ERP migration checklist
Exit checklist for unwinding your Odoo ERP setup cleanly.
Why teams make this switch
Leaving
What's pushing teams away
Choosing
What's pulling them in
Object mapping
Each row shows how a Odoo ERP object lands in Microsoft Dynamics 365 Business Central, including any object-level transformations, lookup resolution, or schema-design dependencies.
Typical mapping — final map is confirmed during the sample migration step.
Odoo ERP
res.partner
Microsoft Dynamics 365 Business Central
Contact and Customer or Vendor
1:manyOdoo Partners (res.partner) serve as both contacts and companies in a single record with type flags (customer, vendor, employee). Dynamics 365 splits these into separate Contact and Customer/Vendor entities. We extract the partner name and addresses into Dynamics Contact records and the commercial relationship into Customer or Vendor records. Multi-address per partner (billing, delivery, other) maps to separate Contact addresses with distinct Address Type codes. Partner categories map to a Customer Group or Vendor Group lookup that we pre-configure before migration.
Odoo ERP
product.template and product.product
Microsoft Dynamics 365 Business Central
Item and Item Variant
1:1Odoo product.template with product.product variants maps to Dynamics Item with variant tracking via the Item Variant Code or Item Cross Reference entities. We preserve the product type (stockable, consumable, service) and map the list_price and standard_cost to Unit Price and Standard Cost on the Item. Vendor-specific pricing in Odoo product.supplierinfo maps to Vendor Catalog entries in Dynamics. Attribute combinations on the source product.template generate separate variant records that we map to Dynamics Item Variants with matching Variant Code values.
Odoo ERP
stock.quant
Microsoft Dynamics 365 Business Central
Item Ledger Entry and Warehouse Entry
1:1Odoo stock.quant tracks on-hand quantity per location (stock.location hierarchy). We map the source warehouse locations to Dynamics warehouse codes in the InventLocation table and create Item Ledger Entries reflecting the on-hand quantity at migration cutover. Lot and serial number traceability migrates to Item Tracking Code assignments and Item Tracking Legend entries, but customers must verify lot/serial counts manually post-import because Dynamics requires explicit Item Tracking Code configuration before any tracked inventory can be received.
Odoo ERP
sale.order
Microsoft Dynamics 365 Business Central
Sales Header
1:1Odoo Sales Orders map to Dynamics Sales Header records. The order state (draft, confirmed, done, cancel) maps to the Dynamics Document Status (Quote, Order, Released, Cancelled). Odoo order lines map to Sales Line records with product references resolved to Item numbers, quantities preserved, and unit prices transferred from the source order. If Odoo fiscal positions affect tax computation on the source order, we replicate the tax group assignment on the destination sales line to maintain tax correctness at migration.
Odoo ERP
account.move (out_invoice, out_refund)
Microsoft Dynamics 365 Business Central
Sales Invoice Header and Sales Cr. Memo Header
1:1Odoo 17+ unified invoices into account.move with move_type distinctions. We map posted out_invoice records to Dynamics Sales Invoice Header, posted out_refund records to Sales Cr. Memo Header, and posted in_invoice records to Purchase Invoice Header. Posted invoices are non-editable in Dynamics 365; we do not attempt to re-import or adjust them after posting. We preserve the Odoo invoice number as the External Document Number and the Odoo invoice date as the Posting Date. Any posted Odoo invoice with a partial payment history must be reconciled by the customer's accountant post-migration against the payment journal entries.
Odoo ERP
account.account
Microsoft Dynamics 365 Business Central
G/L Account
1:1Odoo Chart of Accounts (account.account) maps to Dynamics G/L Account records. We transfer the account code, account name, and account type (asset, liability, equity, revenue, expense). However, Dynamics requires that G/L Accounts be assigned an Account Category (Income, Expense, Asset, Liability, etc.) that drives the financial statement grouping, which Odoo does not have. We flag accounts without a clear category assignment during scoping and defer those rows until the customer configures Account Categories in Dynamics.
Odoo ERP
stock.location
Microsoft Dynamics 365 Business Central
Location and Warehouse
1:1Odoo stock.location records (with location_type: internal, partner, inventory, production) map to Dynamics Locations via the InventLocation and Ward table. We map the Odoo location_complete_name path to the Dynamics Location Name and assign a Location Type. Warehouse-level locations map to Dynamics Warehouse entries used in pick, put-away, and shipping workflows. Sub-location hierarchies in Odoo flatten into separate Location codes in Dynamics because Dynamics does not support recursive location nesting.
Odoo ERP
project.project
Microsoft Dynamics 365 Business Central
Job
1:1Odoo Projects map to Dynamics 365 Finance and Operations Projects (ProjTable / ProjJournalTable) or Business Central Jobs (Job table) depending on the destination product. We transfer the project name, project state (Open, Closed), responsible user mapping from Odoo owner to the Dynamics Worker or Resource, and the project type (Billable, Non-Billable, Internal). Project budgets from Odoo migrate as budget register entries on the destination project if the customer requires budget tracking, though this requires a separate configuration step.
Odoo ERP
project.task
Microsoft Dynamics 365 Business Central
Job Task Line
1:1Odoo Tasks map to Job Task Lines within a Job in Business Central or Project Lines in Finance and Operations. We preserve the task name, stage assignment (mapped to a Task Number sequence), responsible Worker from Odoo user assignment, deadline (Due Date), and the parent_id hierarchy as Task Line dependencies. Custom stage names from Odoo Studio become Job Task Line categories pre-configured in Dynamics. Sub-task nesting under a parent task maps to a line number dependency structure in Dynamics.
Odoo ERP
mrp.production
Microsoft Dynamics 365 Business Central
Production Order
1:1Odoo Manufacturing Orders (mrp.production) map to Dynamics Production Orders (ProdTable). We transfer the production state (draft, confirmed, in_production, done, cancel), the Bill of Materials reference (resolved from Odoo mrp.bom), the product to manufacture, and the bill of material quantity. Workorder sequences from Odoo map to Production Order Operation Lines with work center assignments. Note that workorder-specific trackings (time tracking, byproduct lines) require re-configuration in Dynamics Operations because Operations routes use a separate capacity planning model that Odoo does not expose via the standard API.
Odoo ERP
mrp.bom
Microsoft Dynamics 365 Business Central
Production Bill of Materials
1:1Odoo Bills of Materials (mrp.bom) map to Dynamics Production BOM records (BOMTable / BOMVersion). We preserve the BoM type (kit, manufactured, phantom), component lines with quantities and unit of measure, and the routing reference if the BoM has an associated mrp.routing. Phantom BoMs in Odoo resolve to sub-assembly Items in Dynamics with the phantom explosion handled via the Production BOM structure rather than a separate flag.
Odoo ERP
res.currency
Microsoft Dynamics 365 Business Central
Currency
lossyOdoo Currency records (res.currency) with active rates map to Dynamics Currencies and Exchange Rate tables. We transfer the currency name, symbol, decimal places, and the current exchange rate as a Currency Exchange Rate entry. Multi-currency configurations in Odoo (where invoices are posted in a foreign currency against a base currency) require explicit configuration of the Dynamics Currency and General Ledger Setup before any posted transactions can be imported, because Dynamics enforces currency rounding at posting.
Odoo ERP
account.tax
Microsoft Dynamics 365 Business Central
Tax Group and Tax Posting Setup
1:1Odoo Taxes (account.tax) map to Dynamics Tax Groups and Tax Codes. We transfer the tax name, rate (percentage or fixed), scope (sale, purchase), and tax type (account.tax.type: group, percent, fixed). Tax group assignments from Odoo fiscal positions map to Tax Group membership on the destination. However, Dynamics tax calculation uses a posting setup matrix (Tax % Posting Setup) that must be explicitly configured for each Tax Group and Business Posting Group combination, which Odoo does not model the same way.
Odoo ERP
hr.employee
Microsoft Dynamics 365 Business Central
Worker
1:1Odoo Employees (hr.employee) map to Dynamics Human Resources Workers (HcmWorker or Worker in Business Central). We transfer the employee name, work email, department (mapped to a Department lookup in Dynamics HR), job title, and employment status. Employee categories from Odoo map to the Dynamics HR Job function or position. Note that Odoo HR-specific fields (emergency contacts, bank account for payroll, attendance) are Odoo-specific and have no direct Dynamics equivalent without additional HR module configuration.
Odoo ERP
ir.model.data (External IDs)
Microsoft Dynamics 365 Business Central
Number Sequence and ID mapping
1:1Odoo uses External IDs (ir.model.data) as the import-reference standard for cross-record lookups during CSV import. Dynamics does not have an External ID field on all entities. We maintain a FlitStack AI migration key mapping table that resolves Odoo External IDs to Dynamics primary keys at migration time, particularly for parent lookups like Partner on Sales Order, Account on Contact, and Item on Sales Line. This mapping table is preserved through all import phases and used for reconciliation.
| Odoo ERP | Microsoft Dynamics 365 Business Central | Compatibility | |
|---|---|---|---|
| res.partner | Contact and Customer or Vendor1:many | Fully supported | |
| product.template and product.product | Item and Item Variant1:1 | Fully supported | |
| stock.quant | Item Ledger Entry and Warehouse Entry1:1 | Fully supported | |
| sale.order | Sales Header1:1 | Fully supported | |
| account.move (out_invoice, out_refund) | Sales Invoice Header and Sales Cr. Memo Header1:1 | Fully supported | |
| account.account | G/L Account1:1 | Fully supported | |
| stock.location | Location and Warehouse1:1 | Fully supported | |
| project.project | Job1:1 | Fully supported | |
| project.task | Job Task Line1:1 | Fully supported | |
| mrp.production | Production Order1:1 | Fully supported | |
| mrp.bom | Production Bill of Materials1:1 | Fully supported | |
| res.currency | Currencylossy | Fully supported | |
| account.tax | Tax Group and Tax Posting Setup1:1 | Fully supported | |
| hr.employee | Worker1:1 | Fully supported | |
| ir.model.data (External IDs) | Number Sequence and ID mapping1:1 | Fully supported |
Gotchas + challenges
Platform-specific issues from each side, plus the pair-specific challenges that don't show up on either platform's page on its own.
Odoo ERP gotchas
No rollback for CSV imports
External ID conflicts on re-import
Many2many field encoding in CSV imports
Large export timeouts require batching
Version schema drift between Odoo releases
Microsoft Dynamics 365 Business Central gotchas
Named-user licensing has no concurrent-use relief
API rate limits throttle large-volume migrations
Historical posted transactions require selective migration scoping
NAV-to-Business Central cloud migration requires partner coordination
Custom fields and AL extensions require separate migration handling
Pair-specific challenges
Migration approach
Discovery and Odoo version audit
We audit the source Odoo instance across version (Community vs Enterprise, major version number, on-premise vs Odoo Online vs Odoo.sh), active modules, custom fields created via Odoo Studio, external ID usage patterns, and multi-company configuration. We identify which Odoo apps are in scope for migration (CRM, Sales, Accounting, Inventory, Manufacturing, Project) and document the relationship between Odoo modules and their corresponding Dynamics 365 modules. The discovery output is a written scope document, an Odoo-to-Dynamics object mapping draft, and a Dynamics 365 edition recommendation (Business Central Essentials, Premium, or Finance and Operations).
Schema pre-configuration in Dynamics
We pre-configure the Dynamics 365 environment before any data import. This includes provisioning the Chart of Accounts with Account Categories and Posting Setup, setting up Dimensions and Dimension combinations, configuring Tax Groups and Tax Posting Setup, defining Number Sequences for Customer, Vendor, Item, and Sales Invoice, creating Location and Warehouse codes, and establishing the Job and Worker structures for HR data. Any custom fields required to capture Odoo Studio fields are added to the Dynamics metadata before import begins. Schema configuration is deployed to a Dynamics Sandbox first for validation.
Sandbox migration and reconciliation
We run a full migration into a Dynamics 365 Sandbox environment using production-equivalent data volumes. The customer's finance lead and operations lead reconcile record counts and spot-check 25-50 records against the Odoo source across each object (Partners, Products, Inventory, Orders, Invoices, Projects, Tasks, Production Orders). Any field mapping corrections, dimension assignment errors, or account category gaps identified during sandbox reconciliation are resolved before production migration begins. The customer signs off on the sandbox reconciliation report as the gate for production migration.
Partner and product extraction in dependency order
We extract Odoo data in record-dependency order. Partners (res.partner) are extracted first because they are referenced by Sales Orders, Invoices, Purchase Orders, and Manufacturing Orders. We resolve partner categories against the Dynamics Customer Group and Vendor Group lookups, and we split partner addresses into separate Contact address lines with distinct Address Type codes. Products (product.template and product.product) follow, with variant tracking configured in Dynamics before product variants are imported. The Odoo External ID mapping table is maintained throughout this phase and cross-referenced against Dynamics primary keys.
Transactional data migration and Bulk API import
Sales Orders, Purchase Orders, and Manufacturing Orders are imported using the Dynamics 365 Data Management Framework with entity-specific import jobs. We chunk large datasets (over 10,000 records) into batches of 1,000 rows and run import jobs sequentially to avoid rate-limit responses from the Dynamics API. For Finance and Operations migrations, we use the OData batch endpoint with recursive import patterns. Odoo analytic tag lines are transformed into Dynamics Default Dimension assignments using the Dimension Default combination table. Production Orders and BoM structures are imported last because they reference Items and Locations that must already exist.
Cutover, validation, and automation inventory delivery
We freeze Odoo write access during the cutover window, run a final delta migration of any records modified during the migration window, and enable Dynamics 365 as the system of record. We deliver a written inventory of every Odoo Automation Rule, Studio-created custom field, Odoo Studio view layout, and scheduled action that requires rebuild in Dynamics 365. The inventory includes the Odoo automation name, trigger conditions, actions, and a recommended Dynamics equivalent (Power Automate flow, Power Platform custom field, or configuration change). We do not rebuild automations inside the migration scope; that work is handled by the customer's Dynamics admin or a certified partner.
Platform deep dives
Odoo ERP
Source
Strengths
Weaknesses
Microsoft Dynamics 365 Business Central
Destination
Strengths
Weaknesses
Complexity grading
Standard ERP migration. 1 of 8 objects need a mapping; the rest are 1:1.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Odoo ERP and Microsoft Dynamics 365 Business Central.
Object compatibility
1 of 8 objects need a mapping; the rest are 1:1.
Field mapping clarity
Field mapping is derived from defaults — final spec confirmed during the sample migration.
Timeline complexity
8-object category — typical timelines run 2–7 days end-to-end.
API constraints
Odoo ERP: Not publicly documented by Odoo.
Data volume sensitivity
Odoo ERP doesn't expose a bulk API — REST + parallelization used for high-volume runs.
Estimator
Rule-based pricing — no per-record fees, no manual quotes. Migrations over 2M records are scoped individually.
Step 1
Pick a category, then your source and destination platforms.
Category
FAQ
Answers to the questions buyers ask most during Odoo ERP to Microsoft Dynamics 365 Business Central migration scoping. Not seeing yours? Book a call.
Walk through your Odoo ERP to Microsoft Dynamics 365 Business Central migration with a real engineer — 30 minutes, free, written quote within 24 hours.
Book a free 30 minute consultationAdjacent paths
Other ways to leave Odoo ERP
Other ways to arrive at Microsoft Dynamics 365 Business Central
Ready when you are
Tell us record counts and timeline. We'll come back with a written quote inside 1 business day — no commitment, no sales pitch.