CRM migration
Field-level mapping, validation, and rollback between OpenCRM and Twenty CRM. We move data and schema; workflows are rebuilt natively in Twenty CRM.
OpenCRM
Source
Twenty CRM
Destination
Compatibility
8 of 10
objects map 1:1 between OpenCRM and Twenty CRM.
Complexity
CModerate
Timeline
3-5 weeks
Overview
Moving from OpenCRM to Twenty CRM is a migration from a UK-based VtigerCRM fork to a modern open-source CRM built in 2023 with a TypeScript/React stack and a GraphQL API. OpenCRM uses CSV exports as its primary data extraction mechanism and stores Contacts linked to Companies via foreign-key relationships; Deals carry pipeline stage names that require manual mapping. Twenty CRM uses a different object model: OpenCRM Companies map to Twenty Companies, OpenCRM Contacts map to Twenty Persons, and OpenCRM Deals map to Twenty Opportunities. A key migration constraint is that Twenty ships with minimal standard fields on Person and Company objects, requiring custom field creation via the /metadata GraphQL API before record import begins. We pre-create the full custom field schema in Twenty, sequence the import as Companies first then Persons then Opportunities, and resolve owner references through email matching. Workflows, automations, and custom integrations do not migrate; we deliver a written inventory of these for the customer to rebuild in Twenty's workflow builder or via connected n8n automations.
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 OpenCRM 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.
OpenCRM
Company
Twenty CRM
Company
1:1OpenCRM Company records map directly to Twenty Company records. We extract the full OpenCRM Company dataset via CSV export including all standard fields (name, domain, address, phone) and any custom fields discovered during scoping. The Company record is imported first because OpenCRM Contacts are linked to Companies via foreign-key relationship; without the parent Company present, Contact imports would create orphaned Person records with no company association.
OpenCRM
Contact
Twenty CRM
Person
1:1OpenCRM Contact records map to Twenty Person records. The OpenCRM contact_email, contact_phone, contact_firstname, and contact_lastname fields map to Twenty's Person standard fields. A key pre-migration requirement in Twenty is that many industry-standard fields (job title, department, phone type) do not exist as standard fields and must be created via the /metadata GraphQL API before Person import. We create these custom fields during the schema preparation phase so that field mapping can complete field-by-field rather than collapsing into generic text fields.
OpenCRM
Deal
Twenty CRM
Opportunity
1:1OpenCRM Deals map to Twenty Opportunities. The OpenCRM deal name, value (amount), expected close date, and owner assignment transfer directly. Pipeline stage names from OpenCRM require a stage-mapping table because Twenty Opportunity stages are tenant-defined and rarely align one-to-one with OpenCRM's workflow-specific stage names. We produce this mapping during scoping and present it for customer confirmation before the Opportunity import runs.
OpenCRM
Activity (Call, Meeting, Task)
Twenty CRM
Task / Event
1:1OpenCRM Activity records (calls, meetings, tasks) are supported for migration with timestamp normalization to UTC and owner mapping by email match to Twenty users. Twenty stores task-type activities as Task records and meeting-type activities as Event records. We validate that each activity has a valid Person or Company reference before import so the activity lands in the correct Twenty timeline.
OpenCRM
Note
Twenty CRM
Comment
1:1OpenCRM Notes attached to Contacts, Companies, or Deals migrate to Twenty Comment records linked to the corresponding Person or Company. Note body content migrates as rich text. We validate parent record linkage after import to confirm notes are associated with the correct entity in Twenty.
OpenCRM
Custom Field (all objects)
Twenty CRM
Custom Field
lossyOpenCRM custom fields on Contacts, Companies, and Deals require pre-creation in Twenty via the /metadata GraphQL API before migration begins. We discover all custom field names, data types, and object assignments during the scoping phase, then create the corresponding Twenty custom fields with matching API names. This is a required step because Twenty's Person and Company objects ship with minimal standard fields and imports that attempt to populate non-existent fields will silently fail or reject records.
OpenCRM
Tag / Label
Twenty CRM
Tag
1:1Tag-based categorisation on OpenCRM Contacts and Companies migrates as flat string arrays to Twenty Tags. Tags used for content classification migrate as Twenty Tag records with TagAssignment records linking to the Person or Company. The customer confirms tag strategy during scoping since Twenty supports both object-level tags and workspace-level topic tagging.
OpenCRM
User / Owner
Twenty CRM
WorkspaceMember
1:1OpenCRM user records and deal/contact ownership assignments are resolved by email match against Twenty WorkspaceMember records. Any OpenCRM Owner without a matching Twenty user goes to a reconciliation queue for the customer to provision before record import resumes. Owner resolution is required before Contacts and Deals can be imported because both record types carry an owner reference in Twenty.
OpenCRM
Pipeline Stage
Twenty CRM
Pipeline Stage
lossyOpenCRM allows full customisation of pipeline stage names per workflow. We produce a stage-mapping table during scoping that maps each OpenCRM stage name to the corresponding Twenty Pipeline stage value. The customer reviews and approves this table before Opportunity import so every Deal lands in the correct stage.
OpenCRM
Attachment
Twenty CRM
Attachment (file reference)
1:1File attachments stored against OpenCRM Contacts, Companies, or Deals are extracted from the OpenCRM UI export and staged in a file store. We generate reference links in Twenty pointing to the staged file store so the attachment context is preserved even if the attachment content is not embedded in Twenty's object model. Full file embedding in Twenty is available via the /graphql API for implementations that require it.
| OpenCRM | Twenty CRM | Compatibility | |
|---|---|---|---|
| Company | Company1:1 | Fully supported | |
| Contact | Person1:1 | Fully supported | |
| Deal | Opportunity1:1 | Fully supported | |
| Activity (Call, Meeting, Task) | Task / Event1:1 | Fully supported | |
| Note | Comment1:1 | Fully supported | |
| Custom Field (all objects) | Custom Fieldlossy | Fully supported | |
| Tag / Label | Tag1:1 | Fully supported | |
| User / Owner | WorkspaceMember1:1 | Fully supported | |
| Pipeline Stage | Pipeline Stagelossy | Fully supported | |
| Attachment | Attachment (file reference)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.
OpenCRM gotchas
Bulk import without CRM ID or ExternalID creates duplicate records
Import ordering dependency: Companies before Contacts
No documented public REST API for programmatic export
Pipeline stage names are tenant-defined and require manual mapping
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 CSV export scoping
We audit the OpenCRM tenant to enumerate all active modules (Contacts, Companies, Deals, Activities, Notes), custom field names and data types, pipeline stage names, owner assignments, and tag usage. We coordinate with the customer's OpenCRM admin to export full-column CSV for each object from the OpenCRM list view. We simultaneously query Twenty's /metadata GraphQL endpoint to enumerate existing standard and custom fields and identify the gap that requires custom field pre-creation. The discovery output is a written migration scope document with the full field mapping matrix and a list of Twenty custom fields to create before import.
Twenty schema preparation and custom field creation
We create all required custom fields in Twenty via the /metadata GraphQL API before any record import. This includes OpenCRM custom field equivalents on Person and Company, plus any industry-standard fields (job title, department, phone type, industry, annual revenue) that OpenCRM has as standard but Twenty does not. We deploy the schema to a Twenty staging instance (or sandbox equivalent) for validation before production migration. We also configure Pipeline stages in Twenty to match the OpenCRM stage names, using the stage-mapping table confirmed with the customer during scoping.
CSV parsing, transformation, and reconciliation
We parse the exported OpenCRM CSV files, apply the field mapping matrix, normalize date formats to ISO 8601 UTC, resolve owner email addresses to Twenty WorkspaceMember IDs, and validate that every Contact has a valid Company reference. Any records with broken parent references, missing required fields, or invalid data formats are flagged in a pre-import reconciliation report for the customer to review and resolve before loading. We also deduplicate on the OpenCRM record ID to prevent duplicate creation on any re-run.
Staging migration and sign-off
We run a full migration into a Twenty staging instance using production-like data volume. The customer's ops lead reconciles record counts (Companies in, Persons in, Opportunities in, Activities in), spot-checks 25 to 50 random records against the OpenCRM source, and confirms the Person-to-Company linkage and Opportunity stage assignments are correct. Any mapping corrections are applied to the transformation logic before the production migration runs. This step is the last opportunity to adjust field mapping without affecting live data.
Production migration in dependency order
We run production migration in record-dependency order: Companies first (from OpenCRM Company CSV), then Persons with companyId resolved from the newly created Company records, then Opportunities with stage name mapped via the confirmed stage table, then Activities and Notes linked to their parent Persons and Companies. Each phase emits a row-count reconciliation report. Owner resolution by email match happens during the preparation phase; any OpenCRM Owner without a matching Twenty WorkspaceMember is held in a reconciliation queue.
Cutover, validation, and workflow rebuild handoff
We freeze OpenCRM write access during cutover, run a final delta migration of any records modified during the migration window, then enable Twenty as the system of record. We deliver the OpenCRM workflow and automation inventory document to the customer's admin team with recommended Twenty workflow builder equivalents. We support a one-week hypercare window where we resolve any reconciliation issues raised by the customer's team. We do not rebuild OpenCRM workflows in Twenty's workflow builder or configure n8n sequences inside the migration scope; those are separate engagements or internal admin tasks.
Platform deep dives
OpenCRM
Source
Strengths
Weaknesses
Twenty CRM
Destination
Strengths
Weaknesses
Complexity grading
Moderate CRM migration. 4 of 8 objects need a mapping; the rest are 1:1.
Overall complexity
Moderate migration
Derived from compatibility, mapping clarity, API constraints, and data volume across OpenCRM and Twenty CRM.
Object compatibility
4 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
OpenCRM: Not publicly documented.
Data volume sensitivity
OpenCRM 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 OpenCRM to Twenty CRM migration scoping. Not seeing yours? Book a call.
Walk through your OpenCRM 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 OpenCRM
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.