CRM migration

Migrate from Zoho CRM to Twenty CRM

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

Zoho CRM logo

Zoho CRM

Source

Twenty CRM

Destination

Twenty CRM logo

Compatibility

91%

10 of 11

objects map 1:1 between Zoho CRM and Twenty CRM.

Complexity

BStandard

Timeline

2-4 weeks

Rollback included Accuracy guarantee Field-level validation

Try the reverse

Twenty CRM
Zoho CRM

Overview

What this migration involves

Moving from Zoho CRM to Twenty CRM is a structural migration: Zoho separates Leads, Contacts, and Accounts as distinct modules, while Twenty collapses those into Person and Company objects with a unified contact model. We split Zoho Leads and Contacts into Twenty Persons, map Zoho Accounts to Twenty Companies, and resolve Deals against the correct Company at migration time. Subform data (line items, related records) requires separate API extraction from Zoho because CSV exports drop these rows entirely. We use Twenty's GraphQL API for all writes, batching mutations and handling the metadata-driven schema discovery that custom objects require. Zoho Blueprints, workflow rules, and custom modules are configuration, not data; we document them for the customer's admin to rebuild in Twenty rather than 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

Zoho CRM logo

Zoho CRM

What's pushing teams away

  • Support quality is inconsistent — reviewers report undertrained staff, slow response times, and difficulty reaching knowledgeable engineers for complex issues (7.6/10 vs industry average for Quality of Support).
  • Steep learning curve and complex UI navigation discourage adoption — users report that onboarding new team members requires significant training investment.
  • Integration challenges frustrate users: Zapier/Make workflows break unexpectedly, OAuth tokens expire, and third-party connectors lag behind Zoho's API versioning.
  • Advanced features are paywalled: AI (Zia), multi-pipeline management, sandbox environments, and advanced analytics are locked to $40–52/user/month Enterprise/Ultimate tiers.
  • The Zoho ecosystem is a double-edged sword — 45+ apps create scattered data, and migrating away means reconstructing relationships across those interconnected apps.

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

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

Zoho CRM

Lead

maps to

Twenty CRM

Person

1:1
Fully supported

Zoho Leads map to Twenty Person records. We extract Lead_Status, Lead_Source, and any custom fields and store them as Twenty Person fields or custom fields created via the /metadata API before import. The Zoho Lead-to-Contact conversion logic does not apply in Twenty; all imported Leads become Persons directly without a conversion step.

Zoho CRM

Contact

maps to

Twenty CRM

Person

1:1
Fully supported

Zoho Contacts map to Twenty Persons. The Contact-to-Account relationship in Zoho maps to the Person's relationship with a Twenty Company record. We sequence Company import before Person import so that the Company link resolves at insert time rather than requiring a follow-up update pass.

Zoho CRM

Account

maps to

Twenty CRM

Company

1:1
Fully supported

Zoho Accounts map directly to Twenty Companies. We use the Account_ID as the external identifier for deduplication and preserve the account's industry, website, phone, address, and any custom fields. Multi-address accounts in Zoho are stored as separate address records; we collapse the primary address into the Company record and store additional addresses as custom fields or note attachments.

Zoho CRM

Deal

maps to

Twenty CRM

Opportunity

1:1
Fully supported

Zoho Deals map to Twenty Opportunities. The Opportunity's link to a Company (Account) must resolve before Opportunity insert. We map Zoho's dealstage and pipeline to Twenty's pipeline stage field and handle multi-pipeline setups by creating separate pipeline configurations in Twenty before migration begins.

Zoho CRM

Product

maps to

Twenty CRM

Product (Custom Object)

1:1
Fully supported

Zoho Products map to a Twenty Product custom object created via the /metadata API before migration. Product_Code, Unit_Price, and Quantity_Unit migrate as fields. Products must import before any Quote or Sales Order migration because line items reference products by ID.

Zoho CRM

Subform: Quote Line Items, Sales Order Line Items

maps to

Twenty CRM

Custom Object + Lookup

1:many
Fully supported

Zoho nests line items as related records rather than inline fields. Standard CSV exports drop subform rows entirely. We issue separate API calls for each subform relationship (Quotes/Products, SalesOrders/Products), reconstruct the parent-child hierarchy, and upsert both layers into Twenty with the lookup resolved at insert time. If the source Zoho plan lacks API access, we alert the customer that subform data will require manual re-entry.

Zoho CRM

Task, Event, Call

maps to

Twenty CRM

Activity

1:1
Fully supported

Zoho Tasks, Events, and Calls map to Twenty Activity records. We preserve the linked-to-record association by resolving the WhoId (Person) and WhatId (Opportunity, Company) references at migration time. Activity timestamps are set from the original Zoho created_at value, not the import date, to preserve the timeline ordering sales reps rely on.

