Skip to Content
Odoo & ERP

From Excel or CONTPAQi to Odoo: How to Migrate Without Losing Information

What data to bring, in what order, how to reconcile balances and what to do with the history.

By the NIQERA TeamPublished 1 Nov 20269 min read

In short

To migrate from Excel or CONTPAQi (a widely used Mexican accounting software) to Odoo without losing information, you don't copy the whole past: you bring over the master data (customers, suppliers, products, chart of accounts) and the open balances as of a cutoff date (accounts receivable, accounts payable, stock and accounting balances). Odoo imports Excel or CSV files, lets you test each file before loading it and warns that imports cannot be undone. The previous system is kept for reference, because the law requires keeping accounting records for five years.

What information gets migrated from Excel or CONTPAQi to Odoo?

What you need to operate from day one: master data and open balances. Not the detail of every transaction from the past years. With that you can invoice, collect, pay and fulfill orders from the start, and your accountant can compare the closing figures from the previous system with the opening figures in Odoo.

InformationWhat is worth bringingWhat usually stays in the previous system
Customers and suppliersThe active ones, with RFC (tax ID), tax data, contacts and payment termsThose that haven't bought or sold in years
ProductsCode, description, unit, price, cost and main supplierDiscontinued codes with no stock
Accounts receivable and payableEvery invoice still open at the cutoff date, with its balanceInvoices already paid
InventoryStock by warehouse and its cost at the cutoff dateThe history of receipts and issues
AccountingChart of accounts and opening balancesJournal entries from previous fiscal years

If you are still deciding whether it's time to make the jump, start with the signs that your company already needs an ERP.

How does Odoo import data?

With Excel (.xlsx) or CSV files, from the list view of almost any record: contacts, products, invoices, accounts. The official Odoo 20 documentation describes the same procedure for all of them: you upload the file, check that each column matches the right field, click Test to validate the data and, if there are no errors, Import.

Five details from that documentation that help you avoid surprises:

  • There are templates. Odoo offers downloadable templates for common data, such as contacts, already prepared so the columns match their fields.
  • The external ID prevents duplicates. If your file has an external ID column, when you import it again Odoo updates the records that already exist instead of creating new ones. You can use your previous system's code as the ID, which eases the transition. Each ID must be unique.
  • Odoo guesses from the first ten rows. It infers each column's type from the first ten rows. If a column isn't recognized, you assign it by hand during the test.
  • Related records go first. For an invoice to point to its customer, the customer must already exist in Odoo.
  • There is no undo button. Odoo warns that imports are permanent and that large files are best loaded in smaller batches.

What it costs you not to test first: hundreds of duplicated or misassigned records that then have to be fixed one by one.

In what order is data migrated?

