CRM migration

Migrate from Corteza CRM to Twenty CRM

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

Corteza CRM logo

Corteza CRM

Source

Twenty CRM

Destination

Twenty CRM logo

Compatibility

55%

6 of 11

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

Complexity

BStandard

Timeline

2-4 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

Moving from Corteza CRM to Twenty CRM is a platform migration that also involves a schema redesign. Corteza organizes data around named modules (Leads, Accounts, Contacts, Opportunities, Campaigns, Cases, Contracts, Events) with a namespace export path that has documented edge cases around orphaned page references. Twenty uses a simpler object model with Company and Person as standard objects, Opportunities, and a custom object system via the /metadata API. We audit the Corteza namespace for broken page-module links before export, translate each module to its Twenty equivalent, and handle custom Corteza modules by pre-creating the destination schema via Twenty's metadata API. Workflow definitions, automations, and namespace configuration do not migrate; we deliver a written inventory of these for the customer's admin to rebuild in Twenty's workflow builder. File attachments are not included in CSV-based migration paths and require supplemental API handling.

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

Corteza CRM logo

Corteza CRM

What's pushing teams away

  • Enterprise support is unclear — despite Enterprise tier branding, there is no documented SLA or dedicated support channel, leaving self-hosted teams without recourse when issues arise.
  • Workflow stability after upgrades is inconsistent — lead conversion automation buttons have been documented as disabled after restore operations, requiring manual re-import of workflow definitions to fix.
  • The platform feels bare for production use — federation is marked experimental and disabled by default, and multiple standard CRM functions still require manual scripts or DB workarounds.
  • Self-hosting carries hidden operational cost — teams need DevOps capacity for deployment, backups, updates, and troubleshooting that SaaS CRMs absorb entirely.

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

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

Corteza CRM

Leads

maps to

Twenty CRM

Person

1:1
Fully supported

Corteza Leads are a first-class module with standard fields (first name, last name, email, phone, rating) and a conversion workflow that creates Accounts, Contacts, and Opportunities. Twenty does not have a separate Lead object; all individual person records are Person objects. We migrate Corteza Lead records as Twenty Person records, and we flag the lead-conversion workflow as requiring a rebuild in Twenty's workflow builder. The original conversion status (converted vs not-yet-converted) is preserved in a custom field on the Person record for audit.

Corteza CRM

Account

maps to

Twenty CRM

Company

1:1
Fully supported

Corteza Account records (representing companies) map directly to Twenty Company records. The account domain or website becomes the Company domainName field. Industry classification, address data, and social media URLs map to their equivalent Twenty Company fields. Company is the parent entity for Person in Twenty's data model, so we create all Company records before any Person import to satisfy the lookup relationship at insert time.

Corteza CRM

Contact

maps to

Twenty CRM

Person

1:1
Fully supported

Corteza Contact records (individual people linked to Accounts) map to Twenty Person records. The contact-Account relation maps to the Person.companyId foreign key pointing to the migrated Company. First name, last name, email, phone, and job title migrate directly. Any custom fields on the Corteza Contact module migrate as custom fields on the Twenty Person object created via the /metadata API before import.

Corteza CRM

Opportunity

maps to

Twenty CRM

Opportunity

1:1
Fully supported

Corteza Opportunities track sales deals with stage, amount, probability, and close date. Each Opportunity relates to an Account and multiple Contacts via OpportunityContactRole records. We map Opportunity to Twenty's Opportunity with stage, amount, probability, and closeDate preserved. The OpportunityAccountId maps from the Corteza Opportunity-Account relation. We create Opportunity records after Company and Person records are in place to satisfy lookups.

Corteza CRM

Campaign

maps to

Twenty CRM

Custom Object (Campaign)

lossy
Fully supported

Corteza Campaigns group marketing activities and track campaign member responses. CampaignMember records link Contacts and Leads to a Campaign. Twenty does not have a native Campaign object in its standard schema, so we create a Campaign custom object via the /metadata API with fields for campaign name, status, type, start date, and end date. CampaignMember relations migrate as a separate custom association object linking the Person (or Company) custom object to the Campaign custom object.

Corteza CRM

Case

maps to

Twenty CRM

Custom Object (Case)

lossy
Fully supported

Corteza Cases track customer support issues with status, priority, origin, and resolution fields. Cases link to Accounts and Contacts. Twenty does not have a native Case object; we create a Case custom object via the /metadata API with the relevant fields and create a CaseContact association to the Person object. Status values migrate as a picklist on the custom object.

