ERP migration
Field-level mapping, validation, and rollback between Infor XA and Odoo ERP. We move data and schema; workflows are rebuilt natively in Odoo ERP.
Infor XA
Source
Odoo ERP
Destination
Compatibility
12 of 13
objects map 1:1 between Infor XA and Odoo ERP.
Complexity
BStandard
Timeline
6-10 weeks
Overview
Moving from Infor XA to Odoo ERP is a cross-architecture migration: XA runs on IBM i with Db2 for i, RPG-era flat-file structures, and a green-screen interface; Odoo uses a PostgreSQL-backed relational schema with a web-based UI and a Python application layer. There is no documented REST API on the source side, so we establish read-only SQL access to Db2 for i and sequence table extracts in dependency order—Item masters and BOMs before Work Orders, GL chart-of-accounts before AP/AR opening balances, and Users before any transactional record carrying an owner reference. Multi-level BOMs require recursive explosion to flatten XA's nested RPG-era structures into Odoo's BOM model. Decades of site-specific RPG customizations, IFS-hosted document attachments, and IBM i security profiles do not migrate; we document these as requiring separate admin action in Odoo. We do not migrate XA workflows, production scheduling rules, or machine-center configurations as code. We deliver a written inventory of these for the customer's admin to rebuild in Odoo's Manufacturing module.
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 Infor XA 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.
Infor XA
Item Master (F1201/F4101 equivalents)
Odoo ERP
Product (product.product)
1:1Item master records in XA carry manufacturing attributes including stocking codes, cost methods (FIFO, standard, average), warehouse assignments, and unit of measure. We map these to Odoo product records, setting the product type (stockable, consumable, service) based on the item's stocking code. Unit of measure conversions and product category assignments require field-level mapping. Multi-company item sites map to Odoo warehouse-specific stock locations. Lot/serial number tracking configuration migrates to Odoo's lot/serial traceability settings.
Infor XA
Bill of Material (F3002 equivalents)
Odoo ERP
Bill of Materials (mrp.bom)
1:1XA BOMs support multi-level, phantom, and substitute item structures with effective dates and BOM type codes. Migration requires recursive BOM explosion to flatten nested hierarchies into Odoo's parent-component model, preserving operation sequences, scrap percentages, and routing references. Phantom BOMs map to Odoo's phantom BoM type. Substitute items require separate product links in Odoo after the primary BoM is created. We flag any BOMs with unresolved component items as a reconciliation item before the import phase.
Infor XA
Manufacturing Routing (F3003 equivalents)
Odoo ERP
Work Center (mrp.workcenter) + Routing (mrp.routing)
1:1XAM routings define operation sequences, work center assignments, and labor or machine time standards tied to production. We extract routing definitions and map them to Odoo Work Center records (with capacity, time efficiency, and costs) and Odoo Routing records that link operations to work centers. Work center costing rates from XA (labor rate, machine rate) map to Odoo's Work Center costs field. Operation sequences and step dependencies migrate directly to Odoo routing operation lines.
Infor XA
Work Order (F3111/F3112 equivalents)
Odoo ERP
Manufacturing Order (mrp.production)
1:1Open and historical work orders in XA drive shop floor control and link to routing, labor posting, and costing. We extract work order headers and operation lines, map their statuses (released, in-progress, completed, closed) to Odoo MO states, and preserve the component allocation, routed operations, and associated item and BOM references. Historical closed work orders migrate as MO records in a done state for costing and audit purposes. Any work order without a valid item or BOM reference is flagged for manual resolution.
Infor XA
Purchase Order Header and Lines (F4311 equivalents)
Odoo ERP
Purchase Order (purchase.order + purchase.order.line)
1:1PO headers and lines in XA carry supplier assignments, terms, delivery schedules, and line status. We map header-level fields (PO number, date, terms, buyer) and line-item details (item number, quantity ordered, unit price, delivery date, status) to Odoo purchase.order and purchase.order.line. Open POs migrate with their full line detail and outstanding quantities. Closed and cancelled POs migrate as historical records. Purchase agreement references from XA map to Odoo's Blanket Orders when applicable.
Infor XA
Supplier Master (F0401/F0431 equivalents)
Odoo ERP
Vendor (res.partner with supplier flag)
1:1Supplier records in XA include address, payment terms, tax registration, and purchasing defaults. We map suppliers to Odoo res.partner records with the is_company and supplier_rank flags set. Payment terms, fiscal position, and purchase currency map to the partner's accounting settings. Multi-address supplier records require address-type resolution (ship-to vs bill-to). Supplier-specific item pricing in XA maps to Odoo's seller_ids on the product form.
Infor XA
Customer Master (F0301 equivalents)
Odoo ERP
Customer (res.partner with customer flag)
1:1Customer records in XA include address, payment terms, credit limits, and sales defaults. We map customers to Odoo res.partner records with is_company and customer_rank flags. Multi-address customer records require address-type resolution in Odoo. Credit limits and payment terms map to partner accounting settings. Sales area and territory assignments from XA map to Odoo's sales team or area fields if configured.
Infor XA
Customer Order (F4211/F4311 sales equivalents)
Odoo ERP
Sales Order (sale.order + sale.order.line)
1:1Sales orders in XA link to pricing, availability checking, and inventory allocation. We map order headers, line items, delivery addresses, and order-specific discounts or special terms. Open sales orders migrate with outstanding quantities and delivery schedules intact. Pricing rules and discount matrices from XA are documented as Odoo Pricelist configurations to be rebuilt post-migration. Order history migrates as closed sale.order records for audit and reference.
Infor XA
General Ledger Accounts (F0901 equivalents)
Odoo ERP
Account (account.account)
1:1GL accounts in XA are defined in a structured chart of accounts with account codes, descriptions, and posting controls (natural account, posting edit code, unit controller). Standard GL account definitions export cleanly and map 1:1 to Odoo account.account records. Account type (asset, liability, equity, revenue, expense), reconcile flag, and group assignments migrate directly. Cost center and department coding from XA maps to Odoo's analytic account structure or dimension tags depending on the customer's Odoo configuration.
Infor XA
Open AP/AR Records (F0411/F0311 equivalents)
Odoo ERP
Vendor Bill / Customer Invoice (account.move)
1:1Outstanding payables and receivables carry customer or supplier references, invoice numbers, due dates, and amounts. We extract open AP/AR documents and map them to Odoo account.move records with type set to in_invoice or out_invoice, preserving the partner reference, invoice date, due date, and open amount. Partial payments and payment terms require line-level resolution. Currency conversion for multi-currency AP/AR records uses the exchange rate at the migration effective date, documented for reconciliation. Historical AP/AR aging reports serve as the opening balance validation reference.
Infor XA
Shop Floor Data Collection (time entries, labor posting, operation completions)
Odoo ERP
Manufacturing Log / Analytic Account (mrp.workorder + account.analytic.line)
1:1Time entries, labor posting, and operation completions recorded in XA's shop floor module tie to work orders and employees. We extract these records to reconstruct labor cost histories in Odoo analytic account lines linked to manufacturing orders. Operation-level time tracking maps to Odoo MO work orders with workcenter time logs. Labor cost summaries migrate to Odoo's analytic accounting for production costing analysis. Detailed clock-in/clock-out records require additional discussion as Odoo's standard timesheet module may require configuration.
Infor XA
User Accounts and Security Profiles (IBM i user profiles)
Odoo ERP
User (res.users)
1:1XAM user accounts and IBM i security profiles define access rights and default accounting entities. We extract user records and map them to Odoo res.users with internal users flagged. IBM i security profiles (special authorities, menu access) do not have a direct Odoo equivalent; we map them to Odoo's Groups (access rights per application module) based on the user's XAM role. Any user without a valid email in XAM is flagged as a manual provisioning item before Odoo access is granted. Active vs inactive status migrates to Odoo active field.
Infor XA
Custom Fields (CMS470 user-defined fields on items, suppliers, purchase agreements)
Odoo ERP
Custom Fields (ir.model.fields)
lossyXAM supports user-defined alphanumeric, numeric, and date fields attached to items, suppliers, and purchase agreement headers via CMS470. These require explicit field-level mapping to Odoo custom fields created before migration. We pre-create Odoo custom fields with appropriate types (char, float, date, selection), attach them to the target model (product.product, res.partner, purchase.order), and migrate the values during the parent record import. Any custom field without a matching Odoo field definition is flagged as a configuration gap before data import begins.
| Infor XA | Odoo ERP | Compatibility | |
|---|---|---|---|
| Item Master (F1201/F4101 equivalents) | Product (product.product)1:1 | Fully supported | |
| Bill of Material (F3002 equivalents) | Bill of Materials (mrp.bom)1:1 | Fully supported | |
| Manufacturing Routing (F3003 equivalents) | Work Center (mrp.workcenter) + Routing (mrp.routing)1:1 | Fully supported | |
| Work Order (F3111/F3112 equivalents) | Manufacturing Order (mrp.production)1:1 | Fully supported | |
| Purchase Order Header and Lines (F4311 equivalents) | Purchase Order (purchase.order + purchase.order.line)1:1 | Fully supported | |
| Supplier Master (F0401/F0431 equivalents) | Vendor (res.partner with supplier flag)1:1 | Fully supported | |
| Customer Master (F0301 equivalents) | Customer (res.partner with customer flag)1:1 | Fully supported | |
| Customer Order (F4211/F4311 sales equivalents) | Sales Order (sale.order + sale.order.line)1:1 | Fully supported | |
| General Ledger Accounts (F0901 equivalents) | Account (account.account)1:1 | Fully supported | |
| Open AP/AR Records (F0411/F0311 equivalents) | Vendor Bill / Customer Invoice (account.move)1:1 | Fully supported | |
| Shop Floor Data Collection (time entries, labor posting, operation completions) | Manufacturing Log / Analytic Account (mrp.workorder + account.analytic.line)1:1 | Fully supported | |
| User Accounts and Security Profiles (IBM i user profiles) | User (res.users)1:1 | Fully supported | |
| Custom Fields (CMS470 user-defined fields on items, suppliers, purchase agreements) | Custom Fields (ir.model.fields)lossy | Mapping required |
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.
Infor XA gotchas
Direct Db2 extraction required for bulk data export
IFS-hosted document attachments fall outside standard extraction
Decades of site-specific RPG customizations resist direct migration
Citrix XenApp dependency complicates user acceptance testing
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
IBM i access and Db2 extraction scoping
We coordinate with the customer's IBM i administrator to establish read-only ODBC or native DB2 for i SQL access to the XAM production library. We run a discovery script against the live or recent backup Db2 for i database to enumerate all relevant tables: item master, BOM headers and components, routing definitions, work order headers and operations, PO headers and lines, supplier and customer masters, GL account records, open AP and AR documents, and shop floor time records. We produce a data inventory report listing table name, row count, date range, and referential dependency chain for every transactional table.
Data cleansing and master record preparation
We run deduplication and cleansing against the extracted XAM data. Duplicate item records (same part number with different descriptions), duplicate supplier or customer records, and orphaned BOM component references are flagged in a cleansing report for the customer's review. We clean and standardize address formats, normalize unit-of-measure codes, and resolve multi-site item locations into Odoo warehouse records. Master data (items, BOMs, routings, GL accounts, partners) is prepared for import before any transactional records are touched. This phase typically takes two to three weeks for environments with messy legacy data.
Odoo environment configuration
We configure the target Odoo environment before any data loads. This includes setting up the company and multi-company structure, configuring accounting (chart of accounts, fiscal positions, payment terms, taxes), setting up warehouse locations and inventory valuation method per product category, configuring the manufacturing module (work center costs, routing definitions, BoM types), and creating custom fields to match XAM CMS470 user-defined fields. We create a migration-ready Odoo sandbox, validate the configuration against the XAM data model, and run a test import of a representative subset before production migration begins.
Master data migration in dependency order
We load data into Odoo in strict dependency order: chart of accounts first (no dependencies), then product categories, then product templates and product variants, then Bills of Materials (with recursive explosion applied), then work center and routing definitions, then supplier and customer partners, then open purchase orders, then open sales orders, then GL opening balances for AP/AR, then work orders, then shop floor labor records. Each phase emits a row-count reconciliation report comparing Odoo record count to the XAM extraction count. Any discrepancy greater than 1 percent triggers a root-cause investigation before the next phase begins.
Sandbox validation and UAT
We run the full migration in a staging Odoo environment and provide the customer's operations and finance leads with a reconciliation workbook covering record counts, spot-check field comparisons, and financial opening balance validation. Users validate their key transactions—open PO receipts, in-progress work orders, outstanding customer invoices—and confirm that Odoo's quantities and balances match XA's as-of migration date. We incorporate any mapping corrections identified during UAT into the production migration scripts before the cutover window opens.
Production cutover and hypercare
We freeze writes to XAM during the cutover window, extract final delta records (any orders, receipts, or postings added since the initial extraction), load them into Odoo, and run a final financial reconciliation comparing Odoo open balances to XA's closing trial balance as of the cutover date. We transition access to Odoo as the system of record and deliver a custom fields and RPG logic inventory document to the customer's admin team for post-migration rebuild in Odoo. We provide a two-week hypercare window to resolve any record-level issues discovered after go-live.
Platform deep dives
Infor XA
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 Infor XA 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
Infor XA: Not publicly documented — depends on Runtime Server (nginx gateway) configuration and IDF object limits..
Data volume sensitivity
Infor XA exposes a bulk API — large-volume migrations stream efficiently.
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 Infor XA to Odoo ERP migration scoping. Not seeing yours? Book a call.
Walk through your Infor XA 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 Infor XA
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.