CRM migration
Field-level mapping, validation, and rollback between SuiteCRM and Twenty CRM. We move data and schema; workflows are rebuilt natively in Twenty CRM.
SuiteCRM
Source
Twenty CRM
Destination
Compatibility
9 of 12
objects map 1:1 between SuiteCRM and Twenty CRM.
Complexity
BStandard
Timeline
4-8 weeks
Overview
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.
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 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
Twenty CRM
Company
1:1SuiteCRM 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
Twenty CRM
People
1:1SuiteCRM 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
Twenty CRM
People (or custom Lead object)
lossySuiteCRM 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
Twenty CRM
Opportunity
1:1SuiteCRM 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)
Twenty CRM
Task
1:1SuiteCRM 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)
Twenty CRM
Custom Field
lossySuiteCRM 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
Twenty CRM
Attachment (Content)
1:1SuiteCRM 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)
Twenty CRM
WorkspaceMember
1:1SuiteCRM 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
Twenty CRM
Custom Object (Campaign)
lossySuiteCRM 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
Twenty CRM
Custom Object (Product)
1:1SuiteCRM 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
Twenty CRM
Note (PDF reference)
1:1SuiteCRM 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
Twenty CRM
Note (flagged partial)
1:1SuiteCRM 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.
| SuiteCRM | Twenty CRM | Compatibility | |
|---|---|---|---|
| Account | Company1:1 | Fully supported | |
| Contact | People1:1 | Fully supported | |
| Lead | People (or custom Lead object)lossy | Fully supported | |
| Opportunity | Opportunity1:1 | Fully supported | |
| Case (Bugs module) | Task1:1 | Fully supported | |
| Custom Field (Studio) | Custom Fieldlossy | Fully supported | |
| Document | Attachment (Content)1:1 | Fully supported | |
| User (Assignee) | WorkspaceMember1:1 | Fully supported | |
| Campaign | Custom Object (Campaign)lossy | Fully supported | |
| Product | Custom Object (Product)1:1 | Fully supported | |
| Quote | Note (PDF reference)1:1 | Fully supported | |
| Invoice | Note (flagged partial)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.
SuiteCRM gotchas
7.x to 8.x upgrade silently breaks the web UI
Documents store files on the server filesystem, not in the database
Invoices are standalone records with no accounting ledger
Workflow automation rules (AOW) cannot be programmatically exported
Version 7.x extended support ends mid-2027 on ESR branch
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 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.
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.
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.
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.
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.
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
SuiteCRM
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 SuiteCRM 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
SuiteCRM: Not publicly documented in SuiteCRM's own docs.
Data volume sensitivity
SuiteCRM exposes a bulk API — large-volume migrations stream efficiently.
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 SuiteCRM to Twenty CRM migration scoping. Not seeing yours? Book a call.
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 consultationAdjacent paths
Other ways to leave SuiteCRM
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.