ERP migration

Migrate from inoERP to Odoo ERP

Field-level mapping, validation, and rollback between inoERP and Odoo ERP. We move data and schema; workflows are rebuilt natively in Odoo ERP.

inoERP logo

inoERP

Source

Odoo ERP

Destination

Odoo ERP logo

Compatibility

92%

11 of 12

objects map 1:1 between inoERP and Odoo ERP.

Complexity

BStandard

Timeline

4-6 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

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.

Field-level fidelity

Every standard and custom field arrives verified.

Schema-aware mapping

AI proposes the map; you confirm before any record moves.

Relationships preserved

Parent–child, lookups, and ownership stay linked.

Full activity history

Calls, emails, meetings — with original timestamps.

Attachments & notes

Documents, uploads, and inline notes move with the record.

Why teams make this switch

Two sides of the same decision

Leaving

inoERP logo

inoERP

What's pushing teams away

  • The project management module is incomplete and underdeveloped, frustrating organisations that need integrated project tracking alongside operations.
  • Documentation is sparse and community support is limited, making troubleshooting configuration issues and customisation challenges time-consuming for self-hosted deployments.
  • The platform has undergone a major architecture migration from PHP to Go back-end with a Flutter front-end, creating confusion about which version to deploy and whether older PHP documentation still applies.
  • Hosting, maintaining, and securing a self-managed ERP falls on the customer's team, generating hidden labour costs that often exceed the savings from free licensing.

Choosing

Odoo ERP logo

Odoo ERP

What's pulling them in

  • Modular pay-as-you-grow model with 80+ apps under one database — teams start with CRM and add Accounting, Inventory, or Manufacturing without switching platforms.
  • Free Community edition lets businesses validate Odoo fit before committing to Enterprise licensing costs that scale with user count.
  • Lowest per-user pricing among mid-market ERPs, with a published free tier for one app and Standard plans starting around $24.90 per user per month.
  • Native integration between modules — a confirmed Sales Order automatically updates inventory, invoicing, and accounting without manual re-entry.
  • Strong Odoo Gold Partner ecosystem provides local implementation support, reducing risk for companies without in-house developers.

Object mapping

How inoERP objects map to Odoo ERP

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

maps to

Odoo ERP

Account (account.account)

1:1
Fully supported

inoERP 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

maps to

Odoo ERP

Account Move

1:1
Mapping required

Posted 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

maps to

Odoo ERP

res.partner + account.move (AR/AP subset)

1:1
Mapping required

inoERP'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

maps to

Odoo ERP

product.product + stock.quant

1:1
Fully supported

inoERP 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

maps to

Odoo ERP

sale.order / purchase.order

1:1
Mapping required

Open 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

maps to

Odoo ERP

mrp.production + stock.move

1:1
Mapping required

Work 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

maps to

Odoo ERP

mrp.bom + mrp.routing.workcenter

1:1
Fully supported

inoERP 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

maps to

Odoo ERP

mrp.production (re-run flagged)

lossy
Fully supported

MRP-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

maps to

Odoo ERP

hr.employee

1:1
Mapping required

inoERP 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

maps to

Odoo ERP

res.users + res.groups

1:1
Mapping required

inoERP 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

maps to

Odoo ERP

account.asset.asset

1:1
Fully supported

Asset 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

maps to

Odoo ERP

(not migrated)

1:1
Not supported

inoERP 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.

Gotchas + challenges

What specifically takes care here

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 logo

inoERP gotchas

High

Architecture version split between PHP and Go/Flutter

Medium

OneApp API has no publicly documented rate limits

Medium

Closed-order and historical transaction volume drives migration scope

Low

Dynamic pull system recalculates lot sizes at runtime

Low

Self-hosting creates data export dependency on the customer

Odoo ERP logo

Odoo ERP gotchas

High

No rollback for CSV imports

High

External ID conflicts on re-import

Medium

Many2many field encoding in CSV imports

Medium

Large export timeouts require batching

Medium

Version schema drift between Odoo releases

Pair-specific challenges

  • inoERP PHP vs Go/Flutter version must be confirmed before extraction

    inoERP runs two distinct codebases: the legacy PHP version and the newer OneApp version built on a Go back-end with a Flutter front-end. The database schema differs between versions, and mixing schemas during extraction produces corrupt mappings. We confirm which version the source system runs during scoping and connect to the correct database. Self-hosted customers may be running either version without clear documentation, requiring schema inspection before extraction begins.

  • Multi-level BOM resolution requires recursive extraction

    inoERP supports super BOMs and multi-level product structures where a parent BOM references child BOMs as components. Odoo's mrp.bom model supports one level of kit structure natively, and full multi-level explosion requires running Odoo's MRP explode algorithm after import. We perform recursive BOM resolution during inoERP extraction, compute the total component demand at each level, and import both the BOM structure and the exploded component list as a reference so the customer's Odoo admin can validate the MRP run post-migration.

  • Odoo batch API enforces a 1 request per second rate limit

    Odoo's XML-RPC batch import API is documented at approximately 1 request per second. Third-party integrators on the Odoo community forum report that exceeding this limit results in 429 responses and stalled imports. We run migration jobs with adaptive throttling, exponential backoff, and batch chunking that respects Odoo's stated rate limits. For large datasets (over 5,000 line items), this extends migration time materially and we scope it explicitly during discovery.

  • Work order WIP ledger does not auto-populate computed fields in Odoo

    Odoo does not auto-fill computed fields such as mrp_production.workcenter_cost, total material cost, or production_duration during a raw data import. Fields like amount_total, invoice_status, and display_name must be recomputed via the ORM or SQL scripts after import. We run post-import recomputation scripts for manufacturing cost fields and advise the customer's Odoo admin to run the Manufacturing > Recompute Cost function after go-live to reconcile WIP balances.

  • Self-hosted inoERP requires database access before migration can begin

    inoERP is self-hosted on the customer's infrastructure. We require read access to the MySQL/MariaDB/Oracle database instance or a database dump file. In some deployments, the database server sits on an internal network without external connectivity, requiring the customer to set up VPN access or run our migration agent on-premises. This access requirement is a pre-condition for scoping and is confirmed before any extraction work begins.

