CRM migration

Migrate from PropFlo to Odoo CRM

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

PropFlo logo

PropFlo

Source

Odoo CRM

Destination

Odoo CRM logo

Compatibility

100%

12 of 12

objects map 1:1 between PropFlo and Odoo CRM.

Complexity

BStandard

Timeline

48–72 hours

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

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.

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

PropFlo logo

PropFlo

What's pushing teams away

  • Teams outgrow the platform when scaling to multiple large projects with complex inventory across hundreds of units, requiring more sophisticated ERP-level controls.
  • Limited integration ecosystem compared to established CRMs — teams needing deep third-party accounting or marketing tool connections may find PropFlo's options constrained.
  • Some users note that as the product rapidly releases new features, the learning curve for staying current with updates can create temporary friction.

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 PropFlo objects map to Odoo CRM

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

maps to

Odoo CRM

crm.lead

1:1
Fully supported

PropFlo 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

maps to

Odoo CRM

res.partner

1:1
Fully supported

PropFlo 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

maps to

Odoo CRM

res.partner (contact)

1:1
Fully supported

PropFlo 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

maps to

Odoo CRM

crm.lead (opportunity)

1:1
Fully supported

PropFlo 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

maps to

Odoo CRM

crm.stage + crm.team

1:1
Fully supported

PropFlo 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

maps to

Odoo CRM

product.product (custom real estate fields)

1:1
Fully supported

PropFlo 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

maps to

Odoo CRM

account.move (custom fields)

1:1
Fully supported

PropFlo 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)

maps to

Odoo CRM

ir.attachment (document re-upload)

1:1
Fully supported

PropFlo 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

maps to

Odoo CRM

account.payment

1:1
Fully supported

PropFlo 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

maps to

Odoo CRM

res.partner (with category)

1:1
Fully supported

PropFlo 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)

maps to

Odoo CRM

mail.message + crm.lead.activity

1:1
Fully supported

PropFlo 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

maps to

Odoo CRM

ir.attachment

1:1
Fully supported

PropFlo 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.

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.

PropFlo logo

PropFlo gotchas

High

No documented REST API constrains migration approach

Medium

AOS and Demand Note document files require separate handling

Medium

WhatsApp conversation media attachments not included in standard export

Low

Workflow automations cannot be exported and must be rebuilt

Low

