CRM migration
Field-level mapping, validation, and rollback between Civicrm and Salesforce Sales Cloud. We move data and schema; workflows are rebuilt natively in Salesforce Sales Cloud.
Civicrm
Source
Salesforce Sales Cloud
Destination
Compatibility
10 of 15
objects map 1:1 between Civicrm and Salesforce Sales Cloud.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Moving from CiviCRM to Salesforce is a schema translation and object remapping project, not a record copy. CiviCRM uses a nonprofit-native data model with Contributions, Memberships, Events, and Cases as first-class entities, while Salesforce is a general CRM where those objects require either the Nonprofit Success Pack (NPSP) extension or a custom object configuration to replicate. We handle both paths: NPSP-aware migrations map Contributions to Opportunities and Memberships to Recurring Donations and Membership records, while non-NPSP destinations map to custom objects with equivalent fields. CiviCRM has no native pipeline or deal object; Activity-based fundraising workflows translate into Salesforce Opportunities using the activity timeline as the source of truth for pipeline stages and amounts. Multi-record custom fields land as separate custom objects prefixed with Custom_, and ECK (Entity Construction Kit) entities are flagged as extension-scoped schemas requiring manual destination schema design. CiviMail mailing records and CiviRules automated processes do not migrate; we deliver a written inventory of each for the customer's admin to rebuild.
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 Civicrm 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.
Civicrm
Contact (Individual, Household, Organization)
Salesforce Sales Cloud
Contact and Account
1:manyCiviCRM Contact subtypes (Individual, Household, Organization) map to Salesforce Contact with subtype preserved in a custom field civicrm_contact_type__c. Household contacts generate Salesforce Household Accounts via the NPSP Household model if installed, or standard Account records if not. Organization contacts map to Salesforce Account directly. We preserve all standard address blocks (street, city, state, postal code, country), email, phone, and relationship links. The CiviCRM display_name becomes Contact Name, and the CiviCRM sort_name becomes a custom field for alphabetical ordering.
Civicrm
Relationship
Salesforce Sales Cloud
Contact Relationship
1:1CiviCRM Relationships (household member, employee-employer, spousal, and custom relationship types) map to Salesforce Contact Relationship records. We preserve the relationship type label, both contact references (contact_id_a and contact_id_b), and the is_active flag. Bidirectional relationship types generate two Contact Relationship records in Salesforce. The relationship start and end dates migrate as custom fields on Contact Relationship if the destination org uses the NPSP relationship model.
Civicrm
Activity
Salesforce Sales Cloud
Task and Event
1:1CiviCRM Activities (the catch-all engagement record for calls, emails, meetings, tasks, and custom activity types) map to Salesforce Task and Event objects. Activity type determines the destination object: email maps to Task with Subject and Description; call maps to Task with TaskSubtype=Call; meeting maps to Event with StartDateTime and EndDateTime. Custom activity types from CiviCRM become custom Task or Event record types. We set ActivityDate on Task and StartDateTime on Event to the original CiviCRM activity_date_time for timeline ordering. The activity's assignees ( civicrm_activity_contact with record_type = 3 ) resolve to Salesforce OwnerId via email match.
Civicrm
Contribution
Salesforce Sales Cloud
Opportunity (NPSP) or Custom Object
lossyCiviCRM Contributions include financial_type, total_amount, currency, receive_date, and payment_instrument. If the destination Salesforce org uses NPSP, Contributions map to Opportunity with NPSP-specific fields (npe01__Amount__c, npe01__Payment_Method__c, npe01__Check_Number__c). If NPSP is not installed, we map Contributions to a custom object with equivalent fields and a lookup to the Contact. Price sets introduce variable line-item complexity that must be flattened: each price field value becomes a separate Opportunity Product line or a custom Contribution_Line_Item__c record. We resolve the financial_type to a Campaign or custom field for segregation.
Civicrm
Membership
Salesforce Sales Cloud
npe5__Membership__c (NPSP) or Custom Object
1:1CiviCRM Membership records include type, status, start_date, end_date, and source. With NPSP, these map to the standard Membership object (npe5__Membership__c) with a lookup to the Contact and a separate Membership Type record. Membership Price Sets allow complex tier structures that must be mapped to the destination membership tier configuration. Without NPSP, Memberships migrate as a custom object with equivalent fields and the membership status mapped to a custom picklist. The membership_id is preserved as a custom field for reconciliation.
Civicrm
Group and GroupContact
Salesforce Sales Cloud
Campaign and CampaignMember (or Custom Object)
1:1CiviCRM Groups and their membership lists (GroupContact) are migrated as static segments. Each CiviCRM Group becomes a Salesforce Campaign with Campaign Member status values representing the original group membership records. We preserve the group hierarchy where it exists using Campaign parent-child relationships. Dynamic (smart) groups that are rebuilt on query conditions cannot be fully reproduced without re-running the query logic in Salesforce; we document each dynamic group definition and recommend Salesforce Reports or Campaign membership filters as the equivalent.
Civicrm
Event and Participant
Salesforce Sales Cloud
Event and Custom Object
1:1CiviCRM Events map to Salesforce Event records for date-based scheduling, with Price sets, event types, and participant roles requiring custom field mapping. Participant records (individual registrations for an event) migrate to a custom Event_Registration__c object with a lookup to the Contact and the Event. Online registration profiles are reconstructed as Salesforce Web-to-Lead forms or Experience Cloud site forms post-migration; we document the original profile field mapping for the customer's admin. Event status (Registered, Attended, No-show, Cancelled) maps to custom picklist values on the registration object.
Civicrm
Case (CiviCase)
Salesforce Sales Cloud
Case or Custom Object
lossyCiviCase stores case_id, case_type, status, start_date, and a set of related activities. Case records and their activity chains migrate preserving timeline and assignee history. Case statuses are defined per-case-type within CiviCRM and are not global integers; they are type-scoped, which is a critical migration gotcha. We enumerate every active case_type during scoping, extract its status option values, and map them individually to Salesforce Case Status values or a custom case status set. Without Service Cloud, Cases map to a custom object with equivalent fields.
Civicrm
Tag and TagEntity
Salesforce Sales Cloud
Topic or Custom Field
lossyCiviCRM Tags are flat labels that attach to any entity (contact, activity, contribution, etc.). We map tags to Salesforce Topics with TopicAssignment records, or to a custom multi-select picklist field on the parent object depending on tagging volume. Multi-entity tagging requires separate TopicAssignment records per entity. Tags with high cardinality (over 50 distinct values on a single entity type) are mapped to custom picklist fields for usability in Salesforce reporting.
Civicrm
Grant (CiviGrant extension)
Salesforce Sales Cloud
Opportunity or Custom Object
1:1Grants is an optional CiviCRM extension module that not all instances have installed. Where present, we map grant_type, amount_requested, amount_granted, status, and deadline. Grant data often has tight coupling to Cases (the grant application case) and Contributions (the funded disbursement record), which we resolve through lookup resolution at migration time. Without NPSP Grant management, we create a custom Grant__c object with the standard CiviGrant fields and cross-references to the related Contact and Case.
Civicrm
Custom Fields (CustomValue and Custom_*)
Salesforce Sales Cloud
Custom Fields and Custom Objects
lossySingle-record custom groups in CiviCRM appear as fields on the parent entity via the custom.* selector in APIv4. Multi-record sets appear as separate entities prefixed Custom_. We query both via API and reconstruct them in Salesforce. Multi-record sets land as custom objects with a lookup to the parent record and a sequence or ordinal field to preserve ordering. The custom group name and field names are translated to valid Salesforce API names with __c suffix. Large numbers of custom groups (exceeding approximately 20) require individual entity-by-entity exports rather than bulk API calls due to MySQL join limits in CiviCRM APIv4.
Civicrm
ECK Entity (Entity Construction Kit)
Salesforce Sales Cloud
Custom Objects
1:1ECK allows arbitrary custom entity types with user-defined properties and custom field attachments. These are extension-scoped and can reference contacts. We handle them as custom objects requiring explicit destination schema design for each ECK entity type. During scoping, we enumerate every active ECK entity type, its properties, and its contact reference fields. Each ECK entity becomes a Salesforce custom object with __c suffix and a lookup to Contact. We flag ECK entities separately in the migration scope because they represent non-standard schemas with no automatic mapping; the customer reviews and approves each ECK-to-custom-object mapping before migration runs.
Civicrm
Attachment and File
Salesforce Sales Cloud
ContentDocument and ContentVersion
1:1CiviCRM stores file attachments either in the database (civicrm_file and civicrm_entity_file) or on the filesystem. We extract files from both sources, convert them to Salesforce ContentVersion binary blobs, and create ContentDocumentLink records linking to the parent Contact, Account, Opportunity, or custom object. The original file name and MIME type are preserved in ContentVersion fields. File size limits from Salesforce (25 MB per ContentVersion for most orgs) are enforced during extraction.
Civicrm
Note
Salesforce Sales Cloud
Note
1:1CiviCRM Notes migrate to Salesforce Note records linked via ContentDocumentLink to the parent Contact, Account, or custom object. Note body migrates as rich text with image attachments preserved as separate ContentDocument records. The original note date and author are preserved as custom fields if the NPSP or custom schema supports them.
Civicrm
Mailings (CiviMail)
Salesforce Sales Cloud
NOT MIGRATED
1:1CiviMail mailing records include subject, body HTML, recipient groups, and delivery statistics. Mailings are tightly coupled to the mailing infrastructure (SMTP configuration, SPF/DKIM domain authentication) and cannot be extracted independently. We do not migrate CiviMail mailing records. We deliver a written inventory of every CiviMail mailing with its subject, recipient group count, send date, and open rate for the customer's admin to use as reference when rebuilding email templates and audience segments in the destination marketing platform.
| Civicrm | Salesforce Sales Cloud | Compatibility | |
|---|---|---|---|
| Contact (Individual, Household, Organization) | Contact and Account1:many | Fully supported | |
| Relationship | Contact Relationship1:1 | Fully supported | |
| Activity | Task and Event1:1 | Fully supported | |
| Contribution | Opportunity (NPSP) or Custom Objectlossy | Fully supported | |
| Membership | npe5__Membership__c (NPSP) or Custom Object1:1 | Fully supported | |
| Group and GroupContact | Campaign and CampaignMember (or Custom Object)1:1 | Fully supported | |
| Event and Participant | Event and Custom Object1:1 | Fully supported | |
| Case (CiviCase) | Case or Custom Objectlossy | Fully supported | |
| Tag and TagEntity | Topic or Custom Fieldlossy | Fully supported | |
| Grant (CiviGrant extension) | Opportunity or Custom Object1:1 | Fully supported | |
| Custom Fields (CustomValue and Custom_*) | Custom Fields and Custom Objectslossy | Fully supported | |
| ECK Entity (Entity Construction Kit) | Custom Objects1:1 | Mapping required | |
| Attachment and File | ContentDocument and ContentVersion1:1 | Fully supported | |
| Note | Note1:1 | Fully supported | |
| Mailings (CiviMail) | NOT MIGRATED1:1 | Not 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.
Civicrm gotchas
Server-to-server migration requires CMS settings file portability
Multi-record custom groups can hit MySQL's 61-join limit
No native bulk export — data portability is API- or database-dependent
CiviCase statuses are per-case-type — not a global status list
Hosted Spark tier has no documented API rate limit — performance varies by plan
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
Discovery and data audit
We audit the source CiviCRM instance across version, CMS integration (Drupal, WordPress, Joomla, Backdrop), installed extensions (CiviCase, CiviGrant, CiviMail, CiviRules, ECK), and data volume for each entity type. We identify the contact subtype distribution (Individual, Household, Organization), count active custom groups and ECK entity types, enumerate every CiviCase case_type and its status options, and assess the contribution price set complexity. We also identify whether the destination Salesforce org has NPSP installed or requires custom object configuration for nonprofit entities. The discovery output is a written migration scope with entity counts, custom field inventory, and a recommendation on NPSP vs. custom object strategy.
Database and API access provisioning
We establish read access to the CiviCRM data. For self-hosted instances, this includes read-only database credentials scoped to the CiviCRM database for bulk custom table extraction and API key or session-key credentials for paginated API access. For CiviSpark managed hosting, we use the documented REST API only (no direct database access). We run a burst test of 500 API requests to measure the effective throttle ceiling and calibrate our worker throttling accordingly. If MySQL join limits are detected during custom field enumeration (more than 20 custom groups), we document the fallback to entity-by-entity exports.
Schema design and case status enumeration
We design the destination Salesforce schema. For NPSP destinations, we configure NPSP Data Import field mappings for Contacts, Contributions, Memberships, and Households. For non-NPSP destinations, we create custom objects with equivalent fields for Contributions, Memberships, and Grants. We enumerate every CiviCase case_type and its status options and map them to Salesforce Case Status values or custom status sets. For ECK entities, we present a schema design document to the customer for approval before creating the custom objects. We create the Salesforce schema in a Sandbox org first for validation.
Sandbox migration and reconciliation
We run a full migration into a Salesforce Sandbox using production-like data volume. The customer's nonprofit operations lead reconciles record counts (Contacts in vs. Leads/Contacts out, Contributions in vs. Opportunities out, Activities in vs. Tasks/Events out), spot-checks 25-50 random records against the CiviCRM source, and validates that CiviCase statuses are correctly assigned per case_type. Any mapping corrections, particularly for ECK entities and custom price set structures, happen here. The customer signs off on the Sandbox migration before production migration begins.
Production migration in dependency order
We run production migration in record-dependency order: Custom Objects schema first (for ECK entities and custom nonprofit objects), then Contacts (with subtype split and relationship resolution), then Accounts (for Organization contacts), then Groups to Campaigns, then Activities to Tasks and Events, then Contributions to Opportunities, then Memberships, then Cases (with per-type status resolution), then Attachments to ContentDocument, then Tags to Topics. Each phase emits a row-count reconciliation report before the next phase begins. Large engagement histories use Salesforce Bulk API 2.0 with batch chunking and exponential backoff on API limit responses.
Cutover, validation, and automation handoff
We freeze CiviCRM 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 CiviMail inventory document (mailing subjects, audience sizes, send dates) and the CiviRules automation map (rules, triggers, conditions, actions with Salesforce Flow equivalents) to the customer's admin team. We support a one-week hypercare window where we resolve reconciliation issues. We do not rebuild CiviMail infrastructure or CiviRules automations as Salesforce Flow inside the migration scope; that is a separate engagement or an internal admin task.
Platform deep dives
Civicrm
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 Civicrm 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
Civicrm: Not publicly documented — Spark tier has no published limit; self-hosted performance is infrastructure-dependent.
Data volume sensitivity
Civicrm doesn't expose a bulk API — REST + parallelization used for high-volume runs.
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 Civicrm to Salesforce Sales Cloud migration scoping. Not seeing yours? Book a call.
Walk through your Civicrm 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 Civicrm
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.