CRM migration
Field-level mapping, validation, and rollback between Bluwave CRM and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Bluwave CRM
Source
Odoo CRM
Destination
Compatibility
7 of 12
objects map 1:1 between Bluwave CRM and Odoo CRM.
Complexity
BStandard
Timeline
4-6 weeks
Overview
Moving from Bluwave CRM to Odoo CRM is a migration from a South African SMB-focused CRM with no public API and bundled CRM-and-Service licensing, to a modular Belgian ERP-CRM with a REST API and per-user pricing. Bluwave CRM has no documented public API, so our extraction runs through the built-in Excel export, which requires all relevant module columns to be visible before extraction. Odoo stores Contacts and Companies as a single res.partner record with a company_type flag, which means Bluwave's separate Company and Contact records must be merged or kept distinct depending on whether the customer wants a unified partner model. Deals map to Odoo Opportunities within the CRM module's pipeline stages, and face-to-face activity records carry their geocoded location as custom fields since Odoo has no native travel claim or visit-location feature. Custom fields on both sides require type inference from sample data because Bluwave does not publish a schema reference. We do not migrate workflows, automations, or report definitions as code; we deliver a written inventory of Bluwave's automation objects for the customer's admin to rebuild in Odoo's Action Rules or Studio.
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 Bluwave CRM 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.
Bluwave CRM
Contact
Odoo CRM
res.partner (company_type = contact)
1:manyBluwave Contact records with a link to a Bluwave Company map to a single Odoo res.partner record with company_type=contact and parent_id pointing to the merged Company partner. Contacts without a Company link map to res.partner with company_type=contact and no parent_id. Email, phone, mobile, address fields map directly. The Bluwave geocoded latitude/longitude appends as custom fields latitude and longitude on res.partner. We resolve the parent-company lookup before inserting Contact partners because parent_id is a required foreign key on the relationship.
Bluwave CRM
Company
Odoo CRM
res.partner (company_type = company)
1:1Bluwave Company records map to Odoo res.partner with company_type=company. The company name becomes the partner name, industry maps to industry_id via Odoo's industry picklist, and address fields map directly. This record is inserted before Contact records so that the parent_id lookup is satisfied at import time. Duplicate companies (same name) are deduped by name normalisation before insert.
Bluwave CRM
Lead
Odoo CRM
crm.lead (type = lead)
1:1Bluwave Leads map to Odoo crm.lead records with type=lead. Source attribution (how the lead entered) maps to medium_id, and lifecycle stage maps to tag_ids or a custom stage field we create during schema setup. Lead priority and rating map to priority and tag_ids on crm.lead. Owner assignment maps to user_id via email-match lookup against Odoo res.users.
Bluwave CRM
Deal
Odoo CRM
crm.lead (type = opportunity)
1:1Bluwave Deals map to Odoo crm.lead with type=opportunity. Deal value maps to planned_revenue, expected close date maps to date_deadline, stage name maps to stage_id via Odoo's crm.stage lookup, and owner maps to user_id. The associated Bluwave Contact becomes the partner_id on the Opportunity; the associated Bluwave Company becomes the partner_id parent or is resolved via contact_id. We configure the Odoo pipeline stages before migration so that stage_id references are satisfied.
Bluwave CRM
Pipeline Stage
Odoo CRM
crm.stage
lossyBluwave pipeline stage names and reorder logic are extracted during scoping and recreated as Odoo crm.stage records within the target team's pipeline. Stage probability percentages are stored on crm.stage as probability. Each Odoo crm.team gets its own stage sequence. If Bluwave uses multiple pipelines, we create multiple crm.team records in Odoo with separate stage sets.
Bluwave CRM
Activity (face-to-face visit)
Odoo CRM
mail.activity
1:1Bluwave face-to-face activities map to Odoo mail.activity records linked to the migrated crm.lead (opportunity) or res.partner. Activity type picklist values (Call, Meeting, Site Visit) are mapped to Odoo's activity_type taxonomy during scoping. Geocoded latitude/longitude from the Bluwave activity record is stored as custom fields on mail.activity since Odoo has no native visit-location feature. Travel claim associations are preserved as a note attachment or a custom field link.
Bluwave CRM
Custom Fields
Odoo CRM
ir.model.fields (custom)
lossyBluwave custom fields are inferred from exported sample data during scoping — we infer the data type (text, number, date, picklist) from content patterns and validate with a small batch before committing the full load. Each custom field becomes a custom ir.model.fields entry on the relevant Odoo model (res.partner, crm.lead, or mail.activity). Picklist values in Bluwave become selection fields or ir.model.fields.selection entries in Odoo.
Bluwave CRM
Users / Owners
Odoo CRM
res.users
1:1Bluwave Owner records are matched to Odoo res.users by email address. We extract every distinct owner referenced on Contact, Company, Deal, and Activity and create a reconciliation queue for any that have no matching Odoo user. The customer's Odoo admin provisions missing users before record migration resumes because user_id is a required foreign key on crm.lead and a displayed field on res.partner.
Bluwave CRM
Attachments
Odoo CRM
ir.attachment
1:1Bluwave file attachments on Deals and Contacts do not export via Excel. We extract them separately via the Bluwave web interface where accessible, mapping file names and linked record IDs. Each attachment becomes an ir.attachment record in Odoo linked via res_model and res_id to the target res.partner or crm.lead. Binary attachment volume is estimated during scoping to determine whether a separate file-storage step is required.
Bluwave CRM
Mail List / Segment
Odoo CRM
mailing.list + mailing.contact
1:1Bluwave mail list segments and their member Contact associations are migrated to Odoo mailing.list and mailing.contact records. The mailing.list name maps from the Bluwave segment name, and mailing.contact records are created from each member Contact. Email campaign history (send logs, open rates) does not transfer; we note the segment structure for the customer to rebuild campaign sends in Odoo's Email Marketing app post-migration.
Bluwave CRM
Companies + Contacts relationship
Odoo CRM
res.partner parent_id hierarchy
lossyBluwave stores the Company-Contact relationship as a linked pair. In Odoo, the equivalent is the parent_id field on res.partner. We build a lookup table from the Bluwave export linking each Contact to its parent Company, then set parent_id on each Contact partner during import. This preserves the account hierarchy that sales reps use to navigate from a contact up to its parent company in Odoo's kanban and list views.
Bluwave CRM
Geocoded location data
Odoo CRM
Custom latitude/longitude fields on res.partner and mail.activity
lossyBluwave geocodes addresses at entry, appending latitude and longitude to customer addresses and to face-to-face activity records. These are forward-geocoded approximations, not GPS captures at visit time. We preserve them as custom float fields on res.partner (for customer address location) and on mail.activity (for visit location). We flag these values for customer review because they represent approximate geocoding, not actual travel routes, and any travel claim accuracy depends on this distinction.
| Bluwave CRM | Odoo CRM | Compatibility | |
|---|---|---|---|
| Contact | res.partner (company_type = contact)1:many | Fully supported | |
| Company | res.partner (company_type = company)1:1 | Fully supported | |
| Lead | crm.lead (type = lead)1:1 | Fully supported | |
| Deal | crm.lead (type = opportunity)1:1 | Fully supported | |
| Pipeline Stage | crm.stagelossy | Fully supported | |
| Activity (face-to-face visit) | mail.activity1:1 | Fully supported | |
| Custom Fields | ir.model.fields (custom)lossy | Mapping required | |
| Users / Owners | res.users1:1 | Mapping required | |
| Attachments | ir.attachment1:1 | Mapping required | |
| Mail List / Segment | mailing.list + mailing.contact1:1 | Fully supported | |
| Companies + Contacts relationship | res.partner parent_id hierarchylossy | Fully supported | |
| Geocoded location data | Custom latitude/longitude fields on res.partner and mail.activitylossy | 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.
Bluwave CRM gotchas
No public API — migration relies on Excel export
Custom field schema is not publicly documented
Pricing is in ZAR with mandatory upfront training package
Geocoded location data is address-derived, not GPS-captured
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
Discovery and Excel extraction request
We audit the Bluwave CRM account across all modules (Contacts, Leads, Deals, Activities, Companies, Pipeline Stages, Custom Fields, Mail Lists). We request the customer to export each module via Bluwave's built-in Excel export, ensuring all columns are visible in the module view before export to avoid hidden fields. We receive the exported files and validate record counts, column headers, and data completeness. We also extract a list of all distinct Owner email addresses for user reconciliation, and identify any attachments accessible via the web interface for separate extraction.
Schema design and Odoo environment preparation
We design the destination Odoo schema based on the extracted Bluwave data. This includes provisioning custom fields on res.partner (latitude, longitude, and any Bluwave custom contact properties), on crm.lead (custom lead and deal fields), and on mail.activity (visit location coordinates and travel claim reference). We create the crm.stage pipeline stages matching the Bluwave pipeline structure, and configure crm.team records if multiple pipelines are in use. For self-hosted Odoo destinations, we coordinate with the customer's technical team to provision the environment before schema deployment.
Staging migration and record reconciliation
We run a first migration into an Odoo staging environment using 10–15 percent of the full record volume. We reconcile record counts (Contacts in, Leads in, Deals/Opportunities in, Activities in) against the source export totals. We spot-check 30–50 records across each object for field-level accuracy — particularly geocoded coordinates, owner assignments, and custom field values. We validate the res.partner parent_id hierarchy by selecting a random sample of Company-Contact pairs and confirming the Odoo partner shows the correct company and contact sub-record. We resolve any mapping failures before the next staging round.
User and Owner reconciliation
We extract every distinct Bluwave Owner referenced on Deals, Activities, and Contacts, and match by email against the Odoo res.users table. Any Owner without a matching Odoo user enters a reconciliation queue. The customer's Odoo admin provisions missing users (with appropriate access rights and CRM team assignments) before record import resumes. We cannot insert crm.lead records with a user_id reference that does not exist in Odoo, so this step gates the main migration.
Production migration in dependency order
We run production migration in record-dependency order: res.partner (Companies first, then Contacts with parent_id resolved), crm.lead (Leads, then Opportunities), mail.activity (Activities linked to crm.lead or res.partner), ir.attachment (files linked via res_model and res_id), and mailing lists last. Each phase emits a row-count reconciliation report. Custom field data is loaded in the same phase as its parent object. We apply Odoo's batch-commit limits and handle validation errors (type mismatches, required field gaps) by logging and retrying with corrected values from the source export.
Cutover, validation, and automation inventory handoff
We freeze Bluwave record creation during cutover and run a final delta migration for any records modified in Bluwave during the migration window. We validate record counts, parent relationships, and owner assignments in Odoo production. We deliver a written inventory of Bluwave automations, workflow rules, and report definitions for the customer's admin to rebuild using Odoo Studio or Action Rules. We support a five-business-day hypercare window to resolve any data discrepancies raised by the Odoo user team. We do not rebuild Bluwave automations as Odoo workflows within the migration scope; that is a separate engagement.
Platform deep dives
Bluwave CRM
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 2 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 Bluwave CRM and Odoo CRM.
Object compatibility
2 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
Bluwave CRM: Not publicly documented.
Data volume sensitivity
Bluwave CRM 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 Bluwave CRM to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Bluwave CRM 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 Bluwave CRM
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.