CRM migration

Migrate from Salesforce Sales Cloud to Twenty CRM

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 logo

Salesforce Sales Cloud

Source

Twenty CRM

Destination

Twenty CRM logo

Compatibility

73%

11 of 15

objects map 1:1 between Salesforce Sales Cloud and Twenty CRM.

Complexity

BStandard

Timeline

4-8 weeks

Rollback included Accuracy guarantee Field-level validation

Try the reverse

Twenty CRM
Salesforce Sales Cloud

Overview

What this migration involves

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.

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

Salesforce Sales Cloud logo

Salesforce Sales Cloud

What's pushing teams away

  • The sticker price is a fraction of the actual cost: storage overages run $125/GB, Agentforce conversations are $2 each, and annual uplift is 8–10% on renewal.
  • Admin configuration is non-trivial; teams without a dedicated Salesforce admin spend disproportionate time on maintenance and lose productivity on a platform that resists shortcuts.
  • Workflow Rules and Process Builder are retired features requiring mandatory migration to Flow before Salesforce decommissions them, creating a forced rework project.
  • Hidden costs accumulate: Sales Engagement, Sales Programs, Salesforce Maps, and other add-ons that enterprise teams need are not included in the base per-seat price.
  • Complexity and licensing cost drive mid-market companies to simpler CRMs with faster time-to-value and transparent pricing.

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 Salesforce Sales Cloud objects map to Twenty CRM

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

maps to

Twenty CRM

Company

1:1
Fully supported

Salesforce 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

maps to

Twenty CRM

Person

1:1
Fully supported

Salesforce 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

maps to

Twenty CRM

Person-Company relationship

1:many
Fully supported

Salesforce'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

maps to

Twenty CRM

Person (unqualified)

1:1
Fully supported

Salesforce 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

maps to

Twenty CRM

Opportunity

1:1
Fully supported

Salesforce 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

maps to

Twenty CRM

Task or Custom Object

lossy
Fully supported

Salesforce 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

maps to

Twenty CRM

Custom Object or Tag

lossy
Fully supported

Salesforce 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

maps to

Twenty CRM

Custom Object or Note

lossy
Fully supported

Salesforce 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

maps to

Twenty CRM

Custom Object (Product)

1:1
Fully supported

Salesforce 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

maps to

Twenty CRM

Custom Object (Opportunity Line Item)

1:1
Fully supported

Salesforce 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

maps to

Twenty CRM

Task

1:1
Fully supported

Salesforce 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

maps to

Twenty CRM

Task (event representation)

1:1
Fully supported

Salesforce 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

maps to

Twenty CRM

Note

1:1
Fully supported

Salesforce 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

maps to

Twenty CRM

Custom Object

1:1
Fully supported

Salesforce 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

maps to

Twenty CRM

User

1:1
Fully supported

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

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.

Salesforce Sales Cloud logo

Salesforce Sales Cloud gotchas

High

Workflow Rules and Process Builder are retired

High

Bulk API batch quota exhaustion during large imports

Medium

Storage overage billing is non-obvious

Medium

Account-Contact many-to-many relationship mapping

Low

