CRM migration
Field-level mapping, validation, and rollback between erxes and Twenty CRM. We move data and schema; workflows are rebuilt natively in Twenty CRM.
erxes
Source
Twenty CRM
Destination
Compatibility
6 of 10
objects map 1:1 between erxes and Twenty CRM.
Complexity
BStandard
Timeline
4-8 weeks
Overview
Moving from erxes to Twenty CRM is a migration between two self-hosted open-source CRMs with different architectural models. erxes organizes data around its plugin-based XOS architecture with Contacts, Companies, Deals, Tasks, and multi-channel Conversations accessed via GraphQL with no native bulk export. Twenty CRM, backed by Y Combinator S23 and built in TypeScript with Next.js and NestJS, uses a more conventional CRM object model with People, Companies, Opportunities, and Tasks accessed via REST and GraphQL. We resolve the extraction challenge (erxes requires paginated GraphQL queries rather than a bulk export UI), verify plugin activation states before reading any module data, validate erxes schema-less custom field values against Twenty's typed field model, and migrate records in dependency order with parent-record lookup resolution. Automation workflows and sequences do not migrate; we deliver a written inventory of every active automation for the customer's admin to rebuild in Twenty.
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 erxes 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.
erxes
Contact
Twenty CRM
Person
1:1erxes Contacts migrate directly to Twenty CRM People records. Standard fields (name, email, phone, primaryAddress) map to the corresponding Twenty Person fields. We extract custom field values from erxes' property system and map them to Twenty custom fields, validating type compatibility (text, number, date, select) against Twenty's field definitions before insert. Any erxes Contact without an email receives a generated placeholder and a custom flag for manual review.
erxes
Company
Twenty CRM
Company
1:1erxes Company records map 1:1 to Twenty CRM Companies. The company domain, industry, size, and address fields migrate directly. We resolve the linked Contacts to associate them with the migrated Company record using the companyId reference preserved in the erxes data model. Company is created before Person import so the lookup relationship is satisfied at insert time.
erxes
Deal
Twenty CRM
Opportunity
1:1erxes Deals map to Twenty CRM Opportunities with the deal amount, stage, and custom fields preserved. We translate the erxes dealstage property to Twenty's Opportunity stage values. Any erxes Deals without a linked Company are imported with a placeholder Company record to satisfy the lookup requirement, and we flag these for the customer's admin to reconcile after migration.
erxes
Pipeline
Twenty CRM
Pipeline
1:1erxes Pipelines define the sales workflow stages and map directly to Twenty CRM Pipelines. Stage order, names, and probability mappings migrate as configuration. We create the Twenty Pipeline first, then create the stage definitions with the correct sort order before importing Deals so that stage lookups are available at insert time.
erxes
Task
Twenty CRM
Task
1:1erxes Tasks migrate to Twenty CRM Tasks with title, description, due date, status, and priority preserved. Task ownership migrates by resolving the erxes userId to the Twenty WorkspaceMember via email match. Tasks linked to specific Contacts or Deals maintain their association through the appropriate lookup fields in Twenty's data model.
erxes
Conversation
Twenty CRM
Activity + Comment
1:manyerxes multi-channel Conversations (email, SMS, chat, WhatsApp) migrate to Twenty as Activity records with Comment records for the message thread. We preserve the conversation metadata (channel type, direction, customer identifier) and the message body, author, and timestamp. Message ordering depends on erxes' server-side createdAt timestamps which we preserve during import. Channel credentials (API keys, webhook URLs) do not migrate and are flagged for manual reconfiguration in Twenty's workspace settings.
erxes
Custom Field (on Contacts)
Twenty CRM
Custom Field (on Person)
lossyerxes custom fields on Contacts map to Twenty custom fields on the Person object. We validate erxes' schema-less values against Twenty's typed field model before import and flag any type mismatches. For example, if an erxes date custom field contains a text string (which erxes allows), we flag the record and either correct the value or exclude it from that field with a reconciliation note.
erxes
Custom Field (on Deals)
Twenty CRM
Custom Field (on Opportunity)
lossyerxes custom fields on Deals map to Twenty custom fields on the Opportunity object. Same type-validation approach applies: erxes allows any value to be written to any custom field regardless of UI-defined type, so we validate against Twenty's field schema and flag mismatches. Complex custom field structures (multi-select, relational) are documented separately for the customer's admin to verify in Twenty's data model.
erxes
User / Team Member
Twenty CRM
WorkspaceMember
1:1erxes Users map to Twenty WorkspaceMembers via email match. Role and permission configurations are documented for manual review because Twenty's role model differs from erxes' plugin-based permission system. We extract all distinct users referenced on records (Contacts, Companies, Deals, Tasks, Conversations) to build the user mapping table, and flag any erxes user without a matching Twenty WorkspaceMember for the customer's admin to provision before record import.
erxes
Automation Workflow
Twenty CRM
(no migration)
lossyerxes Automation Workflows are not migrated as code. We extract the full workflow structure including triggers, conditions, and actions from the erxes plugin configuration and deliver a written inventory document. Each automation is documented with its name, trigger type, conditions, action sequence, and a recommended Twenty equivalent or note that the workflow pattern is not supported. The customer's admin rebuilds automations in Twenty post-migration.
| erxes | Twenty CRM | Compatibility | |
|---|---|---|---|
| Contact | Person1:1 | Fully supported | |
| Company | Company1:1 | Fully supported | |
| Deal | Opportunity1:1 | Fully supported | |
| Pipeline | Pipeline1:1 | Fully supported | |
| Task | Task1:1 | Fully supported | |
| Conversation | Activity + Comment1:many | Fully supported | |
| Custom Field (on Contacts) | Custom Field (on Person)lossy | Fully supported | |
| Custom Field (on Deals) | Custom Field (on Opportunity)lossy | Fully supported | |
| User / Team Member | WorkspaceMember1:1 | Fully supported | |
| Automation Workflow | (no migration)lossy | 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.
erxes gotchas
No native bulk export in Community edition
Plugin activation state affects data visibility
Custom fields have no type enforcement during import
Conversation message ordering depends on server timestamps
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
Pre-migration audit and plugin activation verification
We audit the source erxes instance across all active plugins, custom field definitions on Contacts, Companies, Deals, and Tasks, pipeline and stage configurations, active automation workflow count, and engagement volume (tasks, conversations). We specifically verify that all plugins whose data the customer wants migrated are currently active, because deactivating a plugin hides its data from the API. The audit output is a written scope document listing every erxes object type, record count estimate, custom field schema, and a confirmation of plugin activation status.
GraphQL extraction with pagination and checkpointing
We build a programmatic extraction job that queries erxes via GraphQL using cursor-based pagination. Each record type (Contacts, Companies, Deals, Tasks, Conversations) is extracted as a separate batch with checkpointing so that job interruption does not require a full restart. We implement exponential backoff on rate-limit responses and chunk large result sets to avoid memory exhaustion on the extraction host. The extraction output is a set of structured JSON files organized by object type, ready for transformation.
Twenty workspace setup and custom field creation
Before any record import, we create the Twenty CRM workspace configuration including Pipelines, Pipeline Stages, and all custom fields. Custom fields are defined with the correct type (text, number, date, select, multi-select) matching the erxes field schema. We run this configuration into a Twenty test workspace first to validate the field definitions and confirm that the import process accepts the migrated values without type errors.
Sandbox migration and record-count reconciliation
We run a full migration into Twenty's test environment using production-like data volume. The customer's admin reviews record counts (People, Companies, Opportunities, Tasks, Activities) against the source erxes counts, spot-checks 25-50 random records for field-level accuracy, and validates that the pipeline stage assignments and custom field values are correct. Any mapping corrections (field name mismatches, type validation failures, missing lookups) happen in this phase. The customer signs off before production migration begins.
User provisioning and owner reconciliation
We extract every distinct erxes user referenced on Contacts, Companies, Deals, Tasks, and Conversations and match by email against the Twenty workspace's WorkspaceMembers. Any erxes user without a matching Twenty account goes to a reconciliation queue for the customer's admin to provision. Owner assignments on migrated records cannot be finalized until all referenced users exist in Twenty. We run a second pass after user provisioning to update OwnerId lookups on all previously imported records.
Production migration in dependency order
We run production migration in record-dependency order: Companies (first, because People need a Company lookup), People (with companyId resolved), Opportunities (with companyId and Pipeline stage resolved), Tasks (with ownerId resolved via email match), Activity history and Conversation threads (with Person and Opportunity lookups resolved). Each phase emits a row-count reconciliation report before the next phase begins. Automation workflow inventory is delivered as a separate document alongside the migration reports.
Platform deep dives
erxes
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 erxes 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
erxes: Not publicly documented.
Data volume sensitivity
erxes 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 erxes to Twenty CRM migration scoping. Not seeing yours? Book a call.
Walk through your erxes 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 erxes
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.