CRM migration
Field-level mapping, validation, and rollback between X2CRM and Twenty CRM. We move data and schema; workflows are rebuilt natively in Twenty CRM.
X2CRM
Source
Twenty CRM
Destination
Compatibility
8 of 11
objects map 1:1 between X2CRM and Twenty CRM.
Complexity
BStandard
Timeline
2-4 weeks
Overview
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.
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 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
Twenty CRM
Company
1:1X2CRM 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
Twenty CRM
Person
1:1X2CRM 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
Twenty CRM
Opportunity
1:1X2CRM 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
Twenty CRM
Product
1:1X2CRM 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
Twenty CRM
Custom Object (ServiceContract)
1:1X2CRM 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
Twenty CRM
Custom Object (Campaign) or Note
lossyX2CRM 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)
Twenty CRM
Task or Note
1:1X2CRM 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
Twenty CRM
Custom Field (multi-select) or Topic
lossyX2CRM 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
Twenty CRM
Custom Field
lossyX2CRM 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
Twenty CRM
Member
1:1X2CRM 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
Twenty CRM
Attachment (via file upload)
1:1X2CRM 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.
| X2CRM | Twenty CRM | Compatibility | |
|---|---|---|---|
| Account | Company1:1 | Fully supported | |
| Contact | Person1:1 | Fully supported | |
| Deal | Opportunity1:1 | Fully supported | |
| Product | Product1:1 | Fully supported | |
| Service | Custom Object (ServiceContract)1:1 | Fully supported | |
| Marketing Campaign | Custom Object (Campaign) or Notelossy | Fully supported | |
| Activity (Call, Meeting, Task) | Task or Note1:1 | Fully supported | |
| Tag | Custom Field (multi-select) or Topiclossy | Fully supported | |
| Custom Field | Custom Fieldlossy | Fully supported | |
| User | Member1:1 | Fully supported | |
| Attachment | Attachment (via file upload)1: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.
X2CRM gotchas
Rate limiting is gated behind Platinum Edition
Workflow automation (X2Flow) does not export as portable data
API requires Content-Type: application/json on all write requests
Data validation errors return HTTP 422 and may halt batch imports
Self-hosted attachment storage may require manual file extraction
Twenty CRM gotchas
Import order is enforced and critical
Export limited to 20,000 records and visible columns only
Soft-deleted records count toward uniqueness and trigger restores
API rate limits cap at 200 req/min on Organization tier
No native email sequences — follow-up cadences require external tools
Pair-specific challenges
Migration approach
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.
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.
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.
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.
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.
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
X2CRM
Source
Strengths
Weaknesses
Twenty CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 2 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 X2CRM and Twenty CRM.
Object compatibility
2 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
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
X2CRM 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 X2CRM to Twenty CRM migration scoping. Not seeing yours? Book a call.
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 consultationAdjacent paths
Other ways to leave X2CRM
Other ways to arrive at Twenty CRM
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.