CRM migration
Field-level mapping, validation, and rollback between Brivity and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Brivity
Source
Odoo CRM
Destination
Compatibility
13 of 13
objects map 1:1 between Brivity and Odoo CRM.
Complexity
BStandard
Timeline
48–72 hours
Overview
FlitStack AI migrates the Brivity CRM data model into Odoo CRM using Brivity's REST API for live records and CSV exports where the API does not cover. Brivity stores contacts, companies, deals, and activity logs; Odoo CRM models the same concepts as res.partner (contact/company combined), crm.lead (both leads and opportunities), and mail.message (activity history). We map Brivity's firstname, lastname, email, phone, and address fields directly to Odoo res.partner equivalents, and Brivity deal names, amounts, stages, and close dates into crm.lead fields. Brivity's custom properties — transaction type, lead source, showing notes — become custom fields on crm.lead using Odoo's ir.model.fields API. Pipeline stages map to Odoo stage_ids via value mapping. Activity history (calls, emails, tasks) migrates to mail.message records linked to crm.lead. Brivity's agent performance metrics, design automation triggers, and IDX website data do not have Odoo equivalents — we flag these for manual rebuild post-migration. Owner resolution runs by email match against Odoo res.users so every migrated record lands with the correct user assignment.
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 Brivity 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.
Brivity
Contact
Odoo CRM
res.partner
1:1Brivity contacts map directly to Odoo res.partner records. When is_company=false the record represents an individual; when is_company=true it represents a brokerage or property company. Email, phone, and address fields translate 1:1. Primary company assignment uses parent_id on res.partner. During migration, we validate email uniqueness and flag duplicates for review. The is_company flag determines whether the contact appears in Odoo's company or contact views, ensuring proper segmentation for marketing and sales workflows.
Brivity
Company
Odoo CRM
res.partner
1:1Brivity company records map to res.partner with is_company=True. Odoo requires parent_id to be empty on company records. Multi-location companies need separate res.partner records linked by parent_id after the initial company record is created. Each location gets its own partner record with parent_id pointing to the main company, allowing you to track interactions and assignments at both the headquarters and branch level. This structure supports accurate reporting by location and maintains clear hierarchies in your partner database.
Brivity
Deal
Odoo CRM
crm.lead
1:1Brivity deal names, amounts, close dates, and stage names map to crm.lead name, expected_revenue, date_deadline, and stage_id respectively. The crm.lead type field is set to 'opportunity' for all migrated deals. Owner assignment via user_id resolved by email match against Odoo res.users.
Brivity
Pipeline
Odoo CRM
crm.team + crm.stage
1:1Each Brivity pipeline becomes an Odoo crm.team. Brivity stage names within each pipeline create crm.stage records assigned to that team. Stages are ordered using sequence values pulled from Brivity. Teams without pipeline assignment default to the base CRM team in Odoo.
Brivity
Pipeline Stage
Odoo CRM
crm.stage
1:1Stage names are mapped value-by-value from Brivity to Odoo crm.stage records. Probability and legend_color values are preserved as stage properties. Stage IDs in Brivity are not reused; new stage IDs are assigned in Odoo and mapped in the migration lookup table.
Brivity
Custom Property (text/number)
Odoo CRM
ir.model.fields (x_ field)
1:1Brivity custom properties that have no Odoo CRM native equivalent (e.g., transaction_type, showing_notes, mls_number) are created as x_ prefixed fields on crm.lead using Odoo's ir.model.fields API. Field type (char, float, selection, date) is inferred from the Brivity property value type. Selection fields require explicit value_mapping with Brivia pick-list options.
Brivity
Task / Activity
Odoo CRM
mail.message + mail.activity
1:1Brivity tasks and showing notes become Odoo mail.activity records linked to crm.lead via res_model='crm.lead' and res_id matching the migrated deal ID. Task state (open/done) maps to activity state and calendar_event_id where applicable. Original timestamps preserved in create_date. This ensures all historical activities appear in the Odoo chatter, giving your team full visibility into the deal's history. Activities sync with Odoo's calendar module, allowing users to see scheduled tasks alongside their pipeline view.
Brivity
Lead (in Brivity context)
Odoo CRM
crm.lead (type='lead')
1:1Brivity leads that have not been converted to deals migrate as Odoo crm.lead records with type='lead' rather than 'opportunity'. These land in the Leads pipeline view in Odoo and can be converted to opportunities manually after migration using Odoo's native Convert to Opportunity action.
Brivity
User / Agent
Odoo CRM
res.users
1:1Brivity agent and team member records do not create new Odoo users. Owner resolution runs by email address match against existing Odoo res.users. Agents without a matching Odoo email are assigned to a fallback user (configurable) and flagged in the migration report for manual reassignment.
Brivity
Attachment / File
Odoo CRM
ir.attachment
1:1Files attached to Brivity contacts or deals are downloaded and re-uploaded as Odoo ir.attachment records linked to the corresponding res.partner or crm.lead via res_model and res_id. File size limits apply per Odoo configuration. Inline images in Brivity notes are extracted and stored separately.
Brivity
Note (plain text / rich text)
Odoo CRM
mail.message
1:1Brivity notes on contacts and deals migrate to Odoo mail.message records with message_type='comment'. Rich-text formatting is converted to HTML-compatible body content. Notes are displayed in the Odoo chatter thread on the corresponding crm.lead or res.partner record. This preserves all contextual information and makes it searchable within Odoo. The chatter integration allows team members to add follow-up comments directly on migrated notes, maintaining collaboration continuity.
Brivity
Marketing / Automation (no equivalent)
Odoo CRM
none
1:1Brivity's automated follow-up sequences, action plans, and marketing tools do not have an Odoo CRM equivalent at the data level. These are configuration artifacts, not records. We export workflow definitions as JSON for your Odoo admin to rebuild using Odoo Studio actions and server actions after migration.
Brivity
Agent Performance Metric
Odoo CRM
x_custom_field on crm.lead
1:1Brivity tracks agent-level metrics like showing_count, conversion_rate, and days_on_market as deal properties. These migrate to custom x_ fields on crm.lead so reporting in Odoo Spreadsheet or custom views preserves the performance context from Brivity. Custom fields allow you to build agent performance dashboards, track individual productivity, and maintain historical data for comparison. You can create pivot tables and charts in Odoo Spreadsheet to analyze these metrics across your pipeline.
| Brivity | Odoo CRM | Compatibility | |
|---|---|---|---|
| Contact | res.partner1:1 | Fully supported | |
| Company | res.partner1:1 | Fully supported | |
| Deal | crm.lead1:1 | Fully supported | |
| Pipeline | crm.team + crm.stage1:1 | Fully supported | |
| Pipeline Stage | crm.stage1:1 | Fully supported | |
| Custom Property (text/number) | ir.model.fields (x_ field)1:1 | Fully supported | |
| Task / Activity | mail.message + mail.activity1:1 | Fully supported | |
| Lead (in Brivity context) | crm.lead (type='lead')1:1 | Fully supported | |
| User / Agent | res.users1:1 | Fully supported | |
| Attachment / File | ir.attachment1:1 | Fully supported | |
| Note (plain text / rich text) | mail.message1:1 | Fully supported | |
| Marketing / Automation (no equivalent) | none1:1 | Fully supported | |
| Agent Performance Metric | x_custom_field on crm.lead1: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.
Brivity gotchas
No public API forces CSV-based migration scoping
Auto Plans and automated sequences do not transfer
IDX website configuration is non-transferable
Add-on pricing creates unpredictable total cost
GCI and commission data may not survive field mapping
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
Pre-migration data audit and schema discovery
FlitStack AI connects to Brivity via API using read-only credentials to enumerate available object types, field names, and record counts. For each object (contacts, companies, deals, activities) we pull a representative sample and infer custom property names and value types. We cross-reference the sample with Odoo CRM's standard field inventory to identify direct mappings, value-mapping candidates, and fields requiring custom field creation. We deliver a field mapping spreadsheet before migration runs so you can review and adjust the plan.
Odoo custom field creation and team/stage configuration
Before data loads, we create the custom fields identified in the audit on Odoo's crm.lead and res.partner models using the ir.model.fields API. This includes x_transaction_type (selection), x_mls_number (char), x_showing_notes (text), and any other Brivity custom properties with no native Odoo equivalent. Simultaneously, we create the crm.team and crm.stage records for each Brivity pipeline, setting stage sequence, probability, and legend_color values to match Brivity stage definitions as closely as possible.
Contact and company data load with dependency ordering
We load Odoo res.partner records in dependency order — companies first (is_company=True), then contacts with parent_id linking to company records. Email deduplication runs at this stage: if the same email appears on multiple Brivity contacts, the oldest record becomes the primary res.partner and subsequent records are flagged for manual merge review. Owner resolution by email match creates the user_id link on each partner record.
Deal and pipeline data load with stage mapping
Brivity deals load into crm.lead as type='opportunity' records. Each deal's pipeline and stage names resolve to the correct crm.team and crm.stage IDs using the mapping plan. Owner assignment runs via email match to res.users. Custom property values (transaction_type, lead_source, showing_notes) write to the x_ custom fields created in step 2. Deal amount writes to expected_revenue as a float; Brivity currency stored in x_brivity_currency for reference.
Activity history migration and sample validation
Call, email, meeting, and task records from Brivity load as mail.message and mail.activity records linked to the corresponding crm.lead by migrated record ID. A representative sample (typically 100–300 records across contacts, companies, and deals) is validated against the source before the full run commits. We generate a field-level diff comparing source field values to destination field values and surface any mapping gaps for your review.
Delta-pickup, final sync, and audit handoff
After sample validation is approved, the full migration runs with a delta-pickup window of 24–48 hours. Any Brivity records modified or created during the cutover window are pulled in the final sync pass. FlitStack produces an audit log listing every record created or updated in Odoo, the source record ID, and the migration timestamp. If reconciliation reveals record count discrepancies or missing data, one-click rollback reverts Odoo to pre-migration state while preserving the Brivity export for re-run after fixes.
Platform deep dives
Brivity
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. All 8 core objects map 1:1 between Brivity and Odoo CRM.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Brivity and Odoo CRM.
Object compatibility
All 8 core objects map 1:1 between Brivity and Odoo CRM.
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
Brivity: Not publicly documented.
Data volume sensitivity
Brivity 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 Brivity to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Brivity 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 Brivity
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.