Corteza CRM

Contract

maps to

Twenty CRM

Custom Object (Contract)

lossy
Fully supported

Corteza Contracts store agreement details with line items (ContractLineItem), related Accounts, and Contact roles (ContractContactRole). Twenty does not have a native Contract object. We create a Contract custom object via the /metadata API with fields for contract name, account (linked to Company), start date, end date, status, and terms. Contract line items migrate as a related custom object with a lookup to the parent Contract record.

Corteza CRM

Task

maps to

Twenty CRM

Task (Activity)

1:1
Fully supported

Corteza Tasks can be standalone or related to any parent record (Lead, Account, Contact, Opportunity) and have status, due date, assignee, and optional description. We map tasks to Twenty Activity records with the appropriate type discriminator. Task assignees resolve by email match against the Twenty User table. Any Corteza task without a matching User goes to a reconciliation queue for the customer's admin to provision.

Corteza CRM

Event

maps to

Twenty CRM

Task (Activity type=event)

1:1
Fully supported

Corteza Events represent calendar items (meetings, calls) related to any CRM record. Each Event stores datetime, duration, organizer, and attendee references. We map Events to Twenty Activity records with the event type discriminator set. Start datetime, end datetime, and location migrate as custom fields on the Activity. Attendee references resolve by email match against migrated Person records and create ActivityParticipant records in Twenty.

Corteza CRM

Custom Module

maps to

Twenty CRM

Custom Object

lossy
Fully supported

Corteza's low-code environment lets administrators create entirely custom modules beyond the standard CRM set. These custom modules may have non-standard field types, custom validation rules, or non-standard relationships. We audit each custom module during discovery, pre-create the destination custom object in Twenty via the /metadata API (creating DataSource, Object, and Field metadata entries), and then migrate records via the /graphql endpoint. Custom module naming conventions are preserved as the custom object name with API-compliant naming applied.

Corteza CRM

File and Attachment

maps to

Twenty CRM

Attachment

lossy
Fully supported

Corteza file fields store attachments per module. The export path handles individual file records, but bulk attachment export with folder structure intact may require supplemental handling. Twenty's CSV export path explicitly excludes file attachments. We handle file migration by exporting files from Corteza's storage, uploading them to Twenty's storage layer, and creating Attachment records linked to the parent object by ID resolution. This requires supplemental API handling beyond the standard record migration sequence.

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.

Corteza CRM logo

Corteza CRM gotchas

High

Namespace export fails on orphaned page references

High

Workflow automation breaks after restore or upgrade

Medium

Field-level security does not cover all access scenarios

Medium

Federation is experimental and not production-ready

Low

No publicly documented API rate limits

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

  • Corteza namespace export fails on orphaned page references

    Corteza's namespace export path explicitly fails when any page in the namespace references a deleted module. This prevents the 'take your entire CRM and move it' migration path from completing cleanly. We audit the namespace for orphaned page references before attempting export, clean up the broken page-module links, and then proceed with the namespace package so the migration does not stall at the export step. If the namespace cannot be cleaned (deleted modules cannot be restored without a backup), we fall back to direct JSON API extraction per module.

  • Twenty CSV exports do not include file attachments

    Twenty's CSV export path explicitly excludes file attachments per the platform documentation. Teams migrating from Corteza that have file attachments on records (Contracts, Cases, custom modules with file fields) cannot rely on CSV as a complete migration vector. We handle file attachments by exporting from Corteza's storage, uploading to Twenty's storage layer, and creating Attachment records via supplemental API calls after the main record migration completes.

  • Custom module field types require metadata API setup before import

    Corteza custom modules can have non-standard field types beyond the standard text, number, date, and picklist options. Twenty's custom object system uses metadata tables (DataSource, Object, Field) that must be populated via the /metadata API before any data can be inserted via /graphql. We create the metadata schema first during migration, wait for the GraphQL schema cache to recompute, and then proceed with record inserts. Migrations that skip this ordering step result in schema mismatch errors during data load.

  • Workflow definitions do not survive migration between different automation models

    Corteza workflows automate CRM operations (lead conversion, quote creation, task assignment) but are known to break after system restore or upgrade. Twenty uses a different workflow builder model with different trigger types, conditions, and actions. Workflow definitions are not portable between platforms even if the business logic appears similar. We do not migrate workflows as code. We deliver a written inventory of every active Corteza workflow with its trigger, conditions, actions, and a recommended Twenty workflow equivalent, and the customer's admin rebuilds them in Twenty's workflow builder post-migration.

  • Self-hosted update process in Twenty can cause blank CRM state

    GitHub issue #14705 documents that self-hosted Twenty instances can display a largely blank CRM after certain version-to-version updates (specifically jumping from 1.3.0 to 1.6.7 in that report). Database migrations appear to complete and the server starts, but the CRM interface fails to render. We recommend that customers run any Twenty version updates before migration begins and confirm the instance renders correctly. If the instance is in a blank state post-update, we cannot proceed with migration until the customer's admin resolves the rendering issue.

