CRM migration
Field-level mapping, validation, and rollback between EspoCRM and Nutshell. We move data and schema; workflows are rebuilt natively in Nutshell.
EspoCRM
Source
Nutshell
Destination
Compatibility
9 of 12
objects map 1:1 between EspoCRM and Nutshell.
Complexity
BStandard
Timeline
2-4 weeks
Overview
Moving from EspoCRM to Nutshell is a migration from an open-source, self-hostable CRM with deep customization to a managed SaaS CRM built for small-to-mid-size B2B sales teams. EspoCRM's Entity Manager lets administrators create custom entity types with arbitrary relationships; Nutshell uses a more opinionated schema with standard objects (People, Companies, Deals, Cases) that covers most sales use cases out of the box. We handle the schema differences during discovery, extract custom entity definitions from EspoCRM metadata, topologically sort the import order to resolve foreign-key dependencies, and map multi-select fields that exceed Nutshell's picklist limits. Workflows, BPM processes, and custom PHP Before-Save scripts do not migrate; we deliver a written inventory of automations requiring rebuild in Nutshell's workflow builder. File attachments on self-hosted EspoCRM instances require a separate filesystem extraction step because they are not stored in the database.
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 EspoCRM object lands in Nutshell, including any object-level transformations, lookup resolution, or schema-design dependencies.
Typical mapping — final map is confirmed during the sample migration step.
EspoCRM
Account
Nutshell
Company
1:1EspoCRM Account records map directly to Nutshell Company records. The company name becomes the primary match key during import. Nutshell Company stores address, website, phone, and industry fields. If EspoCRM stores industry as a multi-enum field with more than 20 options, we split into a single-select Industry field plus a secondary custom field for overflow values.
EspoCRM
Contact
Nutshell
Person
1:1EspoCRM Contact records map to Nutshell Person records with first name, last name, email, phone, and address fields preserved. Multiple email addresses on a single EspoCRM Contact (multi-email field) are stored as the primary email on the Nutshell Person with secondary addresses in a custom notes field because Nutshell Person does not support a native multi-email structure.
EspoCRM
Lead
Nutshell
Person (unqualified)
1:1EspoCRM Lead records map to Nutshell Person records. EspoCRM stores lead status, source, and conversion date fields; we preserve these in Nutshell Person custom fields because Nutshell does not have a separate Lead object distinct from Person. The original EspoCRM lead status value is retained for reconciliation audit.
EspoCRM
Opportunity
Nutshell
Deal
1:1EspoCRM Opportunity records map to Nutshell Deal records. The deal name, amount, stage, probability, expected close date, and description transfer directly. EspoCRM Opportunity stages map to Nutshell Deal stages; we create the Nutshell stages during setup to match the EspoCRM stage names and order before migration begins. Closed-won and closed-lost outcomes map directly.
EspoCRM
Opportunity Stage
Nutshell
Deal Stage
lossyEach EspoCRM pipeline becomes a set of Nutshell Deal stages. Stage order, names, and probability percentages transfer to Nutshell Deal stages. If EspoCRM uses multiple pipelines, we create separate Nutshell Deal categories or stage sets and assign deals accordingly during import. Nutshell's stage configuration happens in the CRM settings before any deal records are imported.
EspoCRM
Case
Nutshell
Case
1:1EspoCRM Case records map directly to Nutshell Case records. Status, priority, resolution, and description fields transfer. The linked Account and Contact references resolve to Nutshell Company and Person IDs during the migration so that case relationships are preserved on import.
EspoCRM
Activity: Call, Meeting, Task
Nutshell
Activity
1:1EspoCRM Activities (Calls, Meetings, Tasks) map to Nutshell Activity records. Activity type, subject, date, duration, outcome, and description transfer. Each Activity is linked to a Nutshell Person or Company ID resolved from the EspoCRM parent reference. The EspoCRM activity stream order is preserved by setting the Activity date to the original timestamp.
EspoCRM
Activity: Email
Nutshell
Activity (email subtype)
1:1EspoCRM Email activity records migrate to Nutshell Activity records with the email subtype flag. Email body content transfers as the Activity description. Attachments on EspoCRM email records migrate as file references; self-hosted attachment files require the separate filesystem extraction step detailed in the gotchas section.
EspoCRM
Campaign
Nutshell
Campaign
1:1EspoCRM Campaign records migrate to Nutshell Campaign records with campaign name, status, type, start date, and budget preserved. Nutshell Campaign tracks campaign metadata and links to target People; we create the campaign records and link the targeting list during migration. Email send history does not transfer because it is event-log data rather than record data.
EspoCRM
User
Nutshell
User
1:1EspoCRM User records map to Nutshell User accounts by email address match. Role assignments and team memberships are preserved in a written inventory for the customer's admin to reconfigure in Nutshell's user management settings post-migration because Nutshell does not expose role hierarchies via its public API in the same way EspoCRM does.
EspoCRM
Custom Entity (Entity Manager)
Nutshell
Custom Field on Standard Object
lossyCustom entity types created in EspoCRM via Entity Manager require a schema review before migration. Entities that represent a classification or tag (status, type, category) map to Nutshell custom fields on the nearest standard object (Person, Company, Deal). Entities that represent standalone records with their own relationships are flagged as requiring a manual rebuild in Nutshell because Nutshell does not support arbitrary custom object creation. We provide a custom field creation guide and a 'cannot migrate' summary for each standalone custom entity type.
EspoCRM
Attachment (self-hosted)
Nutshell
File
lossyOn self-hosted EspoCRM instances, uploaded files live in the data/files/ directory on the server filesystem, not in the database. We extract the referenced files during the filesystem archive phase, transfer them alongside the database migration, and attach them to the corresponding Nutshell Person, Company, Deal, or Case record. Nutshell supports file attachments on records. Cloud-hosted EspoCRM instances use database-stored attachments that we extract via the API alongside record migration.
| EspoCRM | Nutshell | Compatibility | |
|---|---|---|---|
| Account | Company1:1 | Fully supported | |
| Contact | Person1:1 | Fully supported | |
| Lead | Person (unqualified)1:1 | Fully supported | |
| Opportunity | Deal1:1 | Fully supported | |
| Opportunity Stage | Deal Stagelossy | Fully supported | |
| Case | Case1:1 | Fully supported | |
| Activity: Call, Meeting, Task | Activity1:1 | Fully supported | |
| Activity: Email | Activity (email subtype)1:1 | Fully supported | |
| Campaign | Campaign1:1 | Fully supported | |
| User | User1:1 | Fully supported | |
| Custom Entity (Entity Manager) | Custom Field on Standard Objectlossy | Fully supported | |
| Attachment (self-hosted) | Filelossy | 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.
EspoCRM gotchas
Default 200-record API GET ceiling requires pagination
Server migration leaves WebSocket references pointing to old domain
Multi-enum field option cap of 20 limits data fidelity
Custom entity import ordering creates chicken-and-egg reference problems
Attachments on self-hosted instances are filesystem-stored
Nutshell gotchas
Contact tier limits enforced on import
No bulk API endpoint requires paginated extraction
Email sequences not exportable via API
Foundation plan disables key sales features
Pair-specific challenges
Migration approach
Discovery and data audit
We audit the source EspoCRM instance across all entity types, including standard objects (Contacts, Accounts, Leads, Opportunities, Cases, Campaigns) and any custom entity types created via Entity Manager. We identify the total record counts per entity, custom field definitions (field type, required flag, picklist options), multi-enum option counts, relationship types (link-multiple, foreign key, custom), and attachment record counts with an assessment of whether the instance is cloud-hosted or self-hosted. Self-hosted instances trigger the filesystem archive request in the discovery questionnaire.
Schema design and custom entity strategy
We design the Nutshell destination schema during this phase. Standard fields map directly to Nutshell Person, Company, Deal, and Case objects. Custom fields from EspoCRM are created as Nutshell custom fields of the matching type. Custom Entity Manager types are classified into two buckets: classification entities (which become custom picklist fields on the nearest standard object) and standalone entity types (which are documented in a cannot-migrate inventory with rebuild instructions). We create the Nutshell Deal stages to match the EspoCRM Opportunity stage names and order before any record data is imported.
Entity dependency analysis and import ordering
We perform a dependency graph analysis across all EspoCRM entity types to identify foreign-key and link-multiple references between entities. This produces a topologically sorted import order that prevents orphaned foreign-key errors. Entities with circular references are flagged for customer review and manual拆解. We also build the ID remapping table that maps source EspoCRM record IDs to destination Nutshell record IDs so that relationship lookups are resolved correctly during the multi-pass import.
Filesystem extraction (self-hosted only)
For self-hosted EspoCRM instances, we extract the data/files/ directory from the server archive, identify the files referenced by attachment records, and prepare a file-to-record mapping. Files are transferred to a staging location and re-registered against the corresponding Nutshell record during the import phase. Cloud-hosted EspoCRM instances skip this step because attachments are stored in the database and extracted via the API alongside records.
Data transformation and import sequencing
We run the import in dependency order: Companies first (no dependencies), People second (Companies must exist for the Company link), Deals third (Companies and People must exist for the lookup), Cases fourth (Company and Person links resolved), Activities fifth (Person and Company links resolved), Campaigns sixth, and custom entity data last (after all standard objects that they may reference). Each phase emits a row-count reconciliation report and a field-level validation report before the next phase begins. Multi-enum fields exceeding Nutshell picklist limits are split or remapped per the decision made during schema design.
Cutover, validation, and automation inventory handoff
We freeze EspoCRM writes during cutover, run a final delta migration of any records modified during the migration window, then enable Nutshell as the system of record. We deliver the custom entity cannot-migrate inventory and the workflow automation rebuild guide to the customer's admin team. Workflows, BPM processes, and custom PHP/Before-Save scripts from EspoCRM do not migrate as code; they require manual rebuild in Nutshell's workflow builder. We support a three-day hypercare window for reconciliation issues raised during the first week of Nutshell usage.
Platform deep dives
EspoCRM
Source
Strengths
Weaknesses
Nutshell
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 1 of 8 objects need a mapping; the rest are 1:1.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across EspoCRM and Nutshell.
Object compatibility
1 of 8 objects need a mapping; the rest are 1:1.
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
EspoCRM: Not publicly documented; rate limits can be configured server-side in the EspoCRM config file.
Data volume sensitivity
EspoCRM doesn't expose a bulk API — REST + parallelization used for high-volume runs.
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 EspoCRM to Nutshell migration scoping. Not seeing yours? Book a call.
Walk through your EspoCRM to Nutshell migration with a real engineer — 30 minutes, free, written quote within 24 hours.
Book a free 30 minute consultationAdjacent paths
Other ways to leave EspoCRM
Other ways to arrive at Nutshell
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.