ERP migration checklist

Migration Checklist: Moving to Dolibarr

An 8-phase task list for migrating an existing ERP or accounting system into a self-hosted or DoliCloud Dolibarr instance using its module architecture and Import tool.

124 tasks 4–16 weeks typical Updated May 27, 2026
Dolibarr ERP
Chart of Accounts
Customers
Vendors
Items
Transactions
Inventory
0 of 124 tasks complete

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.