CRM migration

Migrate from Bright to Odoo CRM

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

Bright logo

Bright

Source

Odoo CRM

Destination

Odoo CRM logo

Compatibility

100%

11 of 11

objects map 1:1 between Bright and Odoo CRM.

Complexity

BStandard

Timeline

48–72 hours

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

Bright CRM stores contacts, companies, and deals in a flat property-value model where custom fields are first-class objects and pipeline stages are per-organization. Odoo CRM uses a relational PostgreSQL-backed model: crm.lead for leads and opportunities (with a polymorphic type field distinguishing each), res.partner for contacts and companies (a unified model), and custom fields created via Odoo Studio on the res.partner or crm.lead model. The migration maps Bright's contacts to res.partner records, Bright's companies to res.partner records of type 'company', and Bright's deals to crm.lead records where type='opportunity'. Bright's custom fields migrate as Odoo custom fields on the corresponding model — these must be pre-created in Odoo Studio before the migration run. Owner resolution uses email matching against Odoo res.users records. Bright workflow definitions, automation rules, and sequence logic do not transfer; we export them as JSON rebuild references for your Odoo administrator to reconstruct using Odoo Studio actions or server actions. The migration uses Odoo's xmlrpc/JSON-RPC API for record creation, respecting the 1 request/second rate limit on the Odoo External API for Custom-plan instances.

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

Bright logo

Bright

What's pushing teams away

  • Reporting flexibility is limited compared to enterprise payroll systems — customers needing custom analytics often bridge to external BI tools.
  • Document storage and viewer functionality lacks the polish of dedicated document management platforms, an annoyance for HR-heavy users.
  • UK-only focus means companies expanding internationally have to migrate to multi-country payroll providers like Deel, Remote, or ADP iHCM.
  • Bureau pricing scales aggressively (e.g., £329 for 10 employers, £549 for 25 employers per tax year), pushing larger payroll bureaus toward subscription-based alternatives.
  • Cloud transition is still in progress — historically a desktop-installed Windows product, customers wanting fully cloud-native payroll without local install evaluate alternatives during the transition window.

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

Each row shows how a Bright 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.

Bright

Contact

maps to

Odoo CRM

res.partner (type='contact')

1:1
Fully supported

Bright contacts map directly to Odoo res.partner records with type='contact'. The company_id field is set by resolving Bright's primary company association via the contact-to-company link table. If a Bright contact has no associated company, the contact lands as a standalone res.partner with no parent_id set. Email and name fields are transferred as-is to maintain contact identity.

Bright

Company

maps to

Odoo CRM

res.partner (type='company')

1:1
Fully supported

Bright companies map to Odoo res.partner records with type='company'. The company_id on child contacts points to this record's id. Parent-child company hierarchies in Bright map via res.partner's parent_id field, preserving organizational structure. Industry, website, and employee count are transferred to the corresponding Odoo fields on the res.partner record.

Bright

Deal

maps to

Odoo CRM

crm.lead (type='opportunity')

1:1
Fully supported

Bright deals map to Odoo crm.lead records where type='opportunity'. The crm.lead.name field holds the deal name, expected_revenue holds the amount, and team_id routes the record to the correct Odoo sales team. Close date maps to date_deadline, and probability values are transferred to maintain deal scoring consistency across the migration.

Bright

Lead (pre-deal contact)

maps to

Odoo CRM

crm.lead (type='lead')

1:1
Fully supported

Bright contacts that have not yet entered a deal map to Odoo crm.lead records with type='lead'. These records can later be converted to opportunities via Odoo's 'Convert to Opportunity' action, which creates a res.partner if needed and links the lead to the new opportunity record. Original Bright lifecycle_stage values are preserved in a custom field for reference.

Bright

Pipeline

maps to

Odoo CRM

crm.team

1:1
Fully supported

Each Bright pipeline becomes an Odoo crm.team. The crm.team defines the sales team, its member list, and the pipeline view. Stage records (crm.stage) are created under each team with the Bright stage names as stage names. Team_id on crm.lead records routes opportunities to the correct team-based Kanban view in Odoo.

Bright

Pipeline Stage

maps to

Odoo CRM

crm.stage

1:1
Fully supported

