CRM migration

Migrate from Civicrm to Salesforce Sales Cloud

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 logo

Civicrm

Source

Salesforce Sales Cloud

Destination

Salesforce Sales Cloud logo

Compatibility

67%

10 of 15

objects map 1:1 between Civicrm and Salesforce Sales Cloud.

Complexity

BStandard

Timeline

3-5 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

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.

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

Civicrm logo

Civicrm

What's pushing teams away

  • The UI is dated compared to modern SaaS CRMs — reviewers describe the interface as old-fashioned and the search mechanics as database-query style rather than intuitive keyword search.
  • Steep technical learning curve — multiple Capterra and G2 reviews note that configuring CiviCRM well requires dedicated developer or consultant resources that smaller non-profits cannot afford.
  • No native bulk data export — data portability relies on the API or manual exports; there is no one-click comprehensive dump, making migration planning time-intensive.
  • Hosting complexity is a hidden cost — because the software is self-hosted, organizations must budget for server infrastructure, security patching, and PHP/MySQL maintenance.
  • Performance bottlenecks tied to hosting — slow queries, PHP execution limits, and MySQL configuration tuning fall on the organization's technical team rather than a vendor.

Choosing

Salesforce Sales Cloud logo

Salesforce Sales Cloud

What's pulling them in

  • The AppExchange marketplace with 5,000+ prebuilt apps gives enterprises integrations for nearly every business workflow without custom development.
  • Native Einstein AI for lead scoring, opportunity insights, and predictive forecasting adds intelligence without a separate platform purchase.
  • Territory management, multi-currency support, and advanced forecasting satisfy the needs of complex B2B sales organizations with structured revenue teams.
  • Slack, Tableau, and CPQ are deeply integrated into the core platform, keeping the sales stack unified for teams already in the Salesforce ecosystem.
  • Organizations with a large, established Salesforce implementation choose it because switching costs — integrations, custom code, trained admins — are prohibitive.

Object mapping

How Civicrm objects map to Salesforce Sales Cloud

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)

maps to

Salesforce Sales Cloud

Contact and Account

1:many
Fully supported

CiviCRM 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

maps to

Salesforce Sales Cloud

Contact Relationship

1:1
Fully supported

CiviCRM 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

maps to

Salesforce Sales Cloud

Task and Event

1:1
Fully supported

CiviCRM 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

maps to

Salesforce Sales Cloud

Opportunity (NPSP) or Custom Object

lossy
Fully supported

CiviCRM 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

maps to

Salesforce Sales Cloud

npe5__Membership__c (NPSP) or Custom Object

1:1
Fully supported

CiviCRM 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

maps to

Salesforce Sales Cloud

Campaign and CampaignMember (or Custom Object)

1:1
Fully supported

CiviCRM 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

maps to

Salesforce Sales Cloud

Event and Custom Object

1:1
Fully supported

CiviCRM 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)

maps to

Salesforce Sales Cloud

Case or Custom Object

lossy
Fully supported

CiviCase 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

maps to

Salesforce Sales Cloud

Topic or Custom Field

lossy
Fully supported

CiviCRM 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)

maps to

Salesforce Sales Cloud

Opportunity or Custom Object

1:1
Fully supported

Grants 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_*)

maps to

Salesforce Sales Cloud

Custom Fields and Custom Objects

lossy
Fully supported

Single-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)

maps to

Salesforce Sales Cloud

Custom Objects

1:1
Mapping required

ECK 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

maps to

Salesforce Sales Cloud

ContentDocument and ContentVersion

1:1
Fully supported

CiviCRM 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

maps to

Salesforce Sales Cloud

Note

1:1
Fully supported

CiviCRM 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)

maps to

Salesforce Sales Cloud

NOT MIGRATED

1:1
Not supported

CiviMail 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.

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.

Civicrm logo

Civicrm gotchas

High

Server-to-server migration requires CMS settings file portability

Medium

Multi-record custom groups can hit MySQL's 61-join limit

Medium

No native bulk export — data portability is API- or database-dependent

Medium

CiviCase statuses are per-case-type — not a global status list

Low

Hosted Spark tier has no documented API rate limit — performance varies by plan

Salesforce Sales Cloud logo

Salesforce Sales Cloud gotchas

High

Workflow Rules and Process Builder are retired

High

Bulk API batch quota exhaustion during large imports

Medium

Storage overage billing is non-obvious

Medium

Account-Contact many-to-many relationship mapping

Low

Territory and team member import ordering dependencies

