ERP migration
Field-level mapping, validation, and rollback between Epicor iScala and Odoo ERP. We move data and schema; workflows are rebuilt natively in Odoo ERP.
Epicor iScala
Source
Odoo ERP
Destination
Compatibility
10 of 12
objects map 1:1 between Epicor iScala and Odoo ERP.
Complexity
BStandard
Timeline
4-8 weeks
Overview
Moving from Epicor iScala to Odoo ERP is a structural migration off a legacy Windows and SQL Server platform with predatory per-incident licensing and infrequent version updates toward a modular open-source ERP with a cloud-capable deployment model. Epicor iScala organizes data in company-dependent and company-independent schemas using a two-letter module prefix system (GL, SC, OR, PC, SL, PL, AM, PR, MP, HR) inside a single SQL Server database. Odoo uses a PostgreSQL-backed Python framework with a different module boundary (Accounting instead of GL/SL/PL, Inventory instead of SC, Manufacturing instead of MP). We extract data via direct SQL queries because Epicor iScala REST API access requires separate Web Services licensing and carries exhaustion-related performance degradation. We resolve the multi-company scoping, preserve multi-currency exchange rates, and sequence lot and serial number migration with transaction history. We do not migrate iScala Report Designer reports, workflow automations, or document attachments stored outside the SQL database.
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 Epicor iScala 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 iScala
General Ledger (GL)
Odoo ERP
Accounting / Account Chart
1:1iScala GL records (journal entries, chart of accounts, financial periods) store company-dependent data under company codes. We query company codes from the iScala system configuration during discovery, then extract GL accounts per company and map them to Odoo's account.chart template with the company code preserved as an analytic account or as a separate Odoo company entity. Journal entries migrate with full debit/credit integrity; Odoo's double-entry accounting model matches iScala's ledger structure.
Epicor iScala
Sales Ledger (SL)
Odoo ERP
Contacts / Partners (Company type)
1:1iScala SL customer masters, outstanding invoices, and payment history map to Odoo Partners with the is_company flag set to True. Address fields, contact roles, payment terms, and credit limits migrate from SL to partner fields and custom fields. Multi-currency invoices preserve exchange rates by storing the rate at invoice time in a custom field on the invoice line.
Epicor iScala
Purchase Ledger (PL)
Odoo ERP
Contacts / Partners (Vendor type)
1:1iScala PL vendor masters, open AP invoices, and payment history map to Odoo Partners with the supplier rank greater than zero. Vendor-specific fields (tax ID, bank details, payment terms) migrate to Odoo partner fields and custom fields. Multi-currency purchase transactions preserve exchange rates from PL at invoice time to maintain AP aging accuracy in Odoo.
Epicor iScala
Sales Orders (OR)
Odoo ERP
Sale Orders
1:1iScala OR order headers and lines with pricing, discounts, and fulfillment status map to Odoo sale.order and sale.order.line. Open orders and recently closed orders migrate with line-level detail preserved. We flag orders with a custom field is_migrated__c and store the original iScala order number as a reference for reconciliation.
Epicor iScala
Purchase Orders (PC)
Odoo ERP
Purchase Orders
1:1iScala PC purchase order headers, lines, and receipts map to Odoo purchase.order and purchase.order.line. GRNI (goods-received-not-invoiced) entries migrate as Odoo internal moves with a linked vendor bill reference. GRNI tracking requires Odoo configuration because it is not a native Odoo concept; we map it to a combination of received quantity versus invoiced quantity on the purchase order line.
Epicor iScala
Stock Control (SC)
Odoo ERP
Inventory / Products
1:1iScala SC inventory items, warehouse locations, lot numbers, and serial numbers map to Odoo product.product, stock.quant (for stock on hand), and stock.lot. We map BoM structures to Odoo mrp.bom. Lot and serial tracking flags migrate as metadata. IMPORTANT: Lot and serial records are linked to transaction history (receipts, issues, adjustments) in iScala SC. We sequence stock migration to include receipt transaction history so that traceability links remain intact in Odoo's stock.move chain. Current balances only migration breaks lot/serial traceability.
Epicor iScala
Material Production (MP)
Odoo ERP
Manufacturing / Work Orders
1:1iScala MP work orders, routings, operations, and material allocations map to Odoo mrp.production, mrp.routing, and mrp.workorder. BoMs migrate to Odoo mrp.bom. Complex routings with alternate work centers and labor standards require field-level mapping against the specific iScala MP version's routing table schema. We flag manufacturing migrations with a custom field is_mfg_migration__c and note any routing operations that need manual rebuild in Odoo due to structural differences.
Epicor iScala
Asset Management (AM)
Odoo ERP
Accounting / Fixed Assets
1:1iScala AM asset masters, accumulated depreciation, depreciation methods, and department or cost center assignments map to Odoo account.asset with the depreciation method (linear, declining), book value, and accumulated depreciation preserved. Asset locations and assigned departments migrate as custom fields or analytic account assignments on the asset.
Epicor iScala
Project Management (PR)
Odoo ERP
Project
1:1iScala PR project masters, WBS elements, budgets, and time entries map to Odoo project.project and project.task. Current budget balances migrate as project financial data. Detailed time entries (hours, cost, billable amount) require chunked migration because large project histories can exceed single API batch limits. We migrate project headers and current budget balances and flag detailed time entry scope for admin review.
Epicor iScala
User-Defined Fields (UD)
Odoo ERP
Custom Fields (ir.model.fields)
lossyThe iScala UD module stores custom fields attached to standard objects. UD field definitions vary by iScala version (2.2 through 2022.1), and the UD table schema must be inventoried during discovery against the target iScala version's UD structure. We extract UD field definitions and their stored values per object, then map them to Odoo custom fields (created via ir.model.fields or Odoo Studio on Enterprise). Fields with no matching destination property go to a manual mapping review queue before migration.
Epicor iScala
Multi-Company / Multi-Site
Odoo ERP
Multi-Company Configuration
lossyiScala stores company-dependent data under company codes within the same database alongside company-independent system data. We query company codes from iScala system configuration during discovery, then create each company as a separate Odoo company entity with its own chart of accounts, warehouse assignments, and user permissions. Inter-company transactions require Odoo inter-company rules configuration post-migration.
Epicor iScala
Attachments and Documents
Odoo ERP
Attachments (External Reference)
1:1Document attachments stored outside the SQL database in file shares, SharePoint, or Epicor document management are not migratable via API. We audit and document all file location references during discovery and deliver a written file inventory with target path recommendations in Odoo's filestore. A parallel file migration (using ShareGate, SMB copy, or an Odoo file sync script) should be scheduled to coincide with the Odoo cutover date.
| Epicor iScala | Odoo ERP | Compatibility | |
|---|---|---|---|
| General Ledger (GL) | Accounting / Account Chart1:1 | Mapping required | |
| Sales Ledger (SL) | Contacts / Partners (Company type)1:1 | Mapping required | |
| Purchase Ledger (PL) | Contacts / Partners (Vendor type)1:1 | Mapping required | |
| Sales Orders (OR) | Sale Orders1:1 | Mapping required | |
| Purchase Orders (PC) | Purchase Orders1:1 | Mapping required | |
| Stock Control (SC) | Inventory / Products1:1 | Mapping required | |
| Material Production (MP) | Manufacturing / Work Orders1:1 | Fully supported | |
| Asset Management (AM) | Accounting / Fixed Assets1:1 | Mapping required | |
| Project Management (PR) | Project1:1 | Mapping required | |
| User-Defined Fields (UD) | Custom Fields (ir.model.fields)lossy | Mapping required | |
| Multi-Company / Multi-Site | Multi-Company Configurationlossy | Mapping required | |
| Attachments and Documents | Attachments (External Reference)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.
Epicor iScala gotchas
Web Services license exhaustion degrades API performance
Multi-company schema requires per-company scoping
User-Defined (UD) field schema varies by iScala version
Linux container migration can break file share and report paths
Stock lot and serial records require linked migration
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 Odoo module fit assessment
We audit the source Epicor iScala environment via direct SQL Server queries against the two-letter module prefix tables. We inventory active modules (GL, SL, PL, SC, MP, OR, PC, AM, PR, HR, SM, CM), company codes, multi-currency records, UD field definitions, lot/serial transaction history, and BoM/routing structures. We pair this with an Odoo module fit assessment against the customer's required modules and version (Community or Enterprise). The discovery output is a written migration scope document with a per-company extraction plan, UD field inventory, and a recommendation on Odoo Community versus Enterprise for the customer's manufacturing depth requirements.
Schema design and multi-company Odoo configuration
We design the Odoo destination schema. This includes creating Odoo company entities per iScala company code, configuring the chart of accounts mapped from GL accounts, setting up warehouse assignments mapped from SC locations, creating product templates with variants for lot/serial-enabled SKUs, and designing BoM structures from MP work orders and routings. Multi-currency configuration (manual rates, ECB feed, or Open Exchange Rates) is specified here. We deploy the initial schema into an Odoo test database via XML-RPC API before any data moves.
SQL extraction with per-company and per-module prefix isolation
We run SQL Server extraction queries per iScala company code and per module prefix. Each query applies the company filter and module prefix filter before selecting records. For multi-currency records, we preserve the exchange rate at transaction time as a custom field. For UD fields, we join the UD table schema against the standard object table to capture custom field values. We chunk large tables (SC stock history, MP work order operations, PR time entries) into 5,000-row batches to avoid SQL Server timeout on large result sets. We emit a per-table row count reconciliation report after each extraction batch.
Data load into Odoo with dependency ordering and custom field creation
We load data into Odoo in dependency order: companies and chart of accounts first (Accounting prerequisite), then warehouse locations (Inventory prerequisite), then products with BoMs (Manufacturing prerequisite), then partners (Sales and Purchase prerequisite), then open purchase and sales orders, then stock current balances with lot/serial metadata, then manufacturing work orders, then assets, then projects, then engagement records (if applicable). UD custom fields are created in Odoo via ir.model.fields before the records carrying those values are loaded. Each phase emits a row-count reconciliation report and we compare against the extraction report before proceeding.
Sandbox migration and reconciliation
We run a full migration into a test Odoo database using production-like data volume. The customer's operations lead reconciles record counts across all modules, spot-checks 25-50 records per module against the iScala source (pricing on OR/PC lines, lot numbers on SC, work order operations on MP), and signs off the schema and mapping before production migration begins. Any mapping corrections or missing UD fields are corrected at this stage. We specifically validate multi-company isolation and multi-currency exchange rate preservation during this phase.
Production cutover, delta sync, and automation inventory handoff
We freeze writes to iScala during the cutover window, run a final delta extraction of any records modified during the migration, load the delta into Odoo, then validate the final record counts against the pre-cutover extraction totals. We deliver a written inventory of every iScala automation, report, and workflow that requires rebuild in Odoo, with Odoo-specific equivalents documented per item (Odoo Studio for workflows, IBP or custom SQL reports for Crystal Reports alternatives). We do not rebuild automations, workflows, or reports inside the migration scope; that work is handled by the customer's Odoo partner or internal admin as a separate engagement.
Platform deep dives
Epicor iScala
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 Epicor iScala 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
Epicor iScala: Not publicly documented for iScala; Web Services license pool governs concurrent API sessions rather than a per-minute rate.
Data volume sensitivity
Epicor iScala 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 iScala to Odoo ERP migration scoping. Not seeing yours? Book a call.
Walk through your Epicor iScala 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 iScala
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.