ERP migration
Field-level mapping, validation, and rollback between Atlas ERP and Odoo ERP. We move data and schema; workflows are rebuilt natively in Odoo ERP.
Atlas ERP
Source
Odoo ERP
Destination
Compatibility
11 of 12
objects map 1:1 between Atlas ERP and Odoo ERP.
Complexity
BStandard
Timeline
6-10 weeks
Overview
Moving from Atlas ERP to Odoo ERP is a platform transition from a Bulgarian client-server MS SQL Server system to a Belgian open-source modular ERP running on PostgreSQL. Atlas has no public API, so every extraction requires direct MS SQL read with db_datareader access. We sequence the migration in dependency order — master data first (Accounts, Warehouses, Items, Employees), then transactional records (Sales Orders, Purchase Contracts, Production Orders, Payroll Runs) — while suppressing Atlas's automatic inter-module posting to prevent duplicate journal entries in the destination Finance module. BOM explosion tables and routing steps migrate as separate objects and are linked to the destination Item during import. Odoo's Workflow automations, server actions, and custom modules do not migrate as code; we deliver a written inventory of these for the customer's admin to rebuild. We do not migrate custom report definitions or BPM process definitions stored in proprietary Atlas UI formats.
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 Atlas 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.
Atlas ERP
Chart of Accounts
Odoo ERP
account.account
1:1Atlas COA is stored as a hierarchical table in MS SQL with account codes, names, types, and optional parent references. We extract the full account tree and map to Odoo account.account with code preserved, name remapped, and user_type_id set by type classification (receivable, payable, asset, liability, equity, revenue, expense). Foreign currency account flags migrate if Atlas uses multi-currency; otherwise accounts default to the company's base currency. Account is created first in all migration sequences because journal entries and all financial records depend on it.
Atlas ERP
Journal Entries
Odoo ERP
account.move
1:1Atlas posts all module transactions automatically to the Finance module. We extract journal_headers and journal_lines together and map to Odoo account.move (with move_type = entry for manual journals, or sale/purchase/receipt for invoice-matched entries). We suppress auto-posting on migrated operational records and migrate only open-period journal entries during migration. Historical journal entries for closed periods are exported as reference material; the customer decides whether to enter them manually or skip based on audit requirements.
Atlas ERP
Warehouses
Odoo ERP
stock.warehouse
1:1Atlas warehouses store location_id, name, address, and optional cost-center linkage. We export as-is and create Odoo stock.warehouse records with name, code (short code from Atlas warehouse_id), address mapped to partner_id, and a corresponding stock.location record of type internal. Multiple warehouses in Atlas create multiple Odoo warehouses, each with their own routes and push/pull rules configured post-migration.
Atlas ERP
Items
Odoo ERP
product.product + product.template
1:1Atlas item masters store product_code, name, type (stockable, consumable, service), unit of measure, cost price, and sales price. We export the item master and join the bom_lines table to capture Bill of Materials for manufactured goods. The item migrates as product.template (the canonical product definition) with product.product variants if Atlas uses variant dimensions. Routing steps from the routing_steps table attach to the mrp.bom as operations.
Atlas ERP
Bill of Materials
Odoo ERP
mrp.bom
1:1Atlas BOM data lives in companion tables (bom_headers, bom_lines) separate from item masters, linked by item_code. A naive export of item masters misses production capability. We join bom_headers and bom_lines to the item export, preserve the bom type (kit, standard, phantom), and map each component line to mrp.bom.line with product_id resolved to the migrated product.product reference and quantity mapped. Routing steps map to mrp.workcenter.line on the destination BOM.
Atlas ERP
Production Orders
Odoo ERP
mrp.production
1:1Atlas production orders link to the Production Planning module with status lifecycle (planned, released, in-progress, closed), routing steps, and consumed/issued quantities. We preserve the order header, routing steps, and material consumption records. We map the Atlas production state to Odoo mrp.production state (draft, confirmed, progress, done, cancel). Work orders within the production order are created from the routing steps mapped to mrp.workorder.
Atlas ERP
Sales Orders
Odoo ERP
sale.order
1:1Atlas sales orders store a header (order_id, customer, order_date, terms) and line table (item_code, quantity, price, discount). We export the full order header and line detail with associated customer record, preserving open/closed status. Open orders migrate as sale.order in draft state; the customer reviews and confirms them in Odoo to trigger procurement or production. Closed orders migrate as sale.order in done state for historical reference.
Atlas ERP
Purchase Contracts
Odoo ERP
purchase.order
1:1Atlas purchasing module stores contract headers, line items, supplier linkage, and delivery schedule dates. Pending delivery lines are flagged as back-orders in Odoo. Contracts with blanket order characteristics map to purchase.requisition if the customer chooses to use Odoo's blanket order flow. We preserve supplier reference numbers, payment terms, and incoterms from the Atlas purchasing module.
Atlas ERP
Customers / CRM
Odoo ERP
res.partner
1:1Atlas CRM stores customer company records with contact persons, addresses, responsible sales person, and lifecycle stage. We export the full contact hierarchy and map to Odoo res.partner (with customer_rank set for companies, supplier_rank set for vendors, and individual contact persons as child partners under the company partner). Address fields map to street, city, state_id, country_id, and zip. Sales responsible person maps to Odoo's assigned user field.
Atlas ERP
Employees
Odoo ERP
hr.employee
1:1Atlas employee records include name, department, position, employment status, and salary grade. We map these to Odoo hr.employee with department preserved as hr.department (created first), job title mapped to job_id, and active/inactive status from Atlas employment status. Salary grade and compensation details migrate as hr.contract records with wage and struct from a mapped salary structure.
Atlas ERP
Payroll Runs
Odoo ERP
hr.payslip
1:1Atlas payroll history is stored in a separate module with period-based gross/net breakdown, deductions, and employer contributions. We export run summary and line-by-line detail and map to Odoo hr.payslip with reference to the appropriate hr.contract, salary structure, and worked_days input lines. Note that Odoo Payroll (Enterprise app) must be activated in the destination; Community deployments cannot host payroll data natively and should plan for an external payroll system or Odoo.sh Enterprise.
Atlas ERP
Custom Properties
Odoo ERP
ir.model.data + custom fields
lossyAtlas stores user-defined fields in companion tables or extra columns not exposed in the standard UI. We run a pre-migration schema diff against the base Atlas table definitions to detect shadow columns, then include discovered extra columns in the export scope. These migrate as Odoo custom fields (ir.model.fields with track_visibility set to oncreate) on the relevant model, or as ir.model.data XML records if they require static definition. Customers confirm known custom fields during scoping so no shadow columns are missed.
| Atlas ERP | Odoo ERP | Compatibility | |
|---|---|---|---|
| Chart of Accounts | account.account1:1 | Fully supported | |
| Journal Entries | account.move1:1 | Mapping required | |
| Warehouses | stock.warehouse1:1 | Fully supported | |
| Items | product.product + product.template1:1 | Mapping required | |
| Bill of Materials | mrp.bom1:1 | Fully supported | |
| Production Orders | mrp.production1:1 | Mapping required | |
| Sales Orders | sale.order1:1 | Fully supported | |
| Purchase Contracts | purchase.order1:1 | Fully supported | |
| Customers / CRM | res.partner1:1 | Fully supported | |
| Employees | hr.employee1:1 | Fully supported | |
| Payroll Runs | hr.payslip1:1 | Mapping required | |
| Custom Properties | ir.model.data + custom fieldslossy | 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.
Atlas ERP gotchas
No public API — migration requires direct SQL read
Automatic inter-module posting creates duplicate ledger entries
Holding structure is stored as a self-referential company table
BOM and routing data live in separate tables from item masters
Custom fields not surfaced in the standard export UI
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 database access validation
We audit the Atlas MS SQL Server database across all modules in use (Finance, Warehousing, Production Planning, CRM, HRM, Payroll, BPM) and validate direct SQL connectivity with a read-only account. We run a schema diff against base Atlas table definitions to identify companion tables and shadow columns (BOM lines, routing steps, custom fields, inter-module posting tables). We document the holding structure by walking the self-referential company table, capture the full Chart of Accounts hierarchy, and inventory production orders, BOM levels, payroll runs, and open vs closed transaction counts. The discovery output is a written migration scope and a pre-migration readiness checklist confirming database access, IT approval, and go-live date constraints.
Destination Odoo schema design and configuration
We design the destination Odoo database schema. This includes activating the relevant Odoo apps (Accounting, Inventory, Manufacturing, CRM, HR, Payroll), configuring the Chart of Accounts to match the Atlas COA structure, setting up warehouses (stock.warehouse with corresponding stock.location), creating product categories and product templates with the migrated BOMs, configuring multi-company settings if Atlas had a holding structure, and setting up the payroll structure (salary rules, structures, contracts). For self-hosted deployments, we provision the PostgreSQL database; for Odoo.sh, we set up the project and branch. All configuration is validated in a staging environment before production migration.
Master data migration in dependency order
We migrate master data first in strict dependency order: Users (from Atlas employee records), Departments (hr.department from Atlas organizational structure), Companies (res.company with parent-first ordering for holdings), Warehouses (stock.warehouse), Product Categories, Products and BOMs (product.template, product.product, mrp.bom, mrp.workcenter, mrp.workcenter.line), Work Centers, Employees (hr.employee with department and job linkage), and Contracts (hr.contract with salary structure). Each phase emits a row-count reconciliation report and a spot-check of 20-30 records against the Atlas source. Corrections happen at this stage, not in production.
Transactional record migration and auto-posting suppression
We migrate open Sales Orders (sale.order), Purchase Contracts (purchase.order), and Production Orders (mrp.production) in that order, with each record type loaded as draft in Odoo for customer review before confirmation. We suppress Odoo's automatic journal posting on the corresponding accounts during this phase so that sales and purchase document posting does not create duplicate ledger entries alongside any separately-migrated journal lines. Production orders are loaded in confirmed state with work orders generated from the migrated routing steps. Historical closed orders migrate as done records for reporting continuity.
Financial record migration and payroll history
Journal entries for the open accounting period migrate as account.move records with move_type set appropriately. We skip historical journal entries from closed periods; these are exported as reference CSVs. Payroll runs migrate as hr.payslip records with line detail (hr.payslip.line) covering gross, deductions, and net. Note that Odoo Payroll requires the Enterprise app; Community deployments should plan an alternative payroll system or Odoo.sh Enterprise subscription before this phase begins.
Cutover, delta sync, and automation rebuild handoff
We freeze Atlas writes during cutover, run a final delta migration of any records modified during the migration window (typically within 24-48 hours of cutover), then enable Odoo as the system of record. We deliver a written inventory of Odoo Workflows, Server Actions, and automated actions that the customer's admin rebuilds in Odoo's Studio or through custom Python add-ons. We do not rebuild Atlas BPM processes, custom stored procedures, or report definitions as code. We support a one-week hypercare window where we resolve reconciliation issues raised by the customer's team. Post-hypercare, the customer owns Odoo administration, workflow configuration, and any new integrations.
Platform deep dives
Atlas ERP
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 Atlas ERP 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
Atlas ERP: Not publicly documented.
Data volume sensitivity
Atlas 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 Atlas ERP to Odoo ERP migration scoping. Not seeing yours? Book a call.
Walk through your Atlas 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 Atlas 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.