CRM migration

Migrate from Cordial to Twenty CRM

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

Cordial logo

Cordial

Source

Twenty CRM

Destination

Twenty CRM logo

Compatibility

50%

5 of 10

objects map 1:1 between Cordial and Twenty CRM.

Complexity

BStandard

Timeline

3-5 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

Cordial and Twenty CRM occupy different architectural positions: Cordial is a marketing messaging platform built around flexible JSON contact attributes and campaign-driven audience segmentation, while Twenty CRM is a sales-focused relationship management tool with a structured Person-Company-Opportunity object model. The migration is not a straightforward record copy—it requires reclassifying Cordial's contact-centric data model into the Buyer-Seller relationship model that Twenty uses. We extract Contacts with all standard and custom attributes, flatten array-type properties (tags, behavioral events, favorite colors) into delimited strings or related records, map the product catalog to Company-linked records or custom objects, and preserve channel-level opt-in preferences as custom boolean fields on Person. Automation programs and segment definitions have no export API in Cordial; we document them as written artifacts for the customer's team to rebuild in Twenty CRM or via the n8n community node that landed in March 2025.

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

Cordial logo

Cordial

What's pushing teams away

  • Some users report that complex reporting and advanced analytics require workarounds, with out-of-the-box dashboards feeling insufficient for deep performance analysis.
  • Scaling large contact databases can introduce latency in segment queries and campaign execution, particularly when audiences exceed several million records.
  • The drag-and-drop interface, while easy to use for basic campaigns, can become limiting when building sophisticated multi-step automation logic that requires more programmatic control.

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

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

Cordial

Contact

maps to

Twenty CRM

Person

1:1
Fully supported

Cordial Contacts map directly to Twenty CRM Person records. We extract all standard fields (email, firstName, lastName, phone) plus every custom contact attribute stored as a string or number type. Each attribute becomes a custom field on the Person object in Twenty CRM. Array-type attributes (tags, favorite colors, behavioral lists) are flagged during scoping and normalized to delimited strings or held as a separate lookup table pending customer preference. Cordial's channel preferences (email opt-in, SMS opt-in) become custom boolean fields on Person.

Cordial

Contact (B2B domain)

maps to

Twenty CRM

Company

1:1
Fully supported

Cordial Contacts with matching domain-level company data map to Twenty CRM Company records. We extract the domain from each Contact's email address, deduplicate by domain, and create one Company record per unique domain. Company name, website, and industry attributes from Cordial's company-level custom fields migrate as typed Company fields. If Cordial stores no explicit company data, we infer it from email domain and flag the Company records for enrichment after cutover.

Cordial

Contact

maps to

Twenty CRM

Person (Company lookup)

1:1
Fully supported

After creating Company records, we resolve the Person-to-Company relationship by matching the email domain. Each Person record receives a link to its corresponding Company via the Remote domain lookup in Twenty CRM. This link enables the Person-Company relationship model that powers Twenty's activity attribution and account-level reporting. If a Contact has no inferable domain (personal email), it remains as a Person without a Company link and is flagged for manual review.

Cordial

Product

maps to

Twenty CRM

Custom Object or Company custom fields

lossy
Fully supported

Cordial Products are stored as JSON objects with nested variant arrays. Twenty CRM has no native Product object, so we configure a custom object (e.g. Product_v2__c) to hold SKU, productName, price, and variant-level data. Each variant in Cordial's nested array generates a separate custom object record linked to its parent product record via a self-referential lookup. Alternatively, for simpler migrations, product data maps to custom fields on Company if the product catalog is small. The customer chooses the strategy during scoping.

Cordial

Order / Purchase Event

maps to

Twenty CRM

Opportunity

1:many
Fully supported

Cordial does not have Order as a native first-class object; order data typically lives as a custom contact attribute or a custom purchase event type. We identify all order-related attributes and event types during discovery, then generate a Twenty CRM Opportunity record per order. Order amount maps to Amount, order date maps to CloseDate, and the Opportunity stage is set to Closed Won by default since orders represent completed transactions. The Opportunity is linked to the Person (buyer) and Company (seller or brand) via Twenty's relationship fields. If multiple orders exist per contact, multiple Opportunity records are created.

Cordial

Behavioral Events (custom event types)

maps to

Twenty CRM

Activity (custom)

1:many
Fully supported

Cordial tracks behavioral events (opens, clicks, purchases, custom events) per contact via the Contact Activity Export API. Each distinct event type generates a custom Activity type in Twenty CRM or is mapped to a generic Note attached to the Person record. We preserve the event timestamp and event name as typed Activity fields. High-volume event types (e.g. page views) may be aggregated into summary records to avoid generating tens of thousands of individual Activity rows; the customer defines the aggregation threshold during scoping.