Migration approach

Six steps for a successful inoERP to Odoo ERP data migration

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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

Context on both ends of the pair

inoERP logo

inoERP

Source

Strengths

  • 100% free and open source with no per-user or per-module licensing fees.
  • Full ERP stack covering Finance, SCM, Manufacturing, and HR in a single integrated system.
  • Dynamic pull-based MRP adapts lot sizes to real-time demand changes rather than using fixed Kanban quantities.
  • Multi-database support including Oracle 12c, MySQL, and MariaDB on Windows, macOS, and Linux.
  • Mobile clients available for Android, iOS, macOS, Windows, and web browsers.

Weaknesses

  • Sparse official documentation and limited community support make self-hosting challenging.
  • Project Management module is under development and not yet production-ready.
  • Major architecture shift from PHP to Go/Flutter has created documentation fragmentation.
  • Self-hosting model shifts infrastructure labour costs to the customer, often negating free-licensing savings.
  • Very limited third-party review coverage and few public case studies demonstrating real-world deployments.
Odoo ERP logo

Odoo ERP

Destination

Strengths

  • Modular architecture with 80+ apps sharing one database — add Sales, Accounting, Inventory, and Manufacturing incrementally.
  • Free Community edition for self-hosting with no per-user license cost, backed by an active open-source community.
  • Per-user pricing starting around $24.90/month on Standard, significantly lower than comparable ERPs like NetSuite or SAP.
  • Automatic workflow propagation across modules — a confirmed sales order updates inventory, triggers invoicing, and posts accounting entries without manual steps.
  • Odoo.sh provides a managed cloud hosting environment with CI/CD for custom module deployment and staging databases.

Weaknesses

  • Performance suffers under heavy customization — large implementations with many active modules require dedicated optimization.
  • No single-click migration between Odoo major versions; each release introduces ORM changes, deprecated API calls, and schema revisions requiring manual adaptation.
  • Per-user and per-module licensing costs can escalate unpredictably for growing teams adding multiple apps.
  • Steep learning curve with hundreds of configuration options across dozens of modules creates adoption friction and training requirements.
  • Support tiers on Enterprise have inconsistent response times, pushing some customers toward alternatives with more reliable SLAs.

Complexity grading

How hard is this migration?

Standard ERP migration. 1 of 8 objects need a mapping; the rest are 1:1.

B

Overall complexity

Standard migration

Derived from compatibility, mapping clarity, API constraints, and data volume across inoERP and Odoo ERP.

  • Object compatibility

    B

    1 of 8 objects need a mapping; the rest are 1:1.

  • Field mapping clarity

    C

    Field mapping is derived from defaults — final spec confirmed during the sample migration.

  • Timeline complexity

    B

    8-object category — typical timelines run 2–7 days end-to-end.

  • API constraints

    B

    inoERP: Not publicly documented.

  • Data volume sensitivity

    B

    inoERP doesn't expose a bulk API — REST + parallelization used for high-volume runs.

Estimator

Estimate your inoERP to Odoo ERP migration cost

Rule-based pricing — no per-record fees, no manual quotes. Migrations over 2M records are scoped individually.

Step 1

What are you migrating?

Pick a category, then your source and destination platforms.

Category

FAQ

Frequently asked questions about inoERP to Odoo ERP data migrations

Answers to the questions buyers ask most during inoERP to Odoo ERP migration scoping. Not seeing yours? Book a call.

Can't find your answer?

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 consultation

Most migrations land between four and six weeks for organisations with fewer than 10,000 inventory items, 2,000 open AR/AP lines, and no multi-level BOM structures. Migrations with complex multi-level BOMs, active work order WIP with cost accumulation, multi-year journal entry history, or inoERP Go/Flutter architecture move to eight to fourteen weeks because of recursive BOM resolution, WIP ledger reconciliation, and version-confirmed extraction work.

Adjacent paths

Related migrations to explore

Ready when you are

Move from inoERP.
Land in Odoo ERP, intact.

Tell us record counts and timeline. We'll come back with a written quote inside 1 business day — no commitment, no sales pitch.

Accuracy guarantee Rollback included Quote in 1 business day