ERP migration
Field-level mapping, validation, and rollback between R4 ENTERPRISE and Odoo ERP. We move data and schema; workflows are rebuilt natively in Odoo ERP.
R4 ENTERPRISE
Source
Odoo ERP
Destination
Compatibility
12 of 12
objects map 1:1 between R4 ENTERPRISE and Odoo ERP.
Complexity
BStandard
Timeline
6-10 weeks
Overview
Moving from R4 ENTERPRISE to Odoo ERP is a migration from a hardware-bound, on-premise discrete manufacturing ERP to a modular, open-source cloud platform with a published REST API. R4 ENTERPRISE has no public API, so all data extraction requires vendor-provided CSV or XML exports coordinated through Royal 4 Systems professional services. We receive those exports in advance of the migration window, reformat them in our staging environment, and load them through Odoo's CSV import or XML-RPC API. The migration maps R4's Customer, Vendor, Item, Work Order, BOM, GL Account, AP/AR, Sales Order, Purchase Order, Fixed Asset, and Inventory objects to Odoo's standard res.partner, product.product, mrp.bom, stock.quant, account.move, and stock.picking models. We do not migrate R4 ENTERPRISE workflows, custom reports, or system configurations as code; we deliver a written inventory of these for the customer's Odoo admin to rebuild in Odoo's studio or via custom module development.
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 R4 ENTERPRISE object lands in Odoo ERP, including any object-level transformations, lookup resolution, or schema-design dependencies.
Typical mapping — final map is confirmed during the sample migration step.
R4 ENTERPRISE
Customer
Odoo ERP
res.partner (customer)
1:1R4 ENTERPRISE Customer records map to Odoo res.partner with partner_type=customer. We preserve credit_limit as credit_limit, payment_terms as property_payment_term_id, and currency preference as property_account_position_id. Multi-currency assignments migrate as read-only fields on the partner record. The customer address fields map to partner's street, street2, city, state_id, zip, and country_id using the standard Odoo contact-address structure.
R4 ENTERPRISE
Vendor
Odoo ERP
res.partner (supplier)
1:1R4 ENTERPRISE Vendor records map to Odoo res.partner with partner_type=supplier. We preserve 1099 flags and tax ID as vat, and W-9 status as trustedSupplier flag. Multi-currency settings migrate as property_purchase_currency_id on the supplier partner. Vendor IDs are retained as external_id references for reconciliation against R4 purchase order data.
R4 ENTERPRISE
Item
Odoo ERP
product.product
1:1R4 ENTERPRISE Item master records map to Odoo product.product with type set to product (stockable), consumable, or service based on item type flags. Unit of measure conversions map to Odoo's uom.uom structure with category matching. Cost layers from R4 are flattened to a single standard_cost on the Odoo product because Odoo uses average or standard costing rather than R4's layered cost model. We flag any lot/serial-controlled items so that the destination is configured for stockability at import time.
R4 ENTERPRISE
Work Order
Odoo ERP
mrp.workorder
1:1R4 ENTERPRISE Work Orders map to Odoo mrp.workorder records linked to mrp.production. We extract the routing steps (operations), labor standards, and material allocations, then map these to Odoo's workcenter and BoM operation structures. Any routing steps tied to deprecated BOM versions are flagged so the destination receives only the active production routing. Work order status (open/closed) migrates; closed work orders are imported as reference history unless the customer elects to start clean.
R4 ENTERPRISE
Bill of Material
Odoo ERP
mrp.bom
1:1R4 ENTERPRISE BOMs are versioned with effective-date-linked revisions. We extract the active BOM revision and map each component line to Odoo mrp.bom.line records with the product_qty and operation_id referencing the correct routing step. Superseded revisions are flagged in a separate inventory table so the customer can audit decommissioned BOMs without cluttering the production BoM table.
R4 ENTERPRISE
General Ledger Account
Odoo ERP
account.account
1:1R4 ENTERPRISE GL Account hierarchy maps to Odoo account.account with account_type mapped to Odoo's standard types (asset_current, asset_non_current, liability_current, liability_non_current, equity, revenue, expense). Cost-center assignments map to account.analytic.account for analytic accounting. Segment structures in R4 map to Odoo's analytic dimension framework if the customer uses multiple analytic plans.
R4 ENTERPRISE
Accounts Payable
Odoo ERP
account.move (vendor bill)
1:1R4 ENTERPRISE open AP vouchers (vendor, invoice number, due date, functional and transaction currency amounts) map to Odoo account.move with move_type=in_invoice. We preserve the original functional-currency amounts and the exchange rate used at invoice entry so Odoo can re-price or retain historical rates. Open invoices migrate as draft bills pending validation; the customer's AP team reconciles and posts in Odoo.
R4 ENTERPRISE
Accounts Receivable
Odoo ERP
account.move (customer invoice)
1:1R4 ENTERPRISE open AR invoices map to Odoo account.move with move_type=out_invoice. We preserve invoice aging buckets so the customer maintains accurate cash-flow reporting from day one. Customer reference, due date, and functional currency amounts migrate directly. Invoices are imported as draft so the AR team can validate before posting.
R4 ENTERPRISE
Fixed Assets
Odoo ERP
account.asset
1:1R4 ENTERPRISE Fixed Asset records (acquisition cost, depreciation method, useful life, location) map to Odoo account.asset with the depreciation board computed from the source depreciation method. Accumulated depreciation balance migrates as the opening book value on the asset record. Asset category mapping aligns R4's depreciation profile to Odoo's asset.category.
R4 ENTERPRISE
Sales Order
Odoo ERP
sale.order
1:1R4 ENTERPRISE open Sales Orders map to Odoo sale.order with customer, line items, quantities, pricing, and promised dates. We flag any order lines referencing discontinued items or inactive price lists so the customer can clean up before final import. Line items with product_id resolved to the Odoo product ID; unresolvable SKUs are held in a reconciliation sheet for admin review.
R4 ENTERPRISE
Purchase Order
Odoo ERP
purchase.order
1:1R4 ENTERPRISE open Purchase Orders map to Odoo purchase.order with vendor, line items, quantities, and expected receipt dates. PO lines referencing item numbers not present in the destination item master are flagged in the reconciliation report. Confirmed POs migrate as purchase order state; draft POs migrate as draft and require confirmation in Odoo.
R4 ENTERPRISE
Inventory Balances
Odoo ERP
stock.quant
1:1R4 ENTERPRISE on-hand quantities map to Odoo stock.quant per location and per lot/serial number. Lot numbers and bin locations are preserved so the inventory snapshot reflects physical reality at cutover. We extract lot numbers tied to expired items and flag them separately so Odoo does not create inventory records for discontinued SKUs.
| R4 ENTERPRISE | Odoo ERP | Compatibility | |
|---|---|---|---|
| Customer | res.partner (customer)1:1 | Fully supported | |
| Vendor | res.partner (supplier)1:1 | Fully supported | |
| Item | product.product1:1 | Fully supported | |
| Work Order | mrp.workorder1:1 | Fully supported | |
| Bill of Material | mrp.bom1:1 | Fully supported | |
| General Ledger Account | account.account1:1 | Fully supported | |
| Accounts Payable | account.move (vendor bill)1:1 | Mapping required | |
| Accounts Receivable | account.move (customer invoice)1:1 | Mapping required | |
| Fixed Assets | account.asset1:1 | Fully supported | |
| Sales Order | sale.order1:1 | Fully supported | |
| Purchase Order | purchase.order1:1 | Fully supported | |
| Inventory Balances | stock.quant1: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.
R4 ENTERPRISE gotchas
No public API for programmatic data extraction
Lot number and cost layer histories require careful sequencing
Multi-currency AP and AR balances need currency revaluation
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
Pair-specific challenges
Migration approach
Vendor coordination and export request
We engage Royal 4 Systems professional services to request data exports in CSV or XML format. We request all master records (Customers, Vendors, Items, GL Accounts, Fixed Assets), transaction headers and lines (open AP/AR, Sales Orders, Purchase Orders, Work Orders), and child tables (lot numbers, cost layers, BOM revisions, routing steps) in advance of the migration window. We validate export completeness against the R4 ENTERPRISE record counts provided during scoping before accepting the export as the migration source.
Data audit and cleanup
We run a full data audit on the received exports, identifying duplicates, orphaned records, inactive items, mismatched GL account assignments, and multi-currency inconsistencies. We deliver a cleanup report with a per-record action (merge, delete, activate, correct) for the customer's admin to execute in R4 ENTERPRISE before we re-export and begin mapping. This step consistently takes longer than expected; starting it early prevents go-live delays.
Schema design and Odoo configuration
We configure Odoo's manufacturing, inventory, purchasing, sales, and accounting modules to match the source data model. This includes setting up product categories and types, workcenter capacity, BoM structures, stock locations, chart of accounts, tax codes, and multi-currency settings. We pre-create custom fields to receive any R4 ENTERPRISE user-defined fields using a customer-approved mapping table built during scoping. The configuration is validated in an Odoo test database before production migration begins.
BOM and routing mapping
We map R4 ENTERPRISE BOM revisions to Odoo mrp.bom records, resolving the active revision per item and flagging superseded versions. We map routing steps to mrp.workcenter and mrp.bom.operation records, and flag any routing steps that reference deprecated BOMs. Work orders are mapped to mrp.production and mrp.workorder with operation sequences and labor standards preserved.
Cost-layer flattening and inventory snapshot
We flatten R4 ENTERPRISE layered cost histories into a single standard_cost per product and set this on the Odoo product.product record. Lot numbers and bin locations are mapped to stock.lot and stock.location records. The inventory on-hand snapshot is imported as stock.quant entries per location and per lot, matching the physical count at cutover.
Production migration in dependency order
We run production migration in record-dependency order: GL Accounts, product categories and products, workcenters, BoMs, Customers and Vendors, Fixed Assets, Open AR and AP (as draft moves), Sales Orders, Purchase Orders, Work Orders, and Inventory. Each phase emits a row-count reconciliation report before the next phase begins. Open AP and AR are imported as draft so the accounting team validates and posts after go-live.
Cutover, delta migration, and rebuild handoff
We freeze R4 ENTERPRISE writes during cutover, run a final delta migration of any records modified during the migration window, then enable Odoo as the system of record. We deliver a written inventory of R4 ENTERPRISE workflows, custom reports, and system configurations for the customer's Odoo admin to rebuild using Odoo Studio or custom module development. We support a one-week hypercare window where we resolve any reconciliation issues raised by the customer's team.
Platform deep dives
R4 ENTERPRISE
Source
Strengths
Weaknesses
Odoo ERP
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 R4 ENTERPRISE and Odoo ERP.
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
R4 ENTERPRISE: Not applicable..
Data volume sensitivity
R4 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 R4 ENTERPRISE to Odoo ERP migration scoping. Not seeing yours? Book a call.
Walk through your R4 ENTERPRISE to Odoo ERP migration with a real engineer — 30 minutes, free, written quote within 24 hours.
Book a free 30 minute consultationAdjacent paths
Other ways to leave R4 ENTERPRISE
Other ways to arrive at Odoo ERP
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.