ERP migration

Migrate from Epicor iScala to Odoo ERP

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 logo

Epicor iScala

Source

Odoo ERP

Destination

Odoo ERP logo

Compatibility

83%

10 of 12

objects map 1:1 between Epicor iScala and Odoo ERP.

Complexity

BStandard

Timeline

4-8 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

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.

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

Epicor iScala logo

Epicor iScala

What's pushing teams away

  • Built-in reports are described as difficult to use and the interface is not considered user-friendly, creating frustration with day-to-day reporting tasks.
  • The application does not support opening multiple windows simultaneously, forcing users to close one screen before accessing another — a workflow bottleneck for order processing teams.
  • Steep learning curve and limited documentation make implementation and ongoing administration challenging for under-resourced IT teams.
  • Outdated UI compared to modern cloud ERPs creates a usability gap that frustrates younger users and increases training costs.
  • Performance issues after migration to newer Epicor Kinetic environments have been reported when server resources are undersized, causing slower reporting and task execution.

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 Epicor iScala objects map to Odoo ERP

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)

maps to

Odoo ERP

Accounting / Account Chart

1:1
Mapping required

iScala 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)

maps to

Odoo ERP

Contacts / Partners (Company type)

1:1
Mapping required

iScala 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)

maps to

Odoo ERP

Contacts / Partners (Vendor type)

1:1
Mapping required

iScala 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)

maps to

Odoo ERP

Sale Orders

1:1
Mapping required

iScala 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)

maps to

Odoo ERP

Purchase Orders

1:1
Mapping required

iScala 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)

maps to

Odoo ERP

Inventory / Products

1:1
Mapping required

iScala 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)

maps to

Odoo ERP

Manufacturing / Work Orders

1:1
Fully supported

iScala 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)

maps to

Odoo ERP

Accounting / Fixed Assets

1:1
Mapping required

iScala 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)

maps to

Odoo ERP

Project

1:1
Mapping required

iScala 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)

maps to

Odoo ERP

Custom Fields (ir.model.fields)

lossy
Mapping required

The 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

maps to

Odoo ERP

Multi-Company Configuration

lossy
Mapping required

iScala 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

maps to

Odoo ERP

Attachments (External Reference)

1:1
Not supported

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

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.

Epicor iScala logo

Epicor iScala gotchas

High

Web Services license exhaustion degrades API performance

High

Multi-company schema requires per-company scoping

Medium

User-Defined (UD) field schema varies by iScala version

Medium

Linux container migration can break file share and report paths

Low

Stock lot and serial records require linked migration

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

  • iScala two-letter module prefix tables require explicit schema handling

    iScala stores data across company-dependent and company-independent schemas with a two-letter module prefix system (GL, SC, OR, PC, SL, PL, AM, PR, MP, HR). There is no Odoo equivalent for the module prefix convention. We query the module prefix from the SQL catalog during extraction, drop it from the destination field mapping, and map it implicitly to the Odoo module being populated. If the extraction query does not filter by module prefix correctly, cross-module records contaminate the migration. We build prefix-filtered queries per table pull during the extraction phase.

  • Multi-company schema isolation must precede any extraction

    iScala stores company-dependent data under company codes within the same database. Extracting without scoping per company causes records from different legal entities to merge during the Odoo load. We query company codes upfront from the iScala system configuration tables during discovery and build a per-company extraction filter into every table pull. Each company maps to a separate Odoo company entity with its own data isolation rules configured post-migration.

  • UD field schema changes between iScala versions and must be inventoried per migration

    The iScala UD module allows custom fields on standard objects, but the UD table schema varies significantly between versions (iScala 2.2 through 2022.1). We inventory UD field definitions during discovery against the specific target iScala version's UD table structure. Any fields with no matching Odoo destination property are flagged for manual mapping review before migration begins. UD field definitions are not automatically compatible with Odoo's custom field model and require per-field transformation logic.

  • Stock lot and serial traceability requires transaction history, not just current balances

    Lot and serial numbers in the iScala SC module are linked to stock transaction history (receipts, issues, adjustments). Migrating only current balances without the linked transaction history breaks traceability in Odoo, which stores lot and serial references on stock.move records. We sequence stock migration to include the receipt transaction history so that lot and serial links remain intact in Odoo's stock.move chain. Without this sequencing, Odoo's inventory valuation and traceability reports show gaps.

  • Odoo multi-currency requires explicit rate configuration not present in iScala

    iScala stores exchange rates per multi-currency transaction in the GL. Odoo Multi-Currency must be explicitly configured with exchange rate sources (manual, ECB, Open Exchange Rates API) or rates entered manually per transaction. We preserve exchange rates from iScala multi-currency transactions as custom fields on Odoo account.move.line records, but Odoo's currency conversion engine will use its own rate tables for real-time reporting unless the customer configures a live rate feed. We flag this as a post-migration configuration item during scoping.

Migration approach

Six steps for a successful Epicor iScala to Odoo ERP data migration

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

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

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

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

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

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

Context on both ends of the pair

Epicor iScala logo

Epicor iScala

Source

Strengths

  • Integrated multi-company, multi-currency General Ledger supporting real-time financial closing across subsidiaries.
  • Comprehensive manufacturing module (MP) with work orders, routings, and material production control.
  • Lot and serial number tracking in stock control (SC) for regulated industries like pharma and food.
  • Service order management (SM) with field-service scheduling for companies with on-site service operations.
  • Embedded reporting with iScala Query Designer and Crystal Reports for financial and operational analytics.

Weaknesses

  • UI is considered outdated compared to modern cloud ERPs, with no multi-window support limiting concurrent workflow.
  • Built-in reporting is difficult to use, driving users to external BI tools for ad-hoc analysis.
  • Limited public API documentation for iScala makes programmatic data extraction complex.
  • Web Services licensing model can cause degraded API response times when license pools are exhausted.
  • Steep implementation and training requirements for under-resourced IT and business user teams.
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 Epicor iScala 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

    Epicor iScala: Not publicly documented for iScala; Web Services license pool governs concurrent API sessions rather than a per-minute rate.

  • Data volume sensitivity

    B

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

Estimator

Estimate your Epicor iScala 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 Epicor iScala to Odoo ERP data migrations

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

Can't find your answer?

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 consultation

Most migrations land between four and eight weeks for accounts with three or fewer active modules, two or fewer companies, and fewer than 20,000 SKUs. Migrations with five or more active modules, multi-company extraction across five or more legal entities, large inventory histories (50,000+ SKUs with lot/serial history), active manufacturing work orders, or complex multi-currency configurations move to twelve to twenty weeks because of SQL extraction complexity, per-company schema separation, BoM/routing mapping, and UDF inventory work. Epicor ERP migrations broadly are underestimated by teams expecting under six months, according to r/manufacturing discussions where one team documented a sixteen-month migration from a comparable legacy ERP.

Adjacent paths

Related migrations to explore

Ready when you are

Move from Epicor iScala.
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