CRM migration

Migrate from X2CRM to Twenty CRM

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

X2CRM logo

X2CRM

Source

Twenty CRM

Destination

Twenty CRM logo

Compatibility

73%

8 of 11

objects map 1:1 between X2CRM and Twenty CRM.

Complexity

BStandard

Timeline

2-4 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

Moving from X2CRM to Twenty CRM is a model-first migration: Twenty's schema must be designed and deployed before any data arrives, because Twenty's native CSV import does not create fields — only records. We resolve that dependency by auditing every X2CRM module, creating the corresponding custom fields and objects in Twenty during discovery, then importing in dependency order (Accounts/Companies first, then Contacts/People, then Deals/Opportunities, then Activity history). X2CRM's X2Flow automation does not export as portable data; we produce a Workflow Reconstruction Document listing every trigger, condition, and action so your admin can rebuild in Twenty's workflow builder. Attachment migration from self-hosted X2CRM instances requires coordinating file extraction with your IT team before migration scoping begins, since local disk storage paths are not accessible via the REST API.

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

X2CRM logo

X2CRM

What's pushing teams away

  • Customer support quality is frequently criticized as underwhelming and slow to respond, with users citing difficulty reaching knowledgeable staff for technical issues.
  • The platform lacks the ecosystem depth of larger CRMs—no extensive marketplace of third-party integrations, and fewer pre-built connectors than HubSpot or Salesforce.
  • Documentation and community resources are thin compared to competitors, making self-service troubleshooting difficult for non-standard use cases.
  • Scaling to larger teams reveals UI performance issues and limited reporting depth, with users noting the analytics dashboard feels basic for enterprise forecasting needs.

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 X2CRM objects map to Twenty CRM

Each row shows how a X2CRM 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.

X2CRM

Account

maps to

Twenty CRM

Company

1:1
Fully supported

X2CRM Accounts represent companies and organizations linked to Contacts. We map Accounts to Twenty's Company object using the company name or domain as the dedupe key during import. Associated tags, industry classification, website URL, employee count, and annual revenue migrate to their corresponding Twenty Company fields. If X2CRM uses a custom industry picklist, we create the matching options in Twenty's Data Model before import. Company is created before any Person import so that the company-person relationship is satisfied at Person insert.

X2CRM

Contact

maps to

Twenty CRM

Person

1:1
Fully supported

X2CRM Contacts store name, email, phone, address, and job title as standard properties. We map Contacts to Twenty's Person object using email as the dedupe key. First name, last name, email, phone, and address fields migrate directly. Job title and department map to custom fields that we create in Twenty's Data Model before import. We preserve the X2CRM assignedTo owner reference by resolving it against the Twenty Members list, flagging any unmatched owners in a reconciliation report for your admin to provision before Person import resumes.

X2CRM

Deal

maps to

Twenty CRM

Opportunity

1:1
Fully supported

X2CRM Deals track sales opportunities with stage, value, probability, expected close date, and pipeline association. We map Deals to Twenty's Opportunity object. The X2CRM deal stage maps to a Twenty Opportunity stage value that we configure in Data Model during scoping. Deal amount and probability migrate directly. If X2CRM tracks multi-stage pipelines as separate deal types, we create a corresponding Opportunity field or Record Type in Twenty before migration. Closed-Lost and Closed-Won status from X2CRM maps to Twenty's Opportunity stage with probability and close date preserved.

X2CRM

Product

maps to

Twenty CRM

Product

1:1
Fully supported

X2CRM Products catalog items with pricing, SKU, and description. We map Products to Twenty's Product object. Product name, SKU (mapped to productCode), and unit price migrate directly. If X2CRM has associated price books or price lists, we consolidate them into a single price book in Twenty since Twenty's current API does not expose multi-price-book functionality.

X2CRM

Service

maps to

Twenty CRM

Custom Object (ServiceContract)

1:1
Fully supported

