CRM migration

Migrate from EspoCRM to Twenty CRM

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

EspoCRM logo

EspoCRM

Source

Twenty CRM

Destination

Twenty CRM logo

Compatibility

67%

8 of 12

objects map 1:1 between EspoCRM and Twenty CRM.

Complexity

BStandard

Timeline

4-6 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

Moving from EspoCRM to Twenty CRM is a migration between two open-source platforms at different stages of maturity. EspoCRM brings eleven years of development, an Entity Manager for no-code custom entity creation, and a REST API with a 200-record ceiling per request. Twenty CRM brings three years of active development, a modern TypeScript and PostgreSQL stack, a GraphQL-first API, and a native MCP server for AI agent integration on Cloud plans. The migration requires resolving EspoCRM's cross-referenced entity dependency graph, transferring filesystem-stored attachments from self-hosted instances, and rebuilding EspoCRM workflows and automations as Twenty workflows. We preserve custom entity metadata by exporting entityDefs before migrating records, and we flag WebSocket domain persistence issues that arise when EspoCRM was moved between servers without a full URL reconfiguration. Timeline ranges from four to eight weeks depending on entity count and custom object complexity.

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

Twenty CRM logo

Twenty CRM

What's pulling them in

  • Top open-source CRM on GitHub with 40.6K stars, giving teams full source code access and infrastructure ownership without per-feature licensing surprises.
  • Free self-hosting under AGPL-3.0 means unlimited users and custom objects for the cost of cloud infrastructure alone, typically $20–100/month.
  • Pricing page explicitly mocks competitors for charging add-on fees for API access, webhooks, and workflows — transparency that resonates with RevOps teams burned by Salesforce.
  • Unlimited custom objects and fields with no price impact, letting teams shape the data model to their business rather than forcing business into rigid schemas.
  • Modern TypeScript/React/PostgreSQL stack means developer-led teams can extend, self-host, or integrate without fighting legacy architecture.

Object mapping

How EspoCRM objects map to Twenty CRM

Each row shows how a EspoCRM object lands in Twenty CRM, 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

Twenty CRM

People

1:1
Fully supported

EspoCRM Contact records map directly to Twenty CRM People records. Email, phone, address, title, and all custom fields transfer 1:1. Multi-email fields in EspoCRM (where a Contact can have multiple email addresses) map to a primary email on the Twenty People record with secondary emails stored in a custom text field. Owner resolution uses email match against Twenty Members.

EspoCRM

Account

maps to

Twenty CRM

Company

1:1
Fully supported

EspoCRM Account records map to Twenty CRM Company records. Website, industry, address, employee count, and annual revenue transfer. The domain field in EspoCRM becomes the website field in Twenty. Company is created before any People import so that the People→Company relationship is satisfied at import time.

EspoCRM

Lead

maps to

Twenty CRM

Person or Company (classification required)

1:many
Fully supported

EspoCRM Lead records have a status field that indicates whether the lead is new, assigned, in process, converted, or junk. Leads with status converted carry an ID pointing to the target Contact or Account and are migrated as People or Company records. Unconverted leads migrate as People with the original lead status preserved in a custom field for audit.

EspoCRM

Opportunity

maps to

Twenty CRM

Opportunity

1:1
Fully supported

EspoCRM Opportunity records map to Twenty CRM Opportunity with amount, stage, probability, expected close date, and description fields preserved. The opportunity stage names are recorded in a custom field since Twenty uses its own stage vocabulary. We create the Opportunity records after Company to satisfy the CompanyId lookup.

EspoCRM

Lead Stage

maps to

Twenty CRM

Opportunity Stage

lossy
Fully supported

EspoCRM pipeline stages map to Twenty Opportunity stages. We configure the Twenty opportunity pipeline with stages matching the EspoCRM stage names during setup. Probability values transfer as custom fields if the customer requires exact probability mapping for reporting.

EspoCRM

Case

maps to

Twenty CRM

Task or Note

lossy
Fully supported

EspoCRM Cases (support tickets) have no direct Twenty CRM equivalent. Cases migrate as Tasks with the case number, priority, and resolution stored in custom fields, and the case conversation thread migrates as Notes attached to the Task record. The customer chooses whether to preserve Cases as Tasks or as a custom Case object created in Twenty's Data Model.

EspoCRM

Activity: Meeting, Call, Task

maps to

Twenty CRM

Task

1:1
Fully supported

EspoCRM Activities (Meetings, Calls, Tasks) map to Twenty Task records. Meeting details (title, start time, end time, location) store in Task custom fields. Call duration and disposition store in custom fields. ActivityDate is set to the original EspoCRM timestamp to preserve timeline ordering.

