CRM migration

Migrate from Fat Free CRM to Twenty CRM

Field-level mapping, validation, and rollback between Fat Free CRM and Twenty CRM. We move data and schema; workflows are rebuilt natively in Twenty CRM.

Fat Free CRM logo

Fat Free CRM

Source

Twenty CRM

Destination

Twenty CRM logo

Compatibility

91%

10 of 11

objects map 1:1 between Fat Free CRM and Twenty CRM.

Complexity

BStandard

Timeline

3-5 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

Moving from Fat Free CRM to Twenty CRM is a structural migration from a Rails-era open-source platform with no API to a modern TypeScript-and-PostgreSQL self-hosted CRM with a documented REST API. The primary technical constraint is that Fat Free CRM exposes no public API, so all extraction goes through a read-only connection to its underlying MySQL, PostgreSQL, or SQLite database. We begin every migration with a schema discovery pass to capture core tables, plugin-extended columns, join tables (account-contact, opportunity-contact, campaign membership), and any custom field definitions before extracting a single record. We then map Fat Free CRM's distinct Leads and Opportunities objects to Twenty CRM's Persons and Opportunities, preserving the contact-opportunity join table to keep deal associations intact. User ownership from Fat Free CRM carries forward as a reference roster; Twenty CRM user provisioning happens in your environment and we map by email. Attachments stored on the Fat Free CRM filesystem are enumerated but not migrated as binary content. Workflows, group permissions, and custom plugins do not migrate; we deliver a written inventory of these for your admin to rebuild in Twenty CRM's settings UI.

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

Fat Free CRM logo

Fat Free CRM

What's pushing teams away

  • The user interface feels dated compared to modern SaaS CRMs, and G2 reviewers consistently rate the UX as needing significant improvement.
  • Community development has slowed — Bitrix24's comparison page explicitly notes it is unclear whether Fat Free CRM is still actively maintained, raising long-term support concerns.
  • No native public API means third-party integrations require direct database access or custom Rails code, complicating connections to email, calendars, or other tools.
  • Lacks the reporting depth, automation builder, and sales intelligence features that teams outgrow as they scale beyond basic contact and opportunity tracking.
  • Hosting, maintenance, security patching, and upgrades fall entirely on the customer, creating hidden operational overhead that grows over time.

Choosing

Twenty CRM logo

Twenty CRM

What's pulling them in

  • Top open-source CRM on GitHub with 40.6K stars, giving teams full source code access and infrastructure ownership without per-feature licensing surprises.
  • Free self-hosting under AGPL-3.0 means unlimited users and custom objects for the cost of cloud infrastructure alone, typically $20–100/month.
  • Pricing page explicitly mocks competitors for charging add-on fees for API access, webhooks, and workflows — transparency that resonates with RevOps teams burned by Salesforce.
  • Unlimited custom objects and fields with no price impact, letting teams shape the data model to their business rather than forcing business into rigid schemas.
  • Modern TypeScript/React/PostgreSQL stack means developer-led teams can extend, self-host, or integrate without fighting legacy architecture.

Object mapping

How Fat Free CRM objects map to Twenty CRM

Each row shows how a Fat Free CRM object lands in Twenty CRM, 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

maps to

Twenty CRM

Company

1:1
Fully supported

Fat Free CRM Account records map directly to Twenty CRM Company records. The Account name becomes Company name, website maps to the website field, and phone maps to the phone field. Billing address columns in the accounts table map to company address fields. The account's assigned user_id maps to the owner field in Twenty CRM by email lookup against the Twenty CRM user roster. Accounts with no assigned user default to the migration user until the customer remaps ownership post-migration.

Fat Free CRM

Contact

maps to

Twenty CRM

Person

1:1
Fully supported

Fat Free CRM Contact records map to Twenty CRM Person records. The contact's first name, last name, email, phone, and title transfer directly. The contact_accounts join table preserves the many-to-one link to the Account; we resolve the Account ID first (or create the Company in Twenty CRM) so that the contact-company relationship is established at import time. Contacts without an associated account import as Persons with no company link.

Fat Free CRM

Lead

maps to

Twenty CRM

Person (with lead context)

1:1
Fully supported

