CRM migration

Migrate from SalezShark to Twenty CRM

Field-level mapping, validation, and rollback between SalezShark and Twenty CRM. We move data and schema; workflows are rebuilt natively in Twenty CRM.

SalezShark logo

SalezShark

Source

Twenty CRM

Destination

Twenty CRM logo

Compatibility

80%

8 of 10

objects map 1:1 between SalezShark and Twenty CRM.

Complexity

BStandard

Timeline

3-5 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

Moving from SalezShark to Twenty CRM is a CSV-based migration rather than an API-based one. SalezShark does not publish a public API, which means all record extraction runs through manual or scoped CSV exports from the SalezShark UI. We coordinate with the customer to export Contacts, Leads, Accounts, Opportunities, Tasks, and Custom Fields in batches, normalise the field names and picklist values against SalezShark's tier-gated schema, and load into Twenty's corresponding objects. Twenty's standard objects are Company, Person, and Opportunity; any SalezShark custom objects require pre-creation in Twenty's Settings Data Model before import. We preserve the original enrichment data as static fields in Twenty rather than relying on re-enrichment, and we deliver a written Workflow Automations specification so the customer's admin can rebuild SalezShark Professional-tier automations in Twenty's workflow engine. Workflows, Custom Event Triggers, and marketing sequences do not migrate as code.

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

SalezShark logo

SalezShark

What's pushing teams away

  • SalezShark users report that contact and lead data quality degrades without constant enrichment, leading to bounced emails and poor deliverability that undermines outbound campaigns.
  • The minimum 10-user license requirement for monthly billing catches smaller teams unexpectedly — they pay for 10 licenses even when only 3-4 team members use the system.
  • The platform lacks a publicly documented API, making it impossible to automate data extraction or build integrations without manual CSV exports, which limits migration flexibility and ongoing data sync options.

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 SalezShark objects map to Twenty CRM

Each row shows how a SalezShark 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.

SalezShark

Contact

maps to

Twenty CRM

Person

1:1
Fully supported

SalezShark Contacts map to Twenty Person records. Standard fields (name, email, phone, address) have direct equivalents. We preserve any SalezShark enrichment data (company email format, employee headcount) as static custom fields on the Person record since Twenty has no native enrichment engine. Note: Twenty's Person object may lack some standard fields (job title, department, social profiles) out of the box per GitHub issue #13953 — we create these fields in Twenty's Data Model before import if the source data references them.

SalezShark

Lead

maps to

Twenty CRM

Person or Custom Lead Object

1:1
Fully supported

SalezShark Leads with conversion scoring map to Twenty Person records. If the customer has a distinct lead qualification workflow, we create a custom Lead object in Twenty's Data Model before import and preserve the original SalezShark conversion score as a custom field. Leads that have been converted in SalezShark are treated as Person records with the original lead source preserved.

SalezShark

Account

maps to

Twenty CRM

Company

1:1
Fully supported

SalezShark Accounts map directly to Twenty Company records. The company name becomes displayName, website maps to websiteUrl, and industry/size/revenue data from SalezShark custom fields map to custom fields created in Twenty's Data Model. Company is imported before Person to satisfy the relationship reference.

SalezShark

Opportunity

maps to

Twenty CRM

Opportunity

1:1
Fully supported

SalezShark Opportunities map to Twenty Opportunity records. Pipeline stage names and order migrate as picklist values in Twenty's stage field. Deal value, close date, owner, and probability migrate directly. If SalezShark uses multiple pipelines, we create a custom pipeline field in Twenty and map stage names per pipeline to separate picklist value sets.

SalezShark

Pipeline

maps to

Twenty CRM

Custom Field (Stage + Pipeline)

lossy
Fully supported

SalezShark Pipelines do not have a direct Twenty equivalent. We export the pipeline configuration (pipeline name, stage list, stage order, stage probabilities) and recreate it in Twenty as a custom Opportunity pipeline field plus stage picklist values. The customer chooses a naming convention during scoping.

SalezShark

Task

maps to

Twenty CRM

Task

1:1
Fully supported

SalezShark Tasks map to Twenty Task records. Task title, description, due date, status, priority, and owner assignment migrate directly. Task association (linked to Contact, Account, or Opportunity) resolves via the Person and Company name lookup at migration time. Completed-at timestamp migrates to a custom completedDate field if the standard Twenty task model does not include it.

