CRM migration

Migrate from SuiteCRM to Twenty CRM

Field-level mapping, validation, and rollback between SuiteCRM and Twenty CRM. We move data and schema; workflows are rebuilt natively in Twenty CRM.

SuiteCRM logo

SuiteCRM

Source

Twenty CRM

Destination

Twenty CRM logo

Compatibility

75%

9 of 12

objects map 1:1 between SuiteCRM and Twenty CRM.

Complexity

BStandard

Timeline

4-8 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

Moving from SuiteCRM to Twenty CRM is a structural migration from a PHP-based CRM with a decade-old data model to a modern TypeScript/Next.js application with a Notion-inspired interface. SuiteCRM's Account and Contact are separate modules; Twenty collapses these into Company and People, requiring a schema redesign during import. We extract data from SuiteCRM via the v4.1 REST API for 7.x instances or the v8 REST API for 8.x, pulling Accounts, Contacts, Leads, Opportunities, Cases, and any custom modules built in Studio. Document files stored on the SuiteCRM server filesystem are copied separately and reattached in Twenty. Custom fields created via SuiteCRM Studio are mapped to Twenty custom fields that we pre-create in Settings before any CSV import. Workflow rules (AOW) stored as PHP-serialized objects do not migrate; we deliver a written inventory for manual rebuild in Twenty's workflow system. Activities migrate as Tasks and Notes tied to the correct Company or People record via Twenty's GraphQL API.

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

SuiteCRM logo

SuiteCRM

What's pushing teams away

  • The out-of-the-box UI is widely described as outdated and slow, and the mobile app is a web wrapper with poor offline performance and no field-optimised workflows.
  • Setting up, customising, and maintaining SuiteCRM requires a technical resource — sysadmins or PHP developers — making it a poor fit for small sales teams wanting a plug-and-play CRM.
  • Community support is slow and inconsistent, and paid support is required for anything beyond basic issues, adding hidden operational cost.
  • Google Calendar integration and other third-party connectors are unreliable in practice, causing sync failures that frustrate field sales teams.
  • Migrating between major versions (7.x to 8.x) is non-trivial and has broken CSS, JS, and permissions for many users, making upgrades a risk rather than a routine task.

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

Each row shows how a SuiteCRM 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.

SuiteCRM

Account

maps to

Twenty CRM

Company

1:1
Fully supported

SuiteCRM Accounts map directly to Twenty Companies. Account name maps to Company.displayName, industry maps to Company.industry, website maps to Company.domain, and address fields map to Company.address. We extract all Account records via the SuiteCRM REST API (v4.1 for 7.x, v8 for 8.x) before importing Companies into Twenty. The Account ID is preserved in a custom field suitecrm_id__c for relationship reconciliation during the Contact import phase.

SuiteCRM

Contact

maps to

Twenty CRM

People

1:1
Fully supported

SuiteCRM Contacts map to Twenty People records. Name fields (first_name, last_name) map to People.displayName or firstName/lastName depending on the customer's preference. Email, phone, and title migrate to People.email, People.phone, and People.jobTitle. The primary Account link migrates as a Company relation in Twenty. We resolve the Account reference by looking up the SuiteCRM Account ID against the suitecrm_id__c custom field we set during the Account import phase.

SuiteCRM

Lead

maps to

Twenty CRM

People (or custom Lead object)

lossy
Fully supported

SuiteCRM Leads are a separate module from Contacts. In Twenty, Leads can either map to People records (if the customer wants a unified person object) or to a custom Lead object created in Settings → Data Model before import. We make this decision during scoping based on the customer's pipeline: if Leads represent unqualified prospects that go through a separate qualification step, a custom Lead object preserves that lifecycle. Lead status and source fields migrate to custom People fields or custom Lead fields respectively.

SuiteCRM

Opportunity

maps to

Twenty CRM

Opportunity

1:1
Fully supported

SuiteCRM Opportunities map directly to Twenty Opportunities. Deal amount maps to Opportunity.amount, close date maps to Opportunity.closeDate, and sales stage maps to Opportunity.stage. The probability percentage migrates to a custom Opportunity field or is used to compute a display probability. The Account link migrates as a Company relation resolved via suitecrm_id__c lookup. Pipeline-specific stage values become Twenty Opportunity stage values configured before import.