Cordial

List

maps to

Twenty CRM

Tag + TopicAssignment

lossy
Fully supported

Cordial Lists are static sub-collections within the Contact collection. List membership does not map to a native Twenty CRM object, so we generate Tags for each list name and apply TopicAssignment records linking each Person to the relevant Tag. This preserves list membership data as a filterable attribute without requiring a custom list object. If the customer uses Cordial Lists as a segmentation proxy for campaigns, we note this and advise that campaign segmentation requires rebuilding in Twenty's filter UI or via the n8n integration.

Cordial

Segment / Audience

maps to

Twenty CRM

Tag (reconstructed)

lossy
Fully supported

Cordial Segments are dynamic rules-based audiences built from contact attributes and event conditions. Segment definitions have no export API, so we cannot migrate them as active filters. We document each active Segment as a written rule summary (attributes, operators, event conditions) and identify the contact count currently matching each segment. The customer uses this document to rebuild segments as saved filters or Views in Twenty CRM. This is an information handoff, not an automated migration.

Cordial

Channel Preferences

maps to

Twenty CRM

Person (custom boolean fields)

1:1
Fully supported

Cordial stores channel-level opt-in status (email, SMS, push) as sub-attributes on each Contact. We extract these as separate boolean fields (e.g. emailOptIn__c, smsOptIn__c) and apply them to the Person record in Twenty CRM. Any non-standard channel type in Cordial (e.g. WhatsApp, push notifications) is flagged during scoping and mapped to a custom field with the appropriate label. We verify that opt-in timestamps are preserved where available.

Cordial

Owner

maps to

Twenty CRM

User

1:1
Fully supported

Cordial Owners map to Twenty CRM User records by email address match. We extract every distinct owner referenced on Contact records and cross-reference against the destination Twenty instance's User table. Owners without a matching User in Twenty go to a reconciliation queue for the customer's admin to provision before record import resumes. Inactive Cordial owners map to inactive Twenty users so that historical attribution is preserved even if the user no longer has system access.

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.

Cordial logo

Cordial gotchas

Medium

Message experiment results are not API-exportable

Medium

Rate limits are method- and endpoint-specific

Low

Custom contact attribute arrays require schema normalization

Low

Products collection uses nested JSON with variants

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

  • Cordial's behavioral event arrays require normalization before migration

    Cordial stores behavioral event history and contact-level arrays (tags, favorite colors, product interaction lists) as nested JSON within the contact record. Twenty CRM's Person object does not natively support array-type fields. We flatten these into delimited strings (comma-separated) or separate them into related Activity records during the transform phase. If the customer relies on structured array access (e.g. a tag-based workflow that reads individual array elements), that logic requires rebuilding in Twenty's filter UI or via n8n. We identify every array field during discovery and agree on a normalization strategy before migration begins.

  • Cordial Products use nested variant JSON with no Twenty CRM equivalent

    Cordial Products store multiple variants (color, size, SKU) as a nested array under a single product record. Twenty CRM has no native Product object. We unpack the variant array and create a custom object with one row per SKU, preserving the parent product ID as a reference field. This adds a schema creation step that is not required in same-platform migrations. If the customer uses product variants for segmentation or personalization in Cordial campaigns, they must rebuild that logic in Twenty's custom filter builder or via the n8n node.

  • Order data is stored as custom attributes or events, not a native object

    Cordial does not have a native Order object; purchase history lives as custom contact attributes or custom event types. We identify all order-related fields during discovery, generate Opportunity records in Twenty CRM from that data, and link each Opportunity to the relevant Person and Company. The mapping depends on thorough discovery: if order attributes use non-standard naming or inconsistent date formats across records, the extraction query requires custom logic that adds scope to the migration timeline.

  • Segment definitions and automation workflows have no export API

    Cordial's segment logic and automation programs are not accessible via the public API. We cannot export them as active filters or workflow code. During migration, we deliver a written inventory of every active segment (rule summary, matching contact count) and every active program (trigger, conditions, sequence of steps, delay rules). The customer's team rebuilds these in Twenty's saved filters, Views, or via the n8n community integration node. We do not rebuild these as part of the migration scope.

  • Message experiment results require manual UI export before cutover

    Cordial's Message Analytics Export API explicitly excludes A/B and multivariate test results for batch and automated messages. If the customer has live experiments with results they want to preserve, those results must be exported manually from the Cordial UI before the migration cutover date. We flag this gap during discovery scoping and remind the customer to capture experiment data before we freeze writes on the Cordial side.