Migration approach

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

  1. Discovery and schema audit

    We audit the source Corteza instance across all modules (standard and custom), namespace configuration, workflow definitions, file attachments, and API access. We assess the target Twenty instance for custom object requirements and confirm the /metadata API is accessible. The discovery output is a written migration scope covering which modules map to standard Twenty objects, which require custom object creation via metadata API, which require supplemental file handling, and which require admin rebuild (workflows, namespace configuration).

  2. Namespace audit and orphaned page cleanup

    We audit the Corteza namespace for orphaned page references that would cause export to fail. Any page referencing a deleted module is cleaned up by removing or re-linking the broken reference before namespace export is attempted. If the namespace cannot be cleaned (deleted modules cannot be restored without a backup), we fall back to direct JSON API extraction per module rather than namespace export.

  3. Custom object schema creation in Twenty

    For every Corteza custom module and every standard object that requires custom fields, we pre-create the destination schema in Twenty via the /metadata API. This includes creating DataSource entries, Object entries, and Field entries for each custom module. We wait for the GraphQL schema cache to recompute after each custom object is created before proceeding to the next. Standard objects (Company, Person, Opportunity) use their existing schema with any required custom fields added.

  4. Sandbox migration and reconciliation

    We run a full migration into a Twenty sandbox instance (or a staging environment) using production-like data volume. The customer's team reconciles record counts, spot-checks 25-50 random records against the Corteza source, and validates that parent-child relationships (Company-Person, Opportunity-Company) are intact. Any mapping corrections happen in this phase before production migration begins.

  5. Production migration in dependency order

    We run production migration in record-dependency order: custom object metadata (created via /metadata API first), Company records (from Corteza Accounts), Person records (from Corteza Leads and Contacts with CompanyId resolved), Opportunities (with CompanyId and PersonId lookups resolved), then Activity history (Tasks and Events via /graphql), then custom object records (with all lookups resolved). Files and attachments migrate last via supplemental API calls. Each phase emits a row-count reconciliation report before the next phase begins.

  6. Cutover, validation, and workflow rebuild handoff

    We freeze Corteza 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 deliver the workflow and automation inventory document to the customer's admin team. We support a one-week hypercare window where we resolve any reconciliation issues raised by the customer's team. We do not rebuild Corteza workflows in Twenty inside the migration scope; that is a separate engagement or an internal admin task.

Platform deep dives

Context on both ends of the pair

Corteza CRM logo

Corteza CRM

Source

Strengths

  • 100% open-source with no per-user, per-contact, or tier-gated feature restrictions on the self-hosted version.
  • Self-hosted deployment gives complete data ownership and sovereignty over where customer data resides.
  • Low-code module builder lets non-developers create custom CRM objects and fields without writing code.
  • API-first design documented via OpenAPI with OIDC authentication for secure integrations.
  • Fine-grained RBAC with field-level read and update permissions for complex internal security policies.

Weaknesses

  • No documented SLA or dedicated enterprise support tier despite Enterprise tier branding — self-hosted teams rely on community forums.
  • Upgrade and restore events can break standard CRM workflow behavior, including lead conversion automation buttons.
  • Federation feature is marked experimental and disabled by default, limiting multi-instance identity management.
  • Self-hosted deployment requires DevOps resources for installation, configuration, backups, and ongoing maintenance.
  • Community-driven support has inconsistent response times compared to vendor-backed SaaS alternatives.
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 Corteza 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

    Corteza CRM: Not publicly documented.

  • Data volume sensitivity

    B

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

Estimator

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

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

Can't find your answer?

Walk through your Corteza 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 records and no custom modules. Migrations with multiple custom modules, large event histories, or complex module dependency graphs move to four to eight weeks because of metadata API custom object creation, parent-record lookup resolution, and the namespace audit work required before export can proceed.

Adjacent paths

Related migrations to explore

Ready when you are

Move from Corteza 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