CRM migration

Migrate from Twenty CRM to Salesforce Sales Cloud

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 logo

Twenty CRM

Source

Salesforce Sales Cloud

Destination

Salesforce Sales Cloud logo

Compatibility

77%

10 of 13

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

Complexity

BStandard

Timeline

3-5 weeks

Rollback included Accuracy guarantee Field-level validation

Try the reverse

Salesforce Sales Cloud
Twenty CRM

Overview

What this migration involves

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.

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

Twenty CRM logo

Twenty CRM

What's pushing teams away

  • Recently reached v1.0 — the CTO deliberately held off promotion until now, meaning the platform has a shorter operational track record than established CRMs.
  • No native email sequencing or cadence tools, forcing teams to layer on third-party outreach platforms for any automated follow-up flows.
  • Self-hosting 'free' pricing ignores the reality of DevOps hours, infrastructure costs, and maintenance that make it a real investment.
  • Limited native integrations out of the box — no app marketplace ecosystem, meaning most connections require custom API or Zapier/Make work.
  • Workflow automation is functional but limited in complexity, according to early users who find it insufficient for multi-step sales motions.

Choosing

Salesforce Sales Cloud logo

Salesforce Sales Cloud

What's pulling them in

  • The AppExchange marketplace with 5,000+ prebuilt apps gives enterprises integrations for nearly every business workflow without custom development.
  • Native Einstein AI for lead scoring, opportunity insights, and predictive forecasting adds intelligence without a separate platform purchase.
  • Territory management, multi-currency support, and advanced forecasting satisfy the needs of complex B2B sales organizations with structured revenue teams.
  • Slack, Tableau, and CPQ are deeply integrated into the core platform, keeping the sales stack unified for teams already in the Salesforce ecosystem.
  • Organizations with a large, established Salesforce implementation choose it because switching costs — integrations, custom code, trained admins — are prohibitive.

Object mapping

How Twenty CRM objects map to Salesforce Sales Cloud

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

maps to

Salesforce Sales Cloud

Account

1:1
Fully supported

Twenty 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

maps to

Salesforce Sales Cloud

Contact

1:1
Fully supported

Twenty 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

maps to

Salesforce Sales Cloud

Opportunity

1:1
Fully supported

Twenty 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

maps to

Salesforce Sales Cloud

Task

1:1
Fully supported

Twenty 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

maps to

Salesforce Sales Cloud

Note

1:1
Fully supported

Twenty 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

maps to

Salesforce Sales Cloud

Custom Object

1:1
Fully supported

Twenty 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

maps to

Salesforce Sales Cloud

Contact.AccountId

1:1
Fully supported

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

maps to

Salesforce Sales Cloud

Opportunity.AccountId

1:1
Fully supported

Twenty 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

maps to

Salesforce Sales Cloud

OpportunityContactRole

1:many
Fully supported

Twenty 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

maps to

Salesforce Sales Cloud

Task.WhatId

1:1
Fully supported

Twenty 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)

maps to

Salesforce Sales Cloud

User

1:1
Fully supported

Twenty 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

maps to

Salesforce Sales Cloud

Account (reconciliation)

lossy
Fully supported

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

maps to

Salesforce Sales Cloud

Contact (reconciliation)

lossy
Fully supported

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

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.

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

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

Pair-specific challenges

  • Import sequence is enforced and must be Companies before People before Opportunities

    Twenty requires CSV imports in a specific sequence: Companies first, People second (with companyId references), Opportunities third, and Custom Objects last. We follow this ordering rigorously because foreign key constraints block import of any record referencing a parent that does not yet exist. Skipping this sequence silently fails or creates orphaned relations in the destination CRM. In Salesforce, the same principle applies: Account must exist before Contact insert, and Contact or Account must exist before Opportunity insert. We enforce both constraints simultaneously during migration design.

  • Export limited to 20,000 records and visible columns only

    Twenty's built-in export function caps output at 20,000 records per operation and includes only columns currently visible in the active view. We pre-configure the export view to expose all fields before extracting, and chunk migrations exceeding 20K records into multiple exports by date range or record ID window to avoid silent truncation. For self-hosted Twenty instances, we extract directly from the PostgreSQL database to bypass the 20K UI export limit entirely and ensure all fields are captured.

  • Soft-deleted records trigger restore instead of create on unique match

    Twenty's uniqueness check runs against all records including soft-deleted ones visible under See deleted records. If we import a record with the same unique value (email for People, domain for Companies) as a soft-deleted record, Twenty restores the deleted record instead of creating a new one. We detect this condition during scoping and coordinate with the customer on whether to purge deleted records or map to existing ones before migration. This gotcha is specific to Twenty and does not apply when writing to Salesforce, but it affects which Salesforce records receive which Twenty data during migration.

  • API rate limits cap at 200 req/min on Organization tier

    The Twenty cloud tiers enforce per-minute API quotas: 100 req/min on Pro, 200 req/min on Organization. For migrations above 10,000 records, we distribute writes across throttled request batches with exponential backoff to respect limits without triggering 429 responses. Self-hosted Twenty deployments do not enforce these quotas, which can accelerate migration timelines for teams running their own infrastructure. Salesforce Bulk API is used for large engagement migrations to bypass individual API call limits.

  • No native email sequences migrate; cadence tools require separate platform

    Twenty lacks built-in email sequencing or sales engagement features. Teams migrating from Outreach, Salesloft, or other sales engagement platforms to Twenty do not find equivalent cadence tools inside Twenty. When migrating away from Twenty to Salesforce, this gap in the source platform means that any cadence or sequence history is not present in Twenty to begin with. We flag this gap during discovery so customers understand that sequence history will not exist in the source regardless of the destination chosen.

Migration approach

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

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

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

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

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

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

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

Context on both ends of the pair

Twenty CRM logo

Twenty CRM

Source

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

Salesforce Sales Cloud

Destination

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.

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 Twenty CRM and Salesforce Sales Cloud.

  • 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

    Twenty CRM: 100 req/min (Pro), 200 req/min (Organization).

  • Data volume sensitivity

    B

    Twenty CRM doesn't expose a bulk API — REST + parallelization used for high-volume runs.

Estimator

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

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

Can't find your answer?

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 consultation

Most migrations land between three and five weeks for accounts under 15,000 People and 3,000 Opportunities with no custom objects and no soft-delete conflicts to resolve. Migrations with custom objects, large task and note volumes, self-hosted Twenty instances requiring direct database export, or multiple soft-delete conflicts move to eight to fourteen weeks because of schema pre-creation complexity, lookup queue management, and Salesforce validation rule coordination.

Adjacent paths

Related migrations to explore

Ready when you are

Move from Twenty CRM.
Land in Salesforce Sales Cloud, 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