CRM migration

Migrate from EspoCRM to Salesforce Sales Cloud

Field-level mapping, validation, and rollback between EspoCRM and Salesforce Sales Cloud. We move data and schema; workflows are rebuilt natively in Salesforce Sales Cloud.

EspoCRM logo

EspoCRM

Source

Salesforce Sales Cloud

Destination

Salesforce Sales Cloud logo

Compatibility

88%

14 of 16

objects map 1:1 between EspoCRM and Salesforce Sales Cloud.

Complexity

BStandard

Timeline

4-6 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

Moving from EspoCRM to Salesforce is a structural migration across different deployment models: EspoCRM's AGPLv3 open-source platform (self-hosted or cloud at $15-$69 per user per month) versus Salesforce's multi-tenant SaaS ecosystem (starting at $75 per user per month on Sales Cloud Starter). EspoCRM's Entity Manager lets administrators build custom entity types without code, and those custom entities carry cross-reference relationships that must be resolved in dependency order during migration. We handle the 200-record API ceiling through paginated extraction, transfer filesystem-stored attachment files from self-hosted instances separately from the database export, and map EspoCRM's Leads, Contacts, Accounts, Opportunities, Cases, and Campaigns to their Salesforce equivalents. Salesforce Validation Rules and field-level security profiles can block record inserts if not coordinated with the destination org admin before migration. Workflows, BPM processes built with EspoCRM's Advanced Pack extension, and custom PHP/Before-Save scripts do not migrate; we deliver a written inventory for the customer's admin to rebuild in Salesforce Flow. Files stored on EspoCRM's filesystem require a separate transfer step that database exports alone do not capture.

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

EspoCRM logo

EspoCRM

What's pushing teams away

  • Email and SMS follow-up functionality requires third-party integrations and does not work out of the box, frustrating teams expecting a complete CRM experience.
  • Integration ecosystem is narrow compared to HubSpot or Salesforce, with official integrations limited to Google Workspace, Outlook, Zoom, VoIP, and Stripe.
  • Customization depth requires increasing technical knowledge; complex entity relationships and custom PHP/Before-Save scripts become difficult to maintain across upgrades.
  • Performance degrades on large datasets without careful server configuration; teams with hundreds of thousands of records report slow list views and search.

Choosing

Salesforce Sales Cloud logo

Salesforce Sales Cloud

What's pulling them in

  • The AppExchange marketplace with 5,000+ prebuilt apps gives enterprises integrations for nearly every business workflow without custom development.
  • Native Einstein AI for lead scoring, opportunity insights, and predictive forecasting adds intelligence without a separate platform purchase.
  • Territory management, multi-currency support, and advanced forecasting satisfy the needs of complex B2B sales organizations with structured revenue teams.
  • Slack, Tableau, and CPQ are deeply integrated into the core platform, keeping the sales stack unified for teams already in the Salesforce ecosystem.
  • Organizations with a large, established Salesforce implementation choose it because switching costs — integrations, custom code, trained admins — are prohibitive.

Object mapping

How EspoCRM objects map to Salesforce Sales Cloud

Each row shows how a EspoCRM object lands in Salesforce Sales Cloud, including any object-level transformations, lookup resolution, or schema-design dependencies.

Typical mapping — final map is confirmed during the sample migration step.

EspoCRM

Contact

maps to

Salesforce Sales Cloud

Contact

1:1
Fully supported

EspoCRM Contact records map directly to Salesforce Contact. The Email field serves as the dedupe key during import. We map all standard fields (FirstName, LastName, Phone, MobilePhone, MailingAddress) plus any custom fields. EspoCRM multi-email fields (multiple email addresses on one contact) require splitting: the primary email maps to Email and additional addresses are stored in a custom Textarea field custom_email_secondary__c. Multi-enum fields (capped at 20 options in EspoCRM) map to Salesforce Multi-Select Picklist fields with no option count limit.

EspoCRM

Account

maps to

Salesforce Sales Cloud

Account

1:1
Fully supported

EspoCRM Account records map to Salesforce Account. We use the Account Name as the dedupe key. The industry sector, annual revenue, number of employees, website, and billing address fields map directly. Custom fields on EspoCRM Account map to custom fields on Salesforce Account (with __c suffix). Account must be created before Contact import so that AccountId Lookup is satisfied at insert time.