SuiteCRM

Case (Bugs module)

maps to

Twenty CRM

Task

1:1
Fully supported

SuiteCRM Cases track support issues linked to Contacts or Accounts. Case records migrate to Twenty Tasks with the case title as Task.title, status mapped to Task.status, and priority mapped to Taskriority. The related Contact or Account link migrates as a People or Company relation in Twenty. Case descriptions migrate as Task.body or Note records attached to the Task. Closed-case history is preserved as completed Tasks.

SuiteCRM

Custom Field (Studio)

maps to

Twenty CRM

Custom Field

lossy
Fully supported

SuiteCRM custom fields added via Studio are stored in extended database tables with a naming convention appended to the module name. We scan the SuiteCRM database schema to identify all extended column names, map their data types (varchar to text, int to number, date to date, enum to select, multienum to multiselect), and pre-create the equivalent custom fields in Twenty Settings → Data Model before any CSV import begins. This step is critical: Twenty's CSV import creates records only, not fields.

SuiteCRM

Document

maps to

Twenty CRM

Attachment (Content)

1:1
Fully supported

SuiteCRM Documents store files on the server filesystem (typically upload/) with a database record containing metadata. We extract both the file blobs and the metadata records. Files are copied to a local staging directory with checksums validated post-copy. On import into Twenty, we reattach files as Note or Attachment records linked to the parent Company, People, or Opportunity record. File system permission issues during extraction are a known migration risk: we validate file integrity checksums after extraction and flag any inaccessible files in the reconciliation report.

SuiteCRM

User (Assignee)

maps to

Twenty CRM

WorkspaceMember

1:1
Fully supported

SuiteCRM Users map to the owner field on all records. We export the Users table including usernames and email addresses. In Twenty, Workspace Members must be invited and accept their invitation before data import can reference them as owners or assignees. We extract all distinct owner_ids referenced on Contacts, Accounts, Opportunities, and Cases, match by email against the Twenty workspace Members list, and flag any unmatched owners in a reconciliation queue for the customer's admin to provision before import resumes.

SuiteCRM

Campaign

maps to

Twenty CRM

Custom Object (Campaign)

lossy
Fully supported

SuiteCRM Campaigns have no direct equivalent in Twenty's core schema. We create a custom Campaign object in Twenty Settings → Data Model before migration, capturing campaign name, type, status, start date, and budget. Campaign target lists (Target Lists module) migrate as custom relationship fields linking People records to the Campaign custom object. Campaign response activity (opens, clicks) migrates as Task records attached to the Campaign custom object rather than as native engagement records.

SuiteCRM

Product

maps to

Twenty CRM

Custom Object (Product)

1:1
Fully supported

SuiteCRM Products store the product catalogue used in Quotes and Opportunities. We create a custom Product object in Twenty with fields for name, SKU, description, and price. If the customer uses Quotes heavily, we create line item fields on the custom Product object and reference them from Opportunities. Product taxonomy (categories, families) migrates as select or multiselect custom fields on the Product custom object.

SuiteCRM

Quote

maps to

Twenty CRM

Note (PDF reference)

1:1
Fully supported

SuiteCRM Quotes reference Opportunities and include line items linked to the Products catalogue. Twenty has no native Quotes object at its current release stage. We export Quote body content and line items, recreate the Quote as a Note attached to the relevant Opportunity record, and preserve the PDF as a file attachment if available. The customer's admin rebuilds formal quoting using Twenty's API or a third-party quoting tool post-migration.

SuiteCRM

Invoice

maps to

Twenty CRM

Note (flagged partial)

1:1
Fully supported

SuiteCRM Invoice records track payment status but have no connection to an accounts-receivable ledger or payment reconciliation system. We export Invoice records as-is and flag them as partial data in the migration report. Since Twenty has no native accounting module, Invoices migrate as Note records attached to the relevant Account, with payment status preserved as a custom field. The customer's finance team sources the full financial reconciliation layer from their accounting system.

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.

