CRM migration
Field-level mapping, validation, and rollback between Fat Free CRM and Salesforce Sales Cloud. We move data and schema; workflows are rebuilt natively in Salesforce Sales Cloud.
Fat Free CRM
Source
Salesforce Sales Cloud
Destination
Compatibility
9 of 12
objects map 1:1 between Fat Free CRM and Salesforce Sales Cloud.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Moving from Fat Free CRM to Salesforce Sales Cloud is a migration from a self-hosted open-source Rails application with no public API to a cloud-native enterprise CRM with a full REST and Bulk API surface. Because Fat Free CRM exposes no documented API, we connect read-only to the underlying database, enumerate the schema including any plugin-extended tables, extract relational data intact, and load it into Salesforce through the Bulk API with parent-record resolution. We preserve join-table relationships (account-contacts, opportunity-contacts, campaign-tag memberships) and carry forward custom field definitions from the Rails schema. Attachments stored on the server filesystem are enumerated as a file inventory for manual copy rather than extracted as binary blobs. Fat Free CRM's internal user and group IDs have no meaning in Salesforce; we export the user and group roster as a reference table for manual remapping by the customer's admin. Workflows, automations, and report definitions do not migrate as code; we deliver a written inventory of these objects for the customer's team to rebuild in Salesforce Flow and Reports.
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 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.
Fat Free CRM
Accounts
Salesforce Sales Cloud
Account
1:1Fat Free CRM accounts table maps directly to Salesforce Account. We extract name, website, phone, and assigned user (owner) from the accounts table. The Account is created before any Contact import so that AccountId lookup is satisfied at the moment of Contact insert. Multi-address billing and shipping in Fat Free CRM maps to Salesforce BillingAddress and ShippingAddress fields respectively.
Fat Free CRM
Contacts
Salesforce Sales Cloud
Contact
1:1Fat Free CRM contacts table maps directly to Salesforce Contact. The contact_accounts join table is resolved during migration: every Contact with an assigned account gets AccountId populated from the matching Account record. Contacts without a matching Account are held in a reconciliation queue for the customer's admin to create Account records or map to an existing placeholder Account. Name, email, phone, title, and department migrate directly.
Fat Free CRM
Leads
Salesforce Sales Cloud
Lead
1:1Fat Free CRM leads table maps directly to Salesforce Lead. Status (new, contacted, converted, rejected), source (web, referral, trade show), and rating (cold, warm, hot) migrate as custom or standard Lead fields. The assigned user maps to OwnerId via email matching against the Salesforce User roster. Note that Salesforce Lead converts to Contact-Account pair; Fat Free CRM leads do not have a separate conversion step in the source.
Fat Free CRM
Opportunities
Salesforce Sales Cloud
Opportunity
1:1Fat Free CRM opportunities map to Salesforce Opportunity. Stage, amount, probability, and close date migrate directly. The opportunity_contacts join table is resolved by creating OpportunityContactRole records for each associated Contact after both Opportunity and Contact inserts are complete. The assigned account maps to AccountId from the Account lookup.
Fat Free CRM
Tasks
Salesforce Sales Cloud
Task
1:1Fat Free CRM tasks belong to a user and optionally to an Opportunity or Contact. Title, body (description), due date, category, and completion status migrate to Salesforce Task. Status open and pending map to Not Started and In Progress; completed maps to Completed. The WhatId lookup (parent Opportunity or Account) and WhoId lookup (parent Contact or Lead) are resolved at migration time using the extracted IDs and the newly created Salesforce IDs.
Fat Free CRM
Campaigns
Salesforce Sales Cloud
Campaign
1:1Fat Free CRM campaigns track name, status (planned, launched, completed, suspended), budget, and target metrics. We import campaign records directly. Campaign membership (which contacts belong to which campaigns) is stored via tag subscriptions in Fat Free CRM; we rebuild these as CampaignMember records linking the migrated Contact IDs to the migrated Campaign IDs.
Fat Free CRM
Tags
Salesforce Sales Cloud
Custom Text Field or Topic
lossyFat Free CRM uses a global acts_as_taggable tagging system across Contacts, Accounts, Opportunities, and Leads. Tag tokens are stored in a separate table with polymorphic associations. We offer two strategies during scoping: migrate tags to a Salesforce custom text field (comma-delimited) on each object, or use Salesforce Topics with TopicAssignment records for cross-object classification. The customer chooses the strategy; the default is a custom text field per object.
Fat Free CRM
Custom Fields
Salesforce Sales Cloud
Custom Fields (__c)
lossyFat Free CRM supports custom fields on Accounts, Contacts, Leads, and Opportunities via a serialized field or extension table. We extract the custom field definitions during schema discovery, map field names to Salesforce __c custom field API names, and map data types (string, integer, date, boolean) to equivalent Salesforce field types. Custom fields are deployed to the destination Salesforce org via metadata API before any data import begins.
Fat Free CRM
Users
Salesforce Sales Cloud
User (reference only)
1:1Fat Free CRM user records (login, email, role, team membership) are exported as a reference table. We do not create Salesforce User records because that requires destination admin credentials and write access to the Salesforce org user directory. The user roster is delivered as a CSV with user email, role, and team so the customer's Salesforce admin can provision matching User accounts before record ownership is assigned.
Fat Free CRM
Groups
Salesforce Sales Cloud
Queue or Public Group (reference)
1:1Fat Free CRM groups are organisational units for access control and data sharing. This concept does not map directly to a first-class Salesforce object. We export the full group roster and group membership as a reference table. The customer's admin decides whether to recreate groups as Salesforce Public Groups (for sharing rules) or Queues (for Lead and Case assignment). We do not create these objects automatically.
Fat Free CRM
Users and Teams
Salesforce Sales Cloud
User
1:1Fat Free CRM users and teams (active, inactive status, admin vs user role) are extracted as a reconciliation reference. The migration user is assigned as the interim OwnerId on all migrated records until the customer's Salesforce admin provisions active User accounts and we remap OwnerId references from the reference table. This is a prerequisite step before production migration begins.
Fat Free CRM
Plugin-extended Tables
Salesforce Sales Cloud
Custom Fields or Custom Objects
lossyFat Free CRM's plugin system can add columns to core tables or create entirely new tables beyond the standard Rails schema. We run a schema discovery phase against the live database before extraction to capture any plugin additions. Each discovered plugin column is mapped to a Salesforce custom field (__c) or custom object depending on whether it is a field on an existing object or a new relational table. Undiscovered plugin columns that surface post-extraction require a supplementary pass documented in the reconciliation report.
| Fat Free CRM | Salesforce Sales Cloud | Compatibility | |
|---|---|---|---|
| Accounts | Account1:1 | Fully supported | |
| Contacts | Contact1:1 | Fully supported | |
| Leads | Lead1:1 | Fully supported | |
| Opportunities | Opportunity1:1 | Fully supported | |
| Tasks | Task1:1 | Fully supported | |
| Campaigns | Campaign1:1 | Mapping required | |
| Tags | Custom Text Field or Topiclossy | Mapping required | |
| Custom Fields | Custom Fields (__c)lossy | Mapping required | |
| Users | User (reference only)1:1 | Fully supported | |
| Groups | Queue or Public Group (reference)1:1 | Mapping required | |
| Users and Teams | User1:1 | Mapping required | |
| Plugin-extended Tables | Custom Fields or Custom Objectslossy | 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.
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
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 database credentials
We collect the read-only database credentials (host, port, database name, username, password) and confirm the database engine (MySQL, PostgreSQL, or SQLite). We run a schema discovery query against information_schema (MySQL/PostgreSQL) or sqlite_master (SQLite) to enumerate every table and column, then compare against the standard Fat Free CRM Rails schema to flag any plugin-extended additions. We also query the active_plugins table if present to capture the full plugin list. The discovery output is a written schema map and a plugin inventory requiring customer sign-off before extraction begins.
Data extraction and join-table enumeration
We run read-only SQL queries against the live database to extract all core objects (accounts, contacts, leads, opportunities, tasks, campaigns, users, groups) plus any plugin-extended tables discovered in step one. We specifically enumerate join tables: contact_accounts, opportunity_contacts, taggings (for tag memberships), and campaign_subscriptions. Each extracted dataset is validated for row count, null percentages, and referential integrity before being staged in our secure extraction environment. Historical timestamps (created_at, updated_at) are preserved as-is for later activity ordering.
Destination Salesforce schema provisioning
We deploy the Salesforce destination schema via the Metadata API or change set into the customer's Sandbox org for validation. This includes custom fields (__c) on Account, Contact, Lead, Opportunity, Task, and Campaign; Record Types if the customer uses multiple sales processes; and any custom objects required by plugin-extended tables. The Salesforce admin reviews field labels, data types, and picklist values before we proceed. Schema corrections happen in Sandbox, not production.
Sandbox migration and reconciliation
We run a full migration into a Salesforce Sandbox using production-equivalent data volume. The customer's admin or RevOps lead spot-checks 25-50 records per object against the source database, validates that join-table relationships resolved correctly (Contact-Account links, OpportunityContactRole entries), and signs off the mapping before production migration begins. OwnerId references are validated against the user reference table at this stage.
User provisioning and owner remapping
Before production migration, the customer's Salesforce admin provisions all required User accounts matching the Fat Free CRM user roster. We receive the provisioned User IDs and map them to the Fat Free CRM user IDs from the extraction. OwnerId references are updated in the migration staging data using this mapping. Any Fat Free CRM user without a matching Salesforce User is flagged; records owned by that user are assigned to the migration user as a placeholder pending admin review.
Production migration in dependency order
We run production migration in record-dependency order: Accounts (from Fat Free CRM accounts), Leads, Contacts (with AccountId resolved from the Account map), Opportunities (with AccountId and OpportunityContactRole resolved), Tasks and Events (with WhoId and WhatId resolved via parent-record lookup), Campaigns (with CampaignMember rebuilt from tag subscriptions), and custom fields last. Each phase emits a row-count reconciliation report before the next phase begins. We use the Salesforce Bulk API 2.0 with chunking, exponential backoff on rate-limit responses, and parent-record lookup resolution for all foreign-key-style references.
Cutover, attachment inventory delivery, and automation handoff
We freeze Fat Free CRM 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 attachment inventory CSV (file path, target object, target record ID) so the admin can manually copy files to Salesforce Files. We deliver the user and group reference tables with recommended Salesforce equivalents (Public Groups or Queues). We do not rebuild automations, workflows, or report definitions as these do not migrate as code; the inventory handoff document lists every object that requires manual rebuild in Salesforce Flow, Process Builder, or Reports.
Platform deep dives
Fat Free CRM
Source
Strengths
Weaknesses
Salesforce Sales Cloud
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 Salesforce Sales Cloud.
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 Salesforce Sales Cloud migration scoping. Not seeing yours? Book a call.
Walk through your Fat Free CRM 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 Fat Free CRM
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.