EspoCRM

Lead

maps to

Salesforce Sales Cloud

Lead

1:1
Fully supported

EspoCRM Lead records map to Salesforce Lead. EspoCRM stores Lead status in a status field with custom values; we map those values to Salesforce Lead Status picklist entries, creating new Status values in the destination org if the EspoCRM values do not already exist. Converted Leads (those that have been converted to Contact and Account in EspoCRM) are handled separately: we migrate the original Lead record and link it to the converted Contact via a custom field espo_converted_contact_id__c for audit trail.

EspoCRM

Lead conversion

maps to

Salesforce Sales Cloud

Contact + Account (from conversion)

1:many
Fully supported

EspoCRM stores converted Lead records with links to the resulting Contact and Account. During migration, we identify converted Leads by the presence of convertedContactId and convertedAccountId fields, then create both the Account (if not already present) and the Contact in Salesforce, and store the original EspoCRM Lead ID on the Contact in a custom field espo_lead_id__c for lineage tracking.

EspoCRM

Opportunity

maps to

Salesforce Sales Cloud

Opportunity

1:1
Fully supported

EspoCRM Opportunity records map to Salesforce Opportunity. Stage, probability, amount, close date, and description fields migrate directly. The pipeline assignment in EspoCRM maps to a Salesforce Record Type and Sales Process that we configure before migration. Custom fields on EspoCRM Opportunity (including any fields tracking product lines or deal-specific attributes) map to custom Opportunity fields in Salesforce.

EspoCRM

Case

maps to

Salesforce Sales Cloud

Case

1:1
Fully supported

EspoCRM Case records (support tickets) map to Salesforce Case. Status, Priority, and Resolution fields map to their Salesforce equivalents. The conversation thread (case comments and customer replies) migrates as CaseComment records linked to the Case. Attachments on Cases are extracted from the EspoCRM filesystem (on self-hosted) or database (on cloud) and re-registered as Salesforce ContentDocument records linked to the Case via ContentDocumentLink.

EspoCRM

Campaign

maps to

Salesforce Sales Cloud

Campaign

1:1
Fully supported

EspoCRM Campaign records map to Salesforce Campaign. Campaign name, type, status, start date, end date, budgeted cost, and actual cost migrate directly. The target Leads and Contacts list migrates as CampaignMember records (with Member Status values). We do not replicate email send history, open rates, or click-through data; EspoCRM does not expose this as structured data via its API, and reconstructing it from email integration logs is outside migration scope.

EspoCRM

User

maps to

Salesforce Sales Cloud

User

1:1
Fully supported

EspoCRM User records map to Salesforce User records by email address match. Role assignments and team memberships are recorded in custom fields (espo_role__c, espo_teams__c) because Salesforce role hierarchies and groups are org-wide structures that require admin design decisions rather than direct mapping. The customer's Salesforce admin provisions Users in the destination org before migration; we reconcile EspoCRM users against existing Salesforce Users and flag any without a match for manual provisioning.

EspoCRM

Activity: Meeting

maps to

Salesforce Sales Cloud

Event

1:1
Fully supported

EspoCRM Meeting records map to Salesforce Event with StartDateTime, EndDateTime, and Location preserved. The meeting description becomes the Event Description field. Attendees are mapped to EventRelation records pointing to the corresponding Contact, Lead, or User in Salesforce. Activity date ordering is preserved by setting the original EspoCRM timestamp.

EspoCRM

Activity: Call

maps to

Salesforce Sales Cloud

Task (TaskSubtype = Call)

1:1
Fully supported

EspoCRM Call records map to Salesforce Task with TaskSubtype set to Call. Call duration, disposition, and any notes migrate to custom Task fields. The original timestamp is preserved in ActivityDate. If the EspoCRM instance stores call recordings as file attachments, those files are extracted from the filesystem and attached to the Task as ContentDocument records.

EspoCRM

Activity: Task

maps to

Salesforce Sales Cloud

Task

1:1
Fully supported

EspoCRM standalone Task records map to Salesforce Task with Status, Priority, DueDate, and ActivityDate preserved. Task assignment migrates by resolving the EspoCRM assigned user (by email) to the Salesforce OwnerId via the User mapping. If the EspoCRM task is linked to a parent record (Contact, Account, Opportunity, Case), we resolve the parent reference and set WhatId or WhoId accordingly.

