CRM migration

Migrate from Fat Free CRM to Odoo CRM

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

Fat Free CRM logo

Fat Free CRM

Source

Odoo CRM

Destination

Odoo CRM logo

Compatibility

100%

12 of 12

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

Complexity

BStandard

Timeline

48–72 hours

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

Fat Free CRM stores data across five primary objects — contacts, accounts (called companies), opportunities (called deals), tasks, and notes — with a group-based permission model and a flat custom-field extension mechanism on each entity. Odoo CRM inverts this model: it uses a single res.partner record to represent both individuals and organizations, differentiated by the company_type field, and drives its entire CRM around the crm.lead model where Leads and Opportunities share one object partitioned by pipeline stage. These structural differences mean the migration is not a simple 1:1 field copy — the Odoo res.partner must be created before any crm.lead can reference it, contacts without a primary company must be assigned a placeholder partner record, and opportunity stage names must be mapped value-by-value against Odoo's stage picklist. We handle this through a sequenced API-driven migration: first we export and clean the source data, then we provision Odoo custom fields and stage configurations, then we run the record migration in dependency order (partners before leads, leads before activities), and finally we capture a delta window so records modified during cutover land in Odoo with no gap. Workflows, automations, and email templates do not transfer — FlitStack exports those definitions as human-readable rebuild references for your Odoo admin.

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

Odoo CRM logo

Odoo CRM

What's pulling them in

  • Teams choose Odoo CRM for its modular architecture — one base install with one-click app additions means they can adopt CRM alone and add accounting, inventory, or sales later as the business grows.
  • Small businesses pick Odoo because the Community edition is free and open-source, with no per-user or contact limits, allowing full evaluation before committing to a paid Enterprise tier.
  • The drag-and-drop Kanban pipeline and AI lead scoring are highlighted across G2 reviews as concrete features that make lead management faster and more visual than spreadsheet-based workflows.
  • Odoo's native integration with email, live chat, SMS, VoIP, and WhatsApp means inbound leads from multiple channels feed into a single pipeline without third-party middleware.
  • Companies in retail, supply chain, and construction value that Odoo's CRM module shares the same PostgreSQL database and UI as its ERP modules, eliminating data silos between sales and operations.

Object mapping

How Fat Free CRM objects map to Odoo CRM

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

Contact

maps to

Odoo CRM

res.partner

1:1
Fully supported

Fat Free CRM contacts map to Odoo res.partner records where company_type = 'person'. The email, phone, job title, address, and website fields translate directly. The contact's primary company (account_id) becomes the parent partner_id in Odoo. If a contact has no company in Fat Free CRM, we create a stub partner record and flag it for Odoo admin review.

Fat Free CRM

Account (Company)

maps to

Odoo CRM

res.partner

1:1
Fully supported

Fat Free CRM accounts map to Odoo res.partner where company_type = 'company'. The name, website, phone, industry, employee count, and annual revenue fields map to Odoo partner fields. Revenue and employee count have no native Odoo partner fields — we create x_annual_revenue and x_number_of_employees as ir.model.fields before import.

Fat Free CRM

Opportunity (Deal)

maps to

Odoo CRM

crm.lead

1:1
Fully supported

Fat Free CRM opportunities map directly to Odoo crm.lead records. The opportunity name becomes the lead subject (name field), amount maps to planned_revenue, and the close date maps to date_deadline. The assigned user resolves by email match to Odoo internal users. Stage mapping requires value-by-value translation from Fat Free stage strings to Odoo crm.stage record IDs.

Fat Free CRM

Pipeline

maps to

Odoo CRM

crm.team + crm.stage

1:1
Fully supported

Fat Free CRM pipelines have no direct Odoo equivalent. In Odoo, each sales team (crm.team) owns a set of crm.stage records. We create a crm.team for each Fat Free CRM pipeline and configure stage records with sequence order and fold/name matching the source stage strings. Probability values map per stage name.

Fat Free CRM

Pipeline Stage

maps to

Odoo CRM

crm.stage

1:1
Fully supported

Stage name strings from Fat Free CRM map to Odoo crm.stage name values. Each stage requires probability and sequence number configuration in Odoo. Stages with the same name across multiple Fat Free pipelines collapse to a single Odoo stage name per team unless you request separate pipelines per team in Odoo.

Fat Free CRM

Task

maps to

Odoo CRM

mail.activity

1:1
Fully supported

Fat Free CRM tasks map to Odoo mail.activity records attached to the parent res.partner or crm.lead. The task name becomes the activity summary, due date maps to date_deadline, and priority (low/medium/high) maps to Odoo's activity_type + priority fields. The assigned user resolves by email match.

Fat Free CRM

Note

maps to

Odoo CRM

mail.message

1:1
Fully supported

Fat Free CRM notes map to Odoo mail.message records with message_type = 'comment' and subtype = 'note.mt_note'. The note body populates the message body field. We preserve the original created date as write_date on the Odoo message record. Messages attach to the parent res.partner or crm.lead using the res_id + model references.