Territory and team member import ordering dependencies

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

  • Account-Contact many-to-many junction does not map cleanly to Twenty

    Salesforce's AccountContactRelation junction object enables a Contact to be linked to multiple Accounts simultaneously. Twenty CRM does not have a native junction table between Person and Company — a Person has a single primary Company relationship. We handle this by importing the primary Account-Contact link as the Person-Company relationship and representing additional Account links as Company tags on the Person record. This is a fidelity trade-off: the primary relationship is preserved completely; secondary relationships are preserved as tags but lose the AccountContactRelation specific fields (Roles, IsPrimary) that Salesforce stores. We flag this during scoping and the customer chooses how to handle it before migration begins.

  • Salesforce Workflow Rules and Process Builder automations do not migrate

    Salesforce has retired Workflow Rules and restricted Process Builder, forcing all orgs to migrate to Flow before the platform enforces shutdown. Twenty CRM does not have an equivalent to Salesforce Flow or Apex — its automation layer uses a simpler trigger-action workflow builder. We do not migrate Workflow Rules, Process Builder processes, or Flow automations as code. We deliver a written inventory of every active automation in the Salesforce org with its trigger object, conditions, actions, and a recommended Twenty workflow-equivalent step-by-step. The customer's admin or a Twenty implementation partner rebuilds them post-migration. Any automations not documented before migration are at risk of being silently lost.

  • Bulk API quota exhaustion can stall large Salesforce exports

    Salesforce's Bulk API limits 15,000 batches per day with 10,000 records per batch. For orgs with millions of historical records (Tasks, Events, Notes), this quota can be exhausted in a single migration day, blocking subsequent days until the quota resets. We pace exports across multiple days, monitor batch consumption in real time, and switch to the REST API for smaller objects when the Bulk API quota is exhausted. During scoping, we calculate total record volume against the daily quota and design a multi-day export schedule before any data leaves Salesforce.

  • Territory management and Opportunity Team Member structures have no Twenty equivalent

    Salesforce Territory Management (Account assignment to Territories with quota allocation) and Opportunity Team Members (User assignments to an Opportunity with role and access level) have no direct Twenty CRM equivalent. Twenty's workspace role model is simpler and does not include territory-based quota or team-based Opportunity sharing. We migrate Opportunity Team Members as Twenty workspace User assignments to the Opportunity record, but the Salesforce-specific role and access level fields are lost. Territory assignments migrate as Company tags or are flagged for manual re-creation. We document the original Salesforce Territory hierarchy and Opportunity team structure in a written handoff.

  • Multi-currency and advanced forecasting fields map incompletely

    Salesforce supports multi-currency at the org level with per-Opportunity currency codes and advanced forecasting models by quota, territory, and rollup. Twenty CRM does not have native multi-currency support — the workspace operates in a single base currency. We migrate Opportunity.Amount as the numeric value with the Salesforce currency ISO code stored in a custom field on the Opportunity record, but the conversion and rollup logic is not replicated. Advanced Forecasting configuration (ForecastCategory, CommitForecast, BestCaseForecast) migrates as custom Opportunity fields rather than native Twenty forecast objects. If multi-currency is a business requirement, we flag it during scoping and advise the customer that it requires a custom field and workflow setup in Twenty post-migration.

Migration approach

Six steps for a successful Salesforce Sales Cloud to Twenty CRM data migration

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

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

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

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

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

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

Context on both ends of the pair

Salesforce Sales Cloud logo

Salesforce Sales Cloud

Source

Strengths

  • Largest enterprise app ecosystem in CRM with 5,000+ AppExchange integrations covering nearly every vertical workflow.
  • Native Einstein AI delivers lead scoring, opportunity insights, and predictive forecasting without a third-party layer.
  • Advanced territory management, multi-currency, and flexible forecasting satisfy complex B2B revenue structures.
  • Deep platform extensibility: Custom Objects, Apex, Flow, and the Metadata API allow full schema customization.
  • Well-documented REST API, Bulk API, and Composite API with published rate limits for programmatic migration.

Weaknesses

  • Pricing model is layered and opaque in practice: per-seat fees plus storage overages, add-on subscriptions, and annual uplifts compound to 30–40% above sticker price.
  • Workflow Rules and Process Builder are deprecated, forcing all orgs onto Salesforce Flow — a migration task that catches many teams by surprise.
  • Steep administrative complexity: meaningful configuration requires a dedicated Salesforce admin or consultant.
  • API rate limits are edition-gated (100k/day base for Enterprise) and easily exhausted by large historical imports without throttling.
  • Data export is exportable via Data Loader but preserving relationship integrity across 30+ objects requires careful ETL sequencing.
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 Salesforce Sales Cloud 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

    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

    A

    Salesforce Sales Cloud exposes a bulk API — large-volume migrations stream efficiently.

Estimator

Estimate your Salesforce Sales Cloud 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 Salesforce Sales Cloud to Twenty CRM data migrations

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

Can't find your answer?

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 consultation

Most migrations land between four and eight weeks for orgs under 20,000 Contacts and 5,000 Opportunities with no custom objects. Migrations with multiple Custom Objects, large engagement histories (over 300,000 activity records), complex Account hierarchies, or territory assignment data move to ten to sixteen weeks because of junction-table resolution, Bulk API quota pacing, and schema design for the Twenty workspace. Timeline assumes adequate scoping preparation; orgs that skip the pre-migration audit phase extend timelines when issues surface during execution.

Adjacent paths

Related migrations to explore

Ready when you are

Move from Salesforce Sales Cloud.
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