ERP migration
Field-level mapping, validation, and rollback between Sage 500 and Dolibarr ERP. We move data and schema; workflows are rebuilt natively in Dolibarr ERP.
Sage 500
Source
Dolibarr ERP
Destination
Compatibility
11 of 13
objects map 1:1 between Sage 500 and Dolibarr ERP.
Complexity
BStandard
Timeline
5-8 weeks
Overview
Moving from Sage 500 to Dolibarr is a structural migration from a tightly normalized, legacy on-premise ERP to a modular open-source ERP that runs on PHP and MySQL or PostgreSQL. Sage 500 stores data across dozens of normalized SQL Server tables with no public API, requiring direct database reads with multi-table JOINs to assemble complete records. Dolibarr organizes its data in flatter, module-scoped tables with a REST API and CSV import utilities available for most core objects. We extract from Sage 500 via read-only SQL access, stage the data in normalized intermediate CSVs, resolve dependencies (Customer before Invoice, Account before Journal Entry), and load into Dolibarr's modules in dependency order. Crystal Reports templates, SQL Agent jobs, and server-level EDI configurations are non-portable artifacts that we document for the customer's IT team to rebuild in Dolibarr's equivalent reporting and scheduling tools. Invoicing and accounting data constitute the most sensitive portion of any Sage-to-Dolibarr migration; the FEC export standard informs how we structure journal entry imports.
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.
Why teams make this switch
Leaving
What's pushing teams away
Choosing
What's pulling them in
Object mapping
Each row shows how a Sage 500 object lands in Dolibarr ERP, including any object-level transformations, lookup resolution, or schema-design dependencies.
Typical mapping — final map is confirmed during the sample migration step.
Sage 500
Chart of Accounts (GL Accounts)
Dolibarr ERP
Plan comptable (Chart of Accounts)
1:1Sage 500 GL Account codes and segment structures map to Dolibarr's accounting module (comptabilité). We extract account codes, account types (Asset, Liability, Equity, Revenue, Expense), and the segment structure from the GL_Account table and map them to Dolibarr's llx_accounting_account table. Multi-segment accounts in Sage 500 (e.g., DEPT-PRODUCT-REGION) are flattened or preserved as sub-account hierarchies depending on the destination chart configuration. The customer selects or provides a compatible French plan comptable or a custom chart before migration begins.
Sage 500
Customer and Vendor Master
Dolibarr ERP
ThirdParty (with Prospect/Supplier flags)
1:1Sage 500 IM_Customer and AP_Vendor tables map to Dolibarr llx_societe with the client and fournisseur flags set independently. We extract billing address, shipping address, payment terms, 1099 configuration, credit limits, and tax registration numbers. Sage 500's separate customer and vendor records become two entries in llx_societe with the appropriate type flags. Customer email, phone, and website map to Dolibarr's contact and address fields. Any Sage 500 customer-to-vendor relationship (a vendor that is also a customer) is preserved as two linked ThirdParty records.
Sage 500
Open AR / Customer Invoices
Dolibarr ERP
Facture client (Customer Invoice)
1:1Sage 500's open receivables and historical customer invoices map to Dolibarr llx_facture with type = Facture (customer). We extract invoice header fields (invoice number, date, due date, total, status) and line items (description, quantity, unit price, tax rate, discount) from the RM_InvoiceHeader and RM_InvoiceDetail tables. The Sage 500 aging bucket configuration maps to Dolibarr's payment terms and overdue handling. Paid invoices are imported with their payment status and date; open invoices are imported as open and reconciled against cash receipts during the AP/AR reconciliation phase.
Sage 500
Open AP / Vendor Invoices
Dolibarr ERP
Facture fournisseur (Supplier Invoice)
1:1Sage 500's open payables and historical vendor invoices map to Dolibarr llx_facture_fourn with type = Facture fournisseur. We extract vendor invoice number, invoice date, due date, amount, and line items from the AP_InvoiceHeader and AP_InvoiceDetail tables. The payment terms from the vendor master propagate to each invoice record. Vendor invoice status (open, paid, partially paid) is preserved so that the customer's AP team can continue the payment lifecycle in Dolibarr without re-keying.
Sage 500
Sales Order
Dolibarr ERP
Commande client (Customer Order)
1:1Sage 500 SO_OrderHeader and SO_OrderDetail tables map to Dolibarr llx_commande with origin = Order. We assemble the order by JOINing header, detail, and warehouse assignment tables to produce complete records. Order status (open, shipped, invoiced, cancelled), fulfillment dates, backorder flags, and line-level pricing migrate. An order that has already been invoiced in Sage 500 is linked to the migrated invoice record via Dolibarr's order-to-invoice relationship field.
Sage 500
Purchase Order
Dolibarr ERP
Commande fournisseur (Supplier Order)
1:1Sage 500 PO_OrderHeader and PO_OrderDetail tables map to Dolibarr llx_commande_fournisseur. We preserve PO number, vendor reference, order date, expected delivery date, and line items with quantities and pricing. Status migration covers entered, approved, received, invoiced, and closed. Line items that have been partially received are flagged with received quantities so that the receiving team in Dolibarr can close the remainder against actual receipts.
Sage 500
Inventory Item
Dolibarr ERP
Product (with stock module enabled)
1:1Sage 500 IM_ItemMaster and IM_ItemWarehouse tables map to Dolibarr llx_product with the produittype field set to Product (stockable). We extract item code, description, costing method (standard, average, FIFO, LIFO), on-hand quantities by warehouse, reorder point, and unit of measure. Multi-warehouse setups require us to create one Dolibarr warehouse per Sage 500 site and link item locations accordingly. If Sage 500 uses LIFO or FIFO layers, we confirm the destination Dolibarr installation's costing engine configuration before committing to a cost-carryover strategy; standard cost environments extract cleanly.
Sage 500
Fixed Asset
Dolibarr ERP
Product (asset tracking) or Asset module
1:1Sage 500 FA_Asset records include acquisition date, cost, depreciation schedule, accumulated depreciation, book value, and asset class. We extract the full depreciation history. Dolibarr's Asset module (activated separately in newer versions) handles asset tracking with acquisition cost, amortization types (linear, declining), and disposal records. If the destination Dolibarr instance does not have the Asset module enabled, we map Fixed Assets to Products with the type set to Asset and preserve depreciation fields in custom ExtraFields. The customer must confirm the asset module version before migration scope is finalized.
Sage 500
General Ledger Journal Entry
Dolibarr ERP
Écriture comptable (Accounting Entry)
1:1Sage 500 GL_Batch and GL_Distributions tables map to Dolibarr llx_accountingbookkeeping (or llx_acc_mouvement depending on version). We extract batch number, posting date, source module (AP, AR, Inventory, Manufacturing), and all distribution lines with account code, debit amount, and credit amount. The journal entry must be posted to a named journal (Ventes, Achats, Banque, etc.) in Dolibarr's accounting module. Sage 500's FEC-compatible export informs how we structure the debit/credit mapping for French regulatory compliance if the destination is a French entity.
Sage 500
Bank and Cash Account
Dolibarr ERP
Compte bancaire (Bank Account)
1:1Sage 500 bank module records map to Dolibarr llx_bank and llx_bank_account. We extract bank account codes, bank names, GL account linkages (each bank account reconciles to a GL account in llx_accounting_account), and any existing bank reconciliation records. The reconciliation state (reconciled date and batch) is preserved so that the customer's accounting team can continue bank reconciliation from the last reconciled point in Sage 500.
Sage 500
Tax Code and Rate
Dolibarr ERP
VAT/-tax configuration
lossySage 500 tax codes (TX_TaxCode, TX_TaxRate) are jurisdiction-specific configurations that map to Dolibarr's llx_c_tva table. We extract the tax code mappings and rate assignments from the tax configuration tables, but customer-specific tax exemptions and nexus-specific rules are configuration items that the customer's accountant must set up in Dolibarr's tax regime configuration before invoices are generated. We deliver a tax code mapping table as part of the migration handoff document.
Sage 500
User Defined Field (UDF)
Dolibarr ERP
ExtraFields
lossySage 500 UDFs are configured per company at the document level (SO, PO, Invoice, Item) and stored in extended columns on the base table or in separate UDF tables. We inventory all active UDFs during scoping, map their data types to Dolibarr ExtraField types (varchar, int, float, datetime, select, checkbox), and create the ExtraField definitions in Dolibarr's llx_extrafields table before the relevant objects are imported. UDF values are loaded in the same import batch as the parent record.
Sage 500
Department and Cost Center
Dolibarr ERP
Project or Accounting Auxiliary Account
1:1Sage 500 segment values (departments, cost centers, projects) used as GL dimensions map to Dolibarr's llx_projet table for project-level tracking or to auxiliary accounting accounts (comptes analytiques) if the customer uses Dolibarr's analytical accounting module. We extract all active segment values and map them to the chosen destination. If the destination uses a different segment structure or no analytical accounting at all, we document the gap and flag it for the customer's finance team to resolve before go-live.
| Sage 500 | Dolibarr ERP | Compatibility | |
|---|---|---|---|
| Chart of Accounts (GL Accounts) | Plan comptable (Chart of Accounts)1:1 | Fully supported | |
| Customer and Vendor Master | ThirdParty (with Prospect/Supplier flags)1:1 | Fully supported | |
| Open AR / Customer Invoices | Facture client (Customer Invoice)1:1 | Fully supported | |
| Open AP / Vendor Invoices | Facture fournisseur (Supplier Invoice)1:1 | Fully supported | |
| Sales Order | Commande client (Customer Order)1:1 | Fully supported | |
| Purchase Order | Commande fournisseur (Supplier Order)1:1 | Fully supported | |
| Inventory Item | Product (with stock module enabled)1:1 | Fully supported | |
| Fixed Asset | Product (asset tracking) or Asset module1:1 | Fully supported | |
| General Ledger Journal Entry | Écriture comptable (Accounting Entry)1:1 | Fully supported | |
| Bank and Cash Account | Compte bancaire (Bank Account)1:1 | Fully supported | |
| Tax Code and Rate | VAT/-tax configurationlossy | Fully supported | |
| User Defined Field (UDF) | ExtraFieldslossy | Fully supported | |
| Department and Cost Center | Project or Accounting Auxiliary Account1:1 | 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.
Sage 500 gotchas
Direct SQL access is required for data extraction
Relational schema requires complex multi-table extraction
Custom Crystal Reports templates are file-based, not database-stored
SQL Agent jobs and scheduled tasks are not part of the company database
Inventory costing method determines whether historical costs can be reproduced
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
Pair-specific challenges
Migration approach
Database access and SQL scoping
We confirm read-only SQL Server access to the Sage 500 company database. The customer provisions a SQL login with db_datareader permissions or grants access through Sage's DBA security roles. We run a schema inventory query against the Sage 500 system tables to map table relationships, confirm which company database is in scope (multi-company deployments have separate databases), and identify any custom tables or UDF columns added by the customer's VAR. If the customer has lost sa-level access or lacks a SQL DBA, we flag this as a pre-scoping blocker and recommend recovering database access through Sage's standard support channel before migration scoping begins.
Object inventory and data quality audit
We run row-count queries across all core Sage 500 tables (GL_Account, IM_Customer, AP_Vendor, SO_OrderHeader, PO_OrderHeader, RM_InvoiceHeader, AP_InvoiceHeader, IM_ItemMaster, FA_Asset, GL_Batch) and produce a data quality report covering null rates on key fields, duplicate account codes, orphaned records (invoices without a customer, orders without a vendor), and date-range coverage for historical transactions. We also inventory active UDFs and Crystal Reports files on the server. The data quality report determines whether cleaning is required before migration and shapes the extraction script complexity.
Dolibarr destination setup and accounting module configuration
We configure the destination Dolibarr instance before any data is loaded. This includes activating the required modules (ThirdParty, Invoice, Order, Supplier Order, Stock, Accounting, Bank, Project, and any Asset module), setting the chart of accounts (French plan comptable or custom), configuring VAT/tax rates from the mapped tax code table, defining payment terms, and creating warehouse records to map against Sage 500 site locations. We also create the ExtraField definitions for any migrated UDFs at this stage. The Dolibarr instance can be fresh-installed on a LAMP/LEMP stack or restored from a baseline backup provided by the customer.
Custom SQL extraction and staging CSV generation
We write custom SQL extraction scripts for each object family. Each script JOINs the normalized Sage 500 tables to produce a flat, de-normalized staging record matching the target Dolibarr import schema. Scripts are written per object: GL Accounts (with segment parsing), ThirdParties (Customers and Vendors in a single pass with type flags), Invoices (AR and AP with line items), Orders (SO and PO with line items), Inventory Items (with warehouse quantity splits), Fixed Assets (with depreciation schedules), and GL Journal Entries (balanced debit/credit lines). We run each script against a read-only database connection and emit a staging CSV with a row-count reconciliation against the Sage 500 source counts.
Dependency-ordered import into Dolibarr
We import into Dolibarr in strict dependency order: Chart of Accounts first (required by the accounting module), then ThirdParties (Customers and Vendors resolve before invoices and orders), then Warehouses (resolve before inventory), then Inventory Items (with on-hand quantities), then Fixed Assets, then Open AP and AR invoices (with payment status), then historical Sales Orders and Purchase Orders, then GL journal entries (balanced per transaction), then Bank accounts and reconciliation records. Each phase emits a row-count reconciliation report. Import is staged through Dolibarr's CSV import utilities or direct MySQL/PostgreSQL INSERT with foreign-key validation disabled temporarily to avoid blocked inserts, then re-enabled for the next phase.
Delta migration, validation, and handoff
We run a final delta migration of any Sage 500 records modified during the active migration window (new invoices, updated orders, new payments received). We perform a spot-check reconciliation on a sample of 30-50 records per object, comparing Sage 500 source values against Dolibarr destination values. We verify that AP and AR aging balances match between systems, that inventory on-hand quantities reconcile by warehouse, and that the chart of accounts total debits equal total credits in the accounting module. We deliver the complete migration handoff document: the SQL extraction scripts, staging CSV samples, tax code mapping table, Crystal Reports and SQL Agent job inventory, and the UDF-to-ExtraField mapping. We do not rebuild Crystal Reports templates, SQL Agent jobs, or EDI agents; those are documented for the customer's IT and finance teams to reconstruct in Dolibarr.
Platform deep dives
Sage 500
Source
Strengths
Weaknesses
Dolibarr ERP
Destination
Strengths
Weaknesses
Complexity grading
Standard ERP migration. All 8 core objects map 1:1 between Sage 500 and Dolibarr ERP.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Sage 500 and Dolibarr ERP.
Object compatibility
All 8 core objects map 1:1 between Sage 500 and Dolibarr ERP.
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
Sage 500: Not applicable — extraction performance is bounded by the customer's SQL Server hardware, not a published quota.
Data volume sensitivity
Sage 500 exposes a bulk API — large-volume migrations stream efficiently.
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 Sage 500 to Dolibarr ERP migration scoping. Not seeing yours? Book a call.
Walk through your Sage 500 to Dolibarr 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 Sage 500
Other ways to arrive at Dolibarr 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.