Fat Free CRM

Campaign

maps to

Odoo CRM

crm.team

1:1
Fully supported

Fat Free CRM campaigns map to Odoo crm.team records, since Odoo does not have a standalone campaign entity in the CRM module. Team name and description carry over. If the campaign tracks UTM data, those fields migrate as custom fields on the crm.lead.

Fat Free CRM

Group / Team

maps to

Odoo CRM

res.groups

1:1
Fully supported

Fat Free CRM groups map to Odoo res.groups. We preserve the group name and transfer user membership by matching user emails. Group descriptions are migrated as the res.groups description field when present. If your Fat Free groups are used for record-level access control, Odoo record rules will need manual tuning post-migration. In Odoo, the default group 'User' is created automatically; custom groups from Fat Free are added alongside it.

Fat Free CRM

Tag

maps to

Odoo CRM

res.partner.category

1:1
Fully supported

Fat Free CRM tags on contacts and accounts map to Odoo res.partner.category (contact category/tag). Tag names map directly, preserving spelling and capitalization. If a tag already exists in Odoo, we reuse the existing category instead of creating a duplicate. Multi-tag membership on a contact creates multiple category entries on the res.partner record. Any tag color data is stored as a custom char field if needed.

Fat Free CRM

Custom Field (Contact)

maps to

Odoo CRM

ir.model.fields (res.partner)

1:1
Fully supported

Fat Free CRM custom fields on contacts require Odoo ir.model.fields entries on res.partner. Field type translation: string fields map to char, number fields to float or integer, date fields to date, multi-select to char (comma-separated string). We create the custom field in Odoo first, then populate it during the partner import.

Fat Free CRM

Custom Field (Opportunity)

maps to

Odoo CRM

ir.model.fields (crm.lead)

1:1
Fully supported

Fat Free CRM custom fields on opportunities migrate as Odoo ir.model.fields on crm.lead. Same type-translation logic applies. Odoo reserves field names starting with x_; we prefix all migrated custom field names with x_fcfm_ to avoid conflicts with reserved internal names.

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

Odoo CRM logo

Odoo CRM gotchas

High

Odoo.sh version gating blocks assisted migrations from trial

High

Enterprise modules fail to install on Community after database restore

Medium

Custom module view inheritance breaks between Odoo major versions

Medium

Custom fields risk losing their application context on Community

Low

API access for Community is gated behind the Custom Plan

Pair-specific challenges

  • Partner-before-lead dependency in Odoo crm.lead

    Odoo's crm.lead model uses partner_id as a required or strongly-recommended foreign key to res.partner. Fat Free CRM stores contacts and accounts as separate tables, and many contacts have a non-null account_id reference. During migration, Odoo requires the partner record to exist before crm.lead.partner_id can be populated. We handle this by sequencing the import: res.partner records (accounts first, then contacts with their parent_id resolved to the account partner) migrate before any crm.lead records land. If your Fat Free CRM contacts lack an account link, we create a stub res.partner record and flag it for your Odoo admin to review or merge after migration.

  • Stage string-to-record-ID resolution requires pre-configured crm.stages

    Fat Free CRM stores pipeline stage as a free-text string on each opportunity record. Odoo stores stage as an integer ID referencing a crm.stage record with its own name, sequence, and probability values. The migration cannot resolve stage IDs until crm.stage records are created in Odoo first, and each Fat Free pipeline must map to a separate crm.team with its own stage set. We deliver a stage-mapping plan before data moves so your Odoo admin can create the stage records with the correct names and probabilities. Mismatched stage names will cause the lead to land on a default stage or require a post-migration correction pass.

  • Fat Free CRM owner assignment requires email-based user resolution in Odoo

    Fat Free CRM stores owner as an internal user ID on contacts, accounts, and opportunities. Odoo uses user_id on crm.lead and user_id on res.partner. There is no Odoo-native equivalent to Fat Free's owner ID because Odoo's user model differs. We resolve owner assignment by matching the Fat Free user email address against Odoo internal user records. Any Fat Free user without a matching Odoo account is flagged before migration and assigned to a fallback admin user so no record lands without an owner. You must provision Odoo user accounts for all active Fat Free CRM users before the migration run.

  • Notes map to internal messages, not to an Odoo Notes application

    Fat Free CRM has a dedicated Notes entity attached to contacts and opportunities. Odoo does not have a standalone Notes object in its CRM module — the closest analog is mail.message with message_type = 'comment' and subtype = 'note.mt_note', which appears in the chatter on the partner or lead form. If your team relies on a separate Notes tab visible from the contact or lead list view, Odoo will display those notes inside the chatter thread instead. We surface this behavior in the migration plan so your admin can configure the chatter visibility and optionally create a filtered note view.

  • Fat Free CRM custom fields require Odoo ir.model.fields pre-creation

    Fat Free CRM custom fields are stored as additional columns in the underlying Rails database tables. Odoo requires custom fields to be declared as ir.model.fields entries before data can be written to them. The migration tool cannot populate a custom field that does not yet exist in Odoo. We audit your Fat Free CRM custom fields during the data audit phase, create the corresponding Odoo ir.model.fields entries (with appropriate type translation: char for strings, float for decimals, integer for whole numbers, date for dates), and then populate them during the import. Field types that do not map cleanly — such as Fat Free multi-select pick-lists — become comma-separated string fields in Odoo.