EspoCRM

Activity: Email

maps to

Salesforce Sales Cloud

EmailMessage + Task

1:1
Fully supported

EspoCRM email records migrate to Salesforce as EmailMessage records (the email content) linked to an Activity Task record (the timeline entry). The email body, subject, from address, and to address migrate directly. The WhoId on the Task points to the related Contact or Lead; the WhatId points to the related Opportunity, Account, or Case. EmailMessage direction (inbound vs outbound) is preserved.

EspoCRM

Document (Attachment)

maps to

Salesforce Sales Cloud

ContentVersion + ContentDocument

1:1
Fully supported

EspoCRM Document records linked to other entities (Contacts, Accounts, Opportunities) map to Salesforce ContentVersion and ContentDocument records. On self-hosted EspoCRM instances, the actual file data lives on the server filesystem under data/files/ rather than in the database. We identify all Document records during discovery, extract the referenced files from the filesystem archive, and upload them to Salesforce as ContentVersion records. On cloud-hosted EspoCRM, the file data is in the database and migrates with the standard database export. We re-register each file with the corresponding ContentDocumentLink to the parent record (Contact, Account, Opportunity, or Case).

EspoCRM

Custom Entity (Entity Manager)

maps to

Salesforce Sales Cloud

Custom Object (__c)

1:1
Fully supported

EspoCRM custom entity types created via Entity Manager map to Salesforce Custom Objects with a __c suffix. We export the entityDefs metadata from EspoCRM first (field names, types, relationships, validation rules), then pre-create the destination Salesforce custom object schema including all custom fields, lookup relationships to standard objects (Contact, Account, Opportunity, Case), and validation rules. Custom entity relationships that reference other custom entities require topological sorting: we build a dependency graph, import entities with no dependencies first, then progressively import entities whose dependencies are satisfied.

EspoCRM

Custom Entity Relationship (link-multiple)

maps to

Salesforce Sales Cloud

Custom Object Lookup or Master-Detail

lossy
Fully supported

EspoCRM link-multiple relationships (many-to-many or many-to-one) map to Salesforce Custom Object lookups or Master-Detail fields depending on the cascade-delete requirement. If EspoCRM's relationship is configured as required (mandatory link), we use Master-Detail; otherwise we use Lookup. Junction objects in EspoCRM (entities that hold two link-multiple references as a many-to-many join table) map to Salesforce junction objects with two Lookup fields.

EspoCRM

Note

maps to

Salesforce Sales Cloud

Note

1:1
Fully supported

EspoCRM Note records migrate to Salesforce Note records. The Note body migrates as plain text. If the Note contains embedded images, those images are extracted as separate files from the EspoCRM filesystem and re-attached to the Salesforce Note. Notes are linked via ContentDocumentLink to the parent record (Contact, Account, Opportunity, Case, or custom object).

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.

EspoCRM logo

EspoCRM gotchas

Medium

Default 200-record API GET ceiling requires pagination

High

Server migration leaves WebSocket references pointing to old domain

Medium

Multi-enum field option cap of 20 limits data fidelity

High

Custom entity import ordering creates chicken-and-egg reference problems

Medium

Attachments on self-hosted instances are filesystem-stored

Salesforce Sales Cloud logo

Salesforce Sales Cloud gotchas

High

Workflow Rules and Process Builder are retired

High

Bulk API batch quota exhaustion during large imports

Medium

Storage overage billing is non-obvious

Medium

Account-Contact many-to-many relationship mapping

Low

Territory and team member import ordering dependencies

