ERP migration

Migrate from Sales ERP to Dolibarr ERP

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 logo

Sales ERP

Source

Dolibarr ERP

Destination

Dolibarr ERP logo

Compatibility

83%

10 of 12

objects map 1:1 between Sales ERP and Dolibarr ERP.

Complexity

BStandard

Timeline

3-5 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

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.

Field-level fidelity

Every standard and custom field arrives verified.

Schema-aware mapping

AI proposes the map; you confirm before any record moves.

Relationships preserved

Parent–child, lookups, and ownership stay linked.

Full activity history

Calls, emails, meetings — with original timestamps.

Attachments & notes

Documents, uploads, and inline notes move with the record.

Why teams make this switch

Two sides of the same decision

Leaving

Sales ERP logo

Sales ERP

What's pushing teams away

  • The total cost of ownership—licenses plus implementation consulting, data migration, and ongoing admin overhead—regularly exceeds initial estimates by 50% or more, driving teams to seek simpler alternatives.
  • The complexity of Salesforce's data model and administration layer creates a steep learning curve, leading to reliance on dedicated admins and creating organizational risk when staff turn over.
  • API rate limits on lower-tier licenses can throttle integrations and migration throughput, forcing expensive license upgrades to accommodate data-heavy workflows.
  • Custom objects, industry-cloud extensions, and third-party AppExchange packages accumulate technical debt that makes future migrations or platform switches prohibitively complex.

Choosing

Dolibarr ERP logo

Dolibarr ERP

What's pulling them in

  • Free open-source core with no per-user license fee makes it the lowest-cost entry point for small teams needing ERP and CRM in one package.
  • Self-hosted deployment gives full data ownership and eliminates vendor lock-in, especially attractive to businesses with compliance requirements.
  • Modular architecture means teams enable only the features they use, keeping the interface uncluttered and reducing learning curve.
  • Fast installation with no technical knowledge required — one reviewer set up multiple businesses in minutes using their own hosting.
  • Active community forum and marketplace of third-party add-ons provide support and extension options without mandatory subscription costs.

Object mapping

How Sales ERP objects map to Dolibarr ERP

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

maps to

Dolibarr ERP

Third Party (llx_societe)

1:1
Fully supported

Salesforce 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

maps to

Dolibarr ERP

Contact (llx_socpeople)

1:1
Fully supported

Salesforce 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

maps to

Dolibarr ERP

Commercial Proposal or Order

lossy
Fully supported

Salesforce 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

maps to

Dolibarr ERP

Order (llx_commande)

1:1
Fully supported

Salesforce 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

maps to

Dolibarr ERP

Contract (llx_contrat)

1:1
Fully supported

Salesforce 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

maps to

Dolibarr ERP

Product (llx_product)

1:1
Fully supported

Salesforce 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

maps to

Dolibarr ERP

Product Price (llx_product_price)

1:1
Fully supported

Salesforce 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

maps to

Dolibarr ERP

Order Line (llx_commandedet)

1:1
Fully supported

Salesforce 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

maps to

Dolibarr ERP

Ticket or Intervention (llx_ticket)

1:1
Fully supported

Salesforce 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

maps to

Dolibarr ERP

User (llx_user)

1:1
Fully supported

Salesforce 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)

maps to

Dolibarr ERP

Custom Table or Extra Fields

lossy
Fully supported

Salesforce 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

maps to

Dolibarr ERP

Document (llx_document)

1:1
Fully supported

Salesforce 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.

Gotchas + challenges

What specifically takes care here

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 logo

Sales ERP gotchas

High

API rate limits cap daily call volume by license tier

High

Historical data is often left behind to cut implementation scope

Medium

Custom object attachments require Base64 encoding

Medium

Object relationships break silently without ID preservation

Medium

Data quality issues derail migration timelines

Dolibarr ERP logo

Dolibarr ERP gotchas

High

Foreign key constraint errors on cross-distribution database restore

High

SQL injection vulnerabilities in version 9.0.1

Medium

Custom fields stored as JSON in extraoptions require field-by-field deserialization

Medium

Decimal precision and rounding configuration affects price fields

Low

No native iOS/Android app forces reliance on browser

Pair-specific challenges

  • Dolibarr module activation must precede data import

    Dolibarr ships with a core set of features disabled by default; the Third Party, Contact, Product, Order, Contract, and Ticket modules must be explicitly activated in Setup > Modules before any data can be imported into those tables. If the modules are not activated, imports into llx_societe, llx_socpeople, llx_product, llx_commande, llx_contrat, or llx_ticket will either fail silently or produce unexpected behavior. We activate all required modules during the pre-migration environment check and verify that the activation persists across any Dolibarr version upgrades before data ingestion begins.

  • Historical transactions are routinely excluded from ERP migration scope

    ERP migration projects frequently drop historical transactions, closed orders, and past invoice records to meet budget and timeline targets. Once Sales ERP goes out of service, the legacy data becomes inaccessible, leaving finance and operations teams without historical context for audits, customer disputes, or trend analysis. We scope historical data explicitly during discovery, identify which fiscal-year records are required, and provide a separate historical archive export in CSV and JSON formats in addition to the live-system migration. This archive is stored independently from Dolibarr and remains accessible for read-only audit purposes.

  • Dolibarr's cross-module relationships use a different link table than Salesforce

    Salesforce maintains parent-child relationships via ID fields on child records (AccountId on Contact, AccountId on Opportunity). Dolibarr uses the llx_element_element table to store links between objects of different types (e.g., linking a Proposal to a Third Party and to a Contact simultaneously). When migrating Salesforce Opportunities mapped to Dolibarr Proposals, we must insert corresponding llx_element_element rows with element_type and element_id for each relationship rather than relying on a foreign key column on the child record. We handle this during migration by running a post-import link phase that reconstructs the relationship graph in Dolibarr's llx_element_element structure.

  • Dolibarr has no native bulk API for high-volume ingestion

    Unlike Salesforce's Bulk API 2.0, Dolibarr does not have a native bulk ingestion API designed for millions of records. Large migrations rely on Dolibarr's CSV import wizard or direct database insertion via MySQL/PostgreSQL. CSV imports through the web interface are subject to PHP memory limits and upload size restrictions that require chunking large files. We handle this by splitting large record sets into CSV batches under Dolibarr's configurable size limits and by using direct SQL insertion for migrations exceeding the CSV approach's practical capacity, while preserving the original Salesforce ID in ref_ext for reconciliation.

  • Salesforce API rate limits cap extraction throughput on lower tiers

    Salesforce Starter and Professional tier orgs are capped at 1,000 and 5,000 API calls per day respectively. Migrations with large data volumes (tens of thousands of records across multiple objects) can exhaust these limits during extraction, causing REQUEST_LIMIT_EXCEEDED errors and halting the migration until the rolling 24-hour window resets. We monitor remaining call budget before each batch, use Bulk API 2.0 for high-volume operations to amortize calls across larger record sets, and schedule extraction windows during off-peak hours. Where the budget is insufficient for the migration scope, we flag this as a pre-migration decision item and recommend a temporary Enterprise tier license for the migration window.