Bright stage names map to Odoo crm.stage records by team. Probability values and sequence orders are preserved. Custom stage colors from Bright are not transferable and must be reconfigured in Odoo's Studio. Stage IDs are recorded in the migration config for explicit mapping during the lead migration phase.

Bright

Activity (call, email, meeting)

maps to

Odoo CRM

crm.activity + mail.message

1:1
Fully supported

Bright activity records map to Odoo crm.activity entries logged against the crm.lead, and mail.message records for the communication history. Original timestamps and owner_id are preserved via the Odoo mail.message model. Activity type (call, email, meeting) is stored in the crm.activity.activity_type_id field using Odoo's activity type configuration.

Bright

Note

maps to

Odoo CRM

mail.message (note subtype)

1:1
Fully supported

Bright notes migrate as Odoo mail.message records with subtype='note' attached to the corresponding res.partner or crm.lead. Rich-text formatting is preserved as HTML in the body field. Author information is set to the migrated Odoo user who owns the note, with create_date matching the original Bright note timestamp for audit continuity.

Bright

Attachment / File

maps to

Odoo CRM

ir.attachment

1:1
Fully supported

Bright file attachments are downloaded and re-uploaded to Odoo as ir.attachment records with res_model set to 'crm.lead' or 'res.partner' and res_id referencing the target record. The original filename and file content are preserved. Attachment metadata including create_date and author is transferred to maintain document provenance in the Odoo filestore.

Bright

Custom Field (Bright-specific)

maps to

Odoo CRM

ir.model.fields (custom)

1:1
Fully supported

Bright custom fields must be pre-created in Odoo Studio before migration. FlitStack generates a field creation plan naming each custom field's Odoo model (crm.lead or res.partner), field type (char, selection, float, etc.), and any required selection values. Data is then mapped into these custom fields during the migration run. Selection field values include the full Bright pick-list options for dropdown compatibility.

Bright

User / Owner

maps to

Odoo CRM

res.users

1:1
Fully supported

Bright owner IDs are resolved by email matching against Odoo res.users records. Unmatched owners are flagged before migration; your team either invites them to Odoo first or assigns records to a fallback Odoo user designated during pre-flight. Owner resolution failures prevent data integrity issues by ensuring every migrated record has a valid user_id reference.

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.

Bright logo

Bright gotchas

Medium

CIS deduction rates are employee-specific and must transfer as discrete fields

High

No bulk document export API forces manual file downloads

Low

Leave entitlement balances require separate export alongside the request history

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

  • Odoo crm.lead is polymorphic — lead vs. opportunity type requires explicit mapping

    Bright uses a single deal object for all pipeline records. Odoo crm.lead has a type field ('lead' or 'opportunity') that determines which Kanban column the record appears in and which view context applies. Bright leads without a deal map to crm.lead with type='lead'; Bright deals map with type='opportunity'. If a Bright record transitions from lead to deal, two crm.lead records exist — one for each state — and both must be mapped so Odoo's 'Convert to Opportunity' action works correctly when users open the record.

  • Odoo External API rate limit is 1 request per second on Custom-plan instances

    The Odoo forum documents a 1 request/second rate limit enforced on the External API for Odoo Online and Odoo.sh instances on the Custom plan. Bright data exports can contain tens of thousands of records. FlitStack batches Odoo writes using xmlrpc/jsonrpc, honouring the rate limit and using Odoo's ORM create() with a list of records per call where possible to stay within throughput constraints. Community/self-hosted Odoo has no enforced API rate limit, which can accelerate large migrations significantly.

  • Bright pipeline stage names require explicit value mapping — no auto-match to Odoo defaults

    Bright pipeline stages are custom-named per organization with no fixed enumeration. Odoo crm.stage records are created per team and have unique integer IDs that differ between Odoo instances. A direct map of stage names to Odoo's default New, Qualified, Proposition, Won, Lost stages will not preserve Bright's custom stage names. We create crm.stage records under each crm.team using Bright's exact stage names and map the stage IDs explicitly. Stage probability values are also carried over if Bright stores them.

  • Custom fields must be pre-created in Odoo Studio before migration data lands

    Bright custom fields are first-class objects with a defined type. Odoo requires custom fields to be declared in the system before data can be written to them. We generate a custom field creation plan (naming the model, field name, type, and any selection values) so your Odoo administrator can create them in Studio before the migration run. Data is held in a staging layer and written to the custom fields once the schema is confirmed.

  • Multi-company contact associations collapse to a single company_id in Odoo

    Bright supports N:N contact-to-company associations natively, where one contact belongs to multiple organizations. Odoo res.partner uses a single company_id foreign key — a contact has one primary company. We migrate the most-recently-associated company as the primary and surface the remaining associations as a custom junction model or a note on the contact record. Your admin decides whether to use the Contact Dependencies module to represent the full N:N graph in Odoo.

