ERP migration
Field-level mapping, validation, and rollback between Odoo Enterprise and Acumatica. We move data and schema; workflows are rebuilt natively in Acumatica.
Odoo Enterprise
Source
Acumatica
Destination
Compatibility
16 of 16
objects map 1:1 between Odoo Enterprise and Acumatica.
Complexity
BStandard
Timeline
2–4 weeks
Overview
Odoo Enterprise and Acumatica take fundamentally different approaches to multi-company operations, pricing, and customizability. Odoo uses a per-user subscription model with a PostgreSQL database where custom fields live in the same ir.model.fields table as standard ones, meaning Python customizations often require framework-level changes that migrate poorly across versions. Acumatica uses a consumption-based pricing model tied to transaction volume and ships industry-specific workflows as configurable rather than code-based extensions, which survive upgrades cleanly. When Odoo companies reach $10M–$100M revenue with complex multi-entity operations, they frequently encounter Odoo's custom-module maintenance burden — third-party apps that stop working after Odoo SA releases a new version, custom Python code requiring a developer to touch every upgrade, and billing that scales with headcount rather than transaction throughput. We migrate all Odoo master data (partners, products, charts of accounts, tax codes, analytic accounts), transactional history (invoices, sale and purchase orders, shipments, manufacturing orders), and file attachments. We do not migrate custom Python modules, Odoo Studio workflows, or automation rules — those must be rebuilt in Acumatica's screen-based automation framework. The migration runs via Odoo's XML-RPC API and Acumatica's REST/Soap web services, with a 24–48 hour delta pickup window for in-flight records during cutover.
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.
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 Enterprise object lands in Acumatica, including any object-level transformations, lookup resolution, or schema-design dependencies.
Typical mapping — final map is confirmed during the sample migration step.
Odoo Enterprise
res.partner (customer type)
Acumatica
Customer
1:1Odoo res.partner records where customer=True map directly to Acumatica Customer. The partner's address fields (street, city, country, email, phone) map to Customer fields. Odoo customer-specific properties (property_payment_term_id, property_account_receivable_id) map to Acumatica CustomerClass terms and AR account settings. Customercontacts within the partner map to CustomerContact entities.
Odoo Enterprise
res.partner (vendor type)
Acumatica
Vendor
1:1Odoo res.partner records where supplier=True map to Acumatica Vendor. Vendor-specific properties like property_account_payable_id and property_supplier_payment_term_id translate to VendorClass settings in Acumatica, ensuring consistent payment terms and default accounts across all vendors. Odoo's supplierinfo (vendor price list) records attach as VendorInventoryItem entries in Acumatica's vendor catalog, preserving historical pricing agreements and lead times.
Odoo Enterprise
res.company
Acumatica
Company + Branch
1:1Odoo multi-company setup uses res.company records that map to Acumatica Company entities. Each Odoo company becomes a separate Acumatica Company with its own ledger. Odoo's inter-company rules translate to inter-company clearing accounts configured in Acumatica's Company finance settings. Shared partners across Odoo companies need Customer/Vendor duplication by branch.
Odoo Enterprise
product.product
Acumatica
Inventory Item (Stock Item + Non-Stock Item)
1:1Odoo product.product records map to Acumatica InventoryItem. Storable products map to StockItem with cogs account, income account, and asset account. Consumable and service products map to Non-Stock Item. Odoo's product.attribute and product.template variant structure maps to Acumatica's Attribute groups on the Stock Item. Unit of measure (uom_id) translates via the UOM code mapping table.
Odoo Enterprise
account.account
Acumatica
GL Account
1:1Odoo chart of accounts (account.account) maps directly to Acumatica GL Account. Account code, name, and account type (asset, liability, equity, revenue, expense) translate to GL Account properties. Odoo's account.account.tag records for tax reporting map to Acumatica tax agency assignments. Active/deprecated status on the Odoo account controls the Active flag on the GL Account.
Odoo Enterprise
account.analytic.account
Acumatica
Subaccount / Financial Dimension
1:1Odoo analytic accounts are a separate model for cost tracking. In Acumatica, this concept maps to subaccount codes (set up in the Subaccount screen) or to Financial Dimensions configured per company. Odoo's analytic distribution lines on account.move records translate to Acumatica's line-level subaccount or dimension assignments. We preserve the original analytic account name as the subaccount description.
Odoo Enterprise
account.move (Customer Invoice / AR)
Acumatica
AR Invoice
1:1Odoo account.move records with type='out_invoice' map to Acumatica ARInvoice. The invoice lines map to ARTran records with inventory reference where applicable. Odoo's reconciliation (account.move.line reconciliation_id) translates to Acumatica's payment application on the AR Invoice screen. Original invoice date, due date, and tax amounts are preserved. Payment terms from Odoo map to Acumatica Cash Discount terms on the document.
Odoo Enterprise
account.move (Vendor Bill / AP)
Acumatica
AP Bill
1:1Odoo account.move with type='in_invoice' maps to Acumatica AP Bill (APInvoice). Vendor references (ref) map to the AP Bill's VendorRef field. Prepayments in Odoo (account.move with type='out_refund' or 'in_refund') map to Acumatica Prepayment applications. Tax amounts, withholding tax records in Odoo translate to Acumatica tax detail lines.
Odoo Enterprise
sale.order
Acumatica
Sales Order
1:1Odoo sale.order maps directly to Acumatica SOOrder. Order lines map to SOLine with the InventoryID, SiteID (warehouse), and quantity. Odoo's sale.order.line.tax_id maps to Acumatica tax category on the SOLine. The Odoo commitment method (pick, deliver, nothing) influences the Acumatica shipping settings on the order. sale.order.note lines attach as SOLine text lines.
Odoo Enterprise
purchase.order
Acumatica
Purchase Order
1:1Odoo purchase.order maps to Acumatica POOrder. POLine records carry InventoryID (or Non-Stock Item), VendorID, and line-level UOM and cost. Odoo's purchase.order.line.account_analytic_id maps to subaccount/dimension on the POLine. Receipts generated in Odoo (stock.picking type='incoming') correspond to Acumatica's PO Receipt screen linked to the PO.
Odoo Enterprise
stock.picking (outgoing)
Acumatica
Shipment (AR Shipment)
1:1Odoo stock.picking with picking_type_id for deliveries maps to Acumatica SOShipment. The stock.move lines map to SOShipmentLine with inventory ID, quantity shipped, and lot/serial numbers where tracked. Odoo's backorder handling (pickings with state='assigned' split across multiple moves) translates to Acumatica's shipment split functionality. Original scheduled date and actual date are both preserved.
Odoo Enterprise
stock.picking (incoming)
Acumatica
Receipt (IN Receipt)
1:1Odoo incoming shipments (receipts from vendors) map to Acumatica INReceiptEntry (Purchase Receipt). The stock.move lines map to INTran lines with Lot/Serial assignment. Odoo's landed cost records attached to pickings (stock.landed.cost) translate to Acumatica Landed Cost entries on the receipt. Warehouse (stock.location) maps to Acumatica SiteID.
Odoo Enterprise
mrp.bom
Acumatica
Bill of Materials (BOM)
1:1Odoo mrp.bom records map to Acumatica BOM records within Production Management. The BOM lines (mrp.bom.line) map to BOMLines with component InventoryID, quantity per, and billable flag. Odoo's bom_line.workscenters (routing operations) map to Acumatica Operation records attached to the BOM. Phantom BOMs in Odoo (type='phantom') translate to Acumatica's phantom BOM configuration.
Odoo Enterprise
mrp.production
Acumatica
Production Order
1:1Odoo manufacturing orders (mrp.production) map to Acumatica ProductionOrder. The production's bill of materials reference translates to the BOMID on the order. Components allocated (mrp.production.product_line) appear as material allocations (materialAllocations) on the Acumatica order. Odoo's workcenter time tracking (mrp.workorder) maps to labor and machine time entries in Acumatica's Production Order detail.
Odoo Enterprise
ir.attachment
Acumatica
Note / File Attachment
1:1Odoo ir.attachment records linked to any migrated object (sale.order, account.move, stock.picking) are re-uploaded to Acumatica's note and file attachment model. The original file name, MIME type, and binary content are preserved. Attachments are linked to the corresponding Acumatica entity (AR Invoice, SO Order, etc.) using the entity's NoteFiles endpoint.
Odoo Enterprise
custom fields via ir.model.fields
Acumatica
Custom fields (Usr* DAC fields)
1:1Odoo custom fields created via ir.model.fields (marked state='manual') migrate as Acumatica custom fields on the corresponding DAC. The Odoo field type (char, integer, float, boolean, selection, many2one) maps to the equivalent Acumatica data type. many2one relations require corresponding target entities to be migrated first; we flag circular dependencies before migration runs. Selection/boolean value labels are preserved in Acumatica's description attributes.
| Odoo Enterprise | Acumatica | Compatibility | |
|---|---|---|---|
| res.partner (customer type) | Customer1:1 | Fully supported | |
| res.partner (vendor type) | Vendor1:1 | Fully supported | |
| res.company | Company + Branch1:1 | Fully supported | |
| product.product | Inventory Item (Stock Item + Non-Stock Item)1:1 | Fully supported | |
| account.account | GL Account1:1 | Fully supported | |
| account.analytic.account | Subaccount / Financial Dimension1:1 | Fully supported | |
| account.move (Customer Invoice / AR) | AR Invoice1:1 | Fully supported | |
| account.move (Vendor Bill / AP) | AP Bill1:1 | Fully supported | |
| sale.order | Sales Order1:1 | Fully supported | |
| purchase.order | Purchase Order1:1 | Fully supported | |
| stock.picking (outgoing) | Shipment (AR Shipment)1:1 | Fully supported | |
| stock.picking (incoming) | Receipt (IN Receipt)1:1 | Fully supported | |
| mrp.bom | Bill of Materials (BOM)1:1 | Fully supported | |
| mrp.production | Production Order1:1 | Fully supported | |
| ir.attachment | Note / File Attachment1:1 | Fully supported | |
| custom fields via ir.model.fields | Custom fields (Usr* DAC fields)1: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 Enterprise gotchas
Enterprise-to-Community downgrade leaves orphaned module references
25% legacy surcharge for older Odoo versions
XML-RPC API lacks public rate limit documentation
Official upgrade service ignores custom and third-party modules
Fiscal localization modules tie accounting data to country
Acumatica gotchas
API user licenses cap concurrent sessions and request throughput
Multi-tenant filtering requires CompanyID awareness
Custom fields require separate discovery before field mapping
Notes and attachments use a separate linked table structure
Implementation timelines frequently run 3–9 months end-to-end
Pair-specific challenges
Migration approach
Audit Odoo schema and Acumatica configuration baseline
We connect to your Odoo instance via XML-RPC using a dedicated migration service account (read-only access). We export the full ir.model.fields manifest to identify every custom field, then cross-reference it against your active Odoo apps in use (Sales, Purchase, Inventory, Manufacturing, Accounting). Simultaneously, we document your Acumatica configuration baseline: Company/Branch structure, subaccount/dimension configuration, Tax Zone setup, and Site/Warehouse assignments. This audit produces the field mapping spec that drives the migration plan and surfaces gotchas before any data moves.
Build and validate custom field schema in Acumatica
Based on the Odoo custom field audit, we create the corresponding Acumatica custom fields on the target DACs using an Acumatica customization project. many2one custom fields in Odoo require the referenced entity to already exist in Acumatica — we sequence custom field creation after the base entity migration (Customer, Vendor, InventoryItem) is validated. The customization project is deployed to the target Acumatica tenant in a sandbox environment before the test migration runs.
Resolve multi-entity and owner mapping
For Odoo multi-company setups, we build the company-to-branch mapping table. Each Odoo res.company record gets assigned to a target Acumatica CompanyID. Partner records are duplicated per company where inter-company transactions exist. Odoo internal users (res.users) who appear as document owners or assigned-by users on sale orders and purchase orders are matched to Acumatica employees by email — unmatched owners are flagged before the migration run with a fallback assignment rule for your review.
Run sample migration with field-level diff
We run a sample migration against a representative slice of Odoo data — typically 200–500 records covering at least one of each major object type (Customer, Vendor, AR Invoice, Sales Order, Purchase Order, Shipment, and if applicable, a Production Order). The field-level diff compares source Odoo values against the migrated Acumatica records, showing every mapped field, transformed value, and dropped field. You review the diff to confirm that analytic account assignments, tax amounts, and date fields meet your expectations before we commit to the full migration.
Execute full migration with delta-pickup window
The full migration runs against your Acumatica production tenant. Master data (partners, products, chart of accounts, subaccounts) migrates first, followed by transactional history in reverse-chronological order. A 24–48 hour delta-pickup window opens at cutover — any records created or modified in Odoo during the final migration run are captured and applied to Acumatica. All operations are logged in the FlitStack audit log. If reconciliation fails, one-click rollback reverts the Acumatica tenant to its pre-migration state.
Platform deep dives
Odoo Enterprise
Source
Strengths
Weaknesses
Acumatica
Destination
Strengths
Weaknesses
Complexity grading
Standard ERP migration. 2 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 Enterprise and Acumatica.
Object compatibility
2 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 Enterprise: Not publicly documented; timeouts observed on Odoo.sh at high request volumes.
Data volume sensitivity
Odoo Enterprise 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 Enterprise to Acumatica migration scoping. Not seeing yours? Book a call.
Walk through your Odoo Enterprise to Acumatica 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 Enterprise
Other ways to arrive at Acumatica
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.