CRM migration
Field-level mapping, validation, and rollback between Lofty and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Lofty
Source
Odoo CRM
Destination
Compatibility
11 of 11
objects map 1:1 between Lofty and Odoo CRM.
Complexity
BStandard
Timeline
48–72 hours
Overview
Teams migrate from Lofty to Odoo CRM when they want the flexibility of an open-source ERP with integrated CRM, or when their brokerage's needs have expanded beyond Lofty's real-estate-specific feature set. Odoo CRM models leads and opportunities in a single crm.lead object that can transition between 'New' and 'Opportunity' states, unlike Lofty which separates Leads and Transactions as distinct record types. The migration carries everything Lofty stores natively — leads, contacts, companies, transactions/deals, agents, teams, and custom fields — into Odoo's crm.lead, res.partner, and product.product models. The harder problems are mapping Lofty's transaction/deal pipeline stages to Odoo's crm.stage kanban stages, resolving Lofty agent IDs to Odoo res.users records by email, and handling Lofty's extensive custom field library (up to 350 fields across 6 data types) which requires Odoo custom field creation. FlitStack sequences the migration so foreign-key dependencies resolve correctly: companies → contacts, then agents → owner assignments, then transactions/deals with stage mapping — followed by a sample migration with field-level diff before the full run. Workflows, automations, and AI features from Lofty do not transfer; FlitStack exports definitions as rebuild references for your Odoo administrator.
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 Lofty 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.
Lofty
Lead (People)
Odoo CRM
crm.lead
1:1Lofty leads map directly to Odoo crm.lead records. The crm.lead type field distinguishes between 'lead' and 'opportunity' states. Lofty lead status (New, Contacted, Qualified, etc.) maps to Odoo stage_id values. Original create dates preserved in crm.lead.create_date or a custom field.
Lofty
Transaction
Odoo CRM
crm.lead (Opportunity)
1:1Lofty transactions are deal records that map to Odoo crm.lead in 'Opportunity' state. Lofty's deal amount, close date, and stage map to planned_revenue, date_deadline, and stage_id respectively. The crm.lead partner_id links to the primary contact from the original transaction, maintaining the relationship between deals and their associated contacts.
Lofty
Agent
Odoo CRM
res.users
1:1Lofty agents map to Odoo res.users by email address match. Agent names become user names, and agent email becomes the Odoo login credential. User groups_id determines CRM access level (Sales, Manager, Administrator). Unmatched agents are flagged for team invitation or fallback assignment to a default user.
Lofty
Team
Odoo CRM
crm.team
1:1Lofty teams map to Odoo crm.team records. Each Odoo team has its own pipeline stages defined in crm.stage with team_id scoped to that specific team. Lofty agents assigned to a team receive crm.team membership in Odoo via res.users belongs_to teams relationship.
Lofty
Company
Odoo CRM
res.partner
1:1Lofty company records (if any) map to Odoo res.partner with is_company=True set. Parent-child relationships between companies in Lofty translate to parent_id on the res.partner records. Contact records link to their parent company through that same parent_id field when a company exists in the source data.
Lofty
Property/Listing
Odoo CRM
product.product
1:1Lofty property records map to Odoo product.product for real estate listings. Property name becomes product name, listing type becomes product category (categ_id), price maps to list_price, and property details become description fields. Bedrooms, bathrooms, and square footage become custom fields on the product record.
Lofty
Tag
Odoo CRM
crm.tag
1:1Lofty tags on leads and transactions map to Odoo crm.tag records. Tags on crm.lead use the tag_ids many2many field for assignment. Multi-tag assignments on a single Lofty record create multiple tag_ids entries on the corresponding Odoo crm.lead, preserving all categorization from the source.
Lofty
Note/Activity Log
Odoo CRM
mail.message
1:1Lofty note entries map to Odoo mail.message records on the related crm.lead. Original timestamps and author (agent) information is preserved through the migration. Activity logs including calls and meetings map to mail.activity with activity_type_id distinguishing between different interaction types.
Lofty
Lead Source
Odoo CRM
source_id (channel_id)
1:1Lofty lead source values (Website, Referral, Zillow, Realtor.com, etc.) map to Odoo utm.source records via crm.lead source_id field. Each unique Lofty source string creates a corresponding utm.source record in Odoo for accurate attribution reporting. Leads without a source receive a default utm.source assignment.
Lofty
Custom Fields (All Types)
Odoo CRM
ir.model.fields (custom)
1:1Lofty custom fields require Odoo custom field creation before migration begins. Text fields map to char or text depending on length constraints. Number fields map to float or integer types based on precision needs. Single-select maps to selection or many2one referencing a dedicated model. Multi-select maps to char (comma-separated) or many2many — your admin chooses the preferred storage approach.
Lofty
Attachment/File
Odoo CRM
ir.attachment
1:1Lofty file attachments on leads and transactions migrate to Odoo ir.attachment records linked to the crm.lead via res_model and res_id reference fields. Files are re-uploaded to Odoo's filestore during migration. File size limits apply per Odoo configuration settings with a default maximum of 25MB per file upload.
| Lofty | Odoo CRM | Compatibility | |
|---|---|---|---|
| Lead (People) | crm.lead1:1 | Fully supported | |
| Transaction | crm.lead (Opportunity)1:1 | Fully supported | |
| Agent | res.users1:1 | Fully supported | |
| Team | crm.team1:1 | Fully supported | |
| Company | res.partner1:1 | Fully supported | |
| Property/Listing | product.product1:1 | Fully supported | |
| Tag | crm.tag1:1 | Fully supported | |
| Note/Activity Log | mail.message1:1 | Fully supported | |
| Lead Source | source_id (channel_id)1:1 | Fully supported | |
| Custom Fields (All Types) | ir.model.fields (custom)1:1 | Fully supported | |
| Attachment/File | ir.attachment1:1 | 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.
Lofty gotchas
API date-range queries capped at 90 days
64-bit integer IDs risk JavaScript precision loss
Starter tier custom field cap breaks complex schemas
Data export requires $500 fee unless handled during subscription
Documentation site migration disrupts integration references
Odoo CRM gotchas
Odoo.sh version gating blocks assisted migrations from trial
Enterprise modules fail to install on Community after database restore
Custom module view inheritance breaks between Odoo major versions
Custom fields risk losing their application context on Community
API access for Community is gated behind the Custom Plan
Pair-specific challenges
Migration approach
Extract Lofty data with 90-day window stitching
FlitStack queries Lofty's API in sequential 90-day slices for each object type (leads, transactions, agents, teams, notes). Each slice captures full metadata including lofty_id, create_date, write_date, and owner agent_id. The slices are merged into a single de-duplicated dataset before field mapping begins. Any records with a lofty_id already seen in a prior slice are flagged for review to prevent duplicate imports.
Resolve agents and teams by email match
Lofty agent emails are matched against existing Odoo res.users records by login field. Unmatched agents are flagged for team invitation or fallback assignment to a default user. Teams are matched by name to existing Odoo crm.team records, with new team creation if no match exists. The resolved user IDs are cached for use as owner assignments on all subsequent record imports.
Create Odoo custom fields and stage pipelines
Before any data lands, FlitStack delivers a custom field creation plan listing every Lofty custom field, its Lofty data type, and the recommended Odoo field type. For multi-select fields, the plan includes the storage option your admin selects. Simultaneously, a stage-pipeline plan maps each Lofty team + transaction stage combination to the corresponding Odoo crm.team and crm.stage records. Your Odoo admin creates these before the sample migration runs.
Run sample migration with field-level diff
A representative slice of 100–500 records (mix of leads, transactions, and properties) migrates first using Odoo's import interface or XML-RPC depending on your plan tier. FlitStack generates a field-level diff comparing source values from Lofty against destination values in Odoo, including custom field values, owner assignments, and stage mappings. You verify the diff before the full run commits to production.
Execute full migration with delta pickup window
The full migration runs with Odoo in read-only mode to prevent conflicts during data import. A delta-pickup window (typically 24–48 hours) captures any new records or modifications made in Lofty during the migration window. FlitStack's audit log records every operation for traceability, and one-click rollback is available if reconciliation identifies data integrity issues at the end of the run.
Platform deep dives
Lofty
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 1 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 Lofty and Odoo CRM.
Object compatibility
1 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
Lofty: Not publicly documented on developer.lofty.com — we implement exponential backoff and respect 429 responses as rate limit signals.
Data volume sensitivity
Lofty 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 Lofty to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Lofty to Odoo CRM migration with a real engineer — 30 minutes, free, written quote within 24 hours.
Book a free 30 minute consultationAdjacent paths
Other ways to leave Lofty
Other ways to arrive at Odoo CRM
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.