Fat Free CRM Leads are distinct from Contacts in the source schema and carry status, source, rating, and assigned user fields that have no direct Twenty CRM equivalent. We import Leads as Persons and append a custom text field or tag capturing the original lead status (new, contacted, qualified, converted) and lead source. The customer's admin reviews and sets the appropriate Person type in Twenty CRM after migration.

Fat Free CRM

Opportunity

maps to

Twenty CRM

Opportunity

1:1
Fully supported

Fat Free CRM Opportunity records map to Twenty CRM Opportunity records. Stage, amount, probability, and close date transfer directly. The opportunity_contacts join table is critical — we resolve each linked Contact's new Twenty CRM Person ID and attach it to the Opportunity. Without join table resolution, opportunities in Twenty CRM appear disconnected from the people working them.

Fat Free CRM

Task

maps to

Twenty CRM

Task

1:1
Fully supported

Fat Free CRM Task records map to Twenty CRM Task records. Title, body, due date, category, and completion status transfer. Assigned user_id resolves via email to the Twenty CRM user roster. Tasks linked to a Contact or Opportunity carry the resolved Person or Opportunity ID in the Twenty CRM target object field. Open and completed tasks both migrate; the status field preserves completion state.

Fat Free CRM

Campaign

maps to

Twenty CRM

Target List

1:1
Fully supported

Fat Free CRM Campaign records (name, status, budget, target metrics) map to Twenty CRM Target List records. Contact-campaign membership is stored in the tag_subscriptions or contacts_tags join table depending on Fat Free CRM version; we reconstruct the membership by resolving each contact's new Twenty CRM Person ID and associating it with the corresponding Target List. Status mapping: active campaigns become active target lists, completed campaigns become archived.

Fat Free CRM

Tag

maps to

Twenty CRM

Custom text field or tag

lossy
Fully supported

Fat Free CRM's global tagging system (acts_as_taggable) stores tags across Contacts, Accounts, Opportunities, and Leads in a separate tagging table. We extract the full tag set per record and decide with the customer whether to map tags to a single multi-value custom field in Twenty CRM or to a tagging implementation in the target object's notes. This decision depends on how heavily the customer uses tagging for segmentation.

Fat Free CRM

User

maps to

Twenty CRM

User (reference roster)

1:1
Fully supported

Fat Free CRM Users (name, email, role, team membership) export as a reference roster keyed by email. Twenty CRM manages its own user directory, so we cannot provision users or reassign ownership automatically. The roster is delivered as a CSV mapping source user_id to email, and the customer creates corresponding users in Twenty CRM before the final migration pass. Ownership assignments on migrated records reference the roster for manual remapping.

Fat Free CRM

Group

maps to

Twenty CRM

Team

1:1
Fully supported

Fat Free CRM Groups represent organisational units used for access control. Twenty CRM does not have an equivalent Group concept as a first-class CRM object. We export group membership as part of the user roster and document which Fat Free CRM users belonged to which groups. The customer maps these to Twenty CRM team structures or user roles post-migration.

Fat Free CRM

Custom Field

maps to

Twenty CRM

Custom Field

1:1
Fully supported

Fat Free CRM custom fields on Accounts, Contacts, Leads, and Opportunities are stored as extended columns in the core tables (plugin-extended schema) or in a separate custom_fields table depending on version. We run schema discovery first, enumerate every custom column, and create matching custom fields in Twenty CRM before data import. All custom field values transfer as text for maximum compatibility; the customer validates type conversion in the Twenty CRM settings UI post-migration.

Fat Free CRM

Attachment metadata

maps to

Twenty CRM

File inventory document

1:1
Fully supported

Fat Free CRM stores uploaded files on the host server's filesystem or a configured S3 bucket, not in the database. We enumerate every attachment record (filename, path, associated record type and ID) and deliver a file inventory CSV. The customer copies files to Twenty CRM's storage layer manually. Binary attachment content cannot be extracted through our standard database connection and is explicitly excluded from migration scope.

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.

Fat Free CRM logo

Fat Free CRM gotchas

High

No public REST API forces direct database extraction

Medium

Plugin-extended schema may alter core tables

Medium

Attachment files live on the host filesystem

Low

Users and groups must be manually remapped in the destination

Twenty CRM logo

Twenty CRM gotchas

High

Import order is enforced and critical

High

Export limited to 20,000 records and visible columns only

