Migrate your Civicrm data
Open-source nonprofit CRM with a generous free self-hosted download and a managed Spark tier. Built for mission-driven organizations that need to track donors, members, volunteers, and cases with extreme flexibility.
In its favor
Why people choose Civicrm
The signal that keeps Civicrm on the shortlist. Sourced from G2, Capterra, and customer scoping calls.
Unlimited users and contacts at no per-seat cost — CiviCRM charges for hosting infrastructure, not named seats, making it economical for large volunteer-heavy organizations.
Nonprofit-specific data model out of the box — Contributions, Memberships, Grants, and Events are first-class entities rather than afterthoughts bolted onto a sales CRM.
Open-source with no vendor lock-in — organizations own their data and infrastructure, and can self-host on any PHP/MySQL stack that meets CiviCRM requirements.
Deep customizability via custom fields, ECK entities, and extensions — allows organizations to model workflows for advocacy campaigns, case management, and grant tracking without code.
Scalable record volume — G2 reviewers report running instances with over one million contact records and hundreds of monthly users without per-record pricing penalties.
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.
Reasons to switch
Why people leave Civicrm
The recurring reasons buyers give for replacing Civicrm. Presented as facts, not knocks.
Platform scorecard
Strengths, weaknesses, and where Civicrm fits
Grades across six dimensions, plus a SWOT-style view of where the platform shines and where it falls short.
SWOT — strengths, weaknesses, and use-case fit
Strengths
Weaknesses
Where it works
Where it struggles
Pricing tiers
Civicrm pricing overview
CiviCRM is free to download as open-source software with no per-user or per-contact license fees. The official managed cloud offering, CiviSpark, charges $15–$50 per month across three tiers, with contact volume increasing at each tier. Organizations on the self-hosted path pay only for their hosting infrastructure.
Spark Starter
Tier 1 of 4
$15/month
What's included
Need help selecting your CRM?
Book a free 30 minute consultationPricing is informational. FlitStack AI does not bill on Civicrm's schedule — see our quote-based pricing →
What gets migrated
Civicrm object support
Object-by-object support for Civicrm migrations. Per-pair details surface during scoping.
Contacts (Individual, Household, Organization)
Fully supportedContacts are the primary entity with three built-in subtypes. We map each subtype to its destination equivalent and preserve all standard fields: names, addresses, emails, phones, and relationship links. The contact's internal ID is preserved as a cross-reference during migration.
Activities
Fully supportedActivities are the catch-all engagement record in CiviCRM. We map Activity type, subject, date, details, and assignee to the destination's activity or engagement object. Activities that represent pipeline-like stages require a structural translation into Deals or Opportunities.
Custom Fields (CustomValue / Custom_*)
Mapping requiredSingle-record custom groups 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 the full field set, but destination custom field creation must be scoped and ordered to avoid hitting MySQL's 61-join limit on the receiving platform.
Groups and Group Contacts
Fully supportedGroups and their membership lists (GroupContact) are migrated as static segments. We preserve the group hierarchy where it exists. Dynamic (smart) groups cannot be fully reproduced without re-running the underlying search criteria on the destination platform.
Contributions
Mapping requiredContributions include financial_type, total_amount, currency, receive_date, and payment_instrument. Price sets introduce variable line-item complexity that must be flattened or mapped to the destination's product/line-item model. Recurring contribution schedules are migrated as standing-order records.
Memberships
Mapping requiredMembership records include type, status, start_date, end_date, and source. Membership Price Sets allow complex tier structures that must be mapped to the destination's membership or subscription tiers. Membership-related custom fields land in the Custom_* migration path.
Events
Mapping requiredEvents map to the destination's event or calendar object. Price sets, event types, and participant roles introduce variation. Online registration profiles are reconstructed as registration forms or intake fields on the destination. Recurring event series are split into individual event records.
Cases (CiviCase)
Mapping requiredCiviCase stores case_id, case_type, status, start_date, and a set of related activities. We map case records and their activity chains preserving timeline and assignee history. Case statuses are defined per-type and must be explicitly mapped to destination case statuses.
Relationships
Fully supportedRelationships connect contacts (e.g., household member, employee-employer, spousal). We preserve the relationship type and both contact references. The bidirectional nature of some relationship types must be handled explicitly during import.
Tags
Fully supportedTags are flat labels that attach to any entity. We map the tag name and its entity_id link to the destination's tagging or labeling system. Multi-entity tagging requires separate association records.
Grants (Extension)
Mapping requiredGrants is an optional extension module that not all CiviCRM instances have. Where present, we map grant_type, amount_requested, amount_granted, status, and deadline. Grant data often has tight coupling to the contact record as applicant.
ECK Entities (Entity Construction Kit)
Mapping requiredECK 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 schema discovery per instance; there is no standard template for ECK entities.
Attachments / Files
Mapping requiredCiviCRM stores file attachments either in the database (civicrm_file / civicrm_entity_file) or on the filesystem. We extract files and re-associate them with the destination record using the original file name and MIME type. Files stored outside the database require filesystem access and path remapping.
Mailings (CiviMail)
Not in this platformCiviMail mailing records include subject, body HTML, recipient groups, and delivery statistics. Mailings are tightly coupled to the mailing infrastructure (SMTP, SPF/DKIM configuration) and cannot be meaningfully reproduced on a different platform without re-creating templates and re-sourcing recipient lists from Groups.
| Object | Support | Notes |
|---|---|---|
| Contacts (Individual, Household, Organization) | Fully supported | Contacts are the primary entity with three built-in subtypes. We map each subtype to its destination equivalent and preserve all standard fields: names, addresses, emails, phones, and relationship links. The contact's internal ID is preserved as a cross-reference during migration. |
| Activities | Fully supported | Activities are the catch-all engagement record in CiviCRM. We map Activity type, subject, date, details, and assignee to the destination's activity or engagement object. Activities that represent pipeline-like stages require a structural translation into Deals or Opportunities. |
| Custom Fields (CustomValue / Custom_*) | Mapping required | Single-record custom groups 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 the full field set, but destination custom field creation must be scoped and ordered to avoid hitting MySQL's 61-join limit on the receiving platform. |
| Groups and Group Contacts | Fully supported | Groups and their membership lists (GroupContact) are migrated as static segments. We preserve the group hierarchy where it exists. Dynamic (smart) groups cannot be fully reproduced without re-running the underlying search criteria on the destination platform. |
| Contributions | Mapping required | Contributions include financial_type, total_amount, currency, receive_date, and payment_instrument. Price sets introduce variable line-item complexity that must be flattened or mapped to the destination's product/line-item model. Recurring contribution schedules are migrated as standing-order records. |
| Memberships | Mapping required | Membership records include type, status, start_date, end_date, and source. Membership Price Sets allow complex tier structures that must be mapped to the destination's membership or subscription tiers. Membership-related custom fields land in the Custom_* migration path. |
| Events | Mapping required | Events map to the destination's event or calendar object. Price sets, event types, and participant roles introduce variation. Online registration profiles are reconstructed as registration forms or intake fields on the destination. Recurring event series are split into individual event records. |
| Cases (CiviCase) | Mapping required | CiviCase stores case_id, case_type, status, start_date, and a set of related activities. We map case records and their activity chains preserving timeline and assignee history. Case statuses are defined per-type and must be explicitly mapped to destination case statuses. |
| Relationships | Fully supported | Relationships connect contacts (e.g., household member, employee-employer, spousal). We preserve the relationship type and both contact references. The bidirectional nature of some relationship types must be handled explicitly during import. |
| Tags | Fully supported | Tags are flat labels that attach to any entity. We map the tag name and its entity_id link to the destination's tagging or labeling system. Multi-entity tagging requires separate association records. |
| Grants (Extension) | Mapping required | Grants is an optional extension module that not all CiviCRM instances have. Where present, we map grant_type, amount_requested, amount_granted, status, and deadline. Grant data often has tight coupling to the contact record as applicant. |
| ECK Entities (Entity Construction Kit) | 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 schema discovery per instance; there is no standard template for ECK entities. |
| Attachments / Files | Mapping required | CiviCRM stores file attachments either in the database (civicrm_file / civicrm_entity_file) or on the filesystem. We extract files and re-associate them with the destination record using the original file name and MIME type. Files stored outside the database require filesystem access and path remapping. |
| Mailings (CiviMail) | Not in this platform | CiviMail mailing records include subject, body HTML, recipient groups, and delivery statistics. Mailings are tightly coupled to the mailing infrastructure (SMTP, SPF/DKIM configuration) and cannot be meaningfully reproduced on a different platform without re-creating templates and re-sourcing recipient lists from Groups. |
Gotchas
What to watch for in Civicrm migrations
Issues we've hit on past Civicrm migrations, tagged by severity. FlitStack AI handles every one — surfacing them up front because buyer engineering teams want to know.
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
| Severity | Issue |
|---|---|
| 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 |
Leaving Civicrm?
Where Civicrm customers move next
12 destinations Civicrm can migrate to.
How a Civicrm migration works
Four steps, Civicrm-specific
Connect
API key or CMS session cookie via REST API into Civicrm. Scopes limited to read-only on the data we move.
Map
We translate Civicrm-specific structures (custom fields, objects, value lists) to the destination's model.
Sample
Test with a 50–200 record subset to validate Civicrm quirks before production.
Migrate
Full migration with Civicrm rate-limit handling. Rollback available throughout.
FAQ
Civicrm migration FAQ
Answers to the questions buyers ask most during Civicrm migration scoping. Not seeing yours? Book a call.
Can't find your answer?
Walk through your Civicrm migration with a real engineer — 30 minutes, free, written quote within 24 hours.
Book a free 30 minute consultationReady when you are
Migrate Civicrm.
Without the rebuild.
Free scoping call with a migration engineer. Tell us about your Civicrm setup and destination — written quote back within a business day.