Zoho CRM

Note

maps to

Twenty CRM

Note

1:1
Fully supported

Zoho Notes migrate to Twenty Note records. We resolve the parent record link (Person, Company, or Opportunity) and write the note body as rich text. Notes attached to multiple records create multiple Note entries rather than a single shared note.

Zoho CRM

Attachment

maps to

Twenty CRM

Attachment

1:1
Fully supported

Zoho attachments are stored as separate file records linked to parent modules. They do not appear in CSV exports and must be fetched via the Attachments API endpoint. We download files, upload them to Twenty's file storage, and create the attachment link record pointing to the parent Person, Company, or Opportunity. File size limits and storage provisioning are confirmed before migration begins.

Zoho CRM

Custom Module

maps to

Twenty CRM

Custom Object

1:1
Fully supported

Zoho custom modules migrate to Twenty custom objects. We introspect the custom module's field metadata via GET /settings/fields in Zoho, create the equivalent Twenty object via the /metadata API, and then import the data. Schema varies per tenant; custom field types (picklist, multi-select, date, currency) are mapped to their Twenty equivalents. Custom module discovery is always the first step in the migration plan because downstream objects may have lookups to custom modules.

Zoho CRM

User (Owner)

maps to

Twenty CRM

User

1:1
Fully supported

Zoho User records carry name, email, role, and territory. We extract Users during discovery and build an email-to-ID mapping table. At migration time, we either match by email to an existing Twenty workspace user or flag missing users for the customer's admin to provision before record import resumes. Inactive Zoho users assigned as record owners are reassigned to an active admin user to avoid orphaning records.

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.

Zoho CRM logo

Zoho CRM gotchas

High

API access requires Professional tier or above

High

Subform fields do not export cleanly via CSV

Medium

API credit consumption is non-linear

Medium

Export download links expire in 7 days

Medium

Owner (User) assignments require pre-mapped user IDs

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

  • Original creation timestamps reset to import date on CSV-based exports

    Zoho's Data Administration export tool and CSV-based extractions do not preserve original record creation timestamps. HubSpot community posts document the same issue when migrating from Zoho: all records display the current import date rather than the original creation date. We address this by using the Zoho CRM REST API v8 where the source plan supports it, extracting createdAt and modifiedAt fields, and writing them to Twenty's equivalent timestamp fields. If the source plan lacks API access, we create custom fields in Twenty (e.g., original_created_date__c) to capture the historical values from CSV exports.

  • Subform and line-item data absent from standard CSV exports

    Zoho stores subform data (line items on Quotes and Sales Orders, related records in custom modules) as separate related-record tables. Standard CSV exports flatten the parent record but drop subform rows entirely. We handle this by issuing separate API calls for each subform relationship during extraction, reconstructing the parent-child hierarchy, and upserting both layers into Twenty. If the source Zoho plan lacks API access, we alert the customer that subform data will require manual re-entry or a Zoho partner-assisted export, and we scope that effort separately.

  • Character encoding issues when importing non-ASCII data

    Zoho's import tool has been documented converting non-ASCII characters into ASCII codes when the target file encoding is not set to UTF-8. This affects company names, address fields, and note bodies containing accented characters, special symbols, or non-Latin scripts. We always use UTF-8 encoding for all extract and import operations, validate character integrity after migration, and re-import affected records when encoding corruption is detected.

  • API access gated at Professional tier, limiting bulk extraction methods

    The Zoho CRM REST API is inaccessible on Free and Standard plans. Customers migrating from Zoho Free or Standard cannot use API-based bulk extraction and must rely on manual CSV exports, which do not include attachments, subforms, or historical timestamps. We always confirm the source Zoho plan's API entitlement during scoping and budget additional time for CSV-based extraction when API is unavailable, as it is significantly slower and more error-prone for datasets over 5,000 records.

  • Owner assignments require pre-mapped user IDs in the destination

    Zoho's Owner field references internal User IDs that do not exist in Twenty. We extract the Users module during discovery, build an email-to-user-ID mapping table, and write Twenty user IDs at import time. Records with owner assignments to inactive or departed Zoho users are flagged and reassigned to an active admin user to avoid orphaning. If the customer has not yet provisioned all expected Twenty users, the owner resolution step runs after user provisioning is complete.

Migration approach

