ERP migration
Field-level mapping, validation, and rollback between De Facto ERP and Odoo ERP. We move data and schema; workflows are rebuilt natively in Odoo ERP.
De Facto ERP
Source
Odoo ERP
Destination
Compatibility
9 of 12
objects map 1:1 between De Facto ERP and Odoo ERP.
Complexity
BStandard
Timeline
4-8 weeks
Overview
Moving from De Facto ERP to Odoo ERP is a structural migration constrained by De Facto's lack of a public API. All source data extraction relies on TSQL scripts and SSRS-based exports generated within the platform itself, which means each migration requires a custom extraction scope scoped during discovery rather than a standard connector. De Facto's highly tailored EDP architecture means no two deployments share the same schema, so every entity and field must be mapped from scratch. We preserve landed-cost tracking fields (freight, insurance, duty, tax) that De Facto's supply chain module uses for importers, mapping them into Odoo's landed cost mechanism on product variants. We do not migrate De Facto SSRS reports, custom workflows, or TSQL-generated output formats; these require rebuild in Odoo's report designer and automation framework as a separate admin task. Odoo's free Community edition is available for self-hosting, with the Enterprise edition starting at $24.90 per user per month for businesses requiring official support and premium modules.
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 De Facto ERP 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.
De Facto ERP
Customer
Odoo ERP
res.partner
1:1De Facto Customer records map directly to Odoo res.partner with partner_type=contact or company. We extract customer name, addresses, phone, email, payment terms, and account balance via TSQL. De Facto's custom field extensions on the customer record (often used for industry-specific attributes) require field-by-field mapping to Odoo res.partner custom fields or to dedicated Odoo configuration tables. Parent-company hierarchies map to res.partner's child contact structure.
De Facto ERP
Vendor
Odoo ERP
res.partner
1:1De Facto Vendor master records map to Odoo res.partner with partner_type=supplier. Currency assignments and tax identification numbers migrate as-is. Multi-country supplier details from De Facto's supply chain module map to Odoo's fiscal country mapping on the partner record. Vendor bank details migrate to res.partner.bank for SEPA and international payment processing.
De Facto ERP
Item / Stock Product
Odoo ERP
product.product
1:1De Facto stock items map to Odoo product.product with product_type=product or service. Each item's unit of measure, barcode, weight, volume, and route assignments (buy, manufacture, make-to-order) migrate via TSQL extraction. De Facto item cost layers (standard, average, FIFO) map to Odoo's product costing method fields. Where De Facto uses item-level landed cost components (freight, insurance, duty), we map these into Odoo's landed cost mechanism on the product form and apply them during stock valuation.
De Facto ERP
Bill of Materials
Odoo ERP
mrp.bom
1:1De Facto BOMs (bill of materials) with component lines, quantities, and operations map to Odoo mrp.bom. Multi-level BOM nesting is preserved as Odoo BOM lines referencing sub-assembly product.cycle_time and workcenter assignments map to mrp.workcenter. De Facto's warranty stock management for importers maps to Odoo product tracebility settings on the finished goods.
De Facto ERP
Landed Cost Components
Odoo ERP
stock.landed.cost
lossyDe Facto's landed cost tracking for importers (freight, insurance, duty, tax per imported shipment) requires explicit mapping to Odoo's stock.landed.cost model. Each landed cost line type from De Facto maps to an Odoo landed cost type (supplier, customs, transportation, other). We preserve the per-shipment allocation logic by creating Odoo landed cost records linked to the relevant stock moves and then triggering Odoo's landed cost valuation layer to update product costs post-import.
De Facto ERP
Open AP / AR
Odoo ERP
account.move (Invoice / Bill)
1:1De Facto open invoices, credit notes, and outstanding balances migrate to Odoo account.move records with move_type=out_invoice (AR) or in_invoice (AP). Payment status, due dates, and residual amounts are preserved in Odoo's payment_state and amount_residual fields. We validate that Odoo's account.payment term lines match De Facto's payment terms before migration to avoid reconciliation gaps. Locked and reconciled items are migrated as reconciled with a journal entry date matching the original.
De Facto ERP
Chart of Accounts
Odoo ERP
account.account
1:1De Facto's chart of accounts generated via TSQL scripts (CSV or XML output) maps directly to Odoo account.account with code, name, account_type, and reconcile flags preserved. De Facto multi-country account structures (common for importers using the landed cost module) map to Odoo's account group hierarchy for consolidated reporting. De Facto tax code assignments map to Odoo account.tax records with the correct tax_scope and country.
De Facto ERP
Historical Transactions
Odoo ERP
account.move, stock.move
1:1De Facto purchase orders, sales orders, and warehouse movements exported via TSQL map to Odoo purchase.order, sale.order, and stock.move respectively. Large transaction volumes require chunked extraction; we chunk TSQL output into 10,000-row batches and load sequentially via Odoo's XML-RPC or csv import framework with batch-level row counts reconciled. Transaction dates and warehouse assignments are preserved for inventory valuation continuity.
De Facto ERP
Fixed Assets
Odoo ERP
account.asset
1:1De Facto fixed asset registers (acquisition cost, depreciation schedule, asset location, category) map to Odoo account.asset and account.asset.profile. Depreciation board entries migrate as Odoo depreciation lines with posted journal entries. De Facto's landed cost tracking overlap with fixed assets (where imported equipment carries duty and freight into asset cost) is resolved by mapping those landed cost lines to Odoo's capitalisation journal entries on the asset.
De Facto ERP
User / Employee
Odoo ERP
res.users
1:1De Facto user records and role assignments map to Odoo res.users and res.groups. De Facto's custom permission sets (often bespoke to each company's EDP configuration) cannot map 1:1 to Odoo's access rights framework; we extract all users with their role memberships during discovery and create a written permission mapping table for the customer's Odoo admin to configure post-migration. Inactive De Facto users migrate as inactive Odoo users for audit continuity.
De Facto ERP
Document / Attachment
Odoo ERP
ir.attachment
1:manyDe Facto documents stored by default and linked to data records via OCR/barcode processing migrate as ir.attachment records in Odoo linked via res_model and res_id to the corresponding parent record (res.partner, product.product, stock.move, account.move). Document-to-record linkages from De Facto export cleanly if the linkage is stored as a foreign key in the document table; linkages maintained only in OCR metadata do not migrate and are flagged in the scoping report.
De Facto ERP
Custom Fields / Custom Objects
Odoo ERP
ir.model.field (Custom)
lossyDe Facto custom fields and user-defined TSQL-generated output formats require field-by-field enumeration during discovery. We extract the complete custom field list from De Facto's metadata tables via TSQL, then pre-create Odoo custom fields (ir.model.field with custom=True) before master data import. Custom field types (string, integer, decimal, date, lookup, multi-select) are mapped to the equivalent Odoo field type. Any De Facto custom entities without an Odoo standard model become Odoo ir.model and ir.model.field definitions in a dedicated custom module.
| De Facto ERP | Odoo ERP | Compatibility | |
|---|---|---|---|
| Customer | res.partner1:1 | Fully supported | |
| Vendor | res.partner1:1 | Fully supported | |
| Item / Stock Product | product.product1:1 | Fully supported | |
| Bill of Materials | mrp.bom1:1 | Fully supported | |
| Landed Cost Components | stock.landed.costlossy | Fully supported | |
| Open AP / AR | account.move (Invoice / Bill)1:1 | Mapping required | |
| Chart of Accounts | account.account1:1 | Fully supported | |
| Historical Transactions | account.move, stock.move1:1 | Mapping required | |
| Fixed Assets | account.asset1:1 | Mapping required | |
| User / Employee | res.users1:1 | Fully supported | |
| Document / Attachment | ir.attachment1:many | Fully supported | |
| Custom Fields / Custom Objects | ir.model.field (Custom)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.
De Facto ERP gotchas
No documented public API for programmatic extraction
Highly customized deployments resist template migrations
Pricing is opaque — all tiers require sales contact
Limited public review volume and low category ratings
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 extraction scoping
We audit the De Facto environment via TSQL script review and database metadata enumeration. We identify all master data tables (customers, vendors, items, BOMs, accounts), transaction tables (open AP/AR, historical orders, stock moves), document storage locations and linkage tables, custom field definitions, user roles and permission sets, and any SSRS report definitions used for financial or supply chain reporting. This phase produces a written extraction scope that enumerates every table, column, and linkage that will be migrated and flags any De Facto-specific structures (landed cost, BOM operations, multi-country tax codes) requiring Odoo configuration before import.
Data validation and deduplication
De Facto's bespoke configurations often include duplicate vendor listings, customer records without contact details, and items with missing SKUs or outdated pricing. We run a data quality assessment against the TSQL extraction output before any Odoo import, producing a deduplication and cleansing report. Duplicate customers merge by name and address fuzzy matching; duplicate vendors merge by tax ID; items with missing SKUs receive a generated SKU flagged for admin review. Companies that complete data cleansing before migration typically reduce post-go-live support tickets by 40-60 percent.
Odoo environment setup and schema design
We install Odoo Community or Enterprise in the target environment and configure the core modules (Accounting, Inventory, Purchase, Sales, Manufacturing) to match the agreed migration scope. This includes creating the chart of accounts, setting up tax codes, defining product categories and routes, configuring landed cost types (if applicable), and building the initial user access groups. Custom fields from De Facto are pre-created as Odoo ir.model.field definitions in a dedicated custom module before any data import begins. The environment is set up in an Odoo Sandbox or staging instance for reconciliation before production cutover.
Master data migration in dependency order
We migrate master data in strict dependency order: account.account (chart of accounts), account.tax (tax codes), res.partner (vendors first, then customers), product.product (stock and service items), mrp.bom (BOMs), and stock.location (warehouses and routes). Each phase is loaded via Odoo's CSV import or XML-RPC API with batch-level row count reconciliation against the TSQL source. Landed cost types are configured before any landed cost lines are imported. Parent-record lookups (e.g., partner_id on product.supplierinfo) are resolved in-memory before each batch is submitted to avoid orphan records.
Transactional data migration and open balance reconciliation
We migrate open AP and AR invoices, credit notes, and outstanding balances as Odoo account.move records. Payment terms from De Facto map to Odoo account.payment.term lines. We reconcile open invoice totals against De Facto's trial balance before closing the migration window to confirm no double-billing risk. Historical sales orders, purchase orders, and warehouse movements load as Odoo sale.order, purchase.order, and stock.move records in date order. We run an Odoo trial balance and inventory valuation report at the end of this phase and compare line-by-line against De Facto's equivalent reports.
Cutover, delta migration, and Odoo admin handoff
We coordinate a cutover freeze window during which no new transactions are entered in De Facto. We run a final delta extraction capturing any records created or modified since the last extraction batch, then import the delta into Odoo and close the migration. Document attachments (ir.attachment) are imported last with parent record res_id/res_model resolved from the migration mapping table. We deliver a written report inventory documenting every SSRS report, De Facto custom field, and automation that requires rebuild in Odoo, with Odoo equivalents noted. We do not rebuild De Facto workflows or TSQL-generated output formats inside the migration scope; these are admin tasks documented in the handoff report.
Platform deep dives
De Facto ERP
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 De Facto ERP 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
De Facto ERP: Not publicly documented.
Data volume sensitivity
De Facto ERP 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 De Facto ERP to Odoo ERP migration scoping. Not seeing yours? Book a call.
Walk through your De Facto ERP 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 De Facto ERP
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.