CRM migration
Field-level mapping, validation, and rollback between PropFlo and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
PropFlo
Source
Odoo CRM
Destination
Compatibility
12 of 12
objects map 1:1 between PropFlo and Odoo CRM.
Complexity
BStandard
Timeline
48–72 hours
Overview
PropFlo structures its CRM around real estate-specific objects: leads with lifecycle tracking, deals tied to property units, demand notes, Agreement of Sale (AOS) records, payment schedules, and channel partner relationships. Odoo CRM uses the standard crm.lead model for leads and opportunities, res.partner for contacts and companies, and links quotations to the sale.order workflow with stage-based crm.stage configuration. The migration maps PropFlo leads to Odoo crm.lead records, PropFlo companies to Odoo res.partner records, and PropFlo deals to Odoo opportunities with stage mapping. Property-specific fields (tower name, unit number, floor plan references, carpet area) migrate as custom fields on Odoo's crm.lead model. Demand notes and AOS documents export as binary attachments and re-upload to Odoo's document management system. Workflows, automation rules, assignment flows, and AI chatbots built in PropFlo do not transfer—these must be rebuilt in Odoo using Odoo Studio, workflow engine, or action-server automation. FlitStack sequences the migration so foreign key relationships resolve correctly: res.partner records land first, then crm.lead records with their partner lookups, then opportunities linked to leads. Owner resolution happens by email match against Odoo res.users.
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 PropFlo 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.
PropFlo
Lead / Contact
Odoo CRM
crm.lead
1:1PropFlo leads with name, email, phone, and source data map directly to Odoo crm.lead records. The lead's assigned owner resolves by email match to Odoo res.users. PropFlo's lead status (New, Contacted, Qualified) maps to crm.stage records. PropFlo contact records without a company link land as crm.lead with partner_id left empty.
PropFlo
Company / Developer
Odoo CRM
res.partner
1:1PropFlo company records—developer names, addresses, GST numbers, and industry classification—map to Odoo res.partner records with is_company=True. The company address fields map to street, city, state_id, and country_id on res.partner. GST or tax registration numbers map to the vat field if Odoo's Indian localization is installed.
PropFlo
Contact Person
Odoo CRM
res.partner (contact)
1:1PropFlo contact person records attached to a company map to Odoo res.partner records with is_company=False and parent_id pointing to the developer partner. Name, email, phone, and job title map to the corresponding res.partner fields. PropFlo's N:N association between contacts and companies requires resolution to one primary parent_id with additional associations noted in a custom field.
PropFlo
Deal / Opportunity
Odoo CRM
crm.lead (opportunity)
1:1PropFlo deals—linked to specific property units with amounts, stages, and close dates—map to Odoo crm.lead records with type='opportunity'. The deal amount maps to planned_revenue. Deal stage names in PropFlo map to crm.stage records by name-value mapping so the kanban pipeline reflects the original sales lifecycle. PropFlo's deal owner resolves by email to Odoo res.users.
PropFlo
Pipeline
Odoo CRM
crm.stage + crm.team
1:1PropFlo pipeline configurations map to Odoo crm.stage records. Each PropFlo stage (Inquiry, Site Visit, Token Amount, Booking, Agreement Signed) maps to a named crm.stage with corresponding sequence order and probability weight. Teams in PropFlo map to crm.team records so opportunities route to the correct sales team in Odoo.
PropFlo
Property / Unit
Odoo CRM
product.product (custom real estate fields)
1:1PropFlo property and unit records—tower name, floor number, unit number, carpet area, balcony area, facing direction, unit type, and availability status—have no direct Odoo equivalent. These map as custom fields on crm.lead (x_tower_name, x_unit_number, x_carpet_area, x_facing, x_unit_status) so opportunity records retain property context. A custom real estate module can extend product.product if inventory tracking is needed.
PropFlo
Demand Note
Odoo CRM
account.move (custom fields)
1:1PropFlo demand notes track payment milestones and amounts due against a booking. Odoo has no direct equivalent; demand note records export as structured JSON with booking reference, milestone name, amount due, and due date. These migrate as custom fields on crm.lead (x_demand_note_json) or as a separate custom model (x_demand_note) linked by booking reference. Rebuild as account.move lines in Odoo's accounting module if payment tracking is needed.
PropFlo
AOS (Agreement of Sale)
Odoo CRM
ir.attachment (document re-upload)
1:1PropFlo generates Agreement of Sale documents as PDF files attached to booking records. These binary files export from PropFlo and re-upload to Odoo as ir.attachment records linked to the corresponding crm.lead opportunity. Document templates and approval workflows for AOS must be rebuilt in Odoo using report or document module.
PropFlo
Payment Record
Odoo CRM
account.payment
1:1PropFlo payment records—amount paid, payment mode, payment date, and receipt reference—map to Odoo account.payment records linked to the corresponding sale.order or account.move. Payment status (Pending, Partial, Complete) maps to the state field on account.payment. Odoo accounting module must be installed for this object to function.
PropFlo
Channel Partner / Broker
Odoo CRM
res.partner (with category)
1:1PropFlo channel partners and brokers map to res.partner records tagged with a Partner Category (e.g., 'Channel Partner'). Partner name, contact person, email, phone, and commission structure map to the corresponding fields. Commission rates and broker codes migrate as custom fields on res.partner (x_commission_rate, x_broker_code).
PropFlo
Activity History (calls, notes, site visits)
Odoo CRM
mail.message + crm.lead.activity
1:1PropFlo activity records—call logs, site visit notes, and meeting records with timestamps and owners—map to Odoo mail.message records linked to crm.lead. Site visit details (date, time, property viewed) migrate as custom fields in the activity note. Odoo's crm.lead activity_ids relationship stores scheduled next actions. Original activity timestamps and owner IDs are preserved.
PropFlo
Attachment / File
Odoo CRM
ir.attachment
1:1PropFlo file attachments—floor plan PDFs, payment receipts, KYC documents—export as binary blobs and re-upload to Odoo as ir.attachment records. The attachment's res_model points to crm.lead and res_id points to the opportunity record. File size limits from Odoo's filestore apply. Inline images in PropFlo notes are extracted and re-hosted as attachments.
| PropFlo | Odoo CRM | Compatibility | |
|---|---|---|---|
| Lead / Contact | crm.lead1:1 | Fully supported | |
| Company / Developer | res.partner1:1 | Fully supported | |
| Contact Person | res.partner (contact)1:1 | Fully supported | |
| Deal / Opportunity | crm.lead (opportunity)1:1 | Fully supported | |
| Pipeline | crm.stage + crm.team1:1 | Fully supported | |
| Property / Unit | product.product (custom real estate fields)1:1 | Fully supported | |
| Demand Note | account.move (custom fields)1:1 | Fully supported | |
| AOS (Agreement of Sale) | ir.attachment (document re-upload)1:1 | Fully supported | |
| Payment Record | account.payment1:1 | Fully supported | |
| Channel Partner / Broker | res.partner (with category)1:1 | Fully supported | |
| Activity History (calls, notes, site visits) | mail.message + crm.lead.activity1: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.
PropFlo gotchas
No documented REST API constrains migration approach
AOS and Demand Note document files require separate handling
WhatsApp conversation media attachments not included in standard export
Workflow automations cannot be exported and must be rebuilt
Dashboard and report definitions are not exportable
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
Audit PropFlo data model and Odoo schema dependencies
FlitStack extracts the full PropFlo object inventory via API: leads, contacts, companies, deals, demand notes, AOS records, payment history, channel partners, and activity logs. We map PropFlo's custom fields (tower, unit, floor, carpet area, facing, unit status, booking reference) to Odoo crm.lead custom fields (x_tower_name, x_unit_number, x_floor_number, x_carpet_area, x_facing, x_unit_status, x_booking_reference). We audit Odoo's installed modules to determine whether res.partner, crm.lead, account.payment, and ir.attachment are available, and document any missing dependencies. The output is a field-level mapping spreadsheet with source API paths, destination model/field names, and mapping type (direct, value-map, or custom-field-required). This spreadsheet is reviewed with your Odoo admin before migration runs.
Pre-create Odoo custom fields and stage configuration
Before data moves, your Odoo admin (or our team) creates the custom fields required for real estate data: x_tower_name, x_unit_number, x_floor_number, x_carpet_area, x_facing, x_unit_status, x_booking_reference, x_demand_note_json, x_commission_rate, x_broker_code, and x_original_create_date on crm.lead and res.partner. We also configure crm.stage records matching PropFlo's pipeline stage names and sequence (Inquiry, Site Visit, Token Amount, Booking, Agreement Signed). If PropFlo has multiple pipelines, we create one crm.team per pipeline and map stage names within each team. The Odoo database must have API access enabled (Settings > Developer Mode > API). We deliver a step-by-step checklist with exact Odoo UI paths and field technical names so the schema is ready before any record lands.
Resolve owner and user mappings by email
PropFlo deal and lead owners are user email addresses. Odoo uses res.users records with login credentials. We match PropFlo owner emails against Odoo res.users login values. Any PropFlo owner without a matching Odoo user is flagged before migration with three options: invite the user to Odoo first, assign their records to a fallback Odoo user, or leave user_id blank and reassign manually after go-live. No record migrates without a documented owner resolution decision. Channel partner email addresses that do not match any Odoo user are preserved in a custom field (x_original_owner_email) on the crm.lead record for reference.
Migrate in dependency order with foreign key resolution
We sequence the migration to respect Odoo's foreign key constraints. First: res.partner records for developers, companies, and channel partners with is_company and parent_id resolved. Second: res.partner contact records linked to parent company partners. Third: crm.lead records with type='lead' for PropFlo leads not yet converted to deals. Fourth: crm.lead records with type='opportunity' for PropFlo deals, linked to the partner_id and user_id resolved in step 3. Fifth: account.payment records linked to sale.order or crm.lead by booking reference. Sixth: mail.message activity records linked to crm.lead by original record ID. Seventh: ir.attachment records for AOS PDFs and demand notes linked to crm.lead. Each batch runs against Odoo's XML-RPC API in chunks of 100–500 records with transaction rollback on error. The migration log records the external ID mapping from PropFlo object IDs to Odoo record IDs so subsequent batches can reference them correctly.
Run sample migration with field-level diff
A representative slice migrates first—typically 100–300 records spanning leads, opportunities, channel partners, and a sample demand note or AOS attachment. We generate a field-level diff report comparing source PropFlo values against destination Odoo field values for every mapped column. You verify that unit numbers, deal amounts, stage names, owner assignments, and property custom fields match the PropFlo source. The diff report flags any Odoo field that is blank, truncated, or contains a mismatched value. You approve the sample before the full migration commits. Common verification points include: crm.lead.stage_id corresponds to the correct PropFlo deal stage, x_unit_number is populated on opportunity records, ir.attachment records are linked to the correct crm.lead IDs, and res.partner.parent_id resolves correctly for company-contact hierarchies.
Cut over with delta-pickup and audit log
The full migration runs against Odoo with all records batched and loaded. A delta-pickup window (24–48 hours from the migration start time) captures any PropFlo records modified or created during the cutover—new leads, updated deal stages, or additional payments recorded in PropFlo after the migration snapshot. These delta records are extracted, mapped, and inserted into Odoo as a final batch. FlitStack generates an audit log detailing every record inserted, the source object ID, destination Odoo record ID, and the timestamp of insertion. If reconciliation fails—record count mismatch, missing foreign key references, or data integrity error—one-click rollback reverts the Odoo database to its pre-migration state. Rollback uses a database snapshot taken before the first migration batch. After rollback, the process restarts from the audit point with the corrected mapping.
Platform deep dives
PropFlo
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 PropFlo 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
PropFlo: Not publicly documented.
Data volume sensitivity
PropFlo 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 PropFlo to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your PropFlo 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 PropFlo
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.