CRM migration
Field-level mapping, validation, and rollback between Cordial and Twenty CRM. We move data and schema; workflows are rebuilt natively in Twenty CRM.
Cordial
Source
Twenty CRM
Destination
Compatibility
5 of 10
objects map 1:1 between Cordial and Twenty CRM.
Complexity
BStandard
Timeline
3-5 weeks
Overview
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.
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 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
Twenty CRM
Person
1:1Cordial 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)
Twenty CRM
Company
1:1Cordial 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
Twenty CRM
Person (Company lookup)
1:1After 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
Twenty CRM
Custom Object or Company custom fields
lossyCordial 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
Twenty CRM
Opportunity
1:manyCordial 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)
Twenty CRM
Activity (custom)
1:manyCordial 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
Twenty CRM
Tag + TopicAssignment
lossyCordial 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
Twenty CRM
Tag (reconstructed)
lossyCordial 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
Twenty CRM
Person (custom boolean fields)
1:1Cordial 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
Twenty CRM
User
1:1Cordial 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.
| Cordial | Twenty CRM | Compatibility | |
|---|---|---|---|
| Contact | Person1:1 | Fully supported | |
| Contact (B2B domain) | Company1:1 | Fully supported | |
| Contact | Person (Company lookup)1:1 | Fully supported | |
| Product | Custom Object or Company custom fieldslossy | Fully supported | |
| Order / Purchase Event | Opportunity1:many | Fully supported | |
| Behavioral Events (custom event types) | Activity (custom)1:many | Fully supported | |
| List | Tag + TopicAssignmentlossy | Fully supported | |
| Segment / Audience | Tag (reconstructed)lossy | Fully supported | |
| Channel Preferences | Person (custom boolean fields)1:1 | Fully supported | |
| Owner | User1: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.
Cordial gotchas
Message experiment results are not API-exportable
Rate limits are method- and endpoint-specific
Custom contact attribute arrays require schema normalization
Products collection uses nested JSON with variants
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 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.
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.
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.
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.
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.
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
Cordial
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 Cordial 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
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
Cordial exposes a bulk API — large-volume migrations stream efficiently.
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 Cordial to Twenty CRM migration scoping. Not seeing yours? Book a call.
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 consultationAdjacent paths
Other ways to leave Cordial
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.