CRM migration
Field-level mapping, validation, and rollback between SoulCRM and Twenty CRM. We move data and schema; workflows are rebuilt natively in Twenty CRM.
SoulCRM
Source
Twenty CRM
Destination
Compatibility
9 of 12
objects map 1:1 between SoulCRM and Twenty CRM.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Moving from SoulCRM to Twenty CRM is a CSV-first migration because SoulCRM does not publish a public API and has no documented programmatic export endpoint. We request CSV exports from each SoulCRM module, validate field headers against the module's standard schema, and map those exports to Twenty's REST and GraphQL API endpoints in dependency order: Companies first to satisfy relationship lookups, then Contacts, then Deals, then Activities last. SoulCRM's India-specific custom fields (GST identifiers, regional segments, INR-based pricing tiers) transfer as Twenty custom fields. SoulCRM's integrated telephony and email capture data requires a content-normalization step before the body text lands cleanly in Twenty's Timeline. SoulCRM's Marketing Module campaigns and follow-up workflows do not migrate as automation; we deliver a written inventory of every active workflow and its recommended Twenty workflow-builder equivalent for the customer's admin to reconstruct 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.
Why teams make this switch
Leaving
What's pushing teams away
Choosing
What's pulling them in
Object mapping
Each row shows how a SoulCRM 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.
SoulCRM
Company
Twenty CRM
Company
1:1SoulCRM Company records map directly to Twenty Company objects. SoulCRM's company name, domain, industry, phone, address, and any linked GST identifiers in custom fields migrate to Twenty's Company fields plus a custom field for the GST number if present. Companies are imported first because Contacts and Deals have lookup dependencies that require the Company record to exist before the relationship can be established in Twenty.
SoulCRM
Contact
Twenty CRM
Person
1:1SoulCRM Contact records map to Twenty Person objects with is_organization set to false. The full contact profile (name, email, phone, address, interaction history) migrates. SoulCRM contacts linked to a Company carry that relationship into Twenty via the Person's workspaceKey field, which is resolved at import time against the previously migrated Company record. Individual email addresses serve as the deduplication key.
SoulCRM
Lead
Twenty CRM
Person (is_organization=false)
1:1SoulCRM Leads from the Marketing Module map to Twenty Person records with is_organization set to false. Lead status, source attribution, assignment fields, and any custom lead scoring values migrate as custom fields in Twenty. If SoulCRM's Marketing Module captures lead scoring, we preserve it in a custom field on the Person record for the customer's admin to use in Twenty's workflow builder.
SoulCRM
Deal
Twenty CRM
Opportunity
1:1SoulCRM Deal records map to Twenty Opportunity objects. The pipeline stage name, deal amount, probability (if stored), owner assignment, and expected close date migrate. SoulCRM's stage names are mapped explicitly to Twenty's opportunity stage values during the transform step. If SoulCRM stores a Closed-Won or Closed-Loss reason, it migrates as a custom field on the Opportunity.
SoulCRM
Deal Stage
Twenty CRM
Opportunity Stage
lossySoulCRM pipeline stages (New, Qualified, Proposal, Negotiation, Closed Won, Closed Lost, and any India-specific regional stages) are mapped to Twenty's opportunity stage values during the transform. We configure Twenty's stage list in the workspace before migration begins so that stage values are available as valid picklist entries during Opportunity import.
SoulCRM
Activity: Email
Twenty CRM
TimelineEvent
1:1SoulCRM email activities linked to Contacts or Companies migrate to Twenty TimelineEvent records. The email subject, body content, sender, recipient, and timestamp transfer. SoulCRM email body formatting (HTML or plain text depending on how it was captured in SoulCRM) may require a content-normalization step before display in Twenty's Timeline, and we flag this during the reconciliation phase.
SoulCRM
Activity: Call
Twenty CRM
TimelineEvent (type=call)
1:1SoulCRM call logs map to Twenty TimelineEvent records with the event type set to call. Call duration, disposition, and any notes from the call record migrate. The linked Contact or Company is resolved via the Person or Company lookup at migration time so the call appears in the correct Timeline in Twenty.
SoulCRM
Activity: Task
Twenty CRM
Task
1:1SoulCRM task activities migrate to Twenty Task records. Task status, priority, due date, and description transfer. If the task was assigned to a SoulCRM Owner, the assignee is resolved via the User mapping before import.
SoulCRM
Marketing Campaign
Twenty CRM
Opportunity (campaign-linked)
1:manySoulCRM Marketing Module campaigns (name, type, start/end dates, budget) map to Twenty Opportunity records tagged with a campaign custom field. Campaign membership links (which SoulCRM associates to Contacts and Leads) are resolved by creating a custom many-to-many relationship: each SoulCRM campaign-contact or campaign-lead association creates a link record in Twenty that associates the Person with the campaign Opportunity. This requires two-phase import: campaign records first, then association records second.
SoulCRM
Custom Fields (India-specific)
Twenty CRM
Custom Fields
lossySoulCRM custom fields for GST identifiers, regional sales segments, INR-based pricing tiers, and other India-specific data migrate as Twenty custom fields on the relevant object (Company, Person, or Opportunity). We audit each SoulCRM custom field during scoping, drop any deprecated fields with zero usage, and create the corresponding custom field in Twenty's workspace schema before data import begins. Field type mapping follows: text to text, number to number, date to date, and picklist to select.
SoulCRM
Attachment
Twenty CRM
Attachment (via File upload)
1:1File attachments linked to SoulCRM Contacts, Companies, or Deals are extracted as binary files and re-uploaded to Twenty via the File API. Folder hierarchy in SoulCRM is not preserved; all files land in Twenty's default attachment location linked to the corresponding record. We extract attachment metadata (filename, size, upload date) and recreate it as a custom field on the record for reference.
SoulCRM
Owner
Twenty CRM
User
1:1SoulCRM Owner records (sales reps, admin users) are mapped to Twenty User accounts by email address. We extract every distinct Owner referenced on Contacts, Companies, Deals, and Activities and match by email against Twenty's User table. Any SoulCRM Owner without a matching Twenty User is held in a reconciliation queue for the customer's admin to provision the User before the record import resumes.
| SoulCRM | Twenty CRM | Compatibility | |
|---|---|---|---|
| Company | Company1:1 | Fully supported | |
| Contact | Person1:1 | Fully supported | |
| Lead | Person (is_organization=false)1:1 | Fully supported | |
| Deal | Opportunity1:1 | Fully supported | |
| Deal Stage | Opportunity Stagelossy | Fully supported | |
| Activity: Email | TimelineEvent1:1 | Fully supported | |
| Activity: Call | TimelineEvent (type=call)1:1 | Fully supported | |
| Activity: Task | Task1:1 | Fully supported | |
| Marketing Campaign | Opportunity (campaign-linked)1:many | Fully supported | |
| Custom Fields (India-specific) | Custom Fieldslossy | Fully supported | |
| Attachment | Attachment (via File upload)1:1 | Fully supported | |
| Owner | 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.
SoulCRM gotchas
No public API documentation discovered in research
Minimum user requirements on paid tiers affect per-seat pricing
Absence from G2, Capterra, and TrustRadius review platforms
Limited documented integrations with third-party tools
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
CSV export request and field audit
We request CSV exports from SoulCRM for each module: Companies, Contacts, Leads, Deals, Activities (emails, calls, tasks), and Marketing Campaigns. We also request any attachments as a separate download. Each CSV is audited for field headers, record counts, custom field columns, and empty columns (deprecated fields). We flag any SoulCRM custom fields that have zero usage across records as candidates for exclusion from migration to keep the destination schema clean. The output of this step is a SoulCRM field inventory mapped to a preliminary Twenty field list.
Twenty workspace schema setup
Before any data loads, we configure the Twenty workspace: custom fields are created on Company, Person, and Opportunity objects to capture SoulCRM's India-specific data (GST identifiers, regional segments, pricing tiers). Opportunity stage values are configured to match SoulCRM's pipeline stage names. If the customer is using Twenty's self-hosted deployment, we verify the installed version is stable and that the database migration has completed successfully. For managed cloud deployments, we confirm workspace provisioning and API access.
CSV transform and dependency ordering
We transform each SoulCRM CSV into Twenty's import format. SoulCRM custom field column names are mapped to the corresponding Twenty custom field API names. Date formats are normalized to ISO 8601. Email addresses are set as the deduplication key for Person imports. The import order is enforced: Companies CSV first, then Contacts/Leads, then Deals/Opportunities, then Activities last. Any SoulCRM owner email references are flagged for User reconciliation.
User reconciliation
We extract every distinct SoulCRM Owner email from the CSV exports and match against Twenty's User list. Owners without a matching Twenty User are added to a reconciliation queue. The customer's admin provisions the missing Twenty Users (with correct roles and team assignments) before record import continues. Owner resolution is required because Contact, Company, and Deal imports carry owner references that must resolve at insert time in Twenty.
Staged import and reconciliation
We run a staged import into Twenty following the dependency order: Companies first (via Twenty's Companies API), then Persons from Contacts and Leads (via the Person API with is_organization=false), then Opportunities from Deals (via the Opportunity API with Company and Person lookups resolved), then Activities (via the TimelineEvent or Task API). Each phase emits a row-count and field-coverage reconciliation report. We perform spot-checks on 20-30 records per module comparing source and destination values before advancing to the next phase.
Cutover, validation, and workflow handoff
After all modules are imported and reconciled, we freeze SoulCRM as the system of record and run a final delta migration for any records modified during the cutover window. We validate record counts across all modules and confirm that primary fields (name, email, phone, stage, amount) match the source data within a tolerance of less than one percent error. We deliver the SoulCRM automation inventory document to the customer's admin for workflow rebuild in Twenty's workflow builder. We provide a one-week hypercare window for reconciliation issues. We do not rebuild SoulCRM workflows as Twenty workflows as standard scope.
Platform deep dives
SoulCRM
Source
Strengths
Weaknesses
Twenty CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 3 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 SoulCRM and Twenty CRM.
Object compatibility
3 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
SoulCRM: Not publicly documented.
Data volume sensitivity
SoulCRM 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 SoulCRM to Twenty CRM migration scoping. Not seeing yours? Book a call.
Walk through your SoulCRM 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 SoulCRM
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.