CRM migration
Field-level mapping, validation, and rollback between Salesforce Sales Cloud and Twenty CRM. We move data and schema; workflows are rebuilt natively in Twenty CRM.
Salesforce Sales Cloud
Source
Twenty CRM
Destination
Compatibility
11 of 15
objects map 1:1 between Salesforce Sales Cloud and Twenty CRM.
Complexity
BStandard
Timeline
4-8 weeks
Try the reverse
Overview
Moving from Salesforce Sales Cloud to Twenty CRM is a structural migration that also involves a deployment model shift: Salesforce is a multi-tenant SaaS platform; Twenty is an open-source CRM deployable as self-hosted or cloud-hosted. The most significant schema difference is that Twenty does not replicate Salesforce's separate Account and Contact objects with a many-to-many junction table — it uses a Company object (equivalent to Account) and a Person object (equivalent to Contact) with a Company-Person relationship that is flatter than Salesforce's AccountContactRelation model. We resolve this during scoping by importing Person records first, then linking them to Company records, preserving every Salesforce relationship. Activity history (calls, emails, meetings, tasks) migrates through the Twenty REST API with batch chunking. Workflow Rules, Process Builder processes, and Flow automations do not migrate as code; we deliver a written inventory of every active automation with its trigger, conditions, and recommended Twenty equivalent for the customer's admin to rebuild post-migration.
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
Salesforce Sales Cloud platform overview
Scorecard, SWOT, gotchas, and pricing for Salesforce Sales Cloud.
Destination platform
Twenty CRM platform overview
Scorecard, SWOT, gotchas, and pricing for Twenty CRM.
Data migration guide
The complete Twenty CRM migration guide
Data model, import mechanisms, field mapping strategy, pitfalls, and cutover — by the engineers running it.
Source platform guide
Salesforce migration guide
Understand the data you're exporting from Salesforce Sales Cloud before mapping it.
Destination checklist
Twenty CRM migration checklist
Pre- and post-cutover tasks for moving onto Twenty CRM.
Source checklist
Salesforce migration checklist
Exit checklist for unwinding your Salesforce Sales Cloud 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 Salesforce Sales Cloud 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.
Salesforce Sales Cloud
Account
Twenty CRM
Company
1:1Salesforce Account maps to Twenty Company. Account.Name becomes Company.name, Account.Industry maps to a Company industry picklist, Account.AnnualRevenue and Account.NumberOfEmployees migrate to Company fields. Parent-Account hierarchies require sequence: we import root Accounts first, then child Accounts with a parent_company_id reference resolved to the previously imported root. If the org uses Salesforce Territory Management, Territory Account assignments migrate as Company tags or a custom Company field rather than a native territory object — Twenty does not replicate Salesforce's Territory model.
Salesforce Sales Cloud
Contact
Twenty CRM
Person
1:1Salesforce Contact maps to Twenty Person. Contact.FirstName, Contact.LastName, Contact.Email, Contact.Phone, Contact.Title migrate directly. The Contact.AccountId lookup maps to a Person-Company relationship in Twenty that we resolve after both Company and Person records are committed. A Contact without a populated AccountId migrates as a Person with no company linkage, which is valid in Twenty's data model.
Salesforce Sales Cloud
AccountContactRelation
Twenty CRM
Person-Company relationship
1:manySalesforce's many-to-many Account Contact Relation junction object has no direct Twenty equivalent. Each Contact that has multiple Account relationships via AccountContactRelation must be handled as a 1:N split: we import the primary Contact-to-Account link as the Person-Company relationship, then capture additional Account relationships as Company tags or a custom multi-value field on the Person record. If the customer needs full fidelity on the many-to-many relationships, we flag this during scoping and the customer decides whether to accept the tag-based representation or manually recreate non-primary relationships post-migration.
Salesforce Sales Cloud
Lead
Twenty CRM
Person (unqualified)
1:1Salesforce Lead maps directly to Twenty Person. Lead.FirstName, Lead.LastName, Lead.Email, Lead.Phone, Lead.Company, Lead.Status, Lead.Rating, LeadSource migrate to corresponding Person fields. The Lead.IsConverted flag is preserved as a custom field on the Person so that pre-conversion Lead records can be distinguished from native Person records after migration. Converted Leads do not create Accounts and Contacts in Twenty — we import them as Person records at their pre-conversion state with a flag.
Salesforce Sales Cloud
Opportunity
Twenty CRM
Opportunity
1:1Salesforce Opportunity maps to Twenty Opportunity with StageName, Amount, CloseDate, Probability, Description, Type, and LeadSource preserved. Opportunity.AccountId maps to the Twenty Opportunity-Company relationship via the Company ID resolved from the migrated Account. Opportunity.OwnerId maps to the Twenty User ID resolved via email match during Owner reconciliation. Multi-currency Opportunity amounts migrate as the numeric Amount with the currency code stored in a custom field; Twenty does not have native multi-currency support so the customer sets a single base currency for the workspace.
Salesforce Sales Cloud
Case
Twenty CRM
Task or Custom Object
lossySalesforce Case maps to Twenty Task records or a custom Case object depending on the customer's configuration preference. Case.Status becomes Task status, Case.Priority becomes Task priority, Case.Subject becomes Task name, and Case.Description becomes Task body. Case.ContactId maps to the Person ID resolved from the migrated Contact. If the org uses Salesforce Entitlement Management or multi-step case resolution workflows, we flag these as post-migration configuration items because Twenty's Task model is simpler and does not include entitlement SLA tracking natively.
Salesforce Sales Cloud
Campaign
Twenty CRM
Custom Object or Tag
lossySalesforce Campaign maps to a Twenty custom object (Campaign) because Twenty does not have a native Campaign object. We pre-create the custom Campaign object in the Twenty workspace with fields for Name, Budget, Status, Type, StartDate, and EndDate. Campaign Members (Contact or Lead responses) migrate as Task records linked to the Campaign custom object, or as Campaign-related Tags on Person records — the customer chooses the representation during scoping.
Salesforce Sales Cloud
Contract
Twenty CRM
Custom Object or Note
lossySalesforce Contract maps to a Twenty custom object (Contract) if the customer needs structured contract lifecycle data, or to a Note attached to the relevant Company record for simpler cases. Contract.StartDate, Contract.EndDate, Contract.Status, Contract.AccountId migrate to the custom object fields or Note body. Contract Line Items require a separate custom object migration pass after Contracts are committed.
Salesforce Sales Cloud
Product2
Twenty CRM
Custom Object (Product)
1:1Salesforce Products (Product2) map to a Twenty custom object (Product) with Name, ProductCode (from Standard Pricebook), Description, and IsActive preserved. Pricebook Entries require a separate pass: we create the Pricebook as a custom object and associate Product-Pricing records as child entries.
Salesforce Sales Cloud
OpportunityLineItem
Twenty CRM
Custom Object (Opportunity Line Item)
1:1Salesforce OpportunityLineItem maps to a Twenty custom object linked to the migrated Opportunity. Quantity, UnitPrice, and TotalPrice migrate directly. We resolve the Pricebook2 and Product2 references at migration time after both the Pricebook custom object and Product custom object are committed.
Salesforce Sales Cloud
Task
Twenty CRM
Task
1:1Salesforce Task maps to Twenty Task with Subject, Status, Priority, ActivityDate, Description, and OwnerId preserved. Task subtyping (Call, Email) is stored in a custom Task type field in Twenty if the native task model does not support subtype distinction. Task WhatId references (Account, Opportunity, Case) are resolved to Twenty Company, Opportunity, or Task IDs respectively after parent records are committed.
Salesforce Sales Cloud
Event
Twenty CRM
Task (event representation)
1:1Salesforce Event maps to Twenty Task with StartDateTime as ActivityDate, EndDateTime captured in a custom end_time field, Location preserved, and Description. Event attendees are not a native Twenty object — we create Tasks for each invited Contact or Lead with an attendee flag, or we create a Note on the primary Event-Task capturing the attendee list as text.
Salesforce Sales Cloud
Note
Twenty CRM
Note
1:1Salesforce Notes (the legacy Note object) migrate to Twenty Note records linked to the parent record (Person, Company, or Opportunity). Note.Body migrates as Note body text, and Note.Title becomes the Note name. Notes attached to multiple parent records create separate Note records in Twenty per parent link.
Salesforce Sales Cloud
Custom Object
Twenty CRM
Custom Object
1:1Salesforce Custom Objects migrate to Twenty custom objects of equivalent name within the Twenty workspace. We pre-create the destination schema using the Twenty workspace schema builder, including all custom fields, picklist values, and lookup relationships, before any data import. Each custom object in Salesforce that has lookup relationships to standard objects requires those lookups to be resolved to the migrated IDs of the parent records. Custom object naming preserves the __c suffix convention in a comment field for audit trail.
Salesforce Sales Cloud
User
Twenty CRM
User
1:1Salesforce User records map to Twenty User by email match. Active Users get Active=True in Twenty; inactive Users can be imported as inactive Twenty Users or flagged for manual provisioning. Salesforce Profile and Role assignments are not replicated in Twenty's simpler role model — we document the original Role hierarchy as a written handoff for the customer's admin to reconfigure Twenty workspace roles post-migration.
| Salesforce Sales Cloud | Twenty CRM | Compatibility | |
|---|---|---|---|
| Account | Company1:1 | Fully supported | |
| Contact | Person1:1 | Fully supported | |
| AccountContactRelation | Person-Company relationship1:many | Fully supported | |
| Lead | Person (unqualified)1:1 | Fully supported | |
| Opportunity | Opportunity1:1 | Fully supported | |
| Case | Task or Custom Objectlossy | Fully supported | |
| Campaign | Custom Object or Taglossy | Fully supported | |
| Contract | Custom Object or Notelossy | Fully supported | |
| Product2 | Custom Object (Product)1:1 | Fully supported | |
| OpportunityLineItem | Custom Object (Opportunity Line Item)1:1 | Fully supported | |
| Task | Task1:1 | Fully supported | |
| Event | Task (event representation)1:1 | Fully supported | |
| Note | Note1:1 | Fully supported | |
| Custom Object | Custom Object1:1 | Fully supported | |
| User | 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.
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
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
Salesforce org audit and scoping
We audit the source Salesforce org across edition, active users, storage usage, Custom Objects, active Workflow Rules, Process Builder processes, Flow automations, and record counts per object. We use the Salesforce REST API and Bulk API to extract object and field metadata, identify the Account-Contact relationship pattern, catalog Custom Objects and their dependency chains, and count engagement records. The audit output is a written migration scope document that includes the object map, relationship resolution strategy, automation inventory, and a Twenty workspace readiness checklist.
Twenty workspace provisioning and schema design
We provision the Twenty workspace (self-hosted or cloud-hosted per the customer's deployment choice) and design the destination schema. This includes creating the custom objects for Campaign, Contract, Product, and any Salesforce Custom Objects, configuring the Opportunity pipeline stages, setting up workspace roles, and creating custom fields for Salesforce-specific data that has no native Twenty equivalent (currency codes, original Lifecycle Stage, Salesforce record IDs for audit). Schema is validated in a staging environment before production migration begins.
Sandbox migration and reconciliation
We run a full migration into a Twenty staging or sandbox workspace using production-like data volume. The customer's RevOps lead reconciles record counts (Accounts in, Contacts in, Leads in, Opportunities in, Activities in), spot-checks 25-50 random records against the Salesforce source, validates the Company-Person linkage, and reviews the Opportunity-Company relationship. Any mapping corrections and fidelity trade-offs (particularly around Account-Contact many-to-many resolution) are resolved here. The customer signs off before production migration begins.
Owner and User reconciliation
We extract every distinct Salesforce Owner referenced on Contact, Lead, Opportunity, and Task records and match by email against the Twenty workspace User table. Owners without a matching Twenty User are held in a reconciliation queue. The customer's admin provisions any missing Twenty Users (active or inactive depending on whether the original Salesforce user is still active). This step must complete before record migration resumes because OwnerId references are required on most standard objects.
Production migration in dependency order
We run production migration in record-dependency order: Users (validated), Company records (from Salesforce Accounts), Person records (from Salesforce Contacts, with AccountId resolved to Company), Leads (as Person records with IsConverted flag), Opportunities (with CompanyId and OwnerId resolved), Cases (as Tasks or custom Case object), Activity history (Tasks and Events via Twenty REST API with batch chunking), Campaign records (custom object), Products (custom object), and Custom Objects last because they often have lookups to standard objects. Each phase emits a row-count reconciliation report before the next phase begins. We pace Bulk API calls against Salesforce's daily quota to avoid exhaustion.
Cutover, validation, and automation handoff
We freeze Salesforce writes during cutover, run a final delta migration of any records modified during the migration window, then enable Twenty as the system of record. We deliver the Workflow Rules, Process Builder, and Flow automation inventory document to the customer's admin team with recommended Twenty workflow equivalents. We support a one-week hypercare window where we resolve any reconciliation issues raised by the customer's team. We do not rebuild Salesforce automations as Twenty workflows inside the migration scope — that is a separate engagement or an internal admin task.
Platform deep dives
Salesforce Sales Cloud
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 Salesforce Sales Cloud 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
Salesforce Sales Cloud: 100,000 daily API requests base for Enterprise, plus 1,000 requests per user license; concurrent long-running requests capped at 25; individual call timeout 10 minutes.
Data volume sensitivity
Salesforce Sales Cloud 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 Salesforce Sales Cloud to Twenty CRM migration scoping. Not seeing yours? Book a call.
Walk through your Salesforce Sales Cloud 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 Salesforce Sales Cloud
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.