SuiteCRM logo

SuiteCRM gotchas

High

7.x to 8.x upgrade silently breaks the web UI

High

Documents store files on the server filesystem, not in the database

Medium

Invoices are standalone records with no accounting ledger

Medium

Workflow automation rules (AOW) cannot be programmatically exported

Low

Version 7.x extended support ends mid-2027 on ESR branch

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

  • SuiteCRM 7.x vs 8.x determines the extraction strategy

    SuiteCRM 8 introduced a complete frontend rewrite that is architecturally incompatible with the 7.x codebase. The extraction strategy differs: 7.x instances require the v4.1 REST API or direct MySQL database export, while 8.x supports the v8 REST API. We identify the current SuiteCRM version during discovery and apply the appropriate extraction method. If a customer plans to upgrade from 7.x to 8.x before migrating, we recommend completing the migration first to avoid a simultaneous upgrade and migration risk that could break both processes at once.

  • Twenty CSV import requires fields to exist before records

    Twenty's CSV import creates records but not fields. All custom fields must be created in Settings → Data Model before any CSV import begins. This means the migration sequence is strict: design the Twenty data model first, then export from SuiteCRM, then import. SuiteCRM Studio custom fields must be individually identified in the database schema, mapped to Twenty field types, and pre-created. Skipping this step results in custom field data being silently dropped during CSV import because the target fields do not exist in Twenty.

  • Document files must be extracted from the server filesystem separately

    SuiteCRM's Documents module stores files on the server filesystem (typically the upload/ directory) rather than as database blobs. During extraction, we must copy the filesystem directory alongside the database records, and file permissions (owner, group, read/write bits) must be preserved or files become inaccessible after migration. We run a filesystem copy step in every SuiteCRM export plan, validate file integrity checksums after extraction, and reattach files as Note or Attachment records in Twenty. Files with permission errors are flagged in the reconciliation report.

  • AOW workflow rules are PHP-serialized and cannot migrate

    SuiteCRM's Advanced Open Workflow module stores automation rule definitions as complex PHP-serialized objects in the database. These definitions are not accessible via the REST or SOAP API in a reusable format, and they do not translate to any workflow system in Twenty because the trigger, condition, and action models are fundamentally different. Customers with active AOW workflows must treat them as a manual rebuild requirement in Twenty's workflow system. We export a human-readable JSON summary of each workflow rule (module, conditions, actions) for reference during the rebuild.

  • Parent-record relationships require pre-resolution before CSV import

    Twenty's CSV import does not support relationship lookups during ingestion. Contacts must reference an existing Account ID, and Opportunities must reference an existing Account ID. We pre-resolve all parent-record references from SuiteCRM before generating CSVs. For Contacts, this means extracting Accounts first and assigning the resulting Twenty record IDs before importing Contacts. For Opportunities, we extract Accounts and Contacts first, then map the Opportunity Account reference before importing. Migrations that attempt to resolve relationships during import run the risk of orphaned records.

Migration approach