Dashboard and report definitions are not exportable

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

  • Property unit data requires custom field architecture before data lands

    PropFlo stores property inventory—tower name, floor, unit number, carpet area, facing, and availability status—as first-class objects with their own fields. Odoo CRM has no native property or unit model; these attributes have no standard fields on crm.lead. We create custom fields (x_tower_name, x_unit_number, x_floor_number, x_carpet_area, x_facing, x_unit_status) on the crm.lead model via Odoo's Settings > Technical > Custom Fields interface before migration runs. If your Odoo setup uses Community edition, custom field creation requires developer mode activation. Without these fields pre-created, property context attached to each deal is lost or stored in a generic notes field, making pipeline filtering by unit or tower impossible in Odoo. FlitStack delivers a custom field setup checklist as part of the pre-migration plan so the schema is ready before data transfer begins. Failure to pre-create these fields is the most common cause of incomplete PropFlo to Odoo migration reports.

  • Demand note and AOS document handling is export-and-reupload, not native migration

    PropFlo generates demand notes and Agreement of Sale documents as dynamic templates filled with booking data. These are PDF or Word files attached to booking records. Odoo has no native demand note or AOS template engine in the base CRM module—those require the sale.order workflow plus the report or document module with custom QWeb templates. We export PropFlo demand note PDFs and AOS files as binary blobs and re-upload them to Odoo as ir.attachment records linked to the corresponding crm.lead opportunity. The document's res_model = 'crm.lead' and res_id = the opportunity ID. You can view attachments in Odoo's attachments smart button on the lead form. However, Odoo does not parse these PDFs back into structured fields; the content remains opaque. Rebuilding demand note generation in Odoo requires the report module and custom Python logic to populate account.move lines from booking data. This is a manual rebuild item we document in the post-migration handoff plan.

  • Odoo lead-to-opportunity conversion loses PropFlo property linkage if not pre-mapped

    Odoo's native lead-to-opportunity conversion action (crm_lead_to_opportunity) maps the lead's contact and email to the opportunity but does not carry custom fields unless you override the _convert_opportunity method in Python. PropFlo property data stored in custom fields (x_unit_number, x_tower_name) on crm.lead does not automatically propagate when an Odoo user clicks 'Convert to Opportunity' on a lead. We pre-map PropFlo deal-linked property fields so they exist on both lead and opportunity forms, but the conversion action still requires either a custom Odoo module or manual field copy. We recommend converting PropFlo leads directly as opportunities (type='opportunity' at import time) rather than using Odoo's conversion wizard, which avoids the issue entirely. If your team uses the conversion wizard routinely, we include a custom module snippet in the handoff documentation.

  • Odoo API access for external integrations requires Custom plan or Community edition limitations

    Odoo's external API (XML-RPC and JSON-RPC) is free to use for all Odoo customers. However, the API access method and rate limits vary by plan: Community edition users can access the API but must enable it manually via Settings > Developer Mode > API Compatibility. Enterprise and Custom plan users have guaranteed API SLA and access via OAuth2 with API keys per user. PropFlo data extraction runs against PropFlo's own API with scoped read access; Odoo data insertion uses xmlrpc/object/execute with the Odoo database, user ID, and password. If your Odoo instance is on Community edition and the database password or server IP changes, the migration script requires re-authentication. We document the API credentials needed (database name, user login, API key or password, server URL) in the pre-migration checklist. Rate limiting on Odoo's XML-RPC is not publicly documented—large migrations run in batches of 100–500 records per request to avoid HTTP 504 timeouts.

  • PropFlo channel partner commission data has no native Odoo equivalent and migrates as custom fields

    PropFlo stores channel partner and broker relationships with commission rates, broker codes, and payout history as part of the partner record. Odoo's base CRM has no commission tracking module—res.partner records store contact and company data but not commission rates. We migrate broker and channel partner records to res.partner with custom fields x_commission_rate (Float) and x_broker_code (Char). Commission payout tracking and broker invoice generation require the Odoo Sales or Accounting module with custom logic to calculate and record commissions per partner. If you use PropFlo's built-in broker payout workflow, that automation must be rebuilt as account.move records with custom Python logic or Odoo Studio automation actions in Odoo. We flag this as a manual rebuild item and include a commission tracking data model spec in the handoff documentation.

Migration approach

Six steps for a successful PropFlo to Odoo CRM data migration

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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

Context on both ends of the pair

PropFlo logo

PropFlo

Source

Strengths

  • AI-powered lead scoring and automated nurturing reduce manual follow-up overhead for sales teams.
  • End-to-end coverage from lead capture through post-sales document generation (AOS, Demand Notes) in a single platform.
  • Highly rated ease of use (top 5 globally per G2) with rapid onboarding reported by multiple customers.
  • WhatsApp, email, and telephony integration for omni-channel client engagement within the CRM.
  • Affordable positioning targeting young real estate businesses, with strong customer support ratings.

Weaknesses

  • No publicly documented REST API — data export relies on admin panel functionality and manual coordination.
  • Dashboard and report definitions do not export and must be manually rebuilt in the destination platform.
  • Export limits (2K accounts/month noted in Crunchbase) may restrict bulk migration speed for larger datasets.
  • Limited third-party integration ecosystem compared to established CRM platforms.
  • As a younger product, documentation depth and community resources are less mature than competitors.
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 PropFlo 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

    PropFlo: Not publicly documented.

  • Data volume sensitivity

    B

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

Estimator

Estimate your PropFlo 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 PropFlo to Odoo CRM data migrations

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

Can't find your answer?

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 consultation

Most PropFlo to Odoo CRM migrations complete in 48–72 hours of clock time for under 50,000 records. Larger setups with 500k+ records, multiple pipelines, or heavy custom field usage extend to 5–7 days. The longest planning steps are pre-creating Odoo custom fields for property data (tower, unit, floor, carpet area) and mapping PropFlo deal stages to Odoo crm.stage records. Odoo Community edition users face additional setup time for developer mode activation and custom field creation. Data extraction from PropFlo depends on API rate limits; we batch in groups of 100–500 records per request to avoid timeouts. Delta-pickup for in-flight records adds 24–48 hours to the overall window.

Adjacent paths

Related migrations to explore

Ready when you are

Move from PropFlo.
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