EspoCRM

Activity: Email

maps to

Twenty CRM

Task

1:1
Fully supported

EspoCRM Email activities migrate to Twenty Task records with the email body stored in the Task description field, sender and recipient stored in custom text fields, and the original timestamp preserved. Email threading and header metadata do not transfer as structured data.

EspoCRM

Document (Attachment)

maps to

Twenty CRM

Attachment

1:1
Fully supported

EspoCRM Documents are stored as Attachment records linked to parent entities. On self-hosted instances, the actual file lives in data/files/ on the server filesystem. We extract referenced files during discovery, copy them to the migration staging environment, and re-upload them to Twenty via API after the parent record is created. CSV export alone does not capture file attachments; this is a parallel workflow to the database migration.

EspoCRM

User

maps to

Twenty CRM

Member

1:1
Fully supported

EspoCRM User records map to Twenty Members. We resolve by email match. Any EspoCRM User without a matching Twenty Member is held in a reconciliation queue; the customer provisions the missing Member in Twenty before record migration resumes. Role and team memberships do not migrate and require manual reconfiguration in Twenty's settings.

EspoCRM

Custom Entity (Entity Manager)

maps to

Twenty CRM

Custom Object

1:1
Fully supported

EspoCRM custom entity types created via Entity Manager map to Twenty CRM custom objects. We export the entityDefs metadata first to capture all field definitions and their types (multi-enum, currency, link-multiple, etc.), create the matching Twenty custom object and fields in Settings → Data Model before import, then migrate records using ID remapping tables to resolve any cross-entity lookups. Multi-enum fields exceeding 20 options in EspoCRM must be split into multiple multi-select fields or a single multi-select with a higher option cap set in Twenty.

EspoCRM

Campaign

maps to

Twenty CRM

Task (campaign tracking)

lossy
Fully supported

EspoCRM Campaign records track marketing campaign metadata and target lists. Twenty CRM has no native Campaign object. Campaign metadata migrates as a custom object or as Tasks with campaign name, type, and status stored in custom fields. Target list membership (Leads and Contacts) does not migrate as structured relationships; we deliver a CSV of campaign-target mappings for the customer to rebuild manually in Twenty.

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

Twenty CRM logo

Twenty CRM gotchas

High

Import order is enforced and critical

High

Export limited to 20,000 records and visible columns only

Medium

Soft-deleted records count toward uniqueness and trigger restores

Medium

API rate limits cap at 200 req/min on Organization tier

Low

No native email sequences — follow-up cadences require external tools

Pair-specific challenges

  • File attachments are not included in EspoCRM CSV exports

    EspoCRM's built-in export tool produces CSV files containing record metadata but excludes file attachments. On self-hosted instances, uploaded files live on the server filesystem under data/files/ rather than as blob records in the database. A standard database export and CSV-based migration will not capture these files. We identify attachment records during discovery, extract the referenced files from the filesystem archive, and transfer them alongside the database migration, re-uploading each file to the corresponding Twenty record via API.

  • Custom entity cross-references require dependency graph ordering

    EspoCRM Entity Manager custom entities can reference each other via link-multiple or foreign-key relationships. Importing records in the wrong order produces orphaned foreign keys because EspoCRM enforces referential integrity on save. We perform a dependency graph analysis of all 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. This step is required for any EspoCRM instance with more than one custom entity type.

  • Multi-enum fields capped at 20 options may exceed Twenty's default limit

    EspoCRM multi-enum fields are capped at 20 selectable options by default. If the source system uses a multi-enum field with more than 20 options, or if the destination mapping requires splitting one EspoCRM multi-enum into multiple Twenty multi-select fields, the customer must configure the option cap in Twenty before import begins. We detect multi-enum fields during discovery, report option counts, and advise on splitting strategy or cap adjustment before migration starts.

  • EspoCRM API 200-record ceiling requires pagination for large datasets

    The EspoCRM REST API returns a maximum of 200 records per GET request by default. For accounts with tens of thousands of records, we detect the total record count from response headers and orchestrate sequential page fetches to pull all records without truncation. We also configure maxSize explicitly during migration to balance throughput against source server load.

  • Twenty workflows and automations must be rebuilt manually post-migration

    EspoCRM Advanced Pack workflows and BPM processes do not have a direct Twenty CRM equivalent. We deliver a written inventory of every active EspoCRM workflow with its trigger, conditions, and actions for the customer's admin to rebuild using Twenty's workflow builder. Integration automations (Google Workspace, Outlook, Zoom, VoIP) are not migrated; we document the existing integration stack and recommend Twenty's API-based or webhook-based replacement approach for each.

