CRM migration
Field-level mapping, validation, and rollback between Salesmate and Twenty CRM. We move data and schema; workflows are rebuilt natively in Twenty CRM.
Salesmate
Source
Twenty CRM
Destination
Compatibility
8 of 12
objects map 1:1 between Salesmate and Twenty CRM.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Moving from Salesmate to Twenty CRM is a migration from a proprietary SaaS platform to an open-source, self-hostable CRM. The primary schema difference is naming: Salesmate uses Contact and Company; Twenty uses Person and Company. Deals map directly to Opportunities, and we configure the Opportunity stage values during workspace setup. We extract data from Salesmate using their REST API v4 (per-user Access Keys), transform each record, and insert via Twenty's GraphQL API using the workspace metadata schema. We do not migrate Smart Flow automations because their trigger-and-action logic is not a standalone API object in Salesmate; we deliver a written inventory of every active Smart Flow for your admin to rebuild in Twenty's automation layer. Team Inbox conversations are preserved as custom fields when no native equivalent exists, because Twenty's activity model uses Tasks and Notes rather than threaded shared-inbox messages.
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 Salesmate 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.
Salesmate
Contact
Twenty CRM
Person
1:1Salesmate Contact records map to Twenty Person records. The mapping preserves name fields (first_name, last_name), email address, phone number, and any custom fields as Twenty Person custom fields. We set the Person's displayName to the Contact's full name and preserve the Salesmate contact_id in a custom field sm_contact_id__c for reconciliation. If the Contact is linked to a Salesmate Company, we create or match the Company in Twenty first and link the Person to it via the Company foreign key.
Salesmate
Company
Twenty CRM
Company
1:1Salesmate Company records map directly to Twenty Company records. The domain from Salesmate's website field becomes the Company domain in Twenty. Companies are imported first to satisfy the Person-Company lookup before Person records are inserted. Any custom fields on the Salesmate Company (industry, employee count, revenue tier) map to Twenty Company custom fields created via the /metadata API.
Salesmate
Deal
Twenty CRM
Opportunity
1:1Salesmate Deals map to Twenty Opportunities. The dealstage maps to Twenty Opportunity stage values, which we configure during workspace setup to match the customer's pipeline stages. Closed-won and closed-lost reasons from Salesmate custom properties migrate to Twenty Opportunity custom fields. The deal amount, expected close date, and owner assignment migrate directly with OwnerId resolved via email match to Twenty User records.
Salesmate
Pipeline
Twenty CRM
Opportunity Stage + Workspace
lossySalesmate pipelines become Twenty Opportunity stage configurations within each Workspace. We extract all Salesmate pipeline names, map each pipeline stage to a corresponding Twenty stage value, and configure the stage probability percentages to match the original Salesmate percentages. For multi-pipeline setups, we configure separate Workspaces in Twenty if the customer's business logic warrants it, or separate Record Type fields if all pipelines share a single Workspace.
Salesmate
Task
Twenty CRM
Task
1:1Salesmate Tasks map directly to Twenty Tasks. Status, Priority, due date, and assignment migrate. The task association (linked to Contact, Company, or Deal) is preserved as a custom field linking the Task to the corresponding Person, Company, or Opportunity in Twenty. Open and completed task status maps directly to Twenty task status values.
Salesmate
Twenty CRM
Task (email subtype)
1:1Salesmate email history stored under Module ID 3 migrates to Twenty as Task records with an email subtype indicator. Full email body content may require a separate export path from Salesmate depending on the email's storage configuration. We preserve the email thread association as a custom field. Email attachments migrate as file links if they are accessible via the Salesmate API.
Salesmate
Product
Twenty CRM
Custom Object or Standard Field
lossySalesmate Products (Module ID 6) migrate to Twenty as a custom object or as line items on the Opportunity object depending on the customer's usage pattern. If the customer uses Products for a price book, we create a custom object with product name, SKU, and pricing fields. Price book associations require configuration in Twenty's Opportunity data model.
Salesmate
Custom Field
Twenty CRM
Custom Field (metadata API)
lossySalesmate custom fields on Contacts, Companies, Deals, Tasks, and Products are recreated in Twenty via the /metadata GraphQL API before any data import begins. We create the field definitions first (field name, type, required/optional), then import values during the record migration phase. Picklist values in Salesmate map to Twenty select or multi-select field options. Number, date, and text types map directly.
Salesmate
Custom Object
Twenty CRM
Custom Object
lossyIf Salesmate has any custom objects (via their Customize > Create Form interface), we create matching custom objects in Twenty using the metadata API. This involves creating the DataSource, Object, and Field metadata records, which triggers Twenty's GraphQL schema computation. Custom object records are imported last, after all parent standard objects are in place, because custom objects often have lookup relationships to Person, Company, or Opportunity.
Salesmate
User
Twenty CRM
User
1:1Salesmate user records map to Twenty User records by email address. Owner assignments on Deals and Tasks are resolved by matching the Salesmate owner email to the Twenty User email. Any Salesmate user without a matching Twenty User is held in a reconciliation queue for the customer's admin to provision before record import resumes.
Salesmate
Team Inbox
Twenty CRM
Custom Fields (thread metadata)
1:1Salesmate Team Inbox conversations do not have a native equivalent in Twenty's activity model. We export the conversation thread metadata (sender, recipient, timestamp, message body, thread ID) and preserve it as a custom multi-line text field on the related Person or Company record. This preserves the conversation history without forcing it into Twenty's Task or Note model where it would lose threading context.
Salesmate
Attachment
Twenty CRM
File
1:1File attachments associated with Contacts, Deals, and Companies are exported from Salesmate via the API and re-uploaded to Twenty. Storage limits in Salesmate vary by tier (1 GB Basic, 5 GB Pro, 10 GB Business, 20 GB Enterprise). We flag files approaching these limits during scoping and advise on a cleanup or selective migration strategy before migration day.
| Salesmate | Twenty CRM | Compatibility | |
|---|---|---|---|
| Contact | Person1:1 | Fully supported | |
| Company | Company1:1 | Fully supported | |
| Deal | Opportunity1:1 | Fully supported | |
| Pipeline | Opportunity Stage + Workspacelossy | Fully supported | |
| Task | Task1:1 | Fully supported | |
Task (email subtype)1:1 | Fully supported | ||
| Product | Custom Object or Standard Fieldlossy | Fully supported | |
| Custom Field | Custom Field (metadata API)lossy | Fully supported | |
| Custom Object | Custom Objectlossy | Fully supported | |
| User | User1:1 | Fully supported | |
| Team Inbox | Custom Fields (thread metadata)1:1 | Fully supported | |
| Attachment | File1: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.
Salesmate gotchas
API uses per-user access keys, not OAuth 2.0
v1 and v3 API versions are deprecated
Smart Flow credits consume based on unique contacts per campaign
All users must be on the same pricing plan
Team Inbox storage and permission model differs from standard CRM activity
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
Discovery and API access provisioning
We audit the Salesmate portal across modules in scope: Contacts, Companies, Deals, Tasks, Products, Custom Fields, Smart Flow campaign membership, and Team Inbox usage. We verify that v4 API access is active (v1 and v3 are deprecated) and request a full-access admin Access Key. We extract the full object schema including custom field definitions and validate that each endpoint returns data without permission errors. The discovery output is a written migration scope with object counts, field mapping draft, and Smart Flow inventory.
Twenty workspace configuration and metadata schema setup
We set up the Twenty workspace before any data import. This involves creating the data model via the /metadata GraphQL API: custom objects, custom fields on Person, Company, and Opportunity, stage values for Opportunities, and any picklist options. We configure Workspaces and Record Types based on the customer's pipeline structure. Schema setup is validated by querying the computed GraphQL schema before proceeding to record import. All metadata is deployed in a staging Workspace first.
Data extraction and transformation from Salesmate
We extract all records from Salesmate using the v4 REST API with pagination handling. For each object, we pull the full record including custom field values, owner assignment, and association IDs. We transform field values to match Twenty's expected types (date formats, picklist values, phone number normalization). We build the dependency graph so that parent records (Companies, Users) are extracted and staged before dependent records (Persons linked to Companies, Opportunities linked to Persons). Smart Flow enrollment data is exported separately as a contact-campaign membership list for the automation inventory document.
Staging migration and reconciliation
We run a full migration into a Twenty staging environment using production-like data volume. The customer reconciles record counts (Persons in, Companies in, Opportunities in, Tasks in), spot-checks 20-40 random records against the Salesmate source, and validates custom field values. Team Inbox thread metadata preservation is validated at this stage. The customer signs off on the mapping and schema before production migration begins. Any field mapping corrections are applied to the transform scripts at this stage, not in production.
Production migration in dependency order
We run production migration in record-dependency order: Users (manual provisioning verified), Companies (Person-Company lookups satisfied), Persons (with CompanyId resolved), Opportunities (with PersonId and OwnerId resolved), Tasks (with PersonId or OpportunityId resolved), Custom Objects (last because they may have lookups to all standard objects). Each phase emits a row-count reconciliation report before the next phase begins. Smart Flow enrollment data is exported and formatted into the automation inventory document rather than imported as records.
Cutover, validation, and automation handoff
We freeze writes to Salesmate during cutover and run a final delta migration of any records created or modified during the migration window. We validate record counts and run targeted spot-checks on high-value records (deals over a threshold amount, contacts with open tasks). We deliver the Smart Flow automation inventory document to the customer's admin team. We do not rebuild automations in Twenty's workflow layer; that is a separate engagement or an internal admin task. We support a five-day hypercare window for reconciliation issues raised during the first week of live use in Twenty.
Platform deep dives
Salesmate
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 Salesmate 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
Salesmate: Not publicly documented in the API docs.
Data volume sensitivity
Salesmate 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 Salesmate to Twenty CRM migration scoping. Not seeing yours? Book a call.
Walk through your Salesmate 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 Salesmate
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.