ERP migration
Field-level mapping, validation, and rollback between Sales ERP and Dolibarr ERP. We move data and schema; workflows are rebuilt natively in Dolibarr ERP.
Sales ERP
Source
Dolibarr ERP
Destination
Compatibility
10 of 12
objects map 1:1 between Sales ERP and Dolibarr ERP.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Moving from Sales ERP to Dolibarr is a shift from a tiered-per-user Salesforce licensing model to a free open-source ERP with a modular activation architecture. Sales ERP uses the Salesforce object model (Accounts, Contacts, Opportunities, Orders, Contracts) accessible via REST and Bulk API 2.0; Dolibarr uses its own schema centered on Third Parties, Products, Orders, and Contracts with relationships stored in the llx_element_element table. We extract from Salesforce respecting per-org API rate limits (1,000 to 100,000 calls per day depending on license tier), transform the object model to Dolibarr's structure, and import through Dolibarr's native import interface or database-direct insertion where module activation is confirmed. Workflows, Flows, approval processes, and AppExchange packages do not migrate; we deliver a written inventory of every automation requiring rebuild in Dolibarr's native action system or third-party module alternatives. Historical transactions and closed Orders require explicit scoping because ERP migrations routinely drop them to cut implementation scope.
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 Sales ERP 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.
Sales ERP
Account
Dolibarr ERP
Third Party (llx_societe)
1:1Salesforce Account records map to Dolibarr llx_societe (Third Party) with client=1 for customer accounts and supplier=1 for vendor accounts. The Account Name becomes nom, Website maps to url, Phone maps to phone, and Address fields map to address, zip, town, country. Parent Account hierarchy in Salesforce maps to parent_id on llx_societe if Dolibarr's multi-company module is activated. We preserve the original Salesforce Account ID in a custom field ref_ext for audit traceability and for resolving any downstream cross-object references.
Sales ERP
Contact
Dolibarr ERP
Contact (llx_socpeople)
1:1Salesforce Contact records map to Dolibarr llx_socpeople linked to a parent Third Party via fk_soc. LastName maps to lastname, FirstName to firstname, Email to email, Phone to phone, and Title to civilite (using Dolibarr's civilite lookup). The Account-Contact relationship resolves to fk_soc at migration time after the parent Third Party is created. Salesforce's Account Contact Relation object maps to multiple Contact records under a single Third Party in Dolibarr.
Sales ERP
Opportunity
Dolibarr ERP
Commercial Proposal or Order
lossySalesforce Opportunity records require a design decision during scoping: open pipeline opportunities map to Dolibarr llx_propal (Commercial Proposal) with status=draft or status=open; won opportunities that require fulfillment map to llx_commande (Order). The Opportunity name becomes ref or label, Amount maps to amount, CloseDate maps to fin_validite (validity end date) on proposals, and Stage maps to a Dolibarr status field. Lost opportunities are migrated as closed proposals with status=0 (draft) and a note field capturing the loss reason. We flag this decision at scoping because it affects the CRM reporting structure in Dolibarr.
Sales ERP
Order
Dolibarr ERP
Order (llx_commande)
1:1Salesforce Order records map to Dolibarr llx_commande with Order Number as ref, Account linked via fk_soc, and OrderStatus mapped to Dolibarr's statut field (draft, validated, approved, shipped, delivered, cancelled). Order effective dates map to date_creation and date_delivery. We flag when Salesforce OrderStatus includes values (e.g., Activated, In Progress) that have no direct Dolibarr equivalent and propose a status mapping table during scoping.
Sales ERP
Contract
Dolibarr ERP
Contract (llx_contrat)
1:1Salesforce Contract records map to Dolibarr llx_contrat linked to the Third Party via fk_soc. Contract Number becomes ref, Status maps to statut, StartDate and EndDate map to date_creation and date_fin_validite. Contract line items (if implemented via custom fields or a managed package) map to llx_contratdet rows. Renewal terms in Salesforce map to fk_contrat for renewal-linked contracts if Dolibarr's contracts module is configured with the renewal extension.
Sales ERP
Product2
Dolibarr ERP
Product (llx_product)
1:1Salesforce Product2 records map to Dolibarr llx_product with product name as label, ProductCode as ref, and IsActive controlling the finished or stock status. The Salesforce IsActive flag maps to Dolibarr's finished=1 for sellable products. We validate that all products have a barcode or product code before import to avoid Dolibarr's unique constraint violations on the ref field.
Sales ERP
PricebookEntry
Dolibarr ERP
Product Price (llx_product_price)
1:1Salesforce PricebookEntry records map to Dolibarr llx_product_price linked to the product via fk_product and optionally to a price level via fk_price_list. UnitPrice maps to price, CurrencyIsoCode maps to currency if Dolibarr's multi-currency module is activated, and IsActive determines whether the price row is included. Custom Price Books require explicit mapping during scoping because Dolibarr's price list structure differs from Salesforce's Pricebook model.
Sales ERP
OrderItem
Dolibarr ERP
Order Line (llx_commandedet)
1:1Salesforce Order Products (OrderItems) map to Dolibarr llx_commandedet lines linked to the parent Order via fk_commande and to the Product via fk_product. Quantity maps to qty, UnitPrice maps to unit price, and TotalLineAmount maps to total_ht. We resolve the product reference and price list at migration time before inserting lines. If Salesforce OrderItems reference a PricebookEntry that does not exist in the destination, we flag it for manual price list configuration.
Sales ERP
Case
Dolibarr ERP
Ticket or Intervention (llx_ticket)
1:1Salesforce Case records map to Dolibarr llx_ticket (if the Ticket module is activated) or llx_actioncomm with type=action and label=ticket. Case Subject maps to subject, Description maps to note_private, Priority maps to priority, and Status maps to statut. The Contact on Case resolves to fk_socpeople after the Contact mapping is complete. Cases without an associated Contact link to the parent Third Party via fk_soc if no contact is available.
Sales ERP
User
Dolibarr ERP
User (llx_user)
1:1Salesforce User records map to Dolibarr llx_user by email match. Active Salesforce users become Dolibarr users with a mapped Profile (admin, sales agent, or readonly). Deactivated Salesforce users are not migrated by default to avoid license waste in Dolibarr. Owners without a matching Dolibarr user are held in a reconciliation queue for the customer's admin to provision before record import resumes.
Sales ERP
Custom Object (__c)
Dolibarr ERP
Custom Table or Extra Fields
lossySalesforce custom objects require a case-by-case migration design. If the custom object is simple (name, date, number fields), we create a Dolibarr extra fields definition on the equivalent standard object (Third Party, Contact, or Product) via Dolibarr's Extra fields module. For complex custom objects with lookup relationships, we design a custom MySQL table in the Dolibarr database with corresponding fk_* foreign keys and map records accordingly. This requires developer access to Dolibarr's database schema and is scoped as a separate configuration item during discovery.
Sales ERP
Attachment
Dolibarr ERP
Document (llx_document)
1:1Salesforce Attachment records linked to Accounts, Contacts, Opportunities, and Orders migrate as Dolibarr documents attached via the llx_element_element cross-reference table. Base64-encoded attachment Body from Salesforce decodes to a file stored in Dolibarr's documents directory, with the original filename preserved and the element_type and element_id linking to the parent record. We validate UTF-8 encoding and file size limits before insertion to avoid Dolibarr's document storage constraints.
| Sales ERP | Dolibarr ERP | Compatibility | |
|---|---|---|---|
| Account | Third Party (llx_societe)1:1 | Fully supported | |
| Contact | Contact (llx_socpeople)1:1 | Fully supported | |
| Opportunity | Commercial Proposal or Orderlossy | Fully supported | |
| Order | Order (llx_commande)1:1 | Fully supported | |
| Contract | Contract (llx_contrat)1:1 | Fully supported | |
| Product2 | Product (llx_product)1:1 | Fully supported | |
| PricebookEntry | Product Price (llx_product_price)1:1 | Fully supported | |
| OrderItem | Order Line (llx_commandedet)1:1 | Fully supported | |
| Case | Ticket or Intervention (llx_ticket)1:1 | Fully supported | |
| User | User (llx_user)1:1 | Fully supported | |
| Custom Object (__c) | Custom Table or Extra Fieldslossy | Fully supported | |
| Attachment | Document (llx_document)1: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.
Sales ERP gotchas
API rate limits cap daily call volume by license tier
Historical data is often left behind to cut implementation scope
Custom object attachments require Base64 encoding
Object relationships break silently without ID preservation
Data quality issues derail migration timelines
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
Discovery and environment readiness
We audit the source Sales ERP org across edition tier, API call allocation, standard and custom objects, active workflows and Flows, and record volumes per object. We simultaneously assess the destination Dolibarr instance for module activation status, PHP memory limits, database capacity, and hosting environment (self-hosted, cloud provider, or Dolibarr cloud subscription). The discovery output is a written migration scope document that identifies which Salesforce objects map to which Dolibarr tables, which modules must be activated, and whether Salesforce API rate limits require a temporary license upgrade for the extraction phase.
Schema design and relationship mapping
We design the Dolibarr destination schema based on the migration scope. This includes activating the required Dolibarr modules (Third Parties, Contacts, Commercial proposals, Orders, Contracts, Products, Tickets, Projects), configuring country and currency settings, setting up the price list structure, and designing any custom database tables for Salesforce custom objects. We document the llx_element_element link strategy for cross-object relationships and validate that Dolibarr's extra fields framework is sufficient for any Salesforce custom fields that do not map to standard Dolibarr columns.
Sandbox migration and reconciliation
We run a full migration into a staging copy of the Dolibarr instance (a separate test database or a separate Dolibarr installation) using production-like data volumes. The customer's operations lead reconciles record counts, spot-checks 25-50 records against the Salesforce source, and validates that Third Party-Contact-Order relationships are correctly represented in llx_element_element. Any mapping corrections happen in this phase. Salesforce API rate limit behavior is also validated here to calibrate batch sizing for the production extraction.
User reconciliation and owner provisioning
We extract every distinct Salesforce Owner referenced on Account, Contact, Opportunity, Order, and Contract records and match by email against the Dolibarr destination's llx_user table. Owners without a matching Dolibarr user are placed in a reconciliation queue. The customer's admin provisions any missing users in Dolibarr with appropriate rights (admin, sales representative, readonly) before record migration resumes. Migration cannot proceed past this step because owner references in Dolibarr's Actioncomm and llx_element_element tables require valid fk_user values.
Production migration in dependency order
We run production migration in record-dependency order: Third Parties (from Salesforce Accounts), Contacts (with fk_soc resolved to the parent Third Party), Products (from Product2), Order headers (from Salesforce Orders), Order lines (with fk_product resolved), Contracts, Commercial proposals for open pipeline opportunities, and Tickets (from Cases). Attachments and documents migrate after their parent records using Dolibarr's file storage structure. Each phase emits a row-count reconciliation report before the next phase begins. Salesforce custom objects migrate last after standard object dependencies are satisfied.
Cutover, validation, and automation handoff
We freeze Salesforce writes during the cutover window, run a final delta migration of any records modified during the migration period, then designate Dolibarr as the system of record. We validate relationship integrity by running a cross-reference check between llx_element_element and the linked object row counts. We deliver a written inventory of every active Salesforce Flow, Approval Process, and workflow with its trigger, conditions, and actions, plus a recommendation for rebuilding equivalent behavior in Dolibarr (native module configuration, third-party module, or custom PHP development). We do not rebuild Flows as Dolibarr automations inside the migration scope; that is a separate engagement. We support a one-week hypercare window for reconciliation issues raised by the customer's team.
Platform deep dives
Sales ERP
Source
Strengths
Weaknesses
Dolibarr ERP
Destination
Strengths
Weaknesses
Complexity grading
Standard ERP migration. All 8 core objects map 1:1 between Sales ERP and Dolibarr ERP.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Sales ERP and Dolibarr ERP.
Object compatibility
All 8 core objects map 1:1 between Sales ERP 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
Sales ERP: 1,000 to 100,000 API calls per day depending on license tier; concurrent request limits also apply.
Data volume sensitivity
Sales ERP 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 Sales ERP to Dolibarr ERP migration scoping. Not seeing yours? Book a call.
Walk through your Sales ERP 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 Sales ERP
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.