Migration approach

Six steps for a successful Sales ERP to Dolibarr ERP data migration

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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

Context on both ends of the pair

Sales ERP logo

Sales ERP

Source

Strengths

  • Highly configurable object model with standard and custom objects accessible via REST and Bulk APIs
  • Tiered licensing scales from small teams on Starter ($25/user/month) to enterprise with 100,000+ API calls per day
  • Native CRM-ERP object integration reduces reconciliation work between sales and finance data
  • Comprehensive role-based sharing model supports complex organizational hierarchies and territory management
  • Industry-specific clouds (Financial Services, Health, Manufacturing) add vertical data models for specialized deployments

Weaknesses

  • Per-org API rate limits restrict migration throughput on Starter and Professional tiers
  • Complex object relationships (Account Contact Relation, Opportunity Team Members, Campaign Members) require detailed mapping work
  • Implementation and ongoing admin costs frequently exceed initial licensing estimates by significant margins
  • Schema customization through custom fields, formulas, and validation rules creates migration-specific technical debt
  • Lower-tier licenses cap daily API calls, forcing customers to purchase higher tiers or accept migration windows that span multiple days
Dolibarr ERP logo

Dolibarr ERP

Destination

Strengths

  • Free core software with AGPL license and no per-user mandatory fee for self-hosted deployments.
  • Modular architecture lets teams activate only needed features, keeping the interface focused and the database lean.
  • Self-hosted option provides full data sovereignty and avoids recurring SaaS subscription costs.
  • Built-in CSV/Excel import and export wizard with saved profiles simplifies recurring data operations.
  • Low-code Module Builder allows functional extensions without writing PHP code.

Weaknesses

  • No native documented REST API for programmatic bulk operations — all migrations depend on the import/export wizard or direct database access.
  • Reporting and analytics are weak without paid add-ons, and built-in charts are limited compared to modern SaaS platforms.
  • UI design is described as dated by multiple reviewers, with infrequent visual updates to the default theme.
  • Community-only support for self-hosted deployments means no SLA or guaranteed response time for issues.
  • Security vulnerabilities (CVE-2024-5314, CVE-2024-5315) in version 9.0.1 with no immediate patch reported.

Complexity grading

How hard is this migration?

Standard ERP migration. All 8 core objects map 1:1 between Sales ERP and Dolibarr ERP.

B

Overall complexity

Standard migration

Derived from compatibility, mapping clarity, API constraints, and data volume across Sales ERP and Dolibarr ERP.

  • Object compatibility

    A

    All 8 core objects map 1:1 between Sales ERP and Dolibarr ERP.

  • Field mapping clarity

    C

    Field mapping is derived from defaults — final spec confirmed during the sample migration.

  • Timeline complexity

    B

    8-object category — typical timelines run 2–7 days end-to-end.

  • API constraints

    B

    Sales ERP: 1,000 to 100,000 API calls per day depending on license tier; concurrent request limits also apply.

  • Data volume sensitivity

    A

    Sales ERP exposes a bulk API — large-volume migrations stream efficiently.

Estimator

Estimate your Sales ERP to Dolibarr ERP migration cost

Rule-based pricing — no per-record fees, no manual quotes. Migrations over 2M records are scoped individually.

Step 1

What are you migrating?

Pick a category, then your source and destination platforms.

Category

FAQ

Frequently asked questions about Sales ERP to Dolibarr ERP data migrations

Answers to the questions buyers ask most during Sales ERP to Dolibarr ERP migration scoping. Not seeing yours? Book a call.

Can't find your answer?

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 consultation

Most migrations land between three and five weeks for organizations under 15,000 Accounts, 3,000 Orders, and no custom objects. Migrations with custom __c objects, large historical transaction records, complex Account-to-Contact hierarchies, or multi-currency requirements move to eight to fourteen weeks because of Salesforce API extraction pacing, Dolibarr module activation work, and relationship reconstruction in the llx_element_element table.

Adjacent paths

Related migrations to explore

Ready when you are

Move from Sales ERP.
Land in Dolibarr ERP, intact.

Tell us record counts and timeline. We'll come back with a written quote inside 1 business day — no commitment, no sales pitch.

Accuracy guarantee Rollback included Quote in 1 business day