CRM migration
Field-level mapping, validation, and rollback between Fat Free CRM and Nutshell. We move data and schema; workflows are rebuilt natively in Nutshell.
Fat Free CRM
Source
Nutshell
Destination
Compatibility
7 of 9
objects map 1:1 between Fat Free CRM and Nutshell.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Fat Free CRM has no public REST API, so every migration from it requires direct database extraction from MySQL, PostgreSQL, or SQLite. We connect read-only to the source database, enumerate the Rails schema including any plugin-extended tables, and transform records into Nutshell API payloads. On the destination side we create Companies, People, Deals, and optional Tasks via Nutshell's REST API, resolving parent-record lookups and preserving opportunity-contact many-to-many associations through a separate import pass. We do not migrate attachments stored on the source filesystem, automations, or user/group access control lists; those require post-migration rebuild or manual handoff. Teams leaving Fat Free CRM typically cite the absence of a maintained API, dated interface, and the operational burden of self-hosting as the core drivers for switching to Nutshell's managed SaaS model.
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 Fat Free CRM object lands in Nutshell, including any object-level transformations, lookup resolution, or schema-design dependencies.
Typical mapping — final map is confirmed during the sample migration step.
Fat Free CRM
Account
Nutshell
Company
1:1Fat Free CRM Accounts map directly to Nutshell Companies. We extract name, website, phone, and billing address from the accounts table and use the Company name as the dedupe key during import. The owner_id from Fat Free CRM resolves to a Nutshell owner via email lookup on the People table post-provisioning. Address fields migrate to Nutshell's address compound field. Account categories and tags (acts_as_taggable) attach as Nutshell tags on the resulting Company record.
Fat Free CRM
Contact
Nutshell
Person
1:1Fat Free CRM Contacts map to Nutshell People with a 1:1 field-level correspondence: first_name, last_name, email, phone, title, and department all have direct equivalents. The contact_accounts join table resolves the account_id to a Nutshell Company lookup that we set as the contact's company reference during import. Tags from the contacts table migrate as Nutshell tags on each Person record.
Fat Free CRM
Lead
Nutshell
Person
1:1Fat Free CRM Leads are a distinct pre-conversion object with status, source, rating, and assigned user. We import Leads as Nutshell People with a custom field ffcrm_lead_source__c carrying the original lead source, and a status field indicating whether the record was converted or unconverted at migration time. The assigned user resolves via email lookup. Lead ratings (cold, warm, hot) map to a custom rating field rather than a native Nutshell field.
Fat Free CRM
Opportunity
Nutshell
Deal
1:1Fat Free CRM Opportunities map to Nutshell Deals with stage, amount, probability, and close date preserved. The opportunity.account_id resolves to the Nutshell Company lookup at migration time. Nutshell Deals support multiple contacts per deal, which handles the opportunity_contact many-to-many join from Fat Free CRM; we import the opportunity_contacts link table as a secondary lookup pass after Deals and People exist in Nutshell.
Fat Free CRM
Task
Nutshell
Task
1:1Open tasks in Fat Free CRM migrate to Nutshell Tasks with title, body, due_date, category, and completion status. Completed tasks are optional and migrate only if the customer requests them; by default we import open tasks to avoid flooding the destination with resolved work. Nutshell does not have a separate activity object for historical task data, so due_date and completion tracking use Nutshell's native task fields.
Fat Free CRM
Campaign
Nutshell
Person (tag + custom field)
lossyFat Free CRM Campaign records track name, status, budget, and target metrics, with contact membership stored in tag tables. Nutshell has no native campaign object. We import Campaign records as Nutshell tags on Person records (e.g., tag: Campaign_Name) and add a custom field campaign_attribution__c on People to preserve campaign-level metrics where the customer requires them. Tag count per Person in Nutshell is limited to 100; records exceeding this threshold use an additional custom field for overflow.
Fat Free CRM
Tag
Nutshell
Tag
1:1Fat Free CRM's global tagging system (acts_as_taggable) stores tags as string tokens across Contacts, Accounts, Opportunities, and Leads. Tags map directly to Nutshell's native tag feature. We preserve the full tag set per record by enumerating the taggings table and attaching each unique tag token to the corresponding Nutshell People, Company, or Deal record at import time.
Fat Free CRM
Users and Groups
Nutshell
Owner (reference table)
1:1Fat Free CRM Users and Groups have no direct Nutshell equivalent because Nutshell's API does not expose user management endpoints. We export the full user and group roster as a reference table keyed by email, role, and group membership. The customer provisions Nutshell users manually post-migration, and we use the email-based lookup to reassign owner references on all migrated records during the import phase.
Fat Free CRM
Custom Fields
Nutshell
Custom Fields
lossyFat Free CRM supports custom fields on Accounts, Contacts, Leads, and Opportunities via serialized columns or extension tables. We extract the custom field definitions from the database schema and migrate values to equivalent Nutshell custom fields, which are available on People, Companies, and Deals at all Nutshell tiers. Text fields exceeding 255 characters in Nutshell require a custom field type or are flagged for truncation during the scoping phase.
| Fat Free CRM | Nutshell | Compatibility | |
|---|---|---|---|
| Account | Company1:1 | Fully supported | |
| Contact | Person1:1 | Fully supported | |
| Lead | Person1:1 | Fully supported | |
| Opportunity | Deal1:1 | Fully supported | |
| Task | Task1:1 | Fully supported | |
| Campaign | Person (tag + custom field)lossy | Fully supported | |
| Tag | Tag1:1 | Fully supported | |
| Users and Groups | Owner (reference table)1:1 | Fully supported | |
| Custom Fields | Custom Fieldslossy | Mapping required |
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.
Fat Free CRM gotchas
No public REST API forces direct database extraction
Plugin-extended schema may alter core tables
Attachment files live on the host filesystem
Users and groups must be manually remapped in the destination
Nutshell gotchas
Contact tier limits enforced on import
No bulk API endpoint requires paginated extraction
Email sequences not exportable via API
Foundation plan disables key sales features
Pair-specific challenges
Migration approach
Schema discovery and scoping
We connect read-only to the Fat Free CRM database (MySQL, PostgreSQL, or SQLite) and run a full schema discovery to enumerate all tables, plugin-extended columns, custom field definitions, and join tables. We pair this with a record count audit across Accounts, Contacts, Leads, Opportunities, Tasks, Campaigns, and Tags. The customer provides the database credentials, confirms the Rails environment version, and identifies any active plugins that modify the core schema. The discovery output is a written migration scope with object-level record counts, a preliminary field map, and a plugin schema addendum.
Data extraction from source database
We export data from all relevant Fat Free CRM tables in dependency order: accounts, contacts, leads, opportunities, tasks, taggings, campaigns, and the join tables (contact_accounts, opportunity_contacts, campaign_subscriptions). We run the extraction in read-only mode against the production or staging database replica. Custom field values are extracted alongside their definitions so that field types can be validated against Nutshell's custom field type restrictions before import. Attachment metadata (filename, path, record association) is enumerated and included in the file inventory rather than the binary import.
Transformation and field mapping
We transform the extracted database rows into Nutshell API payloads, applying the field map for each object type. Name fields split into first_name and last_name. Address data consolidates into Nutshell's compound address field. Owner IDs resolve via the email lookup on the exported user roster. Opportunity-contact many-to-many associations are isolated into a separate lookup table for the secondary association pass. Tags are normalized to lowercase string tokens. Custom field values are validated against Nutshell's type constraints and character limits, with overflow flagged for scoping review before import.
Sample migration and mapping validation
We run a sample migration using 50-100 representative records from each object type into a staging or test Nutshell account. The customer reviews the imported records and confirms that field mappings, tag placements, deal-contact associations, and owner assignments are correct. Any mapping corrections are applied before the full production migration begins. This step also validates that the migration user's API permissions are sufficient to create and update records in Nutshell.
Full production migration in dependency order
We run the full migration into the production Nutshell account in record-dependency order: Companies first (for lookup resolution), then People (with Company lookup resolved), then Deals (with Company and People lookups resolved), then deal-contact associations, then Tags, and finally Tasks. Each phase emits a row-count reconciliation report showing records processed, records imported, and any records skipped due to validation errors. Completed tasks are imported last if included in scope.
Cutover, validation, and handoff
We freeze writes to Fat Free CRM during cutover, run a final delta scan for any records modified during the migration window, then deliver the final reconciliation report. We provide the automation and workflow inventory as a written document for the customer's admin to rebuild in Nutshell, along with the user roster reference table for ownership reassignment. We do not rebuild automations, sequences, or forms as part of the migration scope; those are separate engagements. We support a one-week post-cutover window for reconciliation questions.
Platform deep dives
Fat Free CRM
Source
Strengths
Weaknesses
Nutshell
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 2 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 Fat Free CRM and Nutshell.
Object compatibility
2 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
Fat Free CRM: Not applicable — self-hosted database has no API rate limiting.
Data volume sensitivity
Fat Free CRM 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 Fat Free CRM to Nutshell migration scoping. Not seeing yours? Book a call.
Walk through your Fat Free CRM to Nutshell migration with a real engineer — 30 minutes, free, written quote within 24 hours.
Book a free 30 minute consultationAdjacent paths
Other ways to leave Fat Free CRM
Other ways to arrive at Nutshell
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.