From what depends on nothing to what depends on everything. If you load an invoice before its customer, or a stock level before its product, the import fails or creates incomplete records.

  1. Base configuration: company, tax data, warehouses, taxes and units of measure.
  2. Chart of accounts and its mapping to the SAT (Mexico's tax authority) chart.
  3. Contacts: customers and suppliers, with their external ID.
  4. Products and price lists.
  5. Opening stock by warehouse, with its cost. In Odoo it is recorded with an inventory adjustment: you enter the counted quantity and the system calculates the difference.
  6. Open balances: receivable and payable invoices pending at the cutoff date.
  7. Opening accounting balances, which your accountant checks against the previous system's trial balance.

Each step is done first in a test database, with the full file, and only when it reconciles is it repeated in the production database.

How do you choose the cutoff date and check that everything reconciled?

The cutoff date is the last day the previous system is in charge; the next day, everything is recorded in Odoo. The simplest choice is a month-end, so that the close for that month comes entirely from the previous system and the opening of the next one comes entirely from Odoo.

To know whether you lost anything, compare three reports from the previous system at the cutoff against the same ones in Odoo at launch:

What to comparePrevious system at cutoffOdoo at launch
Accounts receivable and payableAged balances by customer and supplierThe same total, customer by customer
InventoryStock and value by warehouseThe same quantity and the same value, product by product
AccountingTrial balanceIdentical opening balances, account by account

Compare line by line, not just the grand total: two errors can offset each other and hide a customer with the wrong balance. Your accountant signs off on this reconciliation.

Is your data spread across Excel, CONTPAQi and other spreadsheets?In a 60-minute diagnostic session we review what information you have, where it lives and what is worth migrating. $1,800 MXN + VAT, credited toward your project.Book a diagnostic →

What happens to the history and the invoices already stamped?

They stay where they are, and they are kept. The Código Fiscal de la Federación (Federal Tax Code) requires keeping accounting records and their supporting documents for five years, counted from when the related tax returns were filed or should have been filed. That is why the previous system (or a backup you can open) and the XML files of your invoices must remain available even once you operate in Odoo.

Invoices you have already stamped are not issued again: they already exist with the SAT. What you bring into Odoo is the outstanding balance of those still open, so you can collect them and, when applicable, issue the payment complement from Odoo. We explain how invoices and complements work inside Odoo in CFDI 4.0 in Odoo and what is changing at the SAT.

What are the most common mistakes when migrating to Odoo?

Almost all come from loading data that hasn't been cleaned or tested. These are the ones to avoid:

  • Duplicate customers. The same customer written three ways in Excel ends up as three customers in Odoo, with three balances. Deduplicate by RFC before importing.
  • Incomplete tax data. If a customer lacks the correct RFC and tax data, the problem shows up the day you want to invoice them. Validate it against their tax certificate before the load.
  • Products with no unit or with a zero cost. A zero cost drags false margins into every sale. Check the cost of everything that has stock.
  • Importing without an external ID. Without it you can't reload the same corrected file without duplicating.
  • Migrating straight into the production database. Since the import can't be undone, any error is fixed by hand.
  • Leaving the reconciliation for later. If nobody signs off that the balances match before launch, the differences show up at the first month-end close, when it is already hard to tell where they came from.

If you have already migrated and the numbers don't add up, that can be fixed: it is part of what we do in Odoo rescue.

When shouldn't you migrate the full history?

Almost always. Migrating years of transactions multiplies the work and the risk, and is rarely used: to look up a sale from three years ago, the previous system or its backup is enough. What may be worthwhile is bringing a summary into Odoo, for example sales by customer and product for the last twelve months, so that comparison reports start with context.

Conversely: if your information is so disorganized that you don't know how much each customer owes you, don't migrate yet. First clean up, then migrate. And if you are estimating the total effort, see what the cost of implementing Odoo depends on: the quality of your data is one of the factors that moves it most.

Glossary

Cutoff date
The last day records are entered in the previous system. From the next day on, everything is entered in Odoo.
Open balance
What remains pending at the cutoff date: receivable or payable invoices, stock and account balances.
External ID
A unique code per record within the import file. It lets you re-import without duplicating and link records across files.
Trial balance
Accounting report with the balance of each account at a date. It is used to check that the opening balances in Odoo match those of the previous system.
Test database
A copy of Odoo where the migration is rehearsed without affecting real operations.

Frequently asked questions

Can Odoo read my CONTPAQi files directly?

Odoo imports Excel (.xlsx) and CSV files. The information from your previous system is first exported to those formats, cleaned and arranged into Odoo's columns.

Can an import be undone?

No. Odoo's documentation warns that imports are permanent. That is why each file is tested first, preferably in a test database.

Do I have to migrate invoices from previous years?

No. The balances that remain open are migrated. The history stays in the previous system or in a backup you can consult, because accounting records must be kept for five years.

Can I keep using the previous system in the meantime?

Yes, until the cutoff date. During preparation the work is done in an Odoo test database and on cutoff day the final balances are loaded.

Who validates that the numbers came out right?

Your accountant, comparing the trial balance, aged balances and inventory from the previous system against those in Odoo, line by line.

Sources: Odoo, "Export and import data", Odoo 20.0 documentation, accessed November 2026 · Odoo, "Count products" (physical inventory), Odoo 20.0 documentation, accessed November 2026 · Odoo, "Mexico", fiscal localization, Odoo 20.0 documentation, accessed November 2026 · Código Fiscal de la Federación, article 30 (last amended in the DOF on April 9, 2026)

Ready to get started?

Start with a 60-minute assessment session.

$1,800 MXN + VAT, by video call, credited toward your project.