Pair-specific challenges

  • CiviCase statuses are type-scoped, not global

    CiviCase defines statuses within each case_type definition via XML or PHP entityType. When migrating Cases, we must enumerate every active case_type, extract its status option values, and map them individually to the destination case status set. Status IDs are not global integers in CiviCRM; they are type-scoped. Mixing status values across case types during import produces silent mis-assignments where a case shows the wrong status without throwing an error. We handle this by building a per-case-type status map during scoping and enforcing type-scoping in the migration transform. Without this, a Case for a Grant Application case_type might receive a status value intended for an Intake case_type.

  • Multi-record custom groups can exceed MySQL join limits in APIv4

    CiviCRM APIv4's custom.* wildcard selector adds one join per custom group. Sites with more than approximately 20 custom groups exceed MySQL's maximum join count, causing a fatal error during export. We query the custom group count during scoping and fall back to individual entity-by-entity exports for sites at risk. This increases migration time for large custom-field-heavy instances and requires read-only database credentials scoped to the CiviCRM database in addition to API access.

  • CiviMail and automated processes do not migrate

    CiviMail mailing records are tightly coupled to the SMTP configuration, SPF/DKIM domain authentication, and the CMS integration of the source CiviCRM instance. Extracting mailing records and delivery statistics does not reproduce the mailing infrastructure in Salesforce, which has its own email deliverability configuration. We do not migrate CiviMail records. We deliver a written inventory of mailing subjects, audience sizes, and send dates for reference. Similarly, CiviRules automated processes (CiviCRM's workflow automation extension) do not migrate to Salesforce Flow; we deliver a written map of every CiviRules rule with its trigger, conditions, and actions for the customer's admin to rebuild in Salesforce Flow.

  • ECK entities require manual destination schema design

    ECK (Entity Construction Kit) entities are arbitrary custom schemas built by the CiviCRM administrator to model organizational workflows that have no standard CiviCRM equivalent. Because these schemas are extension-scoped and user-defined, there is no automatic mapping to Salesforce objects. We enumerate every active ECK entity type, its properties, and its contact reference fields during scoping and present them as a schema design exercise for the customer. Each ECK entity becomes a Salesforce custom object, but the customer must approve the field types, picklist values, and lookup relationships before we build the destination schema. This adds a design gate to the migration timeline that standard object migrations do not have.

  • No native bulk export requires hybrid extraction strategy

    CiviCRM has no one-click comprehensive export. Data portability depends on the REST API (paginated, session-key or API-key authenticated) or direct MySQL access. We use a hybrid approach: API-first for Contacts and Activities, with direct database reads for large-volume custom tables where API pagination would be prohibitively slow. This requires read-only database credentials scoped to the CiviCRM database. For self-hosted CiviCRM instances with no accessible database (managed hosting with restricted MySQL access), we are limited to API extraction, which increases migration time for large record volumes. We flag this constraint during scoping so the customer can provision database access or accept the API-only extraction timeline.

Migration approach

Six steps for a successful Civicrm to Salesforce Sales Cloud data migration

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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

Context on both ends of the pair

Civicrm logo

Civicrm

Source

Strengths

  • Free open-source download with no per-seat licensing — only hosting costs apply.
  • Nonprofit-native objects: Contributions, Memberships, Grants, Events, and Cases without sales-CRM workarounds.
  • Unlimited record count — G2 reviewers report instances with 1M+ contacts running without per-record billing.
  • Custom data model via custom fields, multi-record sets, and ECK entities for arbitrary organizational schemas.
  • Active open-source community maintaining extensions for Drupal, WordPress, Joomla, and Backdrop CMS integrations.

Weaknesses

  • Dated web interface — search is database-query style rather than modern keyword search; UI consistency varies by CMS integration.
  • No native bulk export or one-click migration tooling — data portability relies on API, direct MySQL access, or manual CSV exports.
  • Performance and API rate limits are hosting-dependent rather than platform-enforced; self-hosting requires dedicated technical resources.
  • Steep configuration learning curve — multiple G2 and Capterra reviewers cite the need for developer or consultant time to configure effectively.
  • No built-in workflow automation without third-party extensions like CiviRules, adding migration complexity for automated processes.
Salesforce Sales Cloud logo

Salesforce Sales Cloud

Destination

Strengths

  • Largest enterprise app ecosystem in CRM with 5,000+ AppExchange integrations covering nearly every vertical workflow.
  • Native Einstein AI delivers lead scoring, opportunity insights, and predictive forecasting without a third-party layer.
  • Advanced territory management, multi-currency, and flexible forecasting satisfy complex B2B revenue structures.
  • Deep platform extensibility: Custom Objects, Apex, Flow, and the Metadata API allow full schema customization.
  • Well-documented REST API, Bulk API, and Composite API with published rate limits for programmatic migration.

Weaknesses

  • Pricing model is layered and opaque in practice: per-seat fees plus storage overages, add-on subscriptions, and annual uplifts compound to 30–40% above sticker price.
  • Workflow Rules and Process Builder are deprecated, forcing all orgs onto Salesforce Flow — a migration task that catches many teams by surprise.
  • Steep administrative complexity: meaningful configuration requires a dedicated Salesforce admin or consultant.
  • API rate limits are edition-gated (100k/day base for Enterprise) and easily exhausted by large historical imports without throttling.
  • Data export is exportable via Data Loader but preserving relationship integrity across 30+ objects requires careful ETL sequencing.

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 Civicrm and Salesforce Sales Cloud.

  • 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

    Civicrm: Not publicly documented — Spark tier has no published limit; self-hosted performance is infrastructure-dependent.

  • Data volume sensitivity

    B

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

Estimator

Estimate your Civicrm to Salesforce Sales Cloud 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 Civicrm to Salesforce Sales Cloud data migrations

Answers to the questions buyers ask most during Civicrm to Salesforce Sales Cloud migration scoping. Not seeing yours? Book a call.

Can't find your answer?

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 consultation

Most CiviCRM migrations land between three and five weeks for instances under 10,000 Contacts with no ECK entities, fewer than 20 custom groups, and straightforward case type configurations. Migrations with large activity histories (over 200,000 records), complex multi-record custom groups requiring entity-by-entity exports, ECK entities with cross-contact lookups, or multiple CiviCase case_types with distinct status sets move to eight to fourteen weeks because of the additional scoping, per-case-type status enumeration, and ECK schema design work required before migration runs.

Adjacent paths

Related migrations to explore

Ready when you are

Move from Civicrm.
Land in Salesforce Sales Cloud, 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