CRM migration
Field-level mapping, validation, and rollback between EspoCRM and HubSpot. We move data and schema; workflows are rebuilt natively in HubSpot.
EspoCRM
Source
HubSpot
Destination
Compatibility
15 of 15
objects map 1:1 between EspoCRM and HubSpot.
Complexity
BStandard
Timeline
48–72 hours
Overview
EspoCRM's data model centers on Leads, Contacts, Accounts, Opportunities, Cases, and Activities — with the Entity Manager adding custom entities and fields through a non-code interface. HubSpot consolidates these into four core CRM objects (Contacts, Companies, Deals, Tickets) plus an engagement model for calls, emails, and meetings. FlitStack AI reads EspoCRM via its REST API (paginated at 200 records per call), extracting all standard and custom entity data including multi-enum and dynamic-logic fields. We map EspoCRM Leads and Contacts to HubSpot Contacts (routing by lifecycle stage if applicable), Accounts to Companies, Opportunities to Deals, and Cases to Tickets. Custom Entity Manager entities migrate as HubSpot custom objects (Enterprise tier) or as custom properties on standard objects. EspoCRM workflows and BPM processes cannot migrate — their definitions export as JSON for manual rebuild in HubSpot's automation tools. We sequence the migration so foreign-key dependencies resolve correctly: accounts first, then contacts, then deals and cases, then activities. A delta-pickup window (24–48 hours) captures in-flight changes during cutover, and a one-click rollback is available if reconciliation detects unexpected gaps.
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 HubSpot, including any object-level transformations, lookup resolution, or schema-design dependencies.
Typical mapping — final map is confirmed during the sample migration step.
EspoCRM
Lead
HubSpot
Contact
1:1EspoCRM Leads map directly to HubSpot Contacts, preserving all standard fields such as name, email, phone, and title. If EspoCRM includes a lead-status picklist (new, assigned, converted), that status is transferred as a HubSpot custom property, allowing your team to recreate the original lifecycle progression within HubSpot after migration.
EspoCRM
Contact
HubSpot
Contact
1:1Each EspoCRM Contact field—including name, email address, phone number, job title, street, city, state, postal code, country, and social URLs—maps directly to the corresponding HubSpot Contact property. The EspoCRM link to an Account converts to a HubSpot Company association once the Account entity has been loaded, ensuring the relationship appears in the HubSpot timeline.
EspoCRM
Account
HubSpot
Company
1:1EspoCRM Accounts are translated into HubSpot Companies, where the account name populates the Company name, the domain field fills the website property, and address components (street, city, state, postal code, country) are consolidated into HubSpot's compound address field. Any parent-account hierarchy present in EspoCRM is reproduced as HubSpot parent-company associations, preserving the original corporate structure.
EspoCRM
Opportunity
HubSpot
Deal
1:1EspoCRM Opportunities migrate to HubSpot Deals. Each EspoCRM pipeline maps to a HubSpot pipeline; stage names translate via value-by-value mapping. Amount, close date, probability, and owner transfer directly. The opportunity's linked account and contacts become the Deal's associated Company and Contact associations.
EspoCRM
Case
HubSpot
Ticket
1:1EspoCRM Cases map to HubSpot Tickets. Case status (new, open, resolved, closed) translates to HubSpot ticket status via value mapping. Priority and case number migrate as custom properties for traceability. The original case ID is preserved as Source_Case_ID__c for reconciliation.
EspoCRM
Task
HubSpot
Engagement (Task)
1:1EspoCRM Tasks are imported as HubSpot engagement tasks, copying the task subject, full description, due date, status, and priority fields directly. The assigned user is resolved by matching the EspoCRM user email to a HubSpot user record; any email that does not find a match is logged in the pre‑migration report, allowing your team to assign a fallback owner before the migration proceeds.
EspoCRM
Meeting
HubSpot
Engagement (Meeting)
1:1EspoCRM Meetings become HubSpot engagement meetings, transferring the start and end timestamps, subject line, and detailed body text. All related contacts or deals are linked to the meeting in HubSpot so the context appears on the record’s timeline. The original creation and modification timestamps are stored on the HubSpot engagement, keeping the historical record accurate.
EspoCRM
Call
HubSpot
Engagement (Call)
1:1EspoCRM Call records are imported as HubSpot call engagements, preserving call direction, duration, subject, and disposition outcome. The original call start time and owner are transferred to HubSpot, so each call appears with its timestamp and assigned user in the contact’s activity feed. This maintains a complete call history for auditing and follow‑up.
EspoCRM
HubSpot
Engagement (Email)
1:1EspoCRM email records become HubSpot email engagements, carrying the subject line, full body (whether plain text or HTML), and the original sent timestamp. Each email is linked to the appropriate HubSpot contact or company, and the engagement timeline displays the sender, recipient, and timestamp, providing a clear chronological view of all email interactions.
EspoCRM
Note
HubSpot
Note
1:1EspoCRM Notes are imported as HubSpot Notes and attached to the relevant Contact, Company, Deal, or Ticket record. The rich‑text note body transfers directly, preserving formatting. When a note contains an attached file, FlitStack AI downloads the file from EspoCRM storage, re‑uploads it to HubSpot Files, and links it to the note, ensuring the attachment is accessible in HubSpot.
EspoCRM
Attachment
HubSpot
File
1:1FlitStack AI extracts file attachments from EspoCRM’s designated storage directory, uploads each file to HubSpot Files, and links the file to the appropriate HubSpot record (Contact, Company, Deal, Ticket, or Note). During extraction, file size is validated against HubSpot’s 25 MB per‑file limit; files exceeding this threshold are flagged for manual handling or compression before the migration proceeds.
EspoCRM
Custom Entity (Entity Manager)
HubSpot
Custom Object (Enterprise)
1:1EspoCRM Entity Manager custom entities map 1:1 to HubSpot custom objects (available on Enterprise tier). Custom entity relationships (one-to-many, many-to-many) translate to HubSpot custom object associations. If HubSpot Enterprise is not available, custom entity data maps as custom properties on standard objects.
EspoCRM
User / Team
HubSpot
User / Owner
1:1EspoCRM Users map to HubSpot Users by email address match. Unmatched users are flagged before migration so your team can either invite them to HubSpot or assign their records to a fallback owner. EspoCRM Teams translate to HubSpot Teams (Enterprise) or remain as user groupings handled by HubSpot role assignments.
EspoCRM
Workflow / BPM
HubSpot
No equivalent (manual rebuild)
1:1EspoCRM Workflows and BPM module definitions are not migratable. We export the workflow JSON definition and trigger logic from EspoCRM so your HubSpot admin can reference it when rebuilding in HubSpot Workflows. This export is included in the migration package at no additional charge.
EspoCRM
Campaign
HubSpot
Campaign
1:1EspoCRM Campaigns are transferred to HubSpot as Campaigns, replicating campaign names, status, and start/end dates. However, campaign assets such as email templates, UTM parameter sets, and landing pages must be recreated in HubSpot’s campaign builder. The existing EspoCRM campaign member records—tracking which contacts are enrolled—are migrated as Campaign Member associations linked to the matching HubSpot Contacts, preserving enrollment history.
| EspoCRM | HubSpot | Compatibility | |
|---|---|---|---|
| Lead | Contact1:1 | Fully supported | |
| Contact | Contact1:1 | Fully supported | |
| Account | Company1:1 | Fully supported | |
| Opportunity | Deal1:1 | Fully supported | |
| Case | Ticket1:1 | Fully supported | |
| Task | Engagement (Task)1:1 | Fully supported | |
| Meeting | Engagement (Meeting)1:1 | Fully supported | |
| Call | Engagement (Call)1:1 | Fully supported | |
Engagement (Email)1:1 | Fully supported | ||
| Note | Note1:1 | Fully supported | |
| Attachment | File1:1 | Fully supported | |
| Custom Entity (Entity Manager) | Custom Object (Enterprise)1:1 | Fully supported | |
| User / Team | User / Owner1:1 | Fully supported | |
| Workflow / BPM | No equivalent (manual rebuild)1:1 | Fully supported | |
| Campaign | Campaign1: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.
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
HubSpot gotchas
Marketing Contacts billing model is migration-critical
Feature tier gating is not visible until onboarding
Mandatory onboarding fees inflate year-one cost
HubSpot CSV importer cannot migrate engagements or attachments
Custom objects require Enterprise and a pre-existing schema
Pair-specific challenges
Migration approach
Extract EspoCRM data via REST API with batched pagination
FlitStack AI connects to your EspoCRM instance via its REST API using your API credentials. Because EspoCRM's API returns a maximum of 200 records per GET call, we paginate through every entity type in sequential batches: Leads, Contacts, Accounts, Opportunities, Cases, Tasks, Meetings, Calls, Emails, Notes, and each custom Entity Manager entity. We extract full record payloads including all custom fields, relationship IDs, and metadata (created_at, modified_at, assigned_user). The extraction runs in a read-only scope — no EspoCRM records are modified during this phase.
Pre-create HubSpot custom properties and pipelines before data loads
Before any data lands in HubSpot, we inspect EspoCRM's Entity Manager metadata to identify all custom fields and relationship types. Custom fields that have no HubSpot standard equivalent are pre-created as HubSpot custom properties (in snake_case for internal naming). EspoCRM pipelines are pre-created as HubSpot pipelines. This step requires a HubSpot admin to confirm custom property names and pipeline configurations before the migration plan is finalized. We deliver a schema-setup checklist so HubSpot-side preparation runs in parallel with EspoCRM data extraction.
Run a sample migration with field-level diff before full commit
We migrate a representative slice of 100–500 EspoCRM records spanning each entity type and including edge cases (records with no linked account, records with multi-enum values, records owned by inactive EspoCRM users). A field-level diff report compares source and destination field values side-by-side so your team can verify mapping correctness before the full run. This sample run also surfaces any EspoCRM multi-enum values exceeding the 20-option cap and any EspoCRM user emails that have no matching HubSpot user — both are resolved before the full migration executes.
Execute full migration with dependency-ordered load sequence
The full migration runs in dependency order: Accounts first (HubSpot requires Companies to exist before Contacts can link via associatedcompanyid), then Contacts and Leads, then Deals and Cases, then Activities. Foreign keys resolve by matching EspoCRM record IDs to their newly created HubSpot record IDs in our mapping table. EspoCRM owners resolve to HubSpot owners by email match — unmatched owners are assigned to a designated fallback owner and flagged in the reconciliation report. All original EspoCRM timestamps (created_at, modified_at) are preserved in custom datetime fields on the HubSpot records.
Cut over with delta-pickup window and one-click rollback
Once the full migration completes and the sample validation passes, your team executes the cutover from EspoCRM to HubSpot. A delta-pickup window (typically 24–48 hours) runs concurrently, capturing any EspoCRM records created or modified during the cutover window and syncing them to HubSpot. An audit log records every operation. If post-migration reconciliation reveals unexpected gaps — missing records, incorrect associations, or field-mapping errors — one-click rollback reverts the HubSpot environment to its pre-migration state so your team can investigate and re-run without data loss.
Platform deep dives
EspoCRM
Source
Strengths
Weaknesses
HubSpot
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 HubSpot.
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 HubSpot migration scoping. Not seeing yours? Book a call.
Walk through your EspoCRM to HubSpot 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 HubSpot
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.