Odoo Data Migration: Moving Master and Transactional Data Without Losing History

Odoo data migration is the work of moving your business data from a source system into Odoo without losing accuracy, history, or relationships between records. It sounds straightforward. In practice it is the phase most implementations underestimate, and the one where source data quality determines whether the project succeeds or requires expensive rework.

📋 Key Takeaways

  • Odoo data migration is specifically about extracting, transforming, and loading data from a source system into Odoo. It is not a version upgrade and not a platform switch.
  • Three data categories must be handled separately. Master data covers customers, products, and accounts. Open transactions include unpaid invoices and pending orders. Historical data requires a deliberate strategy.
  • Dirty source data is the cost driver, accounting for 30 to 50 percent of total migration effort.
  • Historical data does not always need to migrate. Opening balances capture the financial position and the source system stays as a read only archive.
  • Scripted migration is repeatable and testable. For anything above 500 records, use scripts rather than manual import.

Data Migration vs Version Upgrade vs Platform Migration

  • Data migration (this article). Moving data from a source system such as Tally, Zoho, SAP, or Excel into Odoo. The source and target are different platforms. The scope is extract, transform, clean, load, and validate. This is what most Indian SMEs face when switching to Odoo via a structured Odoo migration engagement.
  • Version upgrade. Moving from one Odoo version to another within the same platform. Data stays in the same database and custom modules need compatibility updates. This is not an odoo data migration in the traditional sense.
  • Platform migration. The full project of switching from one system to Odoo. It includes odoo data migration as one phase alongside Odoo implementation, configuration, user training, and go live support.

Master Data: The Foundation of Every Odoo Migration

What master data includes

  • Customers. Names, addresses, GSTINs, payment terms, credit limits, and contact persons. The customer record connects to every sales transaction in Odoo.
  • Vendors. Supplier records with GSTINs, payment terms, TDS categories, and bank details. Linked to all purchase transactions.
  • Products. Product names, internal references, HSN/SAC codes, units of measure, tax rates, categories, and sale and purchase prices.
  • Chart of accounts. Ledger structure mapped to Odoo account types. Must be approved by your CA before any other data is imported.
  • Warehouses and locations. Warehouse structure, storage locations, and zones. Must exist in Odoo before stock data is imported.
⚠️A complete master data import is the foundation that makes every subsequent migration step possible. Rushing this phase causes cascading failures in transaction imports.

Open Transactions: What Is Still In Flight

Open transactions are records not yet completed as of the migration date. These must be in Odoo from day one.

Open transactions that typically migrate

  • Unpaid customer invoices. Outstanding receivables as of migration date. Imported as open invoices so ageing reports and payment tracking work from day one.
  • Unpaid vendor bills. Outstanding payables as of migration date. Imported as open bills so payment scheduling and TDS tracking continue.
  • Pending sales and purchase orders. Confirmed but unfulfilled or unreceived orders so delivery and goods receipt can be processed in Odoo.
  • Opening stock. Inventory quantities and valuations per warehouse and product. Must match the source system exactly on the cutover date.

Historical Data: Migrate, Archive, or Leave Behind

Three strategies for historical data

  • Migrate selectively. Import key historical transactions such as the last one or two years of invoices and major customer orders for reference. Effort is high and cost ranges from Rs 1,00,000 to Rs 3,00,000 depending on volume and source complexity.
  • Archive in the source system. Keep the old system accessible as a read only archive. Historical lookups happen in the old system while Odoo starts fresh with opening balances. This is the most common approach and balances cost with operational continuity.
  • Leave behind. Export historical data to PDF or CSV files for document retention and decommission the source system entirely. This minimises effort but removes system access to old records.
💡Most businesses choose the archive strategy. Opening balances capture the financial position and the source system stays available for historical reference.

Why Dirty Source Data Is the Real Cost Driver

What dirty data looks like in practice

  • Duplicate customers. The same company appears as three separate records under slightly different names. These must be merged into one clean record before import.
  • Missing GSTINs. Hundreds of customers with no GSTIN on file. Every invoice to these customers will fail validation in Odoo.
  • Products without HSN codes. Products with no HSN assigned will produce incorrect GST calculations from day one.
  • Inconsistent units of measure. Odoo needs one consistent UOM per product. Multiple representations of the same unit create import failures and inventory discrepancies.
  • Discontinued products still active. Products that have not been sold in two years but remain in the active catalogue add noise to every product lookup and report.
💸Skipping source data cleanup means importing problems into a clean system. Every bad record you import will surface later as a support ticket, a reconciliation failure, or a GST return error.

Deduplication Before Import

  • Customer deduplication. Match on GSTIN first for B2B records, then match on name and address. Merge duplicates into a single record with the most complete data.
  • Product deduplication. Match on internal reference or barcode. Flag similar names with different references for manual review.
  • Vendor deduplication. Match on GSTIN and merge payment terms and bank details from all duplicates into one master record.
  • Automated vs manual review. Automated matching handles 70 to 80 percent of duplicates. The rest require human judgment.

