Most SAP to Odoo projects that run late do so because of data. The software configuration is usually fine. What hurts is finding out in week 20 that your material master does not map cleanly, your open items do not reconcile, or nobody owns the vendor clean-up.
In our experience data migration is one of the largest workstreams in an SAP to Odoo project, and the one most often underestimated. This post covers the SAP-specific traps we see most and how to plan around them. It applies to ECC and, with fewer objects, to Business One. Our team has 30+ years on SAP projects, including for Toyota, Subaru, Kubota and Hino.
Why SAP data is harder than it looks
SAP stores data in layers. One material can have views across plants, storage locations, sales organisations and valuation areas. One customer can sit in several company codes with different terms in each. Odoo is flatter, which helps once you are live. During migration, every SAP layer needs a decision: map it, merge it, or drop it.
The pitfalls, object by object
1. Company codes and controlling areas
In SAP, financial structure runs through company codes, business areas, profit centres, cost centres and controlling areas. In Odoo you have companies (multi-company), a chart of accounts per company, and analytic accounting for the management view.
What goes wrong: teams copy the SAP structure one for one, and end up with analytic accounts nobody uses.
How to avoid it: start with the reports management actually reads. Decide which SAP company codes become Odoo companies. Map profit centres and cost centres to analytic plans and accounts. Map your SAP GL to an Odoo chart of accounts early, because every other financial object depends on it.
2. Material master
The SAP material master has basic data, plant, storage location, sales organisation, purchasing, MRP, accounting and costing views. Odoo has products, product variants, warehouses, locations and routes.
What goes wrong:
- Plant-specific settings (MRP type, lot size, procurement type) get lost because Odoo holds most of this per product, with routes and reordering rules per warehouse.
- Configurable or near-duplicate SAP materials are migrated as separate products when they should be variants, or the reverse.
- Old and obsolete materials come across because nobody filtered them.
How to avoid it: migrate only materials with stock, open documents or movement in the last 18 to 24 months. Decide your variant strategy before extraction. Translate MRP settings into Odoo routes (buy, manufacture, MTO, inter-warehouse) and reordering rules, and have the planner sign them off.
3. Customers and vendors (and Business Partner in S/4)
In ECC, customers and vendors are separate masters with general, company code and sales or purchasing data. In S/4HANA they sit under Business Partner. In Odoo they are all contacts, with customer and vendor roles.
What goes wrong: the same organisation exists as a customer and a vendor with different numbers, addresses and bank details. Payment terms differ by company code. Duplicates get migrated and then cause credit and payment errors.
How to avoid it: de-duplicate before extraction, one record per legal entity, keyed by ABN where you can. Carry old SAP numbers into a reference field. Verify bank details with a second check.
4. Condition records and pricing
SAP pricing runs on condition types, access sequences and condition records. Customer-specific prices, material group discounts, freight and surcharges can all stack.
What goes wrong: teams rebuild the full SAP pricing procedure in Odoo. It becomes the hardest part of the build, and nobody knows why half the conditions exist.
How to avoid it: report which condition records were used on invoices in the last 12 months. Migrate those into Odoo pricelists and rules. Retire the rest, and get the sales manager to agree early.
5. Open items versus full history
This is the biggest single decision in most SAP migrations.
What goes wrong: a request to “bring everything across”. Ten years of SAP line items in Odoo slows the system, makes reconciliation very hard and adds months.
How to avoid it: migrate opening balances by GL account, open AR and AP items, open sales and purchase orders, and current stock with values. Keep full history in an archive that stays reportable (see below).
6. Units of measure
SAP lets you define alternative units per material, with conversion factors that may not be round numbers.
What goes wrong: material-specific conversions (a carton of product A holds 12, product B holds 10) do not map straight to Odoo’s UoM set-up. Purchase orders arrive in the wrong quantities.
How to avoid it: list every alternative UoM in use, then decide whether it becomes an Odoo UoM, a packaging, or a product-level setting. Test purchasing and sales in each unit during trial loads.
7. Batches and serial numbers
What goes wrong: batch characteristics and classification in SAP do not have a direct match. Expiry dates and serial-to-customer links get lost. In automotive, losing a VIN or serial link to the warranty record is a serious problem.
How to avoid it: migrate open stock by lot or serial with expiry dates. Keep the historical link between serial and customer in the archive, or bring it across where it supports warranty or recalls.
8. Document numbering
What goes wrong: Odoo starts new number sequences. Customers quote old SAP invoice numbers. Auditors ask how you link a new Odoo entry back to the source.
How to avoid it: store the SAP document number on each migrated open item. Set Odoo sequences with a clear new prefix. Tell customers and suppliers what will change.
9. Archiving SAP history so it stays reportable
What goes wrong: SAP is switched off, then an auditor or a warranty claim needs a 2019 invoice.
How to avoid it: decide early. Options include SAP read-only for a period, a reporting database, or an archive tool. The ATO generally requires Australian businesses to keep records for five years, and some records for longer. Test that people can find a real old document before you switch SAP off.
Trial loads and reconciliation
We recommend planning at least three full trial loads.
- Trial 1: proves the mapping. Expect many errors.
- Trial 2: proves the clean-up. Errors should be the exception.
- Trial 3 (dress rehearsal): run with cut-over timing, using the same steps you will use on go-live weekend.
After each load, reconcile:
- Trial balance by account, SAP versus Odoo
- AR and AP ageing by customer and vendor
- Stock quantity and value by product and warehouse
- Open sales and purchase order counts and values
Get a named finance owner to sign off reconciliation. If nobody will sign, you are not ready to go live.
Pre-migration checklist
| Area | Question to answer | Owner | Done |
|---|---|---|---|
| Scope | Which company codes become Odoo companies? | CFO | ☐ |
| Finance | GL to Odoo chart of accounts mapping signed off? | Financial controller | ☐ |
| Finance | Cost and profit centres mapped to analytic plans? | Management accountant | ☐ |
| History | Open items only, or history too? Cut-off date agreed? | CFO | ☐ |
| Archive | How will old SAP data be kept and searched? | IT / finance | ☐ |
| Materials | Filter rule for active materials agreed? | Supply chain | ☐ |
| Materials | Variant strategy decided? | Product / sales | ☐ |
| Planning | MRP settings mapped to routes and reordering rules? | Planner | ☐ |
| Partners | Customer and vendor duplicates removed? Bank details verified? | AR / AP leads | ☐ |
| Pricing | Condition records used in last 12 months identified? | Sales manager | ☐ |
| UoM | Alternative units listed and mapped? | Inventory lead | ☐ |
| Traceability | Batch, serial and expiry data in scope? | Quality / service | ☐ |
| Numbering | SAP numbers carried to reference fields? | Finance | ☐ |
| Testing | Three trial loads booked in the plan? | Project manager | ☐ |
| Sign-off | Reconciliation owner named? | CFO | ☐ |
When a full migration is not the right move
Not every business should move every entity at once. If you run a group with several companies on one SAP system, it can be safer to move one entity at a time. Each move gets smaller and the team learns as it goes. We are working with an Australian corporate group that is doing exactly this, moving its businesses off SAP to Odoo entity by entity. For how that coexistence works, see running SAP and Odoo side by side.
If your SAP data is in poor shape and nobody has time to clean it, fix that first. Migration amplifies bad data. A period on extended maintenance or third-party support while you clean up can be the smarter path. See SAP ECC end of support 2027: your options.
For the cost side, see what it really costs to leave SAP for Odoo, and for a platform comparison, Odoo vs SAP S/4HANA.
Book a free SAP Exit Assessment
We will look at your SAP data volumes, structures and quality, and tell you where the migration risk sits before you commit. Book a free SAP Exit Assessment.
FAQ
How long does SAP data migration to Odoo take? It runs alongside the whole project. For a mid-market ECC system, plan for mapping and clean-up to start in the first month, with at least three trial loads before go-live.
Should I migrate all my SAP history to Odoo? Usually no. Migrate opening balances, open items, open orders and current stock. Keep full history in a reportable archive so you can still answer audit and warranty questions.
How do SAP company codes map to Odoo? Company codes that are separate legal entities usually become Odoo companies. Profit centres and cost centres usually map to Odoo analytic accounting. Base the structure on the reports management actually uses.
Can SAP Business One data be migrated to Odoo? Yes. Business One has fewer layers than ECC, so migration is usually simpler. The same rules apply: clean partners, active items, open items and trial loads.
What happens to SAP pricing conditions in Odoo? They are rebuilt as Odoo pricelists and pricing rules. Migrate only the conditions actually used in the last year or so, and simplify where the business agrees.
How do we know the migration worked? Reconcile trial balance, AR and AP ageing, stock quantity and value, and open orders between SAP and Odoo after each trial load. A named finance owner should sign off before go-live.
