CRM migration

Migrate from Salesmate to Twenty CRM

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

Salesmate logo

Salesmate

Source

Twenty CRM

Destination

Twenty CRM logo

Compatibility

67%

8 of 12

objects map 1:1 between Salesmate and Twenty CRM.

Complexity

BStandard

Timeline

3-5 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

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.

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

Salesmate logo

Salesmate

What's pushing teams away

  • Basic tier's 5-sequence limit and 500-email daily cap forces an upgrade to Pro within the first quarter of active use, creating a sticker shock moment
  • Integration ecosystem is narrower than HubSpot or Salesforce, with reviewers noting limited native connections to third-party tools
  • Learning curve is steeper than expected according to some Capterra reviewers who took months to feel comfortable with all modules
  • Support quality is inconsistent for complex technical issues, with one review noting that enterprise-tier support options are not available as a paid add-on
  • Teams with complex marketing or service desk needs find Salesmate underdelivers compared to purpose-built platforms

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

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

maps to

Twenty CRM

Person

1:1
Fully supported

Salesmate 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

maps to

Twenty CRM

Company

1:1
Fully supported

Salesmate 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

maps to

Twenty CRM

Opportunity

1:1
Fully supported

Salesmate 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

maps to

Twenty CRM

Opportunity Stage + Workspace

lossy
Fully supported

Salesmate 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

maps to

Twenty CRM

Task

1:1
Fully supported

Salesmate 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

Email

maps to

Twenty CRM

Task (email subtype)

1:1
Fully supported

Salesmate 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

maps to

Twenty CRM

Custom Object or Standard Field

lossy
Fully supported

Salesmate 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

maps to

Twenty CRM

Custom Field (metadata API)

lossy
Fully supported

Salesmate 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

maps to

Twenty CRM

Custom Object

lossy
Fully supported

If 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

maps to

Twenty CRM

User

1:1
Fully supported

Salesmate 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

maps to

Twenty CRM

Custom Fields (thread metadata)

1:1
Fully supported

Salesmate 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

maps to

Twenty CRM

File

1:1
Fully supported

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

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.

Salesmate logo

Salesmate gotchas

Medium

API uses per-user access keys, not OAuth 2.0

High

v1 and v3 API versions are deprecated

Medium

Smart Flow credits consume based on unique contacts per campaign

Low

All users must be on the same pricing plan

Medium

Team Inbox storage and permission model differs from standard CRM activity

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

  • Twenty's GraphQL API requires metadata schema setup before data import

    Twenty CRM uses a metadata-driven architecture where custom objects and custom fields are defined through the /metadata GraphQL API before data can be imported. The metadata schema consists of DataSource, Object, and Field records that together define the GraphQL schema. We create all custom fields and custom objects via this API before any record import begins. If the metadata schema is not fully defined before import, the GraphQL mutations will reject records with unmapped field references. We coordinate the metadata setup as the first technical step in every Salesmate-to-Twenty migration.

  • Smart Flow automations do not have a standalone API export path

    Salesmate Smart Flow definitions (triggers, conditions, actions, and cadence) are not a standalone API object. We can export which contacts are enrolled in which Smart Flow campaigns, but not the automation logic itself. This means Smart Flow rebuild work is unavoidable post-migration. We deliver a written inventory of every active Smart Flow during scoping: the campaign name, trigger type, enrolled contact count, and a description of what the flow does. The customer's admin or a Twenty developer rebuilds these in Twenty's automation layer. We do not rebuild automations as part of the migration scope.

  • Salesmate per-user Access Keys lack OAuth 2.0 token rotation

    Salesmate uses per-user Access Keys for API authentication, not OAuth 2.0 tokens. These keys inherit the permission scope of the user who generated them and do not rotate automatically. We request a key from a full-access admin account before migration day and verify it has read access to all required modules. If the admin account is deprovisioned or the key is revoked mid-migration, we must coordinate re-authentication with Salesmate support before resuming. We document this dependency in the migration runbook and recommend generating the key from a dedicated service account rather than an individual employee's account.

  • Team Inbox thread metadata has no native destination in Twenty

    Salesmate Team Inboxes use a threaded conversation model that differs from Twenty's per-record activity timeline. Email threads with multiple participants and replies do not map cleanly to Twenty's Task or Note model without losing thread context. We preserve thread metadata as custom fields on the Person or Company record, but this is a workaround, not a native conversation view. Customers who rely heavily on Team Inboxes for shared customer communication should plan to adopt a dedicated shared inbox tool post-migration (such as an email integration or a purpose-built help desk tool) rather than expecting Twenty to replicate the Team Inbox experience.

  • Salesmate built-in telephony (phone, SMS, call recording) has no Twenty equivalent

    Salesmate includes native phone, SMS, and call recording across all tiers. Twenty CRM has no built-in telephony layer. Call logs, SMS history, and call recordings stored in Salesmate are accessible via the API, but there is no telephony feature to replace them in Twenty. We migrate call logs and SMS records as Task or Note records with metadata preserved. Call recordings are exported as audio files and re-attached to the corresponding activity record. The customer selects a third-party telephony integration (such as Aircall, RingCentral, or Twilio) post-migration to restore calling functionality.

Migration approach

Six steps for a successful Salesmate to Twenty CRM data migration

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

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

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

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

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

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

Context on both ends of the pair

Salesmate logo

Salesmate

Source

Strengths

  • Built-in telephony eliminates the need for a separate VOIP or dialer subscription
  • Consistent G2 ratings of 4.7 with particular praise for interface clarity and onboarding speed
  • Per-user pricing model with no per-contact billing surprises
  • Smart Flow automation available from the entry-level Basic tier
  • 24/7 support across all plans with phone, chat, and email channels

Weaknesses

  • Basic tier quickly becomes insufficient, pushing teams to Pro within their first quarter
  • Narrower integration ecosystem compared to HubSpot or Salesforce
  • Automation definitions (Smart Flows) are not fully accessible via the public API
  • Smart Flow credit consumption tied to unique contacts creates unpredictable billing for large databases
  • Limited marketing and customer service modules compared to all-in-one competitors
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 Salesmate 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

    Salesmate: Not publicly documented in the API docs.

  • Data volume sensitivity

    B

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

Estimator

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

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

Can't find your answer?

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 consultation

Most migrations land between three and five weeks for accounts under 15,000 Contacts, 3,000 Deals, and no custom objects. Migrations with custom objects (requiring metadata schema design via Twenty's GraphQL API), large attachment volumes, complex Teams Inbox threading, or multi-pipeline Deal structures requiring custom Opportunity stage configuration move to seven to eleven weeks because of metadata setup, GraphQL batch ingestion testing, and Smart Flow inventory delivery.

Adjacent paths

Related migrations to explore

Ready when you are

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