Validation After Import

Every validation check must pass before go live is approved. Run all validation on a staging database first.

Validation checks that must pass before go live

  • Record count. Number of customers, vendors, and products in Odoo matches the cleaned source count exactly.
  • Balance reconciliation. Trial balance in Odoo matches the source system trial balance on the cutover date to the rupee.
  • Receivable and payable match. Sum of open invoices and bills in Odoo matches the source system outstanding figures.
  • Stock match. Total stock value in Odoo matches the source system stock value per warehouse.
  • Mandatory fields. No customer without GSTIN where required. No product without HSN code. No vendor without payment terms.
  • Relationship integrity. Invoices link to the correct customer. Bills link to the correct vendor. Stock belongs to the correct warehouse.
⚠️Import into a staging database, run all validation checks, fix issues, and repeat until staging passes cleanly. Only then import into production. Odoo support and audit catches any residual issues post go live.

Opening Balance Strategy

  • Opening balances cover asset, liability, equity, receivable, payable, bank, and stock valuations per warehouse.
  • They are posted as a single set of entries on the migration date. For Indian businesses, April 1 is the cleanest cutover date because it aligns with the financial year start and avoids GST complications from split periods.
  • After posting, Odoo's trial balance matches the source system trial balance. All subsequent transactions are recorded in Odoo.
  • Your Odoo accounting configuration must be complete before opening balances are posted. Chart of accounts, tax rates, and fiscal positions must all be in place first.
💡If you cannot wait for April 1, choose the first day of any month. Avoid mid-month cutovers because they create partial-period complications in GST returns and bank reconciliations.

Manual Import vs Scripted Migration

When manual CSV import is appropriate

  • Under 500 records per model and data is already clean and formatted
  • Simple field mapping where source columns map directly to Odoo fields
  • No relational data that requires linking records across models
  • A single import where repeatability is not needed

When scripted migration is the right choice

  • 500 or more records per model
  • Complex field mappings where source and Odoo data structures differ significantly
  • Data transformations needed such as date format conversion or currency recalculation
  • Relational imports where invoices must link to correct customers and products must link to correct categories
  • Multiple test cycles required before production, making repeatability essential
💡Scripts pay for themselves in the testing phase. A manual import of 2,000 records takes hours each time and introduces human error on every pass. An experienced Odoo consulting team can advise on the right approach for your data volume.

Odoo Data Migration Readiness Checklist

Complete every item before migration begins.

  • Chart of accounts approved by CA and created in Odoo
  • India fiscal localisation activated
  • Tax rates and fiscal positions configured
  • Warehouse and location structure created
  • Customer data deduplicated and GSTINs validated
  • Vendor data deduplicated with TDS categories assigned
  • Product data cleaned with HSN codes, UOMs, and categories assigned
  • Discontinued products removed from active catalogue
  • Opening balance figures agreed with CA
  • Cutover date confirmed as April 1 or first of month
  • Source system data exported in agreed format
  • Staging Odoo database available for test imports and validation

An Odoo ERP audit before migration identifies configuration gaps and data quality issues before they become import failures.

Data Migration

Need Clean, Validated Odoo Data Migration?

Tatvamasi Labs handles odoo data migration with scripted imports, deduplication, GSTIN validation, and balance reconciliation. Staging tested before production. India compliance validated throughout.

Discuss Your Migration

Frequently Asked Questions

Master data (customers, vendors, products, accounts), open transactions (pending orders, unpaid invoices), opening balances, and selectively historical transactions. What migrates depends on source quality and cost benefit.
Master data only with clean source takes 1 to 2 weeks. Master data plus opening balances takes 2 to 4 weeks. Full migration including historical transactions takes 4 to 8 weeks. Timeline is driven by source data quality. Dirty data doubles every estimate.
No. Historical data can migrate selectively or stay in the source system as a read only archive. Opening balances capture the financial position. The source system stays accessible for reference.
Dirty source data is the biggest risk. Duplicates, missing GSTINs, and products without HSN codes account for 30 to 50 percent of total migration effort. Skipping cleanup means importing problems into a clean system.
Manual CSV import works for under 500 records with clean data. Scripted migration handles 500 or more records, complex mappings, or multi-table imports. Scripts are repeatable and testable. Manual imports are not.
An opening balance is a journal entry capturing your financial position on the migration date. It covers asset, liability, equity, receivable, payable, bank, and stock valuations. Once posted, all new transactions are recorded in Odoo.
Yes. Both Tally and Zoho are common source systems. Tally data is exported via reports and XML. Zoho data is exported as CSV. Source fields are mapped to Odoo fields, data is cleaned, and a staging database validates before production.