ERP migration
Field-level mapping, validation, and rollback between Dolibarr ERP and Odoo ERP. We move data and schema; workflows are rebuilt natively in Odoo ERP.
Dolibarr ERP
Source
Odoo ERP
Destination
Compatibility
8 of 10
objects map 1:1 between Dolibarr ERP and Odoo ERP.
Complexity
BStandard
Timeline
3-5 weeks
Try the reverse
Overview
Moving from Dolibarr ERP to Odoo ERP is a platform upgrade that reflects business growth beyond lightweight tooling. Dolibarr's free open-source core serves micro-businesses and freelancers with basic invoicing and contact management, but its modular architecture lacks the depth of integrated accounting, inventory, manufacturing, e-commerce, and HR that growing companies require. Odoo fills those gaps with a unified ERP ecosystem, a documented XML-RPC and JSON-RPC API for bulk operations, and a community of over 5 million users. We extract Dolibarr data through its CSV export wizard or direct MySQL/PostgreSQL query, deserialize the JSON-serialized extraoptions columns to recover custom field values, and write into Odoo via XML-RPC with batch chunking and parent-record lookup resolution. We do not migrate Dolibarr Workflow modules, scheduled tasks, or PDF document attachments; we deliver a written inventory of these for the customer's Odoo administrator to rebuild.
Every standard and custom field arrives verified.
AI proposes the map; you confirm before any record moves.
Parent–child, lookups, and ownership stay linked.
Calls, emails, meetings — with original timestamps.
Documents, uploads, and inline notes move with the record.
Source platform
Dolibarr ERP platform overview
Scorecard, SWOT, gotchas, and pricing for Dolibarr ERP.
Destination platform
Odoo ERP platform overview
Scorecard, SWOT, gotchas, and pricing for Odoo ERP.
Data migration guide
The complete Odoo ERP migration guide
Data model, import mechanisms, field mapping strategy, pitfalls, and cutover — by the engineers running it.
Source platform guide
Dolibarr migration guide
Understand the data you're exporting from Dolibarr ERP before mapping it.
Destination checklist
Odoo ERP migration checklist
Pre- and post-cutover tasks for moving onto Odoo ERP.
Source checklist
Dolibarr migration checklist
Exit checklist for unwinding your Dolibarr ERP setup cleanly.
Why teams make this switch
Leaving
What's pushing teams away
Choosing
What's pulling them in
Object mapping
Each row shows how a Dolibarr ERP object lands in Odoo ERP, including any object-level transformations, lookup resolution, or schema-design dependencies.
Typical mapping — final map is confirmed during the sample migration step.
Dolibarr ERP
Third Party (Company/Customer/Supplier)
Odoo ERP
Partner
1:1Dolibarr's llx_societe and llx_socpeople tables hold Third Parties, Contacts, Customers, and Suppliers as variants of the same entity distinguished by the client/prospect/fournisseur type flags. We map these to Odoo res.partner records with the is_company flag set true for company records and false for individual contacts. Supplier flag maps to Odoo's supplier flag on res.partner. The customer's address fields (street, zip, city, country) map directly to Odoo's address fields; country maps via the res.country lookup by ISO code.
Dolibarr ERP
Product (llx_product)
Odoo ERP
Product Template + Product Variant
1:1Dolibarr products (type=0) and services (type=1) map to Odoo product.product variants under a product.template. The Dolibarr sell price, buy price, and VAT rate map to Odoo's list_price, standard_price, and taxes respectively. Product code (ref) maps to Odoo's default_code for SKU matching. Stock quantities in llx_product_stock map to Odoo quants on the product's default warehouse location.
Dolibarr ERP
Commercial Proposal (llx_proposal)
Odoo ERP
Sale Order
1:1Dolibarr Proposals map to Odoo sale.order records with the state field transformed: draft to draft, validated to sent, signed to sale, refused to cancel. The proposal date maps to Odoo's date_order, and the validUntil date maps to Odoo's validity_date. Proposal lines referencing llx_proposaldet map to sale.order.line with product_id resolved from the product mapping and discount preserved.
Dolibarr ERP
Customer Order (llx_commande)
Odoo ERP
Sale Order
1:1Dolibarr Customer Orders map to Odoo sale.order with state mapping: draft to draft, validated to sent, approved to sale, cancelled to cancel. Order lines (llx_commandedet) map to sale.order.line with product, quantity, unit price, and discount preserved. If the Dolibarr instance uses custom order references containing filesystem-unsafe characters, we sanitize these to Odoo's compatible naming convention before import.
Dolibarr ERP
Invoice (llx_facture)
Odoo ERP
Account Move (Invoice)
1:1Dolibarr Invoices map to Odoo account.move with type=out_invoice. State mapping: draft to draft, validated to posted, cancelled to cancel. Invoice lines (llx_facturedet) map to account.move.line with product_id, quantity, price_unit, and discount preserved. Payment records in llx_paiement and llx_paiement_facture map to Odoo account.payment linked to the account.move via reconcile. We preserve partial payment states for invoices with multiple payments.
Dolibarr ERP
Project (llx_projet)
Odoo ERP
Project
1:1Dolibarr Projects map to Odoo project.project with the project name, description, and status preserved. Tasks in llx_projet_task map to Odoo project.task records linked to the parent project. Task assignees from llx_projet_task_time map as Odoo timesheet entries if the Odoo Timesheets app is installed, or as task description notes if not. We flag any task dependencies stored in Dolibarr's task table for manual Odoo planning configuration.
Dolibarr ERP
Bank Account (llx_bank)
Odoo ERP
Account Journal + Bank Account
lossyDolibarr bank accounts (llx_bank) and their transaction rows map to Odoo account.journal with type=bank and the linked account.account for the bank balance. Each transaction in llx_bank maps to account.bank.statement.line. Dolibarr's reconciliation flags (reconciled column) map to Odoo's statement line reconciled state. We note that Dolibarr's payment-to-invoice links (llx_paiement_facture) are already resolved in the Invoice mapping above.
Dolibarr ERP
Stock Movement (llx_stock_mouvement)
Odoo ERP
Stock Quant + Stock Move
1:1Dolibarr stock movements map to Odoo stock.move records within the stock.picking context. Warehouse locations from llx_entrepot map to Odoo stock.location records. Current stock levels in llx_product_stock map to stock.quant records. Movement types (source vs destination) map to Odoo's stock.location type classification (internal, transit, supplier, customer). We preserve movement dates for audit traceability.
Dolibarr ERP
User Account (llx_user)
Odoo ERP
Res Users
1:1Dolibarr user accounts map to Odoo res.users by email match. We extract user metadata including name, email, and active status. Password hashes (bcrypt-salted) do not transfer; we flag all migrated users for password reset at Odoo destination. Active status maps directly to Odoo's active flag. The Odoo administrator provisions the migration user's access rights separately before migration begins.
Dolibarr ERP
Custom Field (extrafields/extrafields_value via extraoptions JSON)
Odoo ERP
Ir Model Fields + Custom Column on Destination
lossyDolibarr's extrafields system stores custom field definitions and values as JSON in the extraoptions column on the parent table. We deserialize each object's extraoptions JSON during the transform phase, extract named key-value pairs, and create corresponding custom fields on the Odoo destination model using ir.model.fields before writing values. Field-type mismatches (e.g., file paths stored as text in Dolibarr extraoptions) are flagged for the customer's Odoo administrator to resolve as attachments or links post-migration. This step requires the most manual review of any mapping object.
| Dolibarr ERP | Odoo ERP | Compatibility | |
|---|---|---|---|
| Third Party (Company/Customer/Supplier) | Partner1:1 | Fully supported | |
| Product (llx_product) | Product Template + Product Variant1:1 | Fully supported | |
| Commercial Proposal (llx_proposal) | Sale Order1:1 | Fully supported | |
| Customer Order (llx_commande) | Sale Order1:1 | Fully supported | |
| Invoice (llx_facture) | Account Move (Invoice)1:1 | Fully supported | |
| Project (llx_projet) | Project1:1 | Fully supported | |
| Bank Account (llx_bank) | Account Journal + Bank Accountlossy | Fully supported | |
| Stock Movement (llx_stock_mouvement) | Stock Quant + Stock Move1:1 | Fully supported | |
| User Account (llx_user) | Res Users1:1 | Fully supported | |
| Custom Field (extrafields/extrafields_value via extraoptions JSON) | Ir Model Fields + Custom Column on Destinationlossy | Fully supported |
Gotchas + challenges
Platform-specific issues from each side, plus the pair-specific challenges that don't show up on either platform's page on its own.
Dolibarr ERP gotchas
Foreign key constraint errors on cross-distribution database restore
SQL injection vulnerabilities in version 9.0.1
Custom fields stored as JSON in extraoptions require field-by-field deserialization
Decimal precision and rounding configuration affects price fields
No native iOS/Android app forces reliance on browser
Odoo ERP gotchas
No rollback for CSV imports
External ID conflicts on re-import
Many2many field encoding in CSV imports
Large export timeouts require batching
Version schema drift between Odoo releases
Pair-specific challenges
Migration approach
Discovery and export method selection
We audit the source Dolibarr instance for database type (MySQL or PostgreSQL), version, active modules, record counts per object (Third Parties, Products, Proposals, Orders, Invoices, Projects, Bank accounts), custom field definitions in the extrafields system, and any non-standard numerotation or workflow modules. We determine whether the migration uses the CSV export wizard or direct database access based on record volume and custom field density. Direct database access is preferred for accounts over 5,000 records or heavy custom field usage. The discovery output is a written migration scope with export method, object inventory, and a decimal precision record from Dolibarr's Setup > Limits page.
Odoo instance provisioning and schema preparation
We confirm the destination Odoo version (Community or Enterprise) and provision the target database. We pre-create all custom fields on the destination models (res.partner, product.product, sale.order, account.move, project.project) using the Odoo ir.model.fields API, matching the field types derived from the Dolibarr extraoptions JSON analysis. We configure the decimal precision on monetary fields to match the source settings, create the warehouse and location hierarchy for stock migration, and set up any required sales teams or project stages. Schema changes are validated in a staging Odoo database before production migration begins.
Staging migration and reconciliation
We run a full migration into the staging Odoo database using production-equivalent data volume. The customer's Odoo administrator reconciles record counts against the source Dolibarr export (Third Parties in, Products in, Proposals in, Orders in, Invoices in, Projects in, Stock levels in), spot-checks 25-50 random records for field-level accuracy, and validates that custom field values appear correctly on the destination records. Any mapping corrections, extra field creations, or precision adjustments happen in this phase. Staging sign-off is required before production migration.
Parent-record dependency ordering and pre-import sequencing
We establish the import order required by Odoo's foreign key constraints: Partners first (res.partner provides the parent_id for company contacts), then Products (product.product provides product_id for order and invoice lines), then Sale Orders (for proposals and orders), then Invoices (account.move requires validated sale orders for downstream reference), then Projects and Tasks, then Bank Statements, then Stock Quants. Each phase emits a row-count reconciliation report. Any records with unresolved foreign keys (e.g., a Third Party referencing a non-existent country code) are held in a remediation queue for the customer to correct in the source before the next phase begins.
Production migration with real-time delta handling
We freeze Dolibarr writes at the agreed cutover time, run a final delta export of any records modified since the staging export, apply the same transform pipeline, and import into the production Odoo database. Payment reconciliation links from Dolibarr's llx_paiement_facture table are resolved during the Invoice phase. We use Odoo's XML-RPC API with batch sizes tuned to the server's response latency and any applicable rate limits. After each major object group completes, we emit a reconciliation count. The customer's administrator validates the final totals before declaring the migration complete.
Cutover handoff and attachment inventory
We deliver the attachment path inventory (all Dolibarr filesystem references from llx_document) to the customer's administrator for manual re-attachment to the Odoo filestore. We deliver the document numbering scheme inventory for the administrator to re-implement in Odoo Sequences. We provide a one-week hypercare window for reconciliation issues raised by the customer's team. We do not rebuild Dolibarr Workflow modules or scheduled tasks in Odoo Automations; those are documented separately as a rebuild scope for the customer's Odoo administrator or an Odoo implementation partner.
Platform deep dives
Dolibarr ERP
Source
Strengths
Weaknesses
Odoo ERP
Destination
Strengths
Weaknesses
Complexity grading
Standard ERP migration. 1 of 8 objects need a mapping; the rest are 1:1.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Dolibarr ERP and Odoo ERP.
Object compatibility
1 of 8 objects need a mapping; the rest are 1:1.
Field mapping clarity
Field mapping is derived from defaults — final spec confirmed during the sample migration.
Timeline complexity
8-object category — typical timelines run 2–7 days end-to-end.
API constraints
Dolibarr ERP: Not publicly documented.
Data volume sensitivity
Dolibarr ERP doesn't expose a bulk API — REST + parallelization used for high-volume runs.
Estimator
Rule-based pricing — no per-record fees, no manual quotes. Migrations over 2M records are scoped individually.
Step 1
Pick a category, then your source and destination platforms.
Category
FAQ
Answers to the questions buyers ask most during Dolibarr ERP to Odoo ERP migration scoping. Not seeing yours? Book a call.
Walk through your Dolibarr ERP to Odoo ERP migration with a real engineer — 30 minutes, free, written quote within 24 hours.
Book a free 30 minute consultationAdjacent paths
Other ways to leave Dolibarr ERP
Other ways to arrive at Odoo ERP
Ready when you are
Tell us record counts and timeline. We'll come back with a written quote inside 1 business day — no commitment, no sales pitch.