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()
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",
}
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:
- Accounting configuration
- Units of measure
- Categories
- Attributes
- Attribute values
- Product templates
- Product variants
- Vendor information
- 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.