X2CRM Services track recurring service contracts or subscriptions linked to Accounts. Twenty CRM has no native Services object, so we create a custom object named ServiceContract in Twenty's Data Model during discovery. The custom object includes fields for contract name, account link, status, renewal date, and monthly or annual value. We create the custom object and all its fields before any X2CRM Service data is exported.

X2CRM

Marketing Campaign

maps to

Twenty CRM

Custom Object (Campaign) or Note

lossy
Fully supported

X2CRM Campaigns store campaign name, type, status, and associated mailing lists. Twenty CRM has no native campaign management object. During scoping we determine whether the customer's campaign records contain historical performance data (open rates, click rates, revenue attribution) that requires a custom Campaign object in Twenty, or whether campaign names and status values are sufficient to migrate as Note records attached to the associated Company or Person. The customer's RevOps lead makes this decision before migration begins.

X2CRM

Activity (Call, Meeting, Task)

maps to

Twenty CRM

Task or Note

1:1
Fully supported

X2CRM Activities include calls, meetings, and tasks with timestamps, owners, and related Contacts or Deals. We map X2CRM Activity records to Twenty Tasks and Notes. Call activities with disposition and duration migrate as Notes with the call details in the body. Meeting activities with location and attendees migrate as Notes or Tasks with date and description preserved. Task activities migrate directly to Twenty Tasks with status, priority, and due date. Activity timestamps and owner assignments are preserved by resolving the owner against the Twenty Members list.

X2CRM

Tag

maps to

Twenty CRM

Custom Field (multi-select) or Topic

lossy
Fully supported

X2CRM Tags are standalone label records applied across object types. We export all Tags and reapply them to their target records post-import. For Person and Company records, Tags migrate to a multi-select custom field in Twenty's Data Model that we create before import. For activity-level tagging, we evaluate whether to attach tags as Note text or to a separate tagging strategy based on the customer's reporting needs. The customer chooses the tagging approach during scoping.

X2CRM

Custom Field

maps to

Twenty CRM

Custom Field

lossy
Fully supported

X2CRM custom fields added via module builder vary by module and require field-level mapping during discovery. We inspect the X2CRM field schema via API discovery, map each custom field to an equivalent Twenty custom field type (text, number, date, select, multi-select, currency, checkbox), create the field in Twenty's Data Model before any data arrives, then map the values during the import transform phase. Fields with picklist values require matching option sets created in Twenty first.

X2CRM

User

maps to

Twenty CRM

Member

1:1
Fully supported

X2CRM User accounts include name, email, role, and assignment permissions. We export all Users and match them to Twenty Members by email during import. Any X2CRM User without a matching Twenty Member is placed in a reconciliation queue; your admin provisions the missing Members before record import resumes. Role and permission configurations in X2CRM (viewer, editor, admin) are documented for your admin to configure in Twenty's Members and Roles settings post-migration.

X2CRM

Attachment

maps to

Twenty CRM

Attachment (via file upload)

1:1
Fully supported

X2CRM attachments are stored as file references or blobs linked to records. On cloud-hosted X2CRM, we extract attachment URLs from the API response and re-upload via Twenty's GraphQL file upload mutation, linking the file to the target Company, Person, or Opportunity record. On self-hosted X2CRM, the attachment storage may use local disk paths requiring SSH or admin panel access to expose the upload directory — we coordinate with your IT team during discovery to confirm the attachment backend and access method before scoping.

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.

X2CRM logo

X2CRM gotchas

High

Rate limiting is gated behind Platinum Edition

High

Workflow automation (X2Flow) does not export as portable data

Medium

API requires Content-Type: application/json on all write requests

Medium

Data validation errors return HTTP 422 and may halt batch imports

Low

