ERP migration
Field-level mapping, validation, and rollback between Epicor Prophet 21 and Odoo ERP. We move data and schema; workflows are rebuilt natively in Odoo ERP.
Epicor Prophet 21
Source
Odoo ERP
Destination
Compatibility
11 of 12
objects map 1:1 between Epicor Prophet 21 and Odoo ERP.
Complexity
BStandard
Timeline
10-14 weeks
Try the reverse
Overview
Moving from Epicor Prophet 21 to Odoo ERP is a schema translation across fundamentally different database architectures. P21 stores data in a normalized Microsoft SQL Server database with a header-detail table pattern (oe_hdr/oe_line, po_hdr/po_line) that assumes direct SQL access and a distribution-specific data model. Odoo uses a PostgreSQL-backed ORM where distribution objects like counter-sales, kitting, and replenishment are not native modules without additional configuration or third-party apps from the Odoo ecosystem. We extract via direct SQL from P21's on-premise databases (or via the P21 REST/OData API for cloud tenants) and load through Odoo's XML-RPC API or CSV import framework with field-level type mapping. DynaChange customizations, Business Process Modules, and user-defined fields in P21 extension tables do not migrate; we flag them for the customer's Odoo partner to address during configuration. We deliver a written inventory of every P21 Business Rule and SDK customization requiring rebuild as Odoo server actions or workflow rules.
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.
Source platform
Epicor Prophet 21 platform overview
Scorecard, SWOT, gotchas, and pricing for Epicor Prophet 21.
Destination platform
Odoo ERP platform overview
Scorecard, SWOT, gotchas, and pricing for Odoo ERP.
Data migration guide
The complete Odoo ERP migration guide
Data model, import mechanisms, field mapping strategy, pitfalls, and cutover — by the engineers running it.
Source platform guide
Epicor ERP migration guide
Understand the data you're exporting from Epicor Prophet 21 before mapping it.
Destination checklist
Odoo ERP migration checklist
Pre- and post-cutover tasks for moving onto Odoo ERP.
Source checklist
Epicor ERP migration checklist
Exit checklist for unwinding your Epicor Prophet 21 setup cleanly.
Why teams make this switch
Leaving
What's pushing teams away
Choosing
What's pulling them in
Object mapping
Each row shows how a Epicor Prophet 21 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.
Epicor Prophet 21
Customer
Odoo ERP
Contact + Address
1:1P21 customer records (cust_mast, custShipTo) map to Odoo res.partner records with address data split into contact addresses. The P21 Customer ID becomes partner_ref on the res.partner; ship-to addresses become child contact records linked to the parent customer partner. Credit limits, pricing tiers, and buyer assignments from P21 cust_mast map to custom fields on res.partner or to dedicated Odoo pricelist records that the Odoo partner configures before migration.
Epicor Prophet 21
Vendor
Odoo ERP
Supplier (res.partner subtype)
1:1P21 vendor records (vendor_mast) map to res.partner with supplier=True. The vendor-to-item linkage in P21's vendor_part table preserves the preferred-vendor flag on the product-supplierinfo record in Odoo, maintaining replenishment relationships. Payment terms and buyer assignment migrate as custom fields or as Odoo res.partner property fields.
Epicor Prophet 21
Item (Product Master)
Odoo ERP
Product Template + Product Variant
1:1P21 item master records (inv_mast) map to Odoo product.template with type set to product, consumable, or service based on P21's item_type. UoM conversions from P21 default_selling_unit and default_purchasing_unit map to Odoo uom.uom records. Replenishment method (min-max, order point) does not have a native Odoo equivalent without the stock_horizontal_integration or a custom module; we document the gap and the Odoo partner builds the replenishment rules post-migration. Lot/serial controls from P21 inv_mast.lot_tracked and inv_mast.serial_tracked flags set Odoo tracking=lot or tracking=serial on the product.template.
Epicor Prophet 21
Sales Order
Odoo ERP
Sale Order
1:1P21 open and historical sales orders extract from oe_hdr (header) and oe_line (line) tables. Order number, order date, warehouse code, terms, and salesrep assignment migrate as order fields. Line items map to sale.order.line with product, quantity, unit price, discount, and warehouse assignment. P21's order-to-customer linkage preserves through the customer-to-contact mapping already completed. Back-order relationships and kit explosions from P21 kit_bom tables require pre-processing before line insertion; we document kit structure dependencies and defer kit BOM migration until product templates are confirmed in Odoo.
Epicor Prophet 21
Purchase Order
Odoo ERP
Purchase Order
1:1P21 PO records extract from po_hdr and po_line tables with vendor pricing, lead times, and receipt schedule data. Partially received POs require line-level receipt quantities to be preserved so that Odoo receives the correct on-order quantity at go-live. PO-to-vendor linkage resolves through the vendor mapping already completed. Odoo purchase.order records are created after product templates are loaded so that product variants are available for line item resolution.
Epicor Prophet 21
Quote
Odoo ERP
Quotation (sale.order in Quotation state)
1:1P21 quote headers and lines (quote_hdr, quote_dtl) map to sale.order in draft/quotation state. Expiration dates from P21 exp_date map to validity_date on the Odoo quotation. We flag expired quotes (P21 status = expired) before migration so that Odoo receives only active quotations at go-live, with expired records archived as a separate export for the customer's reference.
Epicor Prophet 21
Chart of Accounts
Odoo ERP
Account (account.account)
1:1P21 GL accounts from the gl_account table export with full account code strings preserved. Odoo requires a PostgreSQL-level CSV import of account.account records with code, name, account_type, and reconcile flag set. Account segment structure in P21 (company-configured segments, sometimes multi-dimensional) maps to Odoo's account code prefix structure. We preserve the full account code string as the Odoo account code and document any segment meaning for the customer's accountant to finalize account type mapping.
Epicor Prophet 21
Open AP / AR
Odoo ERP
Vendor Bill + Customer Invoice
1:1Open payables and receivables require careful sequencing and partial-payment tracking. P21 invoice_hdr and invoice_line tables carry payment status flags (paid, partially paid, open) that we use to set Odoo move.state to draft, posted, or locked. For partially paid invoices, the paid amount migrates as a credit or residual, and the Odoo customer's accountant confirms the residual posting at reconciliation. We load open AP/AR after chart of accounts is confirmed in Odoo so that account codes satisfy required field constraints.
Epicor Prophet 21
Warehouse
Odoo ERP
Warehouse (stock.warehouse)
1:1P21 warehouse records include bin locations, picking priorities, and cross-dock configurations from inv_loc and related tables. We map each P21 warehouse to an Odoo stock.warehouse, and bin locations map to stock.location records with location_type = internal. Cross-dock configurations in P21 require a custom Odoo route (route_id = cross-dock) set on the warehouse or product; we document the gap and flag it for the Odoo partner to configure.
Epicor Prophet 21
Lot / Serial Number
Odoo ERP
Lot/Serial Number (stock.lot)
1:1P21 lot and serial number tracking links to inv_tran (inventory transaction) history. We preserve lot_number, expiration_date, and cost layer (FIFO or lot-specific) from the P21 inv_lot table. Each lot/serial record links to the mapped product.template in Odoo via product_id. Full traceability chains (lot-to-receipt-to-shipment) migrate as stock.move.line records with lot_id and location_dest_id resolved through the warehouse and location mapping. Cost layer information migrates to stock.valuation_layer or as a custom field depending on Odoo's inventory valuation configuration.
Epicor Prophet 21
Employee / User
Odoo ERP
User (res.users)
1:1P21 user accounts and employee records extract with role-based permissions. We map P21 users to Odoo res.users by email, and role assignments map to Odoo access groups (res.groups) based on the P21 role matrix. Owner assignment on orders and quotes migrates by resolving P21 user_id to Odoo res.users id via the user mapping table. Any P21 user without a matching Odoo user goes to a reconciliation queue for the customer's admin to provision before record import.
Epicor Prophet 21
Custom Field (UDF)
Odoo ERP
Custom Field (ir.model.fields)
lossyP21 user-defined fields stored in extension tables or custom columns do not migrate as data. We audit every P21 UDF column during discovery, document the table.column name, data type, and which P21 table it extends, and deliver this as a UDF inventory. The customer's Odoo partner creates corresponding custom fields (ir.model.fields) on the equivalent Odoo model before migration so that UDF data can be loaded as a supplemental CSV import in a second pass.
| Epicor Prophet 21 | Odoo ERP | Compatibility | |
|---|---|---|---|
| Customer | Contact + Address1:1 | Fully supported | |
| Vendor | Supplier (res.partner subtype)1:1 | Fully supported | |
| Item (Product Master) | Product Template + Product Variant1:1 | Fully supported | |
| Sales Order | Sale Order1:1 | Fully supported | |
| Purchase Order | Purchase Order1:1 | Fully supported | |
| Quote | Quotation (sale.order in Quotation state)1:1 | Fully supported | |
| Chart of Accounts | Account (account.account)1:1 | Mapping required | |
| Open AP / AR | Vendor Bill + Customer Invoice1:1 | Fully supported | |
| Warehouse | Warehouse (stock.warehouse)1:1 | Fully supported | |
| Lot / Serial Number | Lot/Serial Number (stock.lot)1:1 | Fully supported | |
| Employee / User | User (res.users)1:1 | Fully supported | |
| Custom Field (UDF) | Custom Field (ir.model.fields)lossy | 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.
Epicor Prophet 21 gotchas
Third-party bolt-on integrations complicate migration scope
Dirty data without standardized processes compounds migration risk
SDK customizations and BPMs may not survive platform upgrades
Report-based export only for non-technical users
Per-user pricing model requires accurate user count before migration planning
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 P21 environment audit
We audit the source P21 environment across database version (on-premise SQL Server or cloud P21 SaaS), licensed modules, active DynaChange/BPM customizations, UDF tables, SDK extensions, third-party bolt-on integrations, and data volume per entity. We establish SQL Server read access (on-premise) or API credentials (SaaS) and run profiling queries against the key P21 tables (cust_mast, vendor_mast, inv_mast, oe_hdr/oe_line, po_hdr/po_line, quote_hdr/quote_dtl, gl_account, invoice_hdr, inv_lot, inv_loc). The discovery output is a written migration scope, a P21 UDF inventory, a BPM/customization handoff document, and a pricing audit covering all active customer-specific pricing exceptions and quantity break tiers.
Odoo schema provisioning and distribution workflow gap mapping
We work with the customer's Odoo partner to provision the Odoo environment: companies (res.company), warehouses (stock.warehouse) with bin locations (stock.location), chart of accounts (account.account), and product categories (product.category). We map every identified distribution workflow gap (counter-sale, kitting, replenishment, cross-docking) and deliver the gap document to the partner so they can configure Odoo equivalents before migration data loads. We reserve creation of product templates until after this step because kit BOM structures and replenishment rules must be finalized before product data is loaded.
Data profiling, cleansing roadmap, and test migration to Odoo staging
We run a first-pass extraction of all P21 entity data and profile it for duplicates, missing required fields, inconsistent part numbers, outdated BOMs, and records with P21 delete flags (records marked deleted but not physically removed). We deliver a data cleansing roadmap with prioritized fixes before any ETL work begins. We then run a test migration into a staging Odoo environment (Odoo.sh or self-hosted staging) using production-like data volume to validate schema mapping, field type conversions, and lot/serial traceability chains. The customer's team spot-checks migrated records against the P21 source and approves the mapping before production migration begins.
Parent record loading in dependency order
We load Odoo in strict record-dependency order: res.company first, then stock.warehouse and stock.location, then account.account (chart of accounts), then product.category and product.template (items), then res.partner with supplier=True (vendors) and res.partner with supplier=False (customers), then product.supplierinfo (vendor-part linkages). Each phase emits a row-count reconciliation report before the next phase begins. Purchase and sale order loading follows after all parent records are confirmed. Open AP/AR loads after chart of accounts is finalized so that account codes satisfy Odoo's move line constraints.
Transactional data migration and lot/serial lineage preservation
Purchase orders, sale orders, and quotations load as purchase.order and sale.order records with lines referencing the already-loaded product templates. Lot/serial number records (stock.lot) load from P21 inv_lot with product_id, lot_number, removal_date (expiration), and cost layer preserved. Inventory on-hand quantities load as stock.quant records linked to the lot and location. For kitted items, we pre-process P21 kit_bom data into Odoo mrp.bom records before product templates are finalized so that kit structure is available when sale order lines with kit components load.
Cutover, delta sync, and customization handoff
We freeze P21 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 the DynaChange/BPM inventory document, the UDF inventory, the P21 pricing audit, and the third-party bolt-on integration map to the customer's team and Odoo partner for workflow and automation rebuild. We support a one-week hypercare window to resolve reconciliation issues raised during initial Odoo use. We do not rebuild P21 Business Rules as Odoo server actions or configure Odoo's distribution-specific modules; that work is completed by the customer's Odoo partner as a separate engagement.
Platform deep dives
Epicor Prophet 21
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 Epicor Prophet 21 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
Epicor Prophet 21: Not publicly documented by Epicor; third-party connector rate limits vary by integration layer.
Data volume sensitivity
Epicor Prophet 21 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 Epicor Prophet 21 to Odoo ERP migration scoping. Not seeing yours? Book a call.
Walk through your Epicor Prophet 21 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 Epicor Prophet 21
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.