CRM migration
Field-level mapping, validation, and rollback between Twenty CRM and Salesforce Sales Cloud. We move data and schema; workflows are rebuilt natively in Salesforce Sales Cloud.
Twenty CRM
Source
Salesforce Sales Cloud
Destination
Compatibility
10 of 13
objects map 1:1 between Twenty CRM and Salesforce Sales Cloud.
Complexity
BStandard
Timeline
3-5 weeks
Try the reverse
Overview
Moving from Twenty CRM to Salesforce Sales Cloud is a migration that respects a strict dependency order: Companies first, then People with companyId resolved, then Opportunities with both company and person references satisfied, then Tasks and Notes with their relational targets resolved. Twenty's PostgreSQL-backed object model enforces this sequence through foreign key constraints, and Salesforce requires it through its own lookup integrity rules. We use Salesforce REST and Bulk APIs with chunking, rate-limit handling, and parent-record lookup resolution to preserve the relationship graph across the wire. Workflows, automations, and custom view configurations do not migrate; we deliver a written inventory of every active workflow requiring rebuild in Salesforce Flow. Soft-deleted records in Twenty require explicit handling because the platform's uniqueness check runs against all records including those in the deleted-view, and importing a matching email or domain triggers a restore rather than a create.
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.
Source platform
Twenty CRM platform overview
Scorecard, SWOT, gotchas, and pricing for Twenty CRM.
Destination platform
Salesforce Sales Cloud platform overview
Scorecard, SWOT, gotchas, and pricing for Salesforce Sales Cloud.
Data migration guide
The complete Salesforce migration guide
Data model, import mechanisms, field mapping strategy, pitfalls, and cutover — by the engineers running it.
Source platform guide
Twenty CRM migration guide
Understand the data you're exporting from Twenty CRM before mapping it.
Destination checklist
Salesforce migration checklist
Pre- and post-cutover tasks for moving onto Salesforce Sales Cloud.
Source checklist
Twenty CRM migration checklist
Exit checklist for unwinding your Twenty CRM setup cleanly.
Why teams make this switch
Leaving
What's pushing teams away
Choosing
What's pulling them in
Object mapping
Each row shows how a Twenty CRM object lands in Salesforce Sales Cloud, including any object-level transformations, lookup resolution, or schema-design dependencies.
Typical mapping — final map is confirmed during the sample migration step.
Twenty CRM
Company
Salesforce Sales Cloud
Account
1:1Twenty Companies map directly to Salesforce Account. The company domain field becomes the Account Website field and serves as the dedupe key during import. We use the domain as an external ID on Account to prevent duplicate creates when matching records exist in Salesforce. Account must be the first object imported because both People (via companyId) and Opportunities (via companyId) reference it through foreign key lookups.
Twenty CRM
People
Salesforce Sales Cloud
Contact
1:1Twenty People map to Salesforce Contact. The email field serves as the unique dedupe key and external ID. We resolve the companyId foreign key to a Salesforce AccountId at migration time by querying the Account external ID mapping created during the Account phase. Contacts are inserted with AccountId populated for every record where a matching Account exists; contacts without a resolved Account are held in a reconciliation queue for the customer admin to resolve before continuing.
Twenty CRM
Opportunity
Salesforce Sales Cloud
Opportunity
1:1Twenty Opportunities map to Salesforce Opportunity. We resolve both companyId (to AccountId) and the personId relations (to PrimaryContactId via OpportunityContactRole) at migration time. Stage names from Twenty map to Salesforce StageName values that we configure as a Sales Process before migration begins. Amount, closeDate, and probability percentage transfer directly to Opportunity fields.
Twenty CRM
Task
Salesforce Sales Cloud
Task
1:1Twenty Tasks map to Salesforce Task. We resolve the relational target (linked to People, Companies, or Opportunities) to a Salesforce WhatId or WhoId at migration time by querying the ID mapping tables created during the Company, People, and Opportunity phases. Status, Priority, ActivityDate, and description migrate directly. Tasks without a resolvable parent record are imported with no WhatId and flagged for manual reassignment.
Twenty CRM
Note
Salesforce Sales Cloud
Note
1:1Twenty Notes map to Salesforce Note records. We resolve the relational target to a Salesforce record ID (Contact, Account, or Opportunity) and link via ContentDocumentLink. Note body content migrates as rich text. Attachments within notes migrate as ContentDocument records linked to the parent via ContentDocumentLink. Notes without a resolvable parent are flagged for manual reassignment during reconciliation.
Twenty CRM
Custom Object
Salesforce Sales Cloud
Custom Object
1:1Twenty Custom Objects (user-defined entities on Organization or Pro tier) map to Salesforce custom objects of equivalent API name. We pre-create the destination schema in Salesforce including all custom fields, field types, and lookup relationships before any data import. Custom object records are migrated last because they frequently reference People, Companies, or Opportunities through foreign keys that must resolve to Salesforce record IDs.
Twenty CRM
People.companyId
Salesforce Sales Cloud
Contact.AccountId
1:1Twenty's People.companyId foreign key maps to Salesforce Contact.AccountId via an explicit lookup resolution step. We extract all unique companyId values from the People export, map each to its corresponding Salesforce Account ID using the external ID mapping, and attach that AccountId to each Contact record at insert time. This lookup resolution is the critical step that prevents Contact records from being orphaned from their Account.
Twenty CRM
Opportunity.companyId
Salesforce Sales Cloud
Opportunity.AccountId
1:1Twenty Opportunities that reference a companyId are resolved to Salesforce AccountId using the same Account mapping table created during the Account phase. Every Opportunity must have a valid AccountId or ContactId before Salesforce accepts the insert, so this lookup resolution happens before the Opportunity phase begins.
Twenty CRM
Opportunity.personId
Salesforce Sales Cloud
OpportunityContactRole
1:manyTwenty Opportunities that link to People records generate Salesforce OpportunityContactRole records during migration. The personId maps to the Salesforce Contact ID resolved during the People phase, and the OpportunityContactRole is created with Role=Primary Contact. Multiple personId links on a single Twenty Opportunity produce multiple OpportunityContactRole records in Salesforce.
Twenty CRM
Task.relations
Salesforce Sales Cloud
Task.WhatId
1:1Twenty Tasks can be linked to any record type (People, Company, Opportunity). We extract the relation target type and ID from Twenty, resolve the target ID to the corresponding Salesforce record ID using the ID mapping tables, and write the resolved ID to Task.WhatId. Tasks linked to People resolve to WhoId; tasks linked to Company or Opportunity resolve to WhatId.
Twenty CRM
User (Owner)
Salesforce Sales Cloud
User
1:1Twenty users referenced as record owners (on People, Companies, Opportunities, Tasks) are mapped to Salesforce User records by email match. Any Twenty owner without a matching Salesforce User is placed in a reconciliation queue. The customer's Salesforce admin provisions missing users before the migration continues because OwnerId is required on Opportunity and Task records.
Twenty CRM
Soft-deleted Company
Salesforce Sales Cloud
Account (reconciliation)
lossyTwenty's uniqueness check runs against all records including soft-deleted ones visible in the deleted view. If a Company with domain example.com exists in the deleted view and we import a new Company with the same domain, Twenty restores the deleted record instead of creating a new one. We detect this condition during scoping and coordinate with the customer to either purge deleted records before migration or map to the existing restored record in Salesforce.
Twenty CRM
Soft-deleted People
Salesforce Sales Cloud
Contact (reconciliation)
lossyTwenty People with the same email as a soft-deleted record trigger the restore behavior rather than a create. We pre-query Twenty's deleted-view for People and Companies before migration begins and flag conflicts. The customer chooses to either permanently delete the soft-deleted records or accept that the restored record will be the destination target. This decision is made before any data is written.
| Twenty CRM | Salesforce Sales Cloud | Compatibility | |
|---|---|---|---|
| Company | Account1:1 | Fully supported | |
| People | Contact1:1 | Fully supported | |
| Opportunity | Opportunity1:1 | Fully supported | |
| Task | Task1:1 | Fully supported | |
| Note | Note1:1 | Fully supported | |
| Custom Object | Custom Object1:1 | Fully supported | |
| People.companyId | Contact.AccountId1:1 | Fully supported | |
| Opportunity.companyId | Opportunity.AccountId1:1 | Fully supported | |
| Opportunity.personId | OpportunityContactRole1:many | Fully supported | |
| Task.relations | Task.WhatId1:1 | Fully supported | |
| User (Owner) | User1:1 | Fully supported | |
| Soft-deleted Company | Account (reconciliation)lossy | Fully supported | |
| Soft-deleted People | Contact (reconciliation)lossy | 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.
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
Salesforce Sales Cloud gotchas
Workflow Rules and Process Builder are retired
Bulk API batch quota exhaustion during large imports
Storage overage billing is non-obvious
Account-Contact many-to-many relationship mapping
Territory and team member import ordering dependencies
Pair-specific challenges
Migration approach
Discovery and scoping
We audit the source Twenty instance across tier (Self-hosted, Pro, or Organization), object count, custom object schema, active workflows, and record volume per object. We identify soft-deleted records in the deleted view that may conflict with active records on unique fields. We confirm the Salesforce destination edition (Professional at $80/user or higher) and verify that all required Salesforce features are available in the chosen tier. The discovery output is a written migration scope document covering object counts, conflict status, and a recommended import sequence.
Source data extraction with visibility pre-configuration
For cloud Twenty instances, we pre-configure the export view to expose all fields before extraction, then export in chunks of up to 20,000 records per object. For self-hosted Twenty instances, we extract directly from PostgreSQL using a read-only connection to bypass the UI export limit and capture all fields including those hidden in the active view. We extract in dependency order: Companies first, then People, then Opportunities, then Tasks, then Notes, then Custom Objects last.
Destination schema pre-creation
We create the Salesforce destination schema before any data is written. This includes custom objects with matching API names, custom fields with Salesforce-appropriate types, Salesforce Account as the first standard object for the Company mapping, Contact for the People mapping, and Opportunity for the Deals mapping. We configure the Sales Process and stage values to match the source pipeline stages before migration begins. Custom object fields are created in Settings before import because CSV import creates records, not fields.
ID mapping and owner reconciliation
We build ID mapping tables that associate each Twenty record ID with its corresponding Salesforce record ID as records are created. This mapping is required to resolve lookups: People.companyId requires the Salesforce AccountId, Opportunities require both AccountId and OpportunityContactRole resolution, and Tasks require WhatId or WhoId resolution. We reconcile Twenty Owners against Salesforce Users by email match, placing any unmatched owners in a queue for the customer's admin to provision before record import continues.
Production migration in dependency order
We run production migration in record-dependency order: Accounts (from Twenty Companies), Contacts (with AccountId resolved from the mapping table), Opportunities (with AccountId and OpportunityContactRole resolved), Tasks (with WhatId and WhoId resolved), Notes (with ContentDocumentLink resolved), and Custom Objects (last because they often reference standard objects). Each phase emits a row-count reconciliation report before the next phase begins. We use Salesforce REST API for standard objects and Bulk API 2.0 for large activity volumes with batch chunking and exponential backoff.
Cutover, validation, and workflow inventory delivery
We freeze writes to Twenty during the cutover window, run a final delta migration of any records modified during migration, then enable Salesforce as the system of record. We deliver a written inventory of every active Twenty workflow, automation, and custom view configuration for the customer's admin to rebuild in Salesforce Flow. We do not migrate workflows as code or provide post-migration admin support for Flow rebuild as standard scope; that work is handled separately by the customer's admin team or a Salesforce partner.
Platform deep dives
Twenty CRM
Source
Strengths
Weaknesses
Salesforce Sales Cloud
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 Twenty CRM and Salesforce Sales Cloud.
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
Twenty CRM: 100 req/min (Pro), 200 req/min (Organization).
Data volume sensitivity
Twenty 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 Twenty CRM to Salesforce Sales Cloud migration scoping. Not seeing yours? Book a call.
Walk through your Twenty CRM to Salesforce Sales Cloud migration with a real engineer — 30 minutes, free, written quote within 24 hours.
Book a free 30 minute consultationAdjacent paths
Other ways to leave Twenty CRM
Other ways to arrive at Salesforce Sales Cloud
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.