Migration approach

Six steps for a successful Bright to Odoo CRM data migration

  1. Export Bright data via API and generate Odoo field creation plan

    FlitStack extracts all Bright contacts, companies, deals, activities, and attachments via the Bright REST API. We generate a field-level extraction including custom field definitions. Simultaneously, we produce an Odoo field creation plan listing every custom field to be created via Studio (model name, field label, field type, selection values) so your Odoo administrator can pre-build the schema before the migration run. No data moves until the schema is confirmed.

  2. Resolve owners and create crm.team / crm.stage structure

    Bright owner IDs are matched against Odoo res.users records by email address. Unmatched owners are flagged in a pre-flight report; your team either creates the Odoo user first or designates a fallback owner. We also create the Odoo crm.team and crm.stage records using Bright pipeline names and stage labels, applying any Bright stage probabilities to the Odoo stage probability field.

  3. Migrate companies and contacts in dependency order

    Odoo's relational model requires companies (res.partner type='company') to exist before contacts (res.partner type='contact') can reference them via company_id. We sequence the migration carefully: companies first, establishing the parent records; then contacts with company_id resolved to the migrated company id; then deals with partner_id and company_id resolved to their corresponding Odoo records. Parent-company references are resolved using foreign key ordering so no orphaned records land in Odoo. This dependency chain prevents referential integrity violations during the write phase.

  4. Run a sample migration with field-level diff

    A representative slice — typically 100–500 records spanning contacts, companies, deals, and activities — is migrated first. We generate a field-level diff showing the exact value in Bright versus the value written to Odoo for every mapped field. This diff lets you verify stage mapping accuracy, confirm owner resolution is working, and validate custom field population. You approve the sample before the full run commits, catching mapping errors early rather than discovering them after processing thousands of records.

  5. Full migration with delta-pickup window and rollback readiness

    The full migration runs against your Odoo instance using the validated mappings from the sample phase. A delta-pickup window of 24–48 hours captures any records created or modified in Bright during the cutover period. Every operation is logged to an audit trail tracking source record, destination record, and field mappings applied. If reconciliation reveals unexpected gaps or data quality issues, one-click rollback reverts the Odoo instance to its pre-migration state using the audit log, allowing you to correct mappings and re-run without leaving residual data in the system.

Platform deep dives

Context on both ends of the pair

Bright logo

Bright

Source

Strengths

  • Integrated RTI payroll submissions for UK construction companies under the CIS scheme
  • Clock-in and timesheet tracking with leave management in a single platform
  • CIS verification and deduction calculation built directly into the payroll workflow
  • Support team rated highly in G2 reviews for setup and query resolution

Weaknesses

  • Document storage interface lacks the polish of dedicated document management tools
  • Reporting flexibility is limited compared to standalone payroll systems
  • Pricing and tier structure is not publicly documented in a standard pricing page
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. All 8 core objects map 1:1 between Bright and Odoo CRM.

B

Overall complexity

Standard migration

Derived from compatibility, mapping clarity, API constraints, and data volume across Bright and Odoo CRM.

  • Object compatibility

    A

    All 8 core objects map 1:1 between Bright and Odoo CRM.

  • 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

    Bright: Not publicly documented.

  • Data volume sensitivity

    B

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

Estimator

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

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

Can't find your answer?

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

Book a free 30 minute consultation

Most Bright-to-Odoo CRM migrations complete in 48–72 hours of clock time for under 50,000 records, accounting for API throttling and schema validation steps. Larger setups exceeding 200,000 records or with complex multi-company contact associations extend to 5–10 days. The longest planning step is Odoo Studio field creation for Bright custom properties; the migration run itself is bound by Odoo's 1 request/second rate limit on Custom-plan instances, which determines the maximum throughput regardless of record count complexity.

Adjacent paths

Related migrations to explore

Ready when you are

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