Phase 0
Decide & Plan
Lock the decisions before any byte moves.
-
Risk if skipped: Undocumented scope produces mid-cutover surprises when a source object has no enabled destination module to receive it.
-
Risk if skipped: Shared hosting with locked php.ini caps your upload_max_filesize and memory_limit and silently blocks large CSV imports later.
-
Risk if skipped: Switching from single to multi-entity after data is loaded requires manual re-keying of entity columns across llx_ tables.
-
Risk if skipped: Importing 7+ years of closed-period invoices into a fresh install bloats llx_facture and the bound journal, slowing month-end forever after.
-
Risk if skipped: Hosting a self-hosted instance outside the EU without documented safeguards triggers GDPR cross-border transfer obligations after go-live.
-
Risk if skipped: Without written success criteria, the migration drifts into a multi-month tail of one-off fixes.
-
Risk if skipped: Cutting over mid-period forces a manual delta reconciliation of partial-month transactions.
Phase 1
Pre-Migration Prep
Make the destination ready and the source clean.
1a. Source-system audit and cleansing
-
Risk if skipped: Duplicate third parties carry forward to duplicate invoices and split AR aging across two records of the same customer.
-
Risk if skipped: Free-text country strings fail to match the llx_c_country dictionary and land as NULL country on third parties.
-
Risk if skipped: DD/MM/YYYY vs MM/DD/YYYY ambiguity silently flips months and creates back-dated invoices.
1b. Destination-system setup
-
Risk if skipped: A sandbox on an older minor build hides import-tool fixes and produces different errors than production.
-
Risk if skipped: Default PHP caps abort large product or invoice-line imports halfway with a generic upload error.
-
Risk if skipped: Importing into a module that is not enabled writes to no table and the rows vanish.
-
Risk if skipped: Changing the default currency after invoices are loaded breaks the multicurrency historical-rate columns.
-
Risk if skipped: Importing into an extra field that does not yet exist drops the column silently in the Dolibarr Import tool.
-
Risk if skipped: Source picklist values with no match in the dictionary land as NULL or as the default fallback, distorting reports.
-
Risk if skipped: Turning Multicurrency on after invoices are loaded leaves historical multicurrency columns NULL and breaks FX reporting.
-
Risk if skipped: Posting journals without periods defined throws 'no open fiscal year' errors and blocks the opening-balance entry.
-
Risk if skipped: An active email-collector fires on every imported invoice and floods customers with go-live emails.
-
Risk if skipped: Without a known-clean snapshot, a failed test load contaminates the prod instance and forces a reinstall.
1c. People prep
-
Risk if skipped: Last-minute writes to the source after the export window create a delta that never gets reconciled.
Phase 2
Source Export
Pull everything you might need in a form you can transform.
-
Risk if skipped: ANSI/Windows-1252 source files corrupt non-ASCII names (é, ñ, ö) on import and require a re-export.
-
Risk if skipped: Re-creating lots manually after invoices reference them produces orphan rows in llx_product_lot.
-
Risk if skipped: Directly writing stock totals bypasses the movement audit trail and breaks future reorder reports.
-
Risk if skipped: Loading invoices without payments leaves every closed invoice showing 'unpaid' and breaks the AR aging.
-
Risk if skipped: Notes loaded without a parent FK end up as orphan rows visible only by direct SQL query.
Phase 3
Transform & Map
Reshape source exports into Dolibarr-ready files.
3a. Mapping spreadsheet
-
Risk if skipped: Without a single mapping source of truth, transforms drift across people and re-runs produce different results.
-
Risk if skipped: Without a stable external ID, a re-run inserts duplicates instead of updating the row from the prior attempt.
3b. Data transformation
-
Risk if skipped: Mixed date formats in one column produce a partial import where some rows convert and some are rejected.
-
Risk if skipped: Comma-decimal stock quantities accept the row but ignore the fractional part, dropping inventory accuracy.
-
Risk if skipped: Windows-1252 or Latin-1 source files corrupt diacritics on import and the corruption is invisible until a customer sees their name wrong.
-
Risk if skipped: An unescaped comma in a company name shifts every downstream column by one and corrupts the row silently.
3c. Relationships and audit trail
-
Risk if skipped: Children loaded without a resolvable parent ref end up orphaned and invisible to the parent's tabs.
-
Risk if skipped: Reports filtered by datec will look like the entire business was founded on import day.
-
Risk if skipped: External links break when the source storage is decommissioned; binaries imported into the wrong path are invisible in the document tabs.
3d. ERP-specific transforms
-
Risk if skipped: Unmapped accounts default to a suspense or NULL account and silently distort the trial balance.
-
Risk if skipped: Including a YTD net-income line double-counts current-year profit once posted invoices arrive.
-
Risk if skipped: Loading only the trial-balance AR total leaves you with no per-invoice aging and no way to apply incoming payments cleanly.
-
Risk if skipped: Seeding stock by direct UPDATE to llx_product_stock bypasses the movement audit trail and breaks future stock corrections.
-
Risk if skipped: Using today's FX rate on historical invoices distorts every realized/unrealized FX gain or loss for the year.
-
Risk if skipped: Posting into a period that is not defined throws an error and stops the load mid-file.
-
Risk if skipped: Mass-marking invoices paid without allocation files breaks the audit chain between payment and invoice.
Phase 4
Sandbox Test Migration
Surface every problem in the sandbox.
-
Risk if skipped: Skipping the simulator means errors only surface after partial writes, leaving the table in a mixed state.
-
Risk if skipped: Encoding bugs surface as garbled names on customer-visible PDFs after go-live.
-
Risk if skipped: An out-of-balance opening journal blocks subsequent posted invoices from reconciling cleanly.
-
Risk if skipped: Comma-decimal sneaks back in and Dolibarr stores 1 instead of 1.36, dropping inventory accuracy.
-
Risk if skipped: Wrong subdirectory paths leave binaries on disk but invisible in the UI.
-
Risk if skipped: An untimed cutover is a guess; a 90-minute estimated load that runs 6 hours blows the freeze window.
-
Risk if skipped: Skipping sign-off lets unresolved sandbox issues recur in production where they cost more to fix.
Phase 5
Production Cutover
Execute the load in a tightly sequenced window.
-
Risk if skipped: A late source write creates an invoice that exists in the source but not in the destination after cutover.
-
Risk if skipped: An active job that triggers on invoice creation fires on every imported row and sends thousands of emails.
-
Risk if skipped: Loading invoices before third parties produces orphan invoices that cannot be edited until the third party arrives.
-
Risk if skipped: Insert-only mode on a re-run creates duplicate invoices that double the AR balance.
-
Risk if skipped: Pushing through a count mismatch buries the bug under three more loads.
Phase 6
Validate
Prove the migration before users get in.
-
Risk if skipped: A silent five-row drop in invoice lines distorts revenue for the period until someone notices in the close.
-
Risk if skipped: A non-zero delta in the trial balance is a hard blocker for the first close on Dolibarr.
-
Risk if skipped: Direct UPDATE to llx_product_stock to mask a delta hides the underlying transform bug and corrupts the audit trail.
-
Risk if skipped: Workflow-level bugs only surface during real use; finding them after go-live is 10x more expensive.
Phase 7
Post-Migration Cleanup
Close out cleanly so the team can move on.
-
Risk if skipped: Decommissioning the source the same day as cutover removes the ability to diff against it when a reconciliation question arises.
-
Risk if skipped: An untested backup is a hope, not a backup; the first restore attempt always finds the missing file.
-
Risk if skipped: Without archived exports, a year-end audit question about a migrated transaction has no source of truth to reference.
Watch list
Risks to track throughout
These risks live across multiple phases — keep an eye on them from kickoff through cutover.
-
PHP and MySQL/MariaDB resource limits silently cap import size
Dolibarr's Import tool and document uploads all run through PHP. Default upload_max_filesize, post_max_size, memory_limit, and max_execution_time abort large files with generic errors that look like data problems but are infrastructure problems. Track these limits from Phase 1 and re-verify whenever the host applies an OS update.
-
Module-toggle architecture means imports into disabled modules disappear
Every feature in Dolibarr is a module enabled at Settings → Modules. A CSV with stock data uploaded while the Stocks module is disabled hits no table and the rows vanish without a hard error. Audit the enabled-module list once in Phase 1 and again immediately before each Phase 5 load step.
-
Encoding and decimal-separator drift between source locale and Dolibarr
Latin-1 source files corrupt diacritics on import; European-locale comma-decimal numerics produce stock and currency rounding that looks like data corruption. Force every transformed file to UTF-8 without BOM and dot-decimal in Phase 3, and add a Phase 4 sandbox test specifically for non-ASCII third parties and fractional stock quantities.
-
Opening-balance journal and historical posted documents can double-count
If the opening-balance journal includes current-year P&L lines and you also import the current-year invoices, the income is counted twice. Either snapshot opening balances at fiscal-year-end and import current-year documents fresh, or skip the current-year P&L lines in the opening journal. Decide in Phase 0 and verify the trial balance ties in both Phase 4 sandbox and Phase 6 production.
Pair this with the long-form guide
The complete Dolibarr ERP migration guide
Same research, written as prose: data model, import mechanisms, mapping strategy, pitfalls, and partner landscape.