ERP migration
Field-level mapping, validation, and rollback between inoERP and Odoo ERP. We move data and schema; workflows are rebuilt natively in Odoo ERP.
inoERP
Source
Odoo ERP
Destination
Compatibility
11 of 12
objects map 1:1 between inoERP and Odoo ERP.
Complexity
BStandard
Timeline
4-6 weeks
Overview
Moving from inoERP to Odoo ERP is a platform migration that touches Finance, SCM, Manufacturing, and HR modules simultaneously. inoERP stores its core transactional data in MySQL or MariaDB with a REST API surface through OneApp, while Odoo uses PostgreSQL with XML-RPC and JSON-RPC APIs. The most technically complex areas are multi-level Bills of Material that require recursive resolution during import, work order WIP ledger roll-forward that must be reconciled against Odoo's manufacturing journal, and MRP-generated supply requisitions that reflect inoERP's dynamic pull-based planning rather than valid Odoo MRP records. We extract from the correct inoERP database schema (PHP or Go/Flutter version confirmed during scoping), transform party and account structures to Odoo's partner model, and load through Odoo's batch import API with adaptive throttling. Workflows, automations, custom JavaScript extensions, and document attachments do not migrate; we deliver a written inventory of every automation and attachment reference for the customer's Odoo partner to rebuild post-migration.
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 inoERP 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.
inoERP
Chart of Accounts
Odoo ERP
Account (account.account)
1:1inoERP GL accounts with types (asset, liability, equity, revenue, expense), codes, and currency assignments map directly to Odoo account.account records. We extract account_type, code, name, and currency_id from inoERP and map inoERP account types to Odoo's account type enumeration. Multi-currency accounts from inoERP carry the currency_id into Odoo's allow_reconciliation and currency_revaluation fields.
inoERP
Journal Entries
Odoo ERP
Account Move
1:1Posted journal entries from inoERP's GL module map to Odoo account.move and account.move.line records. We extract debit/credit amounts, account assignments, and reference numbers. Entries with non-standard currency references or inter-company journal IDs are flagged for manual review before import. The move_name (journal entry number) is preserved as Odoo's ref field for audit continuity.
inoERP
Accounts Receivable / Accounts Payable
Odoo ERP
res.partner + account.move (AR/AP subset)
1:1inoERP's party structures (customer, supplier, employee) map to Odoo res.partner with the appropriate customer_rank and supplier_rank values set. Open AR/AP subledger transactions (invoice headers, line items, payment terms) become Odoo account.move records with move_type of out_invoice, out_refund, in_invoice, or in_refund. Party-level aging reports from inoERP translate to Odoo's Account Moves with open reconciliation.
inoERP
Items / Inventory
Odoo ERP
product.product + stock.quant
1:1inoERP item definitions with UOM, cost layers, category hierarchies, and on-hand quantities map to Odoo product.product (for stockable/ consumable/service variants) and stock.quant for location-level on-hand balances. Lot/serial numbers from inoERP migrate as stock.lot records. UOM conversion rules from inoERP map to Odoo's uom.uom model with conversion_factor set. Phantom BOM items are flagged so they are imported as product templates without production routing.
inoERP
Sales Orders / Purchase Orders
Odoo ERP
sale.order / purchase.order
1:1Open orders from inoERP (SO and PO) with header fields (dates, terms, party references) and line items (item, quantity, price, warehouse) map to Odoo sale.order and purchase.order. Order status from inoERP determines whether the record lands as draft, confirmed, or done. Closed orders can be imported as confirmed sale.order or purchase.order records for historical reference, or omitted based on customer scope preference. inoERP warehouse assignments map to Odoo stock.warehouse picking_policy settings.
inoERP
Work Orders / WIP
Odoo ERP
mrp.production + stock.move
1:1Work orders from inoERP including routing steps, material issues, resource transactions, and completion records map to Odoo mrp.production (manufacturing orders) and related stock.moves for component consumption and finished goods receipt. WIP ledger aggregated costs from inoERP map to Odoo's manufacturing journal entries so that work order cost accumulation is visible post-migration. Open work orders migrate as confirmed mrp.production records; completed orders migrate as done records with full cost history.
inoERP
Bills of Material / Routings
Odoo ERP
mrp.bom + mrp.routing.workcenter
1:1inoERP super BOMs and multi-level structures map to Odoo mrp.bom with type set to normal or kit depending on the inoERP BOM variant. Each BOM line references a product.product for the component and a mrp.routing.workcenter record for the operation step. We perform recursive BOM resolution during extraction so that Odoo's explode algorithm produces the same total component demand as inoERP. Phantom BOMs from inoERP map to Odoo kit-type BOMs.
inoERP
MRP-generated supply requisitions
Odoo ERP
mrp.production (re-run flagged)
lossyMRP-generated supply requisitions from inoERP are flagged during extraction and not imported as live Odoo MRP records. inoERP's dynamic pull-based MRP recalculates lot sizes at runtime based on current demand signals, so historical MRP output reflects past demand patterns that may not be valid in Odoo's MRP run. We export the MRP requisition records as a reference CSV and recommend customers re-run MRP in Odoo post-migration rather than importing the historical plan output.
inoERP
Employees / HR
Odoo ERP
hr.employee
1:1inoERP employee profiles, job definitions, positions, and position assignments map to Odoo hr.employee and hr.job. Compensation records (salary, benefits) from inoERP migrate as hr.contract records attached to the employee. Leave balances from inoERP transfer to Odoo's hr.leave model with allocation records. We flag compensation data for manual review because Odoo's payroll module is country-specific and may require additional configuration beyond the standard import.
inoERP
Users / Roles
Odoo ERP
res.users + res.groups
1:1inoERP user accounts and role-based access control map to Odoo res.users and the associated groups (access rights sets). We translate inoERP role names and permission sets to Odoo group assignments. Users without an email address in inoERP are flagged for the customer's Odoo admin to assign login credentials before production migration.
inoERP
Asset Register
Odoo ERP
account.asset.asset
1:1Asset records from inoERP including acquisition details, depreciation schedules, asset categories, book values, and accumulated depreciation map to Odoo account.asset.asset. The depreciation method from inoERP (straight-line, declining balance) maps to Odoo's depreciation method field. Depreciation move lines generate as account.move records in Odoo's asset depreciation journal.
inoERP
Documents / Attachments
Odoo ERP
(not migrated)
1:1inoERP document storage in its CMS module stores attachment links as paths to locally hosted files. Binary attachments do not migrate. We extract the list of attachment references and their file paths as a written inventory for the customer's IT team to migrate via file transfer separately.
| inoERP | Odoo ERP | Compatibility | |
|---|---|---|---|
| Chart of Accounts | Account (account.account)1:1 | Fully supported | |
| Journal Entries | Account Move1:1 | Mapping required | |
| Accounts Receivable / Accounts Payable | res.partner + account.move (AR/AP subset)1:1 | Mapping required | |
| Items / Inventory | product.product + stock.quant1:1 | Fully supported | |
| Sales Orders / Purchase Orders | sale.order / purchase.order1:1 | Mapping required | |
| Work Orders / WIP | mrp.production + stock.move1:1 | Mapping required | |
| Bills of Material / Routings | mrp.bom + mrp.routing.workcenter1:1 | Fully supported | |
| MRP-generated supply requisitions | mrp.production (re-run flagged)lossy | Fully supported | |
| Employees / HR | hr.employee1:1 | Mapping required | |
| Users / Roles | res.users + res.groups1:1 | Mapping required | |
| Asset Register | account.asset.asset1:1 | Fully supported | |
| Documents / Attachments | (not migrated)1:1 | Not 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.
inoERP gotchas
Architecture version split between PHP and Go/Flutter
OneApp API has no publicly documented rate limits
Closed-order and historical transaction volume drives migration scope
Dynamic pull system recalculates lot sizes at runtime
Self-hosting creates data export dependency on the customer
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
Discovery and version confirmation
We audit the source inoERP system: confirm PHP or Go/Flutter version via schema inspection, enumerate installed modules (Finance, SCM, Manufacturing, HR), and count record volumes for accounts, journal entries, AR/AP lines, inventory items, open orders, work orders, BOM structures, and employees. We also identify attachment file paths and any custom JavaScript REST API extensions. The discovery output is a written migration scope with record counts, a data quality assessment, and a recommendation on whether historical closed orders and MRP records are in scope.
Schema design for Odoo destination
We design the Odoo destination schema based on the customer's chosen Odoo edition (Community or Enterprise) and active apps. This includes configuring account.account types to match the inoERP chart of accounts, setting up res.partner with appropriate customer_rank and supplier_rank values, provisioning product categories and product templates, configuring mrp.workcenter resources and mrp.routing, and mapping inoERP HR structures to hr.employee and hr.job. Schema is validated in a sandbox environment before production migration begins.
Data extraction and transformation
We extract data from inoERP's MySQL/MariaDB database using the version-confirmed schema. Transformation steps include splitting inoERP's unified party structure into customer and supplier partner records, resolving multi-level BOMs recursively, converting inoERP UOM codes to Odoo uom.uom with conversion factors, translating inoERP work order status to Odoo mrp.production state values, and flagging MRP-generated requisitions as reference CSV rather than live Odoo MRP records. All transformations run against a staging copy of the database.
Sandbox migration and reconciliation
We run a full migration into an Odoo sandbox environment using production-like data volume. The customer's operations lead reconciles record counts (accounts, partners, products, BOMs, work orders, employees) against inoERP source reports and spot-checks 25-50 random records for field-level accuracy. WIP ledger totals from inoERP are reconciled against Odoo's manufacturing journal entries. Any mapping corrections are documented and re-run in sandbox before production migration begins.
Production migration in dependency order
We run production migration in record-dependency order: accounts (chart of accounts), res.partner (customers and suppliers), product.category and product.product (with BOM), mrp.routing and mrp.workcenter (manufacturing resources), mrp.bom (with recursive component resolution), sale.order and purchase.order (open orders), mrp.production (open work orders with WIP cost), hr.employee and hr.contract (employees with compensation), and account.asset (asset register). Journal entries (posted GL) run after the chart of accounts is live. Each phase emits a row-count reconciliation report before the next phase begins. We use Odoo's batch API with throttling to respect the 1 request per second limit.
Cutover, validation, and post-migration handoff
We freeze inoERP 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: (1) all inoERP document attachment file paths for the customer's IT team to migrate separately, (2) all MRP-generated requisitions as a reference CSV with a recommendation to re-run Odoo MRP post-migration, (3) all workflow and automation equivalents requiring rebuild in Odoo Studio or via an Odoo partner. We support a one-week hypercare window where we resolve any reconciliation issues raised by the customer's team.
Platform deep dives
inoERP
Source
Strengths
Weaknesses
Odoo ERP
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 inoERP and Odoo ERP.
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
inoERP: Not publicly documented.
Data volume sensitivity
inoERP 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 inoERP to Odoo ERP migration scoping. Not seeing yours? Book a call.
Walk through your inoERP 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 inoERP
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.