Medium

Soft-deleted records count toward uniqueness and trigger restores

Medium

API rate limits cap at 200 req/min on Organization tier

Low

No native email sequences — follow-up cadences require external tools

Pair-specific challenges

  • No public API forces direct database extraction

    Fat Free CRM exposes no documented public API. All migration extraction connects directly to the underlying MySQL, PostgreSQL, or SQLite database using read-only credentials provided by the customer. This means the customer must be comfortable granting database read access and the specific database credentials must be available at migration time. For SQLite, this requires a file copy of the database rather than a network connection. Any custom Rails plugins that add columns to core tables must be disclosed before extraction begins; we run schema discovery to surface these, but undiscovered plugin columns appearing post-extraction require a supplementary migration pass.

  • Plugin-extended schema may alter core tables unpredictably

    Fat Free CRM's plugin system can add columns to core tables such as accounts, contacts, and opportunities, or create entirely new join tables. We run a schema discovery phase against the live database before any extraction begins to capture plugin additions. The output is a complete column inventory that we reconcile against Twenty CRM's custom field support. If plugins have introduced non-standard data types or cross-table dependencies, we flag these during discovery and adjust the mapping before production extraction.

  • Attachment files live on the host filesystem

    Uploaded files associated with Contacts, Accounts, or Opportunities are stored on the server's local disk or a configured S3 bucket, not in the database. We enumerate every attachment reference (filename, path, associated record type and ID) and deliver a file inventory CSV. The customer copies the actual file content to Twenty CRM's storage layer manually. Binary attachment content cannot be extracted through our standard database connection and is explicitly excluded from migration scope.

  • User and group IDs require manual remapping in Twenty CRM

    Fat Free CRM's internal user IDs and group IDs have no meaning in Twenty CRM's user directory. We export the full user roster as a reference table with name, email, and Fat Free CRM role. The customer creates corresponding user accounts in Twenty CRM before migration, and we match by email to reassign record ownership. Group-to-team mapping is not automated because Twenty CRM's team model differs from Fat Free CRM's group access control model; we document the mapping and the customer completes it post-migration.

  • Lead status and source fields have no native Twenty CRM equivalent

    Fat Free CRM's Lead object carries status (new, contacted, qualified, converted), source, and rating fields that are specific to the lead management lifecycle. Twenty CRM Persons do not have a native lead status concept by default. We import these as custom text fields on the Person record and tag the record type during migration. The customer reviews and resolves the lead status field in Twenty CRM's settings UI post-migration.

Migration approach

Six steps for a successful Fat Free CRM to Twenty CRM data migration

  1. Discovery and database profiling

    We begin with a read-only database connection to the customer's Fat Free CRM instance (MySQL, PostgreSQL, or SQLite). We run a schema discovery query that enumerates all tables, columns, data types, and any plugin-extended columns added to core tables. We also query the join tables (contact_accounts, opportunity_contacts, taggings, tag_subscriptions) and identify the database version. The discovery output is a schema map that we share with the customer, along with a record count estimate for each object so we can confirm migration scope and timeline before any data moves.

  2. Schema design and custom field pre-creation

    We design the Twenty CRM target schema based on the schema map. This includes creating any custom fields in Twenty CRM that correspond to Fat Free CRM custom columns and plugin-extended fields before data import begins. We map Fat Free CRM campaign membership to Twenty CRM Target Lists, resolve tag handling strategy (multi-value field vs. tagging note), and document the user roster mapping. The customer provisions Twenty CRM users and we confirm the user roster is complete before proceeding.

  3. Test migration in Twenty CRM sandbox

    We run a full migration into a Twenty CRM sandbox or staging instance using a snapshot of the production database. The customer reconciles record counts across all objects, spot-checks 25-50 records for field-level accuracy, and validates that join table relationships (contact-company, opportunity-contact, campaign membership) are intact. Any mapping corrections happen in this phase. The customer signs off on the test migration before production extraction begins.

  4. Production database extraction

    We connect read-only to the production Fat Free CRM database and extract all records in dependency order: Companies (from Accounts), Persons (from Contacts and Leads), Tasks, Opportunities with contact associations resolved, Campaigns with contact memberships rebuilt from join tables, and custom field values. Each extraction phase emits a row-count reconciliation report. The production Fat Free CRM instance remains writable throughout; the customer freezes new record creation in the final 48 hours before cutover.

  5. Production import into Twenty CRM

    We import data into Twenty CRM using its REST API in dependency order: Companies first (required for Person-Company lookups), then Persons, then Opportunities with resolved Person associations, then Tasks, then Target Lists with membership rebuilt from the join table data. Custom field values import after the base object migration is validated. Each phase is reconciled against the extraction row counts before the next phase begins.

  6. Cutover, validation, and automation inventory delivery

    We freeze Fat Free CRM writes during the cutover window, run a final delta pass for any records modified during migration, and enable Twenty CRM as the system of record. We deliver the file inventory for manual attachment migration, the user and group roster mapping, and a written inventory of any Fat Free CRM plugins or custom controllers that require admin review in Twenty CRM. We support a one-week hypercare window for reconciliation issues. We do not rebuild Fat Free CRM automations or custom Rails code as Twenty CRM configurations; that work is documented for the customer's admin.