Pair-specific challenges

  • EspoCRM 200-record API ceiling requires pagination strategy

    EspoCRM's REST API returns a maximum of 200 records per GET request by default (controlled by the maxSize parameter). Large datasets require paginated extraction loops that fetch sequential offset pages. We detect the total record count from the first response, configure maxSize explicitly to balance throughput against server load, and orchestrate chunked page fetches without silent truncation. Skipping this step results in only the first 200 records migrating regardless of total volume.

  • Custom entity cross-references require topological import ordering

    EspoCRM Entity Manager custom entities that reference each other via link-multiple or foreign-key relationships create a chicken-and-egg problem during migration. A custom Project entity linked to a custom Client entity cannot be imported if Client does not yet exist. EspoCRM enforces referential integrity on save, so records with missing parent references fail. We perform dependency graph analysis of all custom entity types during discovery, topologically sort the import order, and use ID remapping tables to resolve forward references when source IDs differ from target IDs.

  • Self-hosted filesystem attachment extraction is separate from database export

    On self-hosted EspoCRM instances, uploaded files are stored on the server filesystem under the data/files/ directory rather than as blob records in the database. A standard database export and restore captures the Attachment metadata records but not the actual file data. We identify Attachment records during discovery, extract the referenced files from the filesystem archive, and transfer them alongside the database migration, re-registering each file as a Salesforce ContentVersion record. Cloud-hosted EspoCRM instances store files in the database and migrate with the standard export.

  • Salesforce Validation Rules block record inserts without coordination

    Salesforce orgs commonly enforce Validation Rules (required field formats, conditional requireds, picklist whitelists) and field-level security that the migration user must explicitly bypass during data load. We coordinate with the destination Salesforce admin to grant the migration user Modify All Data and Bulk API permissions, and either temporarily disable Validation Rules during load or extend them with a migration-context bypass. Skipping this step results in 5-30 percent record rejection on first import attempt.

  • Multi-enum field option cap of 20 in EspoCRM limits data fidelity

    Multi-enum fields in EspoCRM are capped at 20 selectable options by default. If your source EspoCRM data or destination mapping requires more than 20 options in a multi-select field, records may fail validation on import into Salesforce if the multi-select picklist is configured with a limited value set. We detect multi-enum fields during discovery, report option counts, and advise whether to use an unrestricted multi-select picklist in Salesforce or split into multiple fields before migration begins.

Migration approach

Six steps for a successful EspoCRM to Salesforce Sales Cloud data migration

  1. Discovery and source system audit

    We audit the EspoCRM instance across deployment type (self-hosted or cloud), API configuration, total record counts per entity type, custom entity types and their field definitions (exported from entityDefs metadata), active workflows and BPM processes (Advanced Pack), and attachment volume (file count and total storage size on filesystem for self-hosted). We pair this with a review of the destination Salesforce org's current schema, Validation Rules, field-level security profiles, and available API licenses. The discovery output is a written migration scope with entity-level record counts, a custom entity dependency graph, and a Salesforce edition recommendation.

  2. Schema design and dependency resolution

    We design the destination Salesforce schema. For custom entity types, we pre-create the custom objects with __c API names matched to EspoCRM entity names, including all custom fields, lookup relationships, and validation rules. We build the dependency graph for custom entities and define the topological import order. We configure Salesforce Record Types and Sales Processes for Opportunity migration. Schema is deployed into a Salesforce Sandbox first via metadata API for validation before production migration begins.

  3. Sandbox migration and reconciliation

    We run a full migration into a Salesforce Sandbox (Full Copy or Partial Copy) using production-like data volume. The customer's EspoCRM admin and Salesforce admin jointly reconcile record counts, spot-check 25-50 records per entity type against the EspoCRM source, and validate that lookup relationships resolved correctly. Any mapping corrections, validation rule conflicts, or custom entity dependency issues surface here before production migration begins.

  4. Filesystem extraction and owner reconciliation

    For self-hosted EspoCRM instances, we extract all files from the data/files/ directory and index them against the Attachment records in the database. For cloud-hosted instances, we extract file blob data from the database export. We also reconcile EspoCRM Users against Salesforce Users by email address match. Any EspoCRM User without a matching Salesforce User goes to a reconciliation queue for the customer's Salesforce admin to provision before record import resumes.

  5. Production migration in dependency order

    We run production migration in record-dependency order: Accounts first, then Contacts and Leads (with the Lead conversion split resolved), then Opportunities with Record Type and Sales Process assigned, then Cases, then Campaigns and CampaignMembers, then Activities (Tasks, Events, EmailMessages via Bulk API 2.0 with chunking), then Custom Entities in topological order, then Notes and Attachments. Each phase emits a row-count reconciliation report before the next phase begins. EspoCRM's 200-record API ceiling is handled through paginated extraction loops with configurable maxSize.

  6. Cutover, validation, and automation rebuild handoff

    We freeze EspoCRM writes during cutover, run a final delta migration of any records modified during the migration window, then enable Salesforce as the system of record. We deliver the Workflow and BPM inventory document to the customer's admin team. We support a one-week hypercare window where we resolve reconciliation issues raised by the customer's team. We do not rebuild EspoCRM Workflows or Advanced Pack BPM processes as Salesforce Flow inside the migration scope; that is a separate engagement or an internal admin task.

