CRM migration
Field-level mapping, validation, and rollback between ContactWise CRM and Twenty CRM. We move data and schema; workflows are rebuilt natively in Twenty CRM.
ContactWise CRM
Source
Twenty CRM
Destination
Compatibility
6 of 10
objects map 1:1 between ContactWise CRM and Twenty CRM.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Moving from ContactWise CRM to Twenty CRM is a transition from a proprietary UK-hosted contact center platform to a modern open-source CRM backed by Y Combinator (S23 batch) with over 44,000 GitHub stars. The fundamental migration difference is that ContactWise does not publish a public REST API for its CRM module, so export relies on the platform's native export function rather than an API pull. Twenty CRM stores fields as workspace-level definitions, so every custom ContactWise property requires a matching field to be created in Twenty before import. We handle the dependency order: export, field creation in Twenty, then import. Workflow definitions are ContactWise configuration, not data records, so we document every active rule for your team to rebuild in Twenty. Service desk tickets do not map directly to a standard Twenty object; we remap them to Twenty's Activity and Task model and preserve the ticket-to-contact association. We do not migrate automations, forms, or reporting configurations as code.
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 ContactWise CRM 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.
ContactWise CRM
Contact
Twenty CRM
Person
1:1ContactWise Contacts map to Twenty's Person object, which stores name, email, phone, and address fields. We perform a standard field-to-field mapping on standard fields and identify every ContactWise custom property during scoping. Twenty uses workspace-level field definitions, so we create each custom field in Twenty before importing any Person records. Custom property data types are mapped to Twenty field types (text, number, date, single-select, multi-select, URL, currency). Multi-select picklists in ContactWise convert to Twenty multi-select fields.
ContactWise CRM
Company/Account
Twenty CRM
Company
1:1ContactWise Company records map to Twenty's Company object. The company name, domain, industry, employee count, and address fields map directly. Custom company properties are handled the same way as custom Contact properties: we create the matching Twenty field before import, then load the data. Companies must be imported before Persons so that the Person-to-Company relationship (linked via the Person's company field) is satisfied at insert time.
ContactWise CRM
Lead
Twenty CRM
Person or Lead
1:1ContactWise Leads are a distinct object from Contacts with their own status and source attribution fields. We import them as Twenty Persons with a custom lead_status field preserved from the source. If the customer prefers a dedicated Lead object in Twenty, we create a custom Lead object with the relevant fields and import into that instead; the customer decides during scoping. The original lead source attribution migrates as a custom field.
ContactWise CRM
Opportunity
Twenty CRM
Opportunity
1:1ContactWise Opportunities map directly to Twenty's Opportunity object. Opportunity name, amount, stage, expected close date, and owner assignment migrate directly. Pipeline stage values from ContactWise are mapped to Twenty's Opportunity stage definitions, which we configure before import. If ContactWise uses multiple deal pipelines, we create corresponding Opportunity status columns in Twenty.
ContactWise CRM
Pipeline Stage
Twenty CRM
Opportunity Stage
lossyContactWise pipeline stage definitions (stage names and order) are documented during discovery and recreated in Twenty as Opportunity stage columns. Each stage's probability percentage migrates from ContactWise to Twenty's stage probability field. If the customer uses multiple pipelines in ContactWise, we map each to a separate set of stage columns in Twenty.
ContactWise CRM
Workflow
Twenty CRM
(documented, not migrated)
lossyContactWise Workflow definitions are stored as platform configuration, not as data records with an exportable API. We audit every active workflow during discovery, document the trigger type, conditions, and actions for each rule, and deliver a written workflow inventory to the customer's admin. The admin rebuilds the logic in the destination platform. Time-based triggers, process reminders, and conditional routing that have no direct Twenty equivalent are flagged explicitly.
ContactWise CRM
Service Desk Ticket
Twenty CRM
Activity + Task
1:manyContactWise tickets do not map to a single Twenty object. We split each ticket into a Twenty Activity record (containing the ticket subject, description, status, priority, and original ticket ID as a reference field) and a linked Task record for any action items assigned to team members. The ticket-to-contact association is preserved by linking the Activity to the Person record that owns the original ticket. Ticket comments and conversation history migrate as Activity comments.
ContactWise CRM
Time Entry
Twenty CRM
Custom Time Entry Object
lossyContactWise Time Entries are linked to Contacts, Tickets, or Projects but do not map directly to a standard Twenty object. We create a custom TimeEntry object in Twenty with fields for duration, date, billable flag, description, and linked Person. We map the source Time Entry duration and date fields directly and link to the Person record that the time was logged against. Projects (if used in ContactWise) are recreated as Twenty Companies with a project-type tag or a custom field.
ContactWise CRM
Document/Attachment
Twenty CRM
Attachment via Activity or Note
1:1ContactWise documents and attachments associated with Contacts, Opportunities, or Tickets are exported to cloud storage (customer-provided bucket) and linked to the corresponding Twenty record (Person, Opportunity, or Activity) via a URL field or as a Note attachment. We handle file metadata (filename, file type, upload date) during export. Large binary attachments may require chunking and are validated for size limits during scoping.
ContactWise CRM
Owner/User
Twenty CRM
Workspace User
1:1ContactWise Owners referenced on Contact, Company, and Opportunity records are matched to Twenty Workspace Users by email address. We extract every distinct owner referenced in the export and create a user mapping table. If a ContactWise Owner does not have a corresponding Twenty User at migration time, the record is held in a reconciliation queue and the original owner reference is preserved in a custom field until the admin provisions the user.
| ContactWise CRM | Twenty CRM | Compatibility | |
|---|---|---|---|
| Contact | Person1:1 | Fully supported | |
| Company/Account | Company1:1 | Fully supported | |
| Lead | Person or Lead1:1 | Fully supported | |
| Opportunity | Opportunity1:1 | Fully supported | |
| Pipeline Stage | Opportunity Stagelossy | Fully supported | |
| Workflow | (documented, not migrated)lossy | Fully supported | |
| Service Desk Ticket | Activity + Task1:many | Fully supported | |
| Time Entry | Custom Time Entry Objectlossy | Fully supported | |
| Document/Attachment | Attachment via Activity or Note1:1 | Fully supported | |
| Owner/User | Workspace User1: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.
ContactWise CRM gotchas
Workflow rules do not export as records
Service desk tickets require non-standard field mapping
API documentation is not publicly available for the CRM module
Custom contact properties may require manual field creation in destination
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 export assessment
We audit the ContactWise CRM instance across all active objects: Contacts, Leads, Opportunities, Companies/Accounts, Pipeline Stages, Service Desk Tickets, Time Entries, and Workflows. Because ContactWise has no public CRM REST API, we run a trial export using the platform's native export function and compare record counts against what the UI displays to identify any gaps in the export. We document every active workflow rule, custom property, and pipeline stage during this phase. The discovery output is a written migration scope, an export completeness report, and a list of any objects that require database access to supplement the export.
Schema setup in Twenty
We create the destination schema in Twenty before any data import. This includes creating every custom field identified during discovery (matching ContactWise's custom properties with Twenty's field types), configuring Opportunity stage columns mapped to the ContactWise pipeline stages, and creating the custom TimeEntry object for time tracking data. We also configure the initial workspace user list based on the owner mapping table so that OwnerId references can be resolved at import time. Schema is built in Twenty's UI or via API, and validated against the ContactWise export fields before production migration begins.
Test migration and reconciliation
We run a full migration into a Twenty workspace using a subset of the production export (typically 5-10% of records, minimum 100 of each object type). We reconcile record counts, spot-check field mappings, verify the Person-to-Company lookup resolution, and validate that service desk ticket content landed correctly in the Activity-Task model. The customer reviews the test output and signs off on the mapping before production migration. Any field mapping corrections, data type mismatches, or missing fields are addressed at this stage.
Production migration in dependency order
We run the production migration in record-dependency order: Companies first (because Persons link to them), then Persons (Contacts and Leads), then Opportunities, then Activities and Tasks (from service desk tickets), then Time Entries. Custom fields are populated during each phase. The owner mapping table is applied throughout to resolve ContactWise Owner references to Twenty Workspace Users. Each phase emits a row-count reconciliation report. Workflows are not migrated as code; the written workflow inventory is delivered alongside the migration summary.
Cutover and validation
We coordinate a cutover window during which new ContactWise writes are frozen. A final delta migration captures any records modified during the migration window. We validate record counts, relationship integrity (Person-to-Company links, Activity-to-Person links), and the completeness of historical data. The Twenty workspace is set as the system of record and ContactWise access is either sunsetted or demoted to read-only per the customer's decision. We deliver the workflow inventory document and the migration reconciliation report.
Post-migration handoff
We support a one-week hypercare window following cutover where we resolve any data issues raised by the customer's team (records not found, relationship breaks, custom field values not populated). We do not rebuild ContactWise workflows as Twenty automations within the migration scope; that work uses the workflow inventory we delivered and is handled by the customer's admin team. Training and ongoing admin support are outside standard migration scope and can be arranged as a separate engagement.
Platform deep dives
ContactWise CRM
Source
Strengths
Weaknesses
Twenty CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 1 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 ContactWise CRM and Twenty CRM.
Object compatibility
1 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
ContactWise CRM: Not publicly documented.
Data volume sensitivity
ContactWise CRM 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 ContactWise CRM to Twenty CRM migration scoping. Not seeing yours? Book a call.
Walk through your ContactWise CRM 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 ContactWise CRM
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.