Platform deep dives

Context on both ends of the pair

Fat Free CRM logo

Fat Free CRM

Source

Strengths

  • Zero licensing cost — fully open source under MIT license with no per-user or subscription fees.
  • Complete source code access allows deep customisation of data models, views, and business logic without vendor lock-in.
  • Lightweight Ruby on Rails stack runs on commodity hosting (VPS, Heroku) with standard relational databases.
  • Active community and plugin architecture provide extension points for webhooks, time tracking, and record merging.
  • Self-hosted model ensures full data ownership and no third-party data retention concerns.

Weaknesses

  • No native public API — integrations require direct database queries or custom Rails development, limiting third-party tool connectivity.
  • Dated user interface consistently cited in reviews as a friction point compared to modern SaaS CRM experiences.
  • Slowing development activity raises concerns about security patches, Rails compatibility updates, and long-term viability.
  • Operational burden of self-hosting (server management, backups, upgrades, security) falls entirely on the customer.
  • Limited reporting, automation, and sales intelligence features compared to commercial CRM platforms.
Twenty CRM logo

Twenty CRM

Destination

Strengths

  • AGPL-3.0 open-source license with full source code on GitHub — no vendor lock-in, no sunset risk.
  • Unlimited users and unlimited custom objects on self-hosted, with no feature gating based on headcount.
  • REST and GraphQL APIs available on all paid tiers, not locked behind an enterprise add-on fee.
  • MCP server and webhooks shipped as standard features, not premium upgrades.
  • Modern PostgreSQL-backed data model that developer teams can query, extend, and self-host.

Weaknesses

  • Recent v1.0 release means limited production hardening compared to CRMs with multi-year operational track records.
  • No native email sequencing or sales engagement tools — follow-up cadences require a separate platform.
  • No native two-way email sync or inbox integration, requiring third-party connectors for full activity logging.
  • Self-hosting 'free' pricing hides real infrastructure and DevOps costs that stack up over time.
  • Workflow automation is functional but lacks the complexity needed for sophisticated multi-step sales motions.

Complexity grading

How hard is this migration?

Standard CRM migration. 2 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 Fat Free CRM and Twenty CRM.

  • Object compatibility

    B

    2 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

    Fat Free CRM: Not applicable — self-hosted database has no API rate limiting.

  • Data volume sensitivity

    B

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

Estimator

Estimate your Fat Free CRM to Twenty CRM 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 Fat Free CRM to Twenty CRM data migrations

Answers to the questions buyers ask most during Fat Free CRM to Twenty CRM migration scoping. Not seeing yours? Book a call.

Can't find your answer?

Walk through your Fat Free CRM to Twenty CRM migration with a real engineer — 30 minutes, free, written quote within 24 hours.

Book a free 30 minute consultation

Migrations under 10,000 total records with a standard MySQL or PostgreSQL database and no plugin-extended schema land in three to five weeks. Migrations with SQLite databases (which require a file copy and conversion step), large tag sets, plugin-extended columns, or custom field complexity requiring a supplementary schema pass move to eight to twelve weeks. The database profiling and test migration phases add roughly one to two weeks before production extraction begins, regardless of record volume.

Adjacent paths

Related migrations to explore

Ready when you are

Move from Fat Free CRM.
Land in Twenty CRM, 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