Platform deep dives

Context on both ends of the pair

EspoCRM logo

EspoCRM

Source

Strengths

  • AGPLv3 open-source license with no per-contact or per-seat recurring fee on self-hosted deployments.
  • Entity Manager provides a UI for creating custom entity types, fields, and relationships without writing code.
  • Full REST API covers all standard CRUD operations plus stream, metadata, and currency rate endpoints.
  • Cloud plans include daily backups with 7-day retention and all official extensions at no additional cost.
  • Both cloud-hosted and fully self-hosted deployment options with explicit customer data ownership.

Weaknesses

  • Email and SMS functionality requires third-party integrations and does not work natively out of the box.
  • Official integrations are limited to Google Workspace, Outlook, Zoom, VoIP, and Stripe.
  • Multi-enum field type is capped at 20 options by default and requires configuration changes to extend.
  • Large record volumes without server-side performance tuning cause slow list views and degraded search performance.
  • WebSocket domain references can persist after server migration if internal URL configuration is not fully updated.
Salesforce Sales Cloud logo

Salesforce Sales Cloud

Destination

Strengths

  • Largest enterprise app ecosystem in CRM with 5,000+ AppExchange integrations covering nearly every vertical workflow.
  • Native Einstein AI delivers lead scoring, opportunity insights, and predictive forecasting without a third-party layer.
  • Advanced territory management, multi-currency, and flexible forecasting satisfy complex B2B revenue structures.
  • Deep platform extensibility: Custom Objects, Apex, Flow, and the Metadata API allow full schema customization.
  • Well-documented REST API, Bulk API, and Composite API with published rate limits for programmatic migration.

Weaknesses

  • Pricing model is layered and opaque in practice: per-seat fees plus storage overages, add-on subscriptions, and annual uplifts compound to 30–40% above sticker price.
  • Workflow Rules and Process Builder are deprecated, forcing all orgs onto Salesforce Flow — a migration task that catches many teams by surprise.
  • Steep administrative complexity: meaningful configuration requires a dedicated Salesforce admin or consultant.
  • API rate limits are edition-gated (100k/day base for Enterprise) and easily exhausted by large historical imports without throttling.
  • Data export is exportable via Data Loader but preserving relationship integrity across 30+ objects requires careful ETL sequencing.

Complexity grading

How hard is this migration?

Standard CRM migration. 1 of 8 objects need a mapping; the rest are 1:1.

B

Overall complexity

Standard migration

Derived from compatibility, mapping clarity, API constraints, and data volume across EspoCRM and Salesforce Sales Cloud.

  • Object compatibility

    B

    1 of 8 objects need a mapping; the rest are 1:1.

  • 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

    EspoCRM: Not publicly documented; rate limits can be configured server-side in the EspoCRM config file.

  • Data volume sensitivity

    B

    EspoCRM doesn't expose a bulk API — REST + parallelization used for high-volume runs.

Estimator

Estimate your EspoCRM to Salesforce Sales Cloud 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 EspoCRM to Salesforce Sales Cloud data migrations

Answers to the questions buyers ask most during EspoCRM to Salesforce Sales Cloud migration scoping. Not seeing yours? Book a call.

Can't find your answer?

Walk through your EspoCRM to Salesforce Sales Cloud migration with a real engineer — 30 minutes, free, written quote within 24 hours.

Book a free 30 minute consultation

Most migrations land between four and six weeks for accounts under 15,000 Contacts and 3,000 Opportunities with no custom entities or minimal attachment volumes. Migrations with multiple custom entity types that reference each other, large attachment volumes (thousands of files on self-hosted instances), or engagement histories over 200,000 activity records move to ten to fourteen weeks because of dependency graph analysis, filesystem extraction, Bulk API chunking, and Validation Rule coordination.

Adjacent paths

Related migrations to explore

Ready when you are

Move from EspoCRM.
Land in Salesforce Sales Cloud, 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