Migration approach

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

  1. Audit Fat Free CRM data and plan Odoo schema

    FlitStack AI extracts all Fat Free CRM objects via the platform's database layer or export utilities, capturing standard and custom fields, pipeline stage values, owner IDs, and association tables. We cross-reference the extracted schema against Odoo CRM's crm.lead and res.partner field inventory, identify which Fat Free CRM custom fields need Odoo ir.model.fields entries, and produce a schema setup plan listing the exact fields, field types, and stage records your Odoo admin must create before data lands.

  2. Provision Odoo custom fields and stage configuration

    Your Odoo admin (or our team acting with admin credentials) creates the ir.model.fields entries identified in the audit, configures crm.team records per Fat Free pipeline, and sets up crm.stage records with the correct stage names and probability values. Owner resolution runs in parallel: we map each Fat Free user email to an existing Odoo internal user record and flag any unmatched owners for account provisioning.

  3. Migrate partners before leads, leads before activities

    Odoo enforces foreign-key ordering: res.partner must exist before crm.lead.partner_id can be populated, and crm.lead must exist before mail.activity.res_id can reference it. We sequence the migration as follows: first accounts (as company-type res.partner), then contacts (as person-type res.partner with parent_id resolved), then crm.lead records with stage_id resolved to Odoo stage IDs, then mail.activity and mail.message records. We preserve original create_date and write_date values throughout so historical timestamps survive the import.

  4. Run a sample migration with field-level diff

    A representative slice of records — typically 100–300 spanning contacts, accounts, opportunities, and a few tasks or notes — migrates first. We generate a field-level comparison between the source Fat Free CRM record and the resulting Odoo record, covering every mapped field including custom fields and stage assignments. You review the diff and approve before the full run commits. This step catches stage name mismatches, owner resolution gaps, and custom field type issues before they affect your entire dataset.

  5. Cut over with delta-pickup for in-flight records

    The full migration runs against your Odoo instance. FlitStack AI uses scoped read access on Fat Free CRM — your team continues working in the source system throughout. A delta-pickup window (typically 24–48 hours after the main run completes) captures any records created or modified during the cutover. Audit logs record every operation, and a one-click rollback is available if reconciliation against your Fat Free CRM record counts fails.

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.
Odoo CRM logo

Odoo CRM

Destination

Strengths

  • Modular open-source architecture lets teams start with CRM and add ERP apps as needs grow, all sharing one PostgreSQL database.
  • Free Community edition with no contact limits and full source code access means zero licensing cost for evaluation and small deployments.
  • Drag-and-drop Kanban pipeline with AI lead scoring gives a visual, prioritized view of the sales funnel without requiring custom configuration.
  • Native integrations with email, live chat, SMS, VoIP, WhatsApp, and social media feed all inbound leads into a single unified inbox.
  • Active Odoo Community Association (OCA) maintains dozens of community-maintained modules on GitHub for extended functionality.

Weaknesses

  • Gmail and email integration reliability is a recurring complaint — threads drop and conversations scatter across inboxes, disrupting sales team workflows.
  • Enterprise edition pricing stacks quickly: multiple apps at per-user rates ($25–$50/user/month) plus Odoo.sh hosting costs more than many SMBs anticipate.
  • Setup and configuration complexity increases significantly once custom fields, automation rules, and multiple installed modules are in play.
  • Odoo.sh trial databases run on a version (e.g., 18.3) that is not directly migratable to Odoo.sh, blocking the assisted migration path Odoo advertises.
  • Version upgrades between major Odoo releases (e.g., 17→18) frequently break custom module view definitions and XPath expressions, requiring manual remediation.

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 Fat Free CRM and Odoo CRM.

  • 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

    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 Odoo 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 Odoo CRM data migrations

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

Can't find your answer?

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

Book a free 30 minute consultation

Most Fat Free CRM to Odoo migrations complete within 48–72 hours for under 25,000 total records. Larger datasets or setups with heavy custom-field usage extend to 5–8 days. The longest single step is Odoo stage and custom-field configuration planning before any data moves. FlitStack sequences the migration in dependency order so foreign keys resolve correctly on the first run. The data transfer runs as a background job, allowing users to continue working in Fat Free CRM. A final verification pass compares record counts and field totals before the delta window opens.

Adjacent paths

Related migrations to explore

Ready when you are

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