Six steps for a successful Zoho CRM to Twenty CRM data migration

  1. Discovery and plan tier confirmation

    We audit the source Zoho CRM account across plan tier (Free/Standard/Professional/Enterprise/Ultimate), API entitlement, module inventory (standard and custom), subform relationships, pipeline structure, workflow rules, and active user count. We confirm whether API access is available for bulk extraction or whether CSV-based methods are required. The discovery output is a written migration scope covering record counts per module, custom field inventory, subform dependency map, and a recommendation on which modules to migrate versus re-enter manually.

  2. Metadata schema creation in Twenty

    We create the destination schema in Twenty before any data import. This includes using the /metadata API to create custom objects matching Zoho custom modules, adding custom fields to standard Twenty objects (Person, Company, Opportunity) for any Zoho fields that have no direct equivalent, and configuring pipeline stage values to match the Zoho deal pipeline structure. Schema creation happens in a staging Twenty workspace for validation before production migration begins.

  3. Data extraction from Zoho in dependency order

    We extract Zoho data in dependency order: Users first (for owner mapping), then Companies, then Persons (Leads and Contacts with Company link resolved), then Opportunities (with Company link resolved), then Products, then Quote and Sales Order parents, then subform line items, then Activities, then Notes and Attachments. Subform data is extracted via separate API calls for each related-record table. API credit consumption is monitored and spread across multiple 24-hour windows when the volume approaches the source plan's credit limit.

  4. Data cleansing and transformation

    We transform extracted data before loading into Twenty. This includes splitting Zoho Leads and Contacts into Twenty Persons, mapping Zoho Account links to Twenty Company lookups, collapsing multi-address Zoho Accounts into primary plus custom fields, transforming picklist and multi-select values to match Twenty's field type constraints, and encoding validation for non-ASCII character sets. We generate a transformation log that documents every field mapping decision so the customer can audit the data changes.

  5. Twenty import via GraphQL API

    We import into Twenty using its GraphQL API with batched mutations. Each import phase (Companies, Persons, Opportunities, Activities, custom objects) runs sequentially and emits a row-count reconciliation report before the next phase begins. Subform line items import after parent records are committed so that lookup references resolve at insert time. We use exponential backoff on rate-limit responses and implement idempotent upsert logic using external ID fields to handle retry scenarios without duplicating records.

  6. Cutover, validation, and automation rebuild handoff

    We freeze Zoho writes during cutover, run a final delta migration of any records modified during the migration window, then enable Twenty as the system of record. We validate record counts, spot-check field mappings on 25-50 records per module, and confirm that activity timelines preserve chronological ordering. We deliver a written inventory of Zoho Blueprints, workflow rules, and custom modules that require manual rebuild in Twenty, with notes on any feature gaps between Zoho's automation engine and Twenty's current capabilities. Post-migration hypercare support is available as a separate engagement.

Platform deep dives

Context on both ends of the pair

Zoho CRM logo

Zoho CRM

Source

Strengths

  • Generous free tier (3 users) with real CRM functionality — no artificial feature restrictions that prevent valid use cases.
  • Per-seat pricing is transparent and predictable; no contact-based billing surprises that inflate monthly invoices.
  • Blueprint visual workflow builder lets sales ops teams automate stage progressions without developer involvement.
  • Canvas drag-and-drop layout editor lets non-technical users customize module views and forms per role.
  • Active development cadence: API v8 is well-documented, supports bulk endpoints, and COQL queries handle complex filtering.

Weaknesses

  • Poor support quality and inconsistent SLA — Enterprise tier requires 50+ user minimum for Priority Phone support.
  • Daily export limits in the UI vary by plan tier, making large dataset extraction slow and planning-dependent.
  • Zia AI features are gated behind $40+/user Enterprise tier, not available to most SMB customers who chose Zoho for cost savings.
  • User-reported occasional UI inconsistencies and performance slowdowns on large datasets with many custom fields.
  • No EU-hosted option limits appeal for GDPR-sensitive companies; some competitors offer data residency guarantees Zoho does not.
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 Zoho CRM 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

    Zoho CRM: Starter: 500 req/min | Professional: 2,500 req/min | Enterprise: 10,000 req/min, plus a credit-based system for complex queries (1–3 credits per COQL fetch).

  • Data volume sensitivity

    A

    Zoho CRM exposes a bulk API — large-volume migrations stream efficiently.

Estimator

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

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

Can't find your answer?

Walk through your Zoho CRM 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 two and four weeks for accounts under 10,000 Contacts and 2,000 Deals with no custom modules. Migrations with Zoho multi-pipeline structures, subform-heavy Quote and Sales Order modules, large activity histories, or multiple custom modules move to four to eight weeks because of multi-phase subform extraction, per-custom-module metadata discovery, and parent-record resolution across related entities.

Adjacent paths

Related migrations to explore

Ready when you are

Move from Zoho CRM.
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