Six steps for a successful SuiteCRM to Twenty CRM data migration

  1. Discovery and version assessment

    We audit the source SuiteCRM instance across version (7.x or 8.x), installed modules, custom fields created via Studio, active AOW workflows, document file volume, user count, and engagement history depth. We identify whether SuiteCRM is self-hosted on a customer server (requiring SSH/database access for extraction) or on SuiteCRM hosted SaaS. The discovery output is a written migration scope document covering record counts per object, the SuiteCRM API endpoint to use, the list of custom fields to pre-create in Twenty, the workflow inventory summary, and the document file count and approximate storage size.

  2. Twenty workspace preparation and data model design

    We create all custom fields in Twenty Settings → Data Model before any data export begins. This includes custom fields on Company, People, and Opportunity for every SuiteCRM custom field identified in discovery. We also create any custom objects (Campaign, Product) needed to preserve data that has no direct Twenty equivalent. We invite all team members as Workspace Members so that owner and assignee lookups are valid at import time. We configure Opportunity stage values to match the customer's SuiteCRM sales pipeline stages and probabilities.

  3. Data extraction from SuiteCRM

    We extract data from SuiteCRM using the appropriate API for the detected version. For 7.x instances, we use the v4.1 REST API or direct MySQL database export if the API proves insufficient for bulk extraction. For 8.x instances, we use the v8 REST API. We export each object type separately: Accounts, Contacts, Leads, Opportunities, Cases, Campaigns, Target Lists, Products, and custom module records. We run a filesystem copy of the upload/ directory to extract document files, validate file checksums, and prepare them for reattachment. We resolve all owner_id references against the SuiteCRM Users table for owner mapping during import.

  4. Data transformation and relationship resolution

    We transform extracted data into Twenty-compatible CSV format with proper field mapping. The most critical transformation is relationship resolution: we assign Twenty Company IDs to every Contact record (by resolving the SuiteCRM Account ID against the suitecrm_id__c custom field set during Company import), and we assign Twenty Company IDs and Workspace Member IDs to every Opportunity record. We also split SuiteCRM Leads into either People records or a custom Lead object depending on the customer's chosen model. We validate row counts against the extraction output to confirm no records were dropped during transform.

  5. Staged CSV import into Twenty

    We import records into Twenty in dependency order: Companies first, then People, then Opportunities, then Cases, then custom object records, then activities. Each phase is validated with a row-count reconciliation report before the next phase begins. Document files are reattached as Note records linked to the parent Company, People, or Opportunity record using the Twenty API. Owner and assignee fields are mapped by email match against the Workspace Members list. Any records referencing an unresolved parent (orphan records) are flagged in a separate queue for the customer admin to resolve manually.

  6. Cutover, validation, and workflow handoff

    We freeze SuiteCRM writes during the cutover window, run a final delta migration of any records modified during the migration window, and validate that the total row count in Twenty matches the delta-adjusted extraction total. We deliver a reconciliation report showing record counts per object, a list of any inaccessible document files, the workflow inventory JSON summary, and a field mapping reference document. We support a one-week post-cutover window to resolve data issues raised by the customer team. We do not rebuild AOW workflows as Twenty workflows within the migration scope; the workflow handoff document equips the customer's admin to rebuild them manually.

Platform deep dives

Context on both ends of the pair

SuiteCRM logo

SuiteCRM

Source

Strengths

  • No per-user licensing fees — both the Community Edition and hosted tiers charge flat rates, not per-seat.
  • Full source-code ownership under AGPL allows unlimited customisation, white-labelling, and on-premise hosting.
  • Includes modules (Campaigns, Workflows, Reporting, Events) that are add-ons in proprietary CRMs.
  • Active community forum and large install base (5M+ downloads) mean abundant community knowledge and third-party extensions.
  • Supports both REST (v8) and SOAP (v4.1) APIs for integration flexibility.

Weaknesses

  • The web UI and mobile app are described as outdated, slow, and clunky compared to modern SaaS CRMs.
  • Requires a technical resource (sysadmin or PHP developer) to install, configure, upgrade, and maintain — not self-service for non-technical teams.
  • Major version upgrades, especially from 7.x to 8.x, are high-risk and have caused widespread breakage (CSS/JS failures, permissions issues) documented in the community forums.
  • No native accounting module — Invoices track payment status but there is no AR/AP ledger, requiring third-party integration for financial workflows.
  • Google Calendar and other third-party integrations are unreliable in practice, with users reporting broken sync in day-to-day use.
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 SuiteCRM 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

    SuiteCRM: Not publicly documented in SuiteCRM's own docs.

  • Data volume sensitivity

    A

    SuiteCRM exposes a bulk API — large-volume migrations stream efficiently.

Estimator

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

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

Can't find your answer?

Walk through your SuiteCRM 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 four and eight weeks for accounts under 10,000 records covering Accounts, Contacts, Opportunities, and a handful of custom fields with no active AOW workflows. Migrations with multiple SuiteCRM custom modules, large document sets (hundreds of files), or complex activity history move to ten to sixteen weeks. The main variable is how much data needs cleaning before import and whether SuiteCRM 7.x to 8.x version upgrade is required before extraction.

Adjacent paths

Related migrations to explore

Ready when you are

Move from SuiteCRM.
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