Self-hosted attachment storage may require manual file extraction

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

  • Twenty requires fields to exist before import

    Twenty's CSV import creates records only — it does not create fields. If a custom field does not exist in Settings → Data Model at the time of import, any data mapped to that field is silently dropped. This is not a migration tool limitation; it is a platform design constraint. We audit every X2CRM custom field and module-level field during discovery, create the corresponding fields in Twenty's Data Model before any export begins, and verify field existence with a dry-run schema check before the first data batch arrives. Skipping this step results in incomplete data that is only discovered during user adoption testing, not during migration.

  • Twenty's People and Companies lack standard fields out of the box

    An open GitHub issue (twentyhq/twenty#13953) documents that Twenty's Person and Company objects ship with minimal standard fields — teams moving from X2CRM (which includes industry, source, rating, and lifetime value on standard modules) must create these fields manually before importing. A Reddit review of Twenty also notes that import fails when standard fields expected from other CRMs are missing. We create all missing standard fields during the schema design phase, mapping X2CRM's standard field names to Twenty custom fields with appropriate types. This includes industry classification, contact source, and any X2CRM rating or scoring fields.

  • X2CRM X2Flow workflows do not export as portable data

    X2Flow stores automation logic as trigger-action pairs with UI configuration that is not accessible via the REST API in a portable format. Customers moving to Twenty must rebuild their workflows manually. We extract every X2Flow rule during discovery — trigger type, condition criteria, action sequence, and any delay or time-based logic — and produce a Workflow Reconstruction Document that maps each X2Flow rule to an equivalent Twenty workflow. Twenty's workflow builder (available on all paid tiers) supports filter conditions, record-triggered actions, and time-based triggers. The document is handed off to your admin post-migration for rebuild.

  • X2CRM Platinum rate limiting can throttle bulk export

    The X2CRM REST API returns HTTP 429 (Too Many Requests) only when rate limiting is explicitly enabled in API settings, and this feature is gated behind the Platinum tier. If your X2CRM instance is Platinum-tiered and rate limiting is active, bulk exports can be throttled mid-migration without warning. We negotiate a dedicated API token with a raised or disabled rate limit window before migration begins and monitor for 429 responses during the export phase to adjust pacing. Non-Platinum instances have no documented rate limit, which carries its own risk — we monitor for undocumented throttling and cap export throughput conservatively.

  • Self-hosted X2CRM attachment storage requires IT coordination

    X2CRM deployments on self-hosted infrastructure may store file attachments as local disk paths rather than in a cloud object store. The REST API does not expose attachment file bytes in this configuration — only file reference metadata. If the customer is migrating from a self-hosted X2CRM instance, the file store must be accessible for extraction, typically requiring SSH or admin panel access to expose the upload directory. We coordinate with the customer's IT team during discovery to confirm the attachment backend, confirm access credentials, and scope the file extraction as a separate workstream before migration scoping is finalized.

Migration approach

Six steps for a successful X2CRM to Twenty CRM data migration

  1. Discovery and schema audit

    We audit the source X2CRM instance across all active modules, custom fields, tag taxonomies, and user count. We identify every X2CRM object type (Contacts, Accounts, Deals, Products, Services, Campaigns, Activities, Tags, Custom Fields) and map them to their Twenty equivalents. We confirm whether the X2CRM instance is cloud-hosted or self-hosted, and whether the destination Twenty deployment is self-hosted (Docker) or cloud-hosted (app.twenty.com). For self-hosted X2CRM, we confirm IT team access for attachment extraction. The discovery output is a written migration scope, a schema mapping document, and a Twenty workspace preparation checklist.

  2. Twenty workspace preparation

    Before any data arrives, we create all required fields and custom objects in Twenty's Data Model. This includes industry, source, rating, and any X2CRM standard fields missing from Twenty's defaults; custom fields matching every X2CRM module field; custom objects for Service Contracts and any Campaign records requiring a persistent data model; and picklist option sets for all multi-select fields. We then invite all team members as Members in Twenty — user accounts must exist before any import that references an owner or assignee. This phase is critical and cannot be skipped; Twenty's import does not create fields, and owner references without matching Members are dropped silently.

  3. X2CRM export and data cleansing

    We export data from X2CRM in dependency order: Accounts first, then Contacts, then Deals and Opportunities, then Products, then Activities and Notes. We run a data quality pass to identify duplicate records, incomplete required fields, and malformed values before transformation. We flag duplicate records by email (for People) and company name (for Companies) and produce a deduplication recommendation report for the customer's review before import begins. Any records with missing required fields are held in a quarantine queue and corrected before retry. For Platinum-tier X2CRM instances, we configure the export pacing to avoid 429 throttling; for self-hosted instances, we confirm API endpoint accessibility.

  4. Owner and user reconciliation

    We extract every distinct X2CRM user referenced on Contacts, Accounts, Deals, and Activities and match by email against the Twenty Members list. Any X2CRM user without a matching Twenty Member is placed in a reconciliation report for the customer's admin to provision before record import resumes. Owner references on imported records must resolve at insert time — if a user account does not exist in Twenty, the owner field is left blank and flagged for post-migration correction. Role and permission configurations from X2CRM are documented separately for manual rebuild in Twenty's Members and Roles settings.

  5. Production import in dependency order

    We import data into Twenty in record-dependency order: Companies (from X2CRM Accounts) first, then People (from X2CRM Contacts), then Opportunities (from X2CRM Deals) with CompanyId and PersonId resolved, then Products, then custom object records (Service Contracts, Campaign records), then Activities and Notes. Each phase emits a row-count reconciliation report showing records imported, records skipped (with reason), and records quarantined (pending correction). Tags are reapplied post-import using the multi-select custom field created in Twenty's Data Model. Attachments are uploaded via Twenty's GraphQL file upload mutation and linked to the target record.

  6. Cutover, validation, and X2Flow handoff

    We freeze writes to X2CRM during cutover, run a final delta migration of any records modified during the migration window, then set Twenty as the system of record. We validate by spot-checking 25-50 records against the X2CRM source for field-level accuracy, matching pipeline stage distributions, and verifying tag reapplications. We deliver the Workflow Reconstruction Document mapping every X2Flow rule to a Twenty workflow equivalent for your admin to rebuild. We support a one-week hypercare window where we resolve any reconciliation issues raised by the customer's team. We do not rebuild X2Flow workflows as Twenty workflows inside the migration scope; that is a separate engagement or an internal admin task.

Platform deep dives

Context on both ends of the pair

X2CRM logo

X2CRM

Source

Strengths

  • Drag-and-drop X2Flow workflow builder accessible to non-developers for basic automation sequences.
  • All-in-one platform includes marketing, sales, and service modules without requiring separate product purchases.
  • Self-hosted and cloud deployment options give organizations control over where their CRM data resides.
  • Open-source codebase with modern language implementation for teams that need code-level customization.

Weaknesses

  • Thin third-party integration ecosystem limits connectivity to tools outside the core CRM modules.
  • Limited review volume on G2 and Capterra (17 reviews) makes it difficult to assess long-term reliability compared to higher-volume competitors.
  • Support responsiveness issues documented across multiple review sources raise risk for teams needing reliable escalation paths.
  • Smaller market presence means fewer certified implementation partners and less community-generated content, tutorials, and troubleshooting guides.
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. 2 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 X2CRM and Twenty CRM.

  • Object compatibility

    B

    2 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

    X2CRM: Not publicly documented. X2CRM is an open-source / self-hosted CRM, so practical throughput is bounded by the customer's PHP/MySQL deployment rather than a vendor-imposed limit. We benchmark export queries against the customer's hosted instance before the cutover sync..

  • Data volume sensitivity

    B

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

Estimator

Estimate your X2CRM 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 X2CRM to Twenty CRM data migrations

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

Can't find your answer?

Walk through your X2CRM 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 two and four weeks for accounts under 10,000 Contacts and 2,000 Deals with no custom objects and a clean data set. Migrations with custom modules, large activity histories (over 200,000 activity records), self-hosted X2CRM attachment extraction, or multiple custom field types move to four to eight weeks because of schema pre-creation, IT coordination for attachment access, and per-record error handling. The Twenty workspace preparation phase (creating fields and inviting Members) typically takes three to five business days and runs before any X2CRM data is touched.

Adjacent paths

Related migrations to explore

Ready when you are

Move from X2CRM.
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