CRM migration
Field-level mapping, validation, and rollback between Cordial and Salesforce Sales Cloud. We move data and schema; workflows are rebuilt natively in Salesforce Sales Cloud.
Cordial
Source
Salesforce Sales Cloud
Destination
Compatibility
9 of 13
objects map 1:1 between Cordial and Salesforce Sales Cloud.
Complexity
BStandard
Timeline
4-8 weeks
Overview
Moving from Cordial to Salesforce Sales Cloud is a schema-translation migration, not a straight record copy. Cordial organizes data into flexible JSON-based collections where contact attributes, channel preferences, and product variants are stored as flattened properties or nested arrays; Salesforce expects typed fields, explicit Account-Contact relationships, and a standard product catalog. We normalize Cordial's custom contact attributes (including array-type fields like tag lists and behavioral history) into Salesforce custom fields, reconstruct order history from Cordial behavioral event data, and map channel opt-in status to HasOptedOutOfEmail and CampaignMember Status. Cordial Products with nested variant JSON (SKU, color, size) are unpacked into Salesforce Product2 records with one SKU per row. Automation Programs, segment definitions, and message experiment results do not migrate via API; we document each for manual rebuild in Salesforce Flow and manual export from the Cordial UI before cutover. We use the Salesforce Bulk API for large contact and engagement batches and resolve all Account-Contact-Opportunity parent relationships before record insert.
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 Salesforce Sales Cloud, including any object-level transformations, lookup resolution, or schema-design dependencies.
Typical mapping — final map is confirmed during the sample migration step.
Cordial
Contact
Salesforce Sales Cloud
Lead or Contact (split required)
1:manyCordial Contacts map to Salesforce Lead or Contact depending on whether they represent an unqualified prospect or a known organization member. We use Cordial's channel subscriptions and any lifecycle-related custom attributes to determine the split. Unqualified email subscribers with no associated company map to Salesforce Lead; Contacts with a known organization and purchase history map to Salesforce Contact with AccountId resolved. The original Cordial contact key is preserved in a custom field cordial_contact_key__c for audit and cross-reference.
Cordial
Custom Contact Attributes (string, number, geo)
Salesforce Sales Cloud
Custom Fields on Lead or Contact
1:1Cordial's flat attribute schema means each custom contact property (e.g. loyalty_tier, preferred_store, acquisition_source) maps to a Salesforce custom field on the appropriate object. String attributes map to Text(255) or Text Area; numeric attributes map to Number; geo attributes map to geolocation or Address components. We create the destination schema in a Sandbox before migration and validate field types against Salesforce field limits (1,024 character limit per custom text field).
Cordial
Custom Contact Attributes (array type)
Salesforce Sales Cloud
Multi-Select Picklist or Related List
lossyCordial stores some properties as arrays (e.g. favorite_colors, purchase_history, behavioral_tags). Arrays do not have a direct Salesforce equivalent. We normalize them during transformation: multi-value arrays with fewer than 150 unique values become Salesforce Multi-Select Picklist; high-cardinality arrays become a related custom object with a lookup to the parent Contact and one row per array value. The normalization strategy is agreed upon during scoping and documented in the mapping specification.
Cordial
List (static segment membership)
Salesforce Sales Cloud
Campaign + CampaignMember or Custom List Object
1:1Cordial Lists are static sub-collections of Contacts. We export list membership as a Campaign with Campaign Type = Marketing List and add each list member as a CampaignMember with Status = Sent. For organizations that prefer a pure list model, we offer a custom Cordial_Lists__c object with a lookup to Contact and a List_Name__c field, which is simpler to query but breaks standard Campaign reporting. The customer chooses during scoping.
Cordial
Segment (dynamic rules-based audience)
Salesforce Sales Cloud
Campaign with Filter Logic Document
1:1Cordial Segments are dynamic rule-based audiences built from contact attributes and event conditions. Segment definitions are not API-exportable. We document each active segment with its rules, conditions, and estimated match count at migration time, then deliver a written segment inventory to the customer's admin for manual rebuild as a Salesforce Campaign with filter criteria or as a Flow-based audience query. Segment membership at migration time is captured as a CampaignMember snapshot.
Cordial
Product
Salesforce Sales Cloud
Product2
1:1Cordial Products store standard fields (productID, productName, price) plus a variants array containing SKU and attribute pairs. We export products to Salesforce Product2 with ProductCode set to the root product ID, Name set to productName, and Description carrying the full JSON for reference. The variants array is processed separately (see Variant mapping below).
Cordial
Product Variant (nested JSON)
Salesforce Sales Cloud
Product2 (one per SKU) or Custom Variant Fields
1:manyCordial product variants (color, size, SKU) are nested JSON arrays under a single product record. We unpack the variant array and generate one Salesforce Product2 record per SKU, preserving the parent Cordial product ID in a custom field parent_product_id__c. Variant-level pricing (if stored) maps to StandardPricebook2 entries per SKU. If the destination prefers a single product with variant attributes, we use Salesforce's Quantity Scheduling or Product Attribute Sets instead, agreed upon during scoping.
Cordial
Channel Preferences (email, SMS opt-in)
Salesforce Sales Cloud
HasOptedOutOfEmail + Custom Channel Fields
1:1Cordial Channels are sub-attributes on Contact indicating opt-in status per channel. We map email opt-in to Salesforce HasOptedOutOfEmail (false = opted in, true = opted out, per Salesforce convention). SMS and push opt-in status migrate to custom fields sms_opt_in__c and push_opt_in__c as boolean. Channel-level preferences (e.g. preferred_send_time) become custom fields on Contact.
Cordial
Behavioral Event (custom event type)
Salesforce Sales Cloud
Task or Custom Event Object
1:1Cordial supports custom event types stored as behavioral events on contacts (purchases, abandoned_cart, page_view, etc.). Events are not first-class objects in Cordial's API but are accessible via the Contact Activity Export API with time-range filters. We export events as Salesforce Task records with TaskSubtype = Custom and a custom event_type__c field distinguishing the event type. High-volume event types (e.g. page_view) can be summarized and stored as custom fields on Contact rather than individual Task rows to avoid Salesforce storage limits.
Cordial
Order Data (custom attributes or event-linked)
Salesforce Sales Cloud
Custom Order Object + Order Line Items
lossyOrders are not a native first-class object in Cordial's core schema but are often stored as custom attributes on contacts or linked via event data with event_type = purchase. We identify order-related attributes (order_id, order_total, order_date) and custom event types during schema discovery, then design a custom Cordial_Order__c object in Salesforce with fields for order_id, contact_lookup__c, order_total__c, order_date__c, and a related Cordial_Order_Item__c object for line items. If order data is sparse, we may store it as custom fields on Contact instead. This is determined during discovery.
Cordial
Message Analytics (opens, clicks, bounces, unsubscribes)
Salesforce Sales Cloud
CampaignMember Status + Custom Activity Fields
1:1Cordial Message Analytics (opens, clicks, bounces, unsubscribes) are available via the Message Analytics Export API. We map these to Salesforce CampaignMember Status values (Sent, Delivered, Opened, Clicked, Unsubscribed, Bounced) on the corresponding Campaign. Aggregate metrics (open rate, click rate per campaign) are stored as custom fields on the Campaign for reporting. Message experiment results (A/B test variants and winner data) are NOT exportable via API and must be manually exported from the Cordial UI before migration cutover; we flag this gap during scoping.
Cordial
Program (automation workflow)
Salesforce Sales Cloud
Flow (documentation only)
1:1Cordial Programs organize campaigns and automation sequences but are not API-exportable. We document each active Program with its trigger conditions, steps, delays, and channel actions as a written specification. The customer's Salesforce admin or a Salesforce partner rebuilds these as Salesforce Flow (record-triggered, scheduled, or screen flow variants). The program documentation includes a trigger recommendation (e.g. Lead-created, Contact-field-changed, scheduled) and a step-by-step rebuild guide. This is a manual handoff, not an automated migration.
Cordial
Owner (user reference)
Salesforce Sales Cloud
User
1:1Cordial Owners are referenced on Contact, Product, and Engagement records. We resolve Owners by email match against the Salesforce destination org's User table. Any Cordial Owner without a matching Salesforce User is held in a reconciliation queue for the customer's admin to provision before record import resumes. OwnerId is required on standard Salesforce objects, so this step gates the production migration.
| Cordial | Salesforce Sales Cloud | Compatibility | |
|---|---|---|---|
| Contact | Lead or Contact (split required)1:many | Fully supported | |
| Custom Contact Attributes (string, number, geo) | Custom Fields on Lead or Contact1:1 | Fully supported | |
| Custom Contact Attributes (array type) | Multi-Select Picklist or Related Listlossy | Fully supported | |
| List (static segment membership) | Campaign + CampaignMember or Custom List Object1:1 | Fully supported | |
| Segment (dynamic rules-based audience) | Campaign with Filter Logic Document1:1 | Fully supported | |
| Product | Product21:1 | Fully supported | |
| Product Variant (nested JSON) | Product2 (one per SKU) or Custom Variant Fields1:many | Fully supported | |
| Channel Preferences (email, SMS opt-in) | HasOptedOutOfEmail + Custom Channel Fields1:1 | Fully supported | |
| Behavioral Event (custom event type) | Task or Custom Event Object1:1 | Fully supported | |
| Order Data (custom attributes or event-linked) | Custom Order Object + Order Line Itemslossy | Fully supported | |
| Message Analytics (opens, clicks, bounces, unsubscribes) | CampaignMember Status + Custom Activity Fields1:1 | Fully supported | |
| Program (automation workflow) | Flow (documentation only)1:1 | Fully supported | |
| Owner (user reference) | 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
Salesforce Sales Cloud gotchas
Workflow Rules and Process Builder are retired
Bulk API batch quota exhaustion during large imports
Storage overage billing is non-obvious
Account-Contact many-to-many relationship mapping
Territory and team member import ordering dependencies
Pair-specific challenges
Migration approach
Schema discovery and data audit
We audit the source Cordial instance across contacts, custom attribute schema (including data types and array fields), Products collection with variant structures, Lists, active Segments, behavioral event types, and any order-related custom attributes or event data. We pair this with a Salesforce edition review: Professional ($80/user) covers most migrations; Enterprise ($165/user) is required if the customer needs record-triggered Flow at scale, custom fiscal periods, or advanced territory management. The discovery output is a written migration scope, a source data inventory, and a Salesforce schema design specification.
Destination schema design
We design the Salesforce destination schema in a Sandbox. This includes custom objects for orders (Cordial_Order__c) and order items (Cordial_Order_Item__c) if order reconstruction is needed, custom fields for array-normalized attributes, multi-select picklists for low-cardinality arrays, a related list custom object for high-cardinality arrays, channel opt-in custom fields (sms_opt_in__c, push_opt_in__c), and a cordial_contact_key__c field for audit. We configure Campaign Record Types for Cordial list membership and message analytics. Schema is deployed via Salesforce metadata API into a Full Copy Sandbox for validation.
Sandbox migration and reconciliation
We run a full migration into the Salesforce Sandbox using production-like data volumes. The customer's RevOps lead reconciles record counts (Contacts in, Leads in, Accounts in, CampaignMembers in, Tasks in, Custom Order records in), spot-checks 25-50 random records against the Cordial source, and validates the array normalization strategy against reporting requirements. Any mapping corrections happen here before production migration begins. This step typically takes one to two weeks depending on data volume.
Owner reconciliation and User provisioning
We extract every distinct Cordial Owner referenced on Contact, Product, and Engagement records and match by email against the Salesforce destination org's User table. Owners without a matching Salesforce User are held in a reconciliation queue for the customer's admin to provision before record import resumes. Salesforce requires OwnerId on most standard objects, so this step gates the production migration. We also validate that the migration user has the correct permission set and Bulk API access.
Production migration in dependency order
We run production migration in record-dependency order: Accounts (from Cordial organization data if present), Users (validated), Leads and Contacts (with AccountId resolved and array normalization applied), Products and Pricebook entries (with variants unpacked), Campaign records (one per Cordial List), CampaignMembers (list membership), Custom Order records (reconstructed from event data), Tasks (behavioral events), and finally custom objects. Each phase emits a row-count reconciliation report before the next phase begins. We use the Salesforce Bulk API 2.0 for large batches with exponential backoff.
Cutover, validation, and Program inventory handoff
We freeze Cordial writes during cutover, run a final delta migration of any records modified during the migration window, then enable Salesforce as the system of record. We deliver the Cordial Program inventory document to the customer's admin team for Flow rebuild. We deliver the message experiment export checklist for UI-based export before cutover. We support a one-week hypercare window where we resolve any reconciliation issues. We do not rebuild Cordial Programs as Salesforce Flow inside the migration scope; that is a separate engagement.
Platform deep dives
Cordial
Source
Strengths
Weaknesses
Salesforce Sales Cloud
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 Salesforce Sales Cloud.
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 Salesforce Sales Cloud migration scoping. Not seeing yours? Book a call.
Walk through your Cordial to Salesforce Sales Cloud 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 Salesforce Sales Cloud
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.