CRM migration

Migrate from ContactWise CRM to Twenty CRM

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 logo

ContactWise CRM

Source

Twenty CRM

Destination

Twenty CRM logo

Compatibility

60%

6 of 10

objects map 1:1 between ContactWise CRM and Twenty CRM.

Complexity

BStandard

Timeline

3-5 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

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.

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

ContactWise CRM logo

ContactWise CRM

What's pushing teams away

  • Integration issues with workflow-related applications are the most cited operational pain point, with users reporting friction when connecting ContactWise to adjacent tools.
  • Project management functionality is considered weak by enterprise reviewers, who expect more from a platform positioning itself as a unified customer management solution.
  • Customer service responsiveness is flagged as a significant pain point, with at least one enterprise reviewer describing it as terrible in G2 feedback.
  • Limited platform maturity compared to established CRMs creates concerns about long-term roadmap stability and feature depth as teams scale.

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

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

maps to

Twenty CRM

Person

1:1
Fully supported

ContactWise 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

maps to

Twenty CRM

Company

1:1
Fully supported

ContactWise 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

maps to

Twenty CRM

Person or Lead

1:1
Fully supported

ContactWise 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

maps to

Twenty CRM

Opportunity

1:1
Fully supported

ContactWise 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

maps to

Twenty CRM

Opportunity Stage

lossy
Fully supported

ContactWise 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

maps to

Twenty CRM

(documented, not migrated)

lossy
Fully supported

ContactWise 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

maps to

Twenty CRM

Activity + Task

1:many
Fully supported

ContactWise 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

maps to

Twenty CRM

Custom Time Entry Object

lossy
Fully supported

ContactWise 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

maps to

Twenty CRM

Attachment via Activity or Note

1:1
Fully supported

ContactWise 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

maps to

Twenty CRM

Workspace User

1:1
Fully supported

ContactWise 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.

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.

ContactWise CRM logo

ContactWise CRM gotchas

Medium

Workflow rules do not export as records

Medium

Service desk tickets require non-standard field mapping

High

API documentation is not publicly available for the CRM module

Low

Custom contact properties may require manual field creation in destination

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

  • No public CRM REST API on ContactWise

    ContactWise publishes API documentation for its messaging platform (SMS/WhatsApp) but does not publicly document a REST API for the CRM module. Data export relies on the platform's native export function, which may not capture all objects, relationships, or historical states in a single pull. We assess export completeness during discovery by running a trial export and comparing record counts against what the UI displays. Where the export misses relationships (such as ticket-to-contact links or opportunity-to-owner references), we supplement with manual field extraction or direct database access if the customer has provisioned read-only database credentials. This gap extends the discovery phase and may increase the per-record cost for migrations with complex relationship graphs.

  • Workflow rules are configuration not data

    ContactWise Workflows store automation logic as platform configuration, not as exportable data records. The rules, triggers, conditions, and actions cannot be extracted, transformed, and loaded into Twenty as-is. We audit and document every active workflow during discovery and deliver a written inventory with trigger type, conditions, actions, and a recommended manual rebuild approach for Twenty. Time-based triggers and conditional routing that have no equivalent in Twenty's current feature set are flagged explicitly so the admin can prioritize or deprecate those rules rather than attempting an unworkable migration. This is standard scope for every ContactWise migration and is not a surprise gap.

  • Custom ContactWise properties require Twenty field creation

    ContactWise supports custom properties on Contacts, Leads, Opportunities, and Companies that do not correspond to standard fields in Twenty CRM. Twenty uses workspace-level field definitions rather than per-object custom fields, which means every ContactWise custom property requires a distinct field to be created in the destination workspace before any data is imported. We identify every custom property during scoping, create the matching Twenty fields (with correct types: text, number, date, single-select, multi-select, URL, currency), validate the schema in a test environment, and only then run the production import. Migrations with 20+ custom properties require an explicit field creation phase that adds one to two weeks to the timeline.

  • Service desk tickets lack a direct Twenty object

    ContactWise service desk tickets do not map to a single Twenty CRM object. Twenty has Activities and Tasks but no native ticket object with a state machine, priority levels, and resolution tracking. We handle this by splitting each ContactWise ticket into a Twenty Activity (ticket subject, description, status, priority, original ticket ID) linked to the Person record, with action items migrated as Task records. This preserves the ticket content and the person association but does not replicate ContactWise's ticket state model. Customers who rely on service desk SLA tracking and ticket state transitions may need to rebuild that logic in Twenty using Activities and Tasks, or adopt a dedicated support tool alongside Twenty.

  • Time entries require a custom object

    ContactWise time tracking entries (linked to Contacts, Tickets, or Projects) do not map to a standard Twenty object. We create a custom TimeEntry object in the destination workspace with fields for duration, date, billable flag, description, and a Person lookup. The custom object is created during the schema setup phase and validated before any records are imported. Customers who rely heavily on time tracking for billing or project accounting should validate that the custom TimeEntry object meets their reporting needs or consider a dedicated time-tracking tool to pair with Twenty.

Migration approach

Six steps for a successful ContactWise CRM to Twenty CRM data migration

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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

Context on both ends of the pair

ContactWise CRM logo

ContactWise CRM

Source

Strengths

  • Cloud-first architecture with global browser access from any location without on-premise dependencies.
  • Workflow automation engine with process management and reminder triggers for recurring operational tasks.
  • Contact and lead management with centralized customer data including purchase history and demographics.
  • Unified messaging layer combining SMS, WhatsApp, and RCS through a single developer API.
  • Relatively low barrier to entry for small teams looking for a straightforward CRM without complex configuration.

Weaknesses

  • Limited project management functionality compared to teams' expectations for a full CRM platform.
  • Reported integration challenges with third-party workflow applications affecting operational efficiency.
  • Sparser documentation and community resources compared to established CRM vendors.
  • Smaller vendor footprint raises concerns about long-term product support and roadmap investment.
  • Pricing model requires direct consultation rather than self-service evaluation, increasing evaluation friction.
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. 1 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 ContactWise CRM and Twenty CRM.

  • Object compatibility

    B

    1 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

    ContactWise CRM: Not publicly documented.

  • Data volume sensitivity

    B

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

Estimator

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

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

Can't find your answer?

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 consultation

Most migrations land between three and five weeks for accounts under 15,000 Contacts, 3,000 Opportunities, and no active service desk ticketing. Migrations with 20+ custom ContactWise properties (which require a dedicated field creation phase), active service desk queues with conversation history, or large time-entry histories move to seven to eleven weeks because of the additional mapping and custom object work. The main timeline driver is not record volume but the number of distinct custom fields and the complexity of the service desk ticket remapping.

Adjacent paths

Related migrations to explore

Ready when you are

Move from ContactWise CRM.
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