DEV Community

Samcorp
Samcorp

Posted on

Migrating 40,000 SKUs from QuickBooks to Odoo 17: What Broke

Migrating 40,000 SKUs from QuickBooks to Odoo 17

Migrating a few hundred products from one system to another can feel like a spreadsheet task.

Migrating 40,000 SKUs from QuickBooks to Odoo 17 is different.

It quickly becomes a structured data-migration project involving product identities, categories, variants, units of measure, inventory balances, and accounting relationships.

The good news is that once the data is properly mapped and validated, a large QuickBooks to Odoo migration becomes far more manageable.

Here are the biggest lessons from handling a catalog at this scale.

1. Treat QuickBooks Data as the Source, Not the Final Structure

QuickBooks exports product information in a relatively flat format.

Odoo can organize the same information using:

Product templates
Product variants
Categories
Attributes
Units of measure
Inventory tracking

For example:

TSHIRT-BLACK-S
TSHIRT-BLACK-M
TSHIRT-BLACK-L

Instead of creating three unrelated products, Odoo can represent them as:

T-Shirt
├── Color: Black
└── Size: S / M / L

This creates a cleaner catalog and makes future product management much easier.

2. Normalize SKUs Before Importing

With 40,000 records, small formatting differences can create duplicate products.

Examples include:

ABC-123
abc-123
ABC-123
ABC–123

A simple normalization process can clean spaces, capitalization, and special characters before migration.

def normalize_sku(value):
    return value.strip().upper()

Enter fullscreen mode Exit fullscreen mode

The important part is to identify duplicate SKUs before they reach Odoo.

This keeps the product database cleaner from day one.

3. Map Categories Instead of Copying Everything

A migration is also a good opportunity to improve old product structures.

Instead of automatically copying every QuickBooks category into Odoo, we can create a clean mapping.

CATEGORY_MAP = {
    "USB Cables": "Electronics / Cables",
    "Mens Shirts": "Apparel / Men",
    "Installation": "Services / Installation",
}

Enter fullscreen mode Exit fullscreen mode

This prevents outdated categories such as:

Misc
Old Products
Other
General

from becoming permanent parts of the new ERP.

4. Import Dependencies First

Odoo products can depend on several other records.

For example:

Categories
Units of Measure
Attributes
Attribute Values
Accounts
Taxes
Vendors

Because of this, migration order matters.

A reliable sequence is:

  1. Accounting configuration
  2. Units of measure
  3. Categories
  4. Attributes
  5. Attribute values
  6. Product templates
  7. Product variants
  8. Vendor information
  9. Inventory balances

Preparing these dependencies first significantly reduces import errors.

5. Keep Product Data and Inventory Separate

One of the most useful improvements was separating product creation from opening inventory.

Instead of loading everything together:

Products + Stock

we used:

Product Master Data

Product Validation

Opening Inventory

Inventory Reconciliation

This makes it easier to confirm that both product information and stock quantities are correct.

6. Use a Staging Layer

For a large QuickBooks to Odoo migration, importing directly from the original spreadsheet is risky.

A staging layer provides a safer workflow:

QuickBooks Export

Data Cleaning

Normalization

Validation

Odoo Mapping

Test Import

Production Import

Problematic records can be moved into an exception list instead of stopping the entire migration.

For example:

Missing SKU
Duplicate SKU
Unknown Category
Unknown Unit of Measure
Invalid Variant

This makes troubleshooting much faster.

7. Test Representative Products First

Instead of testing all 40,000 SKUs immediately, start with a smaller group that covers different scenarios.

For example:

Simple products
Services
Variants
Archived items
Zero-stock products
Serialized products
Different categories
Different units of measure

A well-selected sample reveals most migration issues before the full import begins.

8. Make the Migration Repeatable

Large migrations normally require several test runs.

You may need to:

Update mappings
Fix duplicate SKUs
Improve categories
Correct variants
Adjust accounting rules

For this reason, migration scripts should be repeatable.

A stable external identifier can help connect the QuickBooks record with the correct Odoo record.

external_id = f"qb_product_{source_id}"

This allows future runs to update or validate existing products instead of creating duplicates.

9. Reconcile the Data After Import

A successful import message does not always mean the migration is complete.

Validation should include:

Product count
SKU count
Inventory quantity
Inventory value
Category totals
Duplicate checks
Exception reports

For example:

QuickBooks SKUs: 40,000
Odoo SKUs: 40,000

Duplicate SKUs: 0
Unknown UOMs: 0
Unmapped items: 0

This provides much stronger confidence that the migration is ready for production.

A Better QuickBooks to Odoo Migration Workflow

The final process looked like this:

QuickBooks

Export

Profile Data

Normalize

Map

Validate

Test Import

Reconcile

Production Migration

The biggest lesson was simple:

A successful migration is not about moving 40,000 rows. It is about translating 40,000 records into a clean and reliable Odoo data model.

When approached as a structured data project, a large QuickBooks to Odoo migration can also become an opportunity to clean old records, simplify categories, improve product structures, and build a stronger ERP foundation for future growth.

Final Takeaway

Moving 40,000 SKUs from QuickBooks to Odoo 17 may look complex at first, but good preparation makes a major difference.

For larger or more complex ERP transitions, structured Odoo migration services can help manage data mapping, testing, reconciliation, and production cutover.

Focus on:

Clean source data
Clear mapping rules
Dependency-first imports
Separate inventory handling
Small test migrations
Automated validation
Final reconciliation

With those pieces in place, the migration becomes more predictable, repeatable, and easier to maintain after go-live.

Top comments (0)