Migration approach

Six steps for a successful EspoCRM to Twenty CRM data migration

  1. Discovery and EspoCRM environment audit

    We audit the source EspoCRM instance across all entity types, custom fields, Entity Manager metadata, attachment storage location (database or filesystem), active workflows and automations, and user role structure. We identify multi-enum fields with option counts, cross-entity relationships requiring dependency graph analysis, and attachment records needing filesystem extraction. The discovery output is a written scope document covering record counts per entity, custom entity dependency graph, and a list of workflows and integrations requiring manual rebuild.

  2. Twenty workspace setup and data model configuration

    We configure the Twenty CRM workspace before any data import. This includes creating custom objects matching EspoCRM Entity Manager entity types, adding custom fields with type-mapped Twenty field types, and inviting all team members who will be assigned as record Owners. Twenty requires all fields to exist before import; creating them first prevents validation failures during the CSV load phase. We also configure the Opportunity pipeline stages to match EspoCRM stage names.

  3. Entity Manager metadata export and schema mapping

    We export EspoCRM entityDefs metadata to capture all custom entity types, their field definitions, field types, and relationship configurations. This metadata drives the field-type mapping matrix that translates EspoCRM field types (multi-enum, currency, link-multiple) to Twenty equivalents. We also export a full record dump per entity type, paginated in chunks of 200 to comply with EspoCRM's API ceiling.

  4. File attachment extraction from EspoCRM filesystem

    For self-hosted EspoCRM instances, we identify all Attachment records and their corresponding filesystem paths under data/files/. We extract the referenced files, rename them with migration-safe identifiers, and stage them for upload to Twenty after their parent records are created. This step runs in parallel with the database extraction to avoid sequential delay.

  5. Dependency-ordered migration into Twenty

    We run migration in record-dependency order: Companies first, then People (Contacts and Leads), then Opportunities, then Activities and Notes, then Custom Entities last because they often contain lookups to standard objects. ID remapping tables track the relationship between EspoCRM record IDs and Twenty record IDs so that link-multiple and foreign-key references resolve correctly even when source and target IDs differ. After each phase, we emit a row-count reconciliation report before the next phase begins.

  6. File attachment upload and association

    After parent records are committed in Twenty, we upload the extracted files via Twenty's API, associating each attachment with the correct parent record ID using the ID remapping table. We verify that the attachment count in Twenty matches the attachment count discovered from EspoCRM.

  7. Cutover, validation, and workflow rebuild handoff

    We freeze EspoCRM writes during cutover, run a final delta migration of records modified during the migration window, then enable Twenty as the system of record. We deliver the EspoCRM workflow and automation inventory document to the customer's admin team with recommended Twenty equivalents for each. We support a one-week hypercare window for reconciliation issues. We do not rebuild EspoCRM workflows as Twenty workflows inside the migration scope; that work is documented separately for the customer's admin.

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.
Twenty CRM logo

Twenty CRM

Destination

Strengths

  • AGPL-3.0 open-source license with full source code on GitHub — no vendor lock-in, no sunset risk.
  • Unlimited users and unlimited custom objects on self-hosted, with no feature gating based on headcount.
  • REST and GraphQL APIs available on all paid tiers, not locked behind an enterprise add-on fee.
  • MCP server and webhooks shipped as standard features, not premium upgrades.
  • Modern PostgreSQL-backed data model that developer teams can query, extend, and self-host.

Weaknesses

  • Recent v1.0 release means limited production hardening compared to CRMs with multi-year operational track records.
  • No native email sequencing or sales engagement tools — follow-up cadences require a separate platform.
  • No native two-way email sync or inbox integration, requiring third-party connectors for full activity logging.
  • Self-hosting 'free' pricing hides real infrastructure and DevOps costs that stack up over time.
  • Workflow automation is functional but lacks the complexity needed for sophisticated multi-step sales motions.

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 Twenty CRM.

  • 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 Twenty CRM 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 Twenty CRM data migrations

Answers to the questions buyers ask most during EspoCRM to Twenty CRM migration scoping. Not seeing yours? Book a call.

Can't find your answer?

Walk through your EspoCRM to Twenty CRM 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, 3,000 Opportunities, and fewer than five custom Entity Manager entity types. Migrations involving complex entity dependency graphs, large attachment volumes on self-hosted instances, or multi-enum fields requiring pre-migration configuration move to six to ten weeks. The critical path is usually the dependency graph analysis and the attachment filesystem extraction on self-hosted instances.

Adjacent paths

Related migrations to explore

Ready when you are

Move from EspoCRM.
Land in Twenty CRM, 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