Migration approach

Six steps for a successful Cordial to Twenty CRM data migration

  1. Discovery and data audit

    We run a comprehensive audit of the Cordial account including the Contacts collection (standard fields, custom attributes by type, array fields), Products collection (variant counts, SKU depth), Lists (names, membership counts), active Segments (rule summaries), active Programs (trigger and sequence documentation), behavioral event types and volume, and order-related custom attributes or event types. We produce a written discovery report with record counts per object, schema maps, and a list of every array-type field requiring normalization. This report defines the migration scope and timeline.

  2. Twenty CRM schema design and custom object creation

    We design the destination schema in Twenty CRM. This includes provisioning any custom objects for Product and variant data, custom fields on Person and Company for Cordial attributes, custom boolean fields for channel preferences, and a Tag structure that represents Cordial Lists. If the customer selects the product-as-Company-fields strategy during scoping, we define those fields now. We do not configure workflows or automations in Twenty during this step—those are outside migration scope.

  3. Sandbox migration and reconciliation

    We run a full migration into Twenty CRM using representative data volume. The customer's team reviews record counts (Person, Company, Activity, Opportunity), spot-checks 25-50 records against the Cordial source, and validates that array normalization produced the expected output. We resolve any mapping corrections before production migration begins. This step protects against discovering schema mismatches after the production cutover has started.

  4. Owner reconciliation and User provisioning

    We extract every distinct Cordial Owner referenced on contact and product records and match by email against the Twenty CRM User table. Any Cordial Owner without a matching Twenty User goes to a reconciliation queue. The customer's admin provisions missing Users before record import resumes. This step is required because Person and Company records reference an Owner, and imports fail if the OwnerId cannot be resolved.

  5. Production migration in dependency order

    We run production migration in record-dependency order: Company records (from inferred domain data), Person records (with Person-Company lookup resolved, array fields normalized, channel preferences mapped), custom Product object records (with variant unpacking), Opportunity records (from order data), Activity records (from behavioral events with optional aggregation), and Tags with TopicAssignment linking Person records to Cordial List membership. Each phase emits a row-count reconciliation report. We freeze Cordial writes during the final cutover window and run a delta migration for any records modified during the window.

  6. Cutover, validation, and automation rebuild handoff

    We enable Twenty CRM as the system of record and deliver the Segment and Program documentation artifact to the customer's team. We support a one-week post-cutover window for reconciliation issues raised by the sales or marketing team. We do not rebuild Cordial automation programs or segments as Twenty workflows or saved filters; that work is handled by the customer's admin or a separate automation engagement. We also do not provide post-migration admin support, training, or n8n workflow setup as standard scope.

Platform deep dives

Context on both ends of the pair

Cordial logo

Cordial

Source

Strengths

  • Flexible JSON-based data model accommodating unlimited custom contact attributes without schema migration overhead.
  • Drag-and-drop Sculpt block editor for rapid email production without requiring developer resources.
  • Product-centric architecture treating SKUs, variants, and catalog data as native objects for personalization.
  • AI agents introduced in 2026 for automated email production and data intelligence workflows.
  • SFTP, AWS S3, and Google Cloud Storage integration for automated data export workflows.

Weaknesses

  • Message experiment results are explicitly not available via the export API, requiring manual UI-based export for A/B test data.
  • Reporting and analytics dashboards are described as insufficient by some users for deep performance analysis, often requiring supplemental BI tooling.
  • Segment logic and automation workflows lack a public export API, making migration of campaign automation a manual rebuild exercise.
  • Order data is not a native first-class object, often stored as custom attributes or behavioral events, requiring careful schema discovery before migration.
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 Cordial 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

    Cordial: Method- and endpoint-specific limits; default limits vary per tier; X-Rate-Limit-* response headers exposed; Retry-After header for backoff; limits are customizable per customer contract.

  • Data volume sensitivity

    A

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

Estimator

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

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

Can't find your answer?

Walk through your Cordial to Twenty CRM migration with a real engineer — 30 minutes, free, written quote within 24 hours.

Book a free 30 minute consultation

Migrations under 10,000 Contacts with no product catalog and clean attribute schemas land in three to five weeks. Migrations with large product catalogs, extensive behavioral event histories, or order data stored across multiple custom attribute formats move to six to ten weeks because of variant unpacking, array normalization, and the custom object schema work required in Twenty CRM. The automation and segment documentation phase adds a fixed two to three days regardless of contact volume.

Adjacent paths

Related migrations to explore

Ready when you are

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