SalezShark

Activity (Call, Email, Meeting, Note)

maps to

Twenty CRM

Task, Comment, or Custom Activity Object

1:1
Fully supported

SalezShark engagement activities map to Twenty Task records for calls and tasks, Comment records for notes, and a custom Activity object for meeting and email history if the customer requires the full timeline preserved. The original SalezShark timestamp becomes the activity date in Twenty. Call duration and disposition migrate as custom fields.

SalezShark

Custom Field

maps to

Twenty CRM

Custom Field (Data Model)

lossy
Fully supported

SalezShark Custom Fields are exported as schema alongside records. We create each custom field in Twenty's Settings Data Model before import, matching the data type (text, number, date, select, multi-select, currency). Picklist values in SalezShark migrate as option values in Twenty's select or multi-select fields. Fields are pre-created before any data load.

SalezShark

Custom Object

maps to

Twenty CRM

Custom Object

1:1
Fully supported

SalezShark Custom Objects (if any exist on the account) map to Twenty custom objects created via /metadata API. We define the object name, plural label, and all fields in Twenty's Data Model before migration. If the custom object has lookups to standard objects (Contact, Account, Opportunity), we resolve those references during the migration run using name-based lookup.

SalezShark

User (Owner)

maps to

Twenty CRM

WorkspaceMember

1:1
Fully supported

SalezShark User records map to Twenty WorkspaceMember records by email address match. Owner assignments on Contacts, Accounts, and Opportunities migrate by resolving the SalezShark owner email to a Twenty WorkspaceMember. Any SalezShark owner without a matching Twenty user is held in a reconciliation queue; the customer's admin provisions the WorkspaceMember before record import resumes.

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.

SalezShark logo

SalezShark gotchas

High

No publicly documented API for automated extraction

Medium

Minimum 10-user billing regardless of actual headcount

Medium

Workflow Automations are not executable at migration time

Medium

Custom Field schema varies by tier and by org configuration

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

  • SalezShark has no public API — all extraction is CSV-only

    SalezShark does not publish API documentation for automated extraction. We work with the customer's export credentials to pull Contacts, Leads, Accounts, Opportunities, Tasks, and Custom Fields in CSV batches from the UI. Large orgs may need multiple export sessions filtered by date range or record owner. This limits what can be extracted automatically and requires coordination with the customer to run exports in sequence. We flag this constraint in every scoping call and plan for batch export time in the project timeline.

  • Twenty lacks standard fields out of the box — custom field creation is required before import

    Twenty CRM ships with minimal standard fields on Person and Company objects. Teams migrating from SalezShark report (per GitHub issue #13953) that they must spend 30-60 minutes creating basic fields before importing data. We handle this proactively: during scoping we extract the full SalezShark field schema, create every required field in Twenty's Data Model before import begins, and verify the field types match (text, email, phone, currency, date, select, multi-select). Skipping this step results in silent field drops during CSV import because Twenty ignores unmapped columns.

  • SalezShark enrichment data does not survive migration unless preserved explicitly

    SalezShark's built-in enrichment engine provides company email formats, employee headcount, and revenue range that teams use for prospecting. This enrichment is platform-native and does not export as verified data. We preserve the enrichment values as static custom fields in Twenty rather than leaving them blank, but the customer should understand these are snapshots at the time of export, not live enrichment. Re-enrichment via a third-party tool (Clearbit, Apollo, ZoomInfo) is the customer's post-migration decision.

  • Workflow Automations and Custom Event Triggers do not migrate to Twenty

    SalezShark Workflow Automations and Custom Event Triggers are gated to the Professional tier and store trigger-and-action sequences that cannot be transferred as executable code. Twenty's workflow builder is a different engine. We export the automation configuration as a written specification (trigger conditions, filter logic, downstream actions) and deliver it alongside migrated records so the customer's admin can rebuild in Twenty. We do not silently drop these during migration — they are explicitly documented and handed off.

  • Minimum 10-user SalezShark billing requires active-seat reconciliation before exit

    SalezShark enforces a minimum 10 user licenses for monthly billing regardless of actual active headcount. When migrating out, we confirm the actual active user count against the license count so the customer does not pay for unused seats during the transition window. We also flag that Twenty should be scoped to the real number of seats needed — the self-hosted version has no per-user limit, and the cloud version bills per workspace.

Migration approach

Six steps for a successful SalezShark to Twenty CRM data migration

  1. Discovery and export preparation

    We audit the customer's SalezShark account across tier (Lite/Basic/Professional), active user count, record volumes (Contacts, Accounts, Opportunities, Tasks), pipeline configurations, custom field schema, and any active Workflow Automations. We identify which objects require CSV export and coordinate with the customer to run exports in batches, filtered by owner or date range to stay within UI export limits. The discovery output is a written migration scope, a CSV export checklist, and a confirmed active-seat count against SalezShark's minimum billing.

  2. Twenty workspace provisioning and Data Model setup

    We provision the Twenty workspace (cloud or self-hosted as the customer chooses) and create all custom fields and custom objects in Twenty's Settings Data Model before any data import. This step is critical: Twenty ignores CSV columns that do not match an existing field, so every SalezShark custom field must be pre-created with the correct type. We also create any custom Lead or Activity objects the customer requires to preserve their full record structure.

  3. User provisioning and owner reconciliation

    We extract every distinct SalezShark owner referenced on records and invite the corresponding team members to the Twenty workspace as WorkspaceMembers. Owner assignments migrate by email match. Any SalezShark owner without a matching Twenty user goes to a reconciliation queue for the customer's admin to provision before record import resumes. This step must complete before any record import because OwnerId references are required on most object imports.

  4. CSV extraction and field mapping

    We extract CSVs from SalezShark for each object: Accounts first (to establish the Company primary key), then Contacts (with Account name resolved), Leads, Opportunities (with Account and Owner references resolved), and Tasks. We build a field mapping document for each object that documents the source field name, target Twenty field, any format transformation (date formats, phone number normalisation, picklist value mapping), and any field that will become a custom field in Twenty.

  5. Production import and reconciliation

    We run production import in dependency order: Company (Accounts), Person (Contacts and Leads), Opportunity, Task, then Custom Objects. Each phase emits a row-count reconciliation report (records in source vs records loaded) and a spot-check of 25-50 records against the SalezShark source. Any mapping corrections happen before the next phase begins. If the customer has large task history (over 50,000 activity records), we chunk the import to avoid timeout.

  6. Cutover, Workflow handoff, and post-migration support

    We freeze SalezShark writes during cutover, run a final delta migration of any records modified during the window, then hand off Twenty as the system of record. We deliver the Workflow Automations and Custom Event Triggers as a written specification document so the customer's admin can rebuild in Twenty. We provide a one-week hypercare window for reconciliation issues. We do not rebuild SalezShark 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

SalezShark logo

SalezShark

Source

Strengths

  • Lowest entry price among SMB CRMs at $8/user/month with full feature tiers.
  • Native lead enrichment and company database included at no extra cost.
  • Custom fields, custom layouts, and field-level security available on Basic tier and above.
  • Multi-currency support and conversion scoring included without enterprise gating.
  • Separate database per customer for data isolation and logical security boundaries.

Weaknesses

  • No publicly documented API — all data movement relies on manual CSV exports and imports, which is a hard blocker for automated migrations.
  • Contact data quality depends heavily on the platform's own enrichment engine; exported data may not retain verified status if the destination lacks equivalent enrichment.
  • Minimum 10-user license requirement inflates cost for teams below that threshold, and additional users are billed at a flat $120/user add-on rather than prorated.
  • Workflow Automations and Custom Event Triggers are gated to Professional tier, meaning mid-market teams must pay $39/user/month to access automation capabilities.
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. 3 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 SalezShark and Twenty CRM.

  • Object compatibility

    B

    3 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

    SalezShark: Not publicly documented.

  • Data volume sensitivity

    B

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

Estimator

Estimate your SalezShark 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 SalezShark to Twenty CRM data migrations

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

Can't find your answer?

Walk through your SalezShark 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 three and five weeks for accounts under 15,000 Contacts, 3,000 Accounts, and 2,000 Opportunities with no custom objects. Migrations with custom field schemas, multiple pipelines, large task histories, or custom objects requiring pre-creation in Twenty's Data Model move to six to ten weeks. The CSV-only extraction constraint adds time on the export side compared to API-based migrations; we plan for multiple export batches during scoping.

Adjacent paths

Related migrations to explore

Ready when you are

Move from SalezShark.
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