CRM migration
Field-level mapping, validation, and rollback between Membrain and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Membrain
Source
Odoo CRM
Destination
Compatibility
10 of 12
objects map 1:1 between Membrain and Odoo CRM.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Moving from Membrain to Odoo CRM is a migration from a structured, methodology-enforcing B2B sales platform to an open-source ERP with a bundled CRM module. Membrain's layered object model (Companies, Contacts, Prospects, Sales Projects, Account Growth Projects) maps to Odoo's res.partner, crm.lead, and crm.opportunity objects, but the mapping requires resolving Membrain's GUID-prefixed custom field names, Lite user ownership blocks, and the fact that Odoo CRM ships with a single pipeline by default while Membrain allows fully custom stages per Sales Project type. We extract data via Membrain's paid API add-on, build a GUID-to-label lookup table before any transform, and load into Odoo via XML-RPC or CSV import. Automations, Flows, Content Hub binary assets, and coaching tools do not migrate; we deliver a written inventory of Membrain automations for the customer's Odoo admin to rebuild in Studio or via Python modules.
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 Membrain 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.
Membrain
Company
Odoo CRM
res.partner
1:1Membrain Company records map to Odoo res.partner with is_company=True. Standard address, industry, and owner fields migrate directly. Company name becomes the partner display name. We deduplicate by company name and domain on import. The partner is created before any related Contact import so that the child_contact relationship is satisfied.
Membrain
Contact
Odoo CRM
res.partner
1:1Membrain Contact records map to Odoo res.partner with is_company=False and parent_id set to the mapped Company partner. Email, phone, title, and custom fields migrate directly. Deduplication runs on email address with a fuzzy match fallback on name for records without email. The child-contact relationship in Odoo uses parent_id on res.partner rather than a separate contact object.
Membrain
Prospect
Odoo CRM
crm.lead
1:1Membrain Prospects (from the Prospecting module) map to Odoo crm.lead with type=lead. Prospects carry their own lifecycle stages and custom fields which map to crm.lead stage and custom stage fields. If Odoo Enterprise is in use, the lead_source field captures the original prospect origin. Prospects without an assigned Company map as standalone leads.
Membrain
Sales Project
Odoo CRM
crm.opportunity
1:1Membrain Sales Projects map to Odoo crm.opportunity. Company links to the mapped res.partner, primary Contact to the mapped res.partner child contact, deal value to planned_revenue, expected close date to date_deadline, and owner to the mapped Odoo user. The Odoo opportunity is created after its Company and Contact parents so that partner_ids and partner_id lookups resolve correctly.
Membrain
Account Growth Project
Odoo CRM
crm.opportunity + custom fields
1:1Membrain Account Growth Projects track expansion work at the Company level. We map these to Odoo crm.opportunity with type=opportunity and a custom field account_growth_source=True to distinguish them from Sales Projects. Custom fields specific to account growth (expansion targets, account plan status) migrate to custom opportunity fields created in Odoo before import.
Membrain
Sales Project Stage
Odoo CRM
crm.stage
lossyMembrain's custom stage names and probabilities per Sales Project type map to Odoo crm.stage records within the appropriate sales team. Stage sequence and probability percentages transfer to stage_sequence and legend_priority. Odoo stages are global across teams by default; if the customer requires team-scoped stages, we configure sales.team stage_relace_ids during setup.
Membrain
Activity: Appointment
Odoo CRM
calendar.event
1:1Membrain Appointment records map to Odoo calendar.event linked to the migrated crm.lead or crm.partner. Start datetime, duration, location, and description migrate directly. Attendees resolve via the mapped Contact and User records and are created as calendar.attendee entries.
Membrain
Activity: Call
Odoo CRM
crm.phonecall
1:1Membrain Call records map to Odoo crm.phonecall (an optional Odoo module that must be installed before migration). Call duration, disposition, and notes migrate to phonecall fields. The call is linked to the mapped partner and opportunity via partner_id and opportunity_id. If crm.phonecall is not installed in the destination Odoo instance, calls migrate as crm.lead activities instead.
Membrain
Activity: Note
Odoo CRM
mail.message
1:1Membrain Notes map to Odoo mail.message records posted on the res.partner or crm.lead timeline. Rich text body migrates as HTML content. The message author resolves to the mapped Odoo user by email. Notes attached to a specific record carry that record's model and res_id in the mail.message link.
Membrain
Activity: Email
Odoo CRM
mail.mail
1:1Membrain Email records (sent from within Membrain) map to Odoo mail.mail linked to the res.partner recipient. Email body, subject, and timestamp migrate. Emails sent outside Membrain (e.g., via Outlook) that were logged as engagements migrate as mail.message records rather than mail.mail since Odoo cannot receive external emails without IMAP sync configuration.
Membrain
Activity: Task
Odoo CRM
project.task
1:1Membrain Tasks map to Odoo project.task linked to the migrated crm.lead or res.partner. Task name, description, due date, priority, and assigned user migrate. If the destination Odoo instance has the project module installed, tasks live in the project context; otherwise they migrate as CRM activities.
Membrain
Custom Fields
Odoo CRM
ir.model.fields (custom)
lossyMembrain custom fields use CustomField{GUID} property names that contain no human-readable label in the data payload. We query Membrain's custom field definitions first to build a GUID-to-label lookup table, then create matching custom fields in Odoo via developer mode or the res.config.settings interface before data import. Field types map from Membrain's type (text, number, date, picklist) to Odoo's corresponding field type (char, float, datetime, selection). Custom fields on Activities (Appointments, Calls, Notes) require the relevant Odoo module to be installed and the custom field created on the correct model.
| Membrain | Odoo CRM | Compatibility | |
|---|---|---|---|
| Company | res.partner1:1 | Fully supported | |
| Contact | res.partner1:1 | Fully supported | |
| Prospect | crm.lead1:1 | Fully supported | |
| Sales Project | crm.opportunity1:1 | Fully supported | |
| Account Growth Project | crm.opportunity + custom fields1:1 | Fully supported | |
| Sales Project Stage | crm.stagelossy | Fully supported | |
| Activity: Appointment | calendar.event1:1 | Fully supported | |
| Activity: Call | crm.phonecall1:1 | Fully supported | |
| Activity: Note | mail.message1:1 | Fully supported | |
| Activity: Email | mail.mail1:1 | Fully supported | |
| Activity: Task | project.task1:1 | Fully supported | |
| Custom Fields | ir.model.fields (custom)lossy | Mapping required |
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.
Membrain gotchas
API access is a paid add-on with undocumented rate limits
Custom field GUID naming convention breaks standard field mappers
Lite accounts cannot own records or trigger automations
Modular product gating means not all features are available in every account
Sales Project stage definitions are per-pipeline and fully custom
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 Membrain API probe
We audit the source Membrain account for active modules (Prospecting, Active Pipeline, Account Growth, Elevate), custom field definitions (building the GUID-to-label lookup table), user license distribution (Full vs Lite), Sales Project type count and stage definitions, and activity volume by type. We also probe the Membrain API with controlled request batches to establish safe throughput given the undocumented rate limits on the API add-on tier. The discovery output is a written migration scope, a custom field manifest with GUID labels, and a recommendation on Odoo edition (Community vs Enterprise) based on the customer's pipeline and activity requirements.
Odoo environment setup and custom field creation
We provision the destination Odoo instance (self-hosted or Odoo.sh) and install required modules: CRM, Phone Call (for call activity migration), Calendar (for meeting migration), and Project (for task migration). We create all custom fields identified in the Membrain audit via Odoo developer mode, matching field types and adding selection options for picklist fields. We configure sales teams (crm.team) for each Membrain Sales Project type and create the corresponding stage sequences in crm.stage.
GUID resolution and data extraction
We run the Membrain API extraction using the established rate-limit-safe batch size, applying the GUID-to-label lookup table to every custom field in the payload. Records are extracted in dependency order: Companies first (for res.partner parent records), Contacts next (for child res.partner), Prospects (for crm.lead), Sales Projects (for crm.opportunity), Account Growth Projects (for crm.opportunity), then Activities. Lite user-owned records are flagged and remapped to the designated Full user before export.
Test migration to Odoo staging
We run a full test migration into the Odoo staging environment with production data volume. The customer reconciles record counts, spot-checks 25-50 records per object against the Membrain source, and reviews the activity timeline rendering in Odoo. Custom field data is validated for type correctness (dates are dates, picklists are valid selection values). Mapping corrections and stage mapping refinements happen in staging, not production.
Production migration in dependency order
We run the production migration in record-dependency order: res.partner companies first, res.partner contacts with parent_id resolved, crm.lead Prospects, crm.opportunity Sales Projects and Account Growth Projects with partner_id and user_id resolved, then Activities (calendar.event, crm.phonecall, mail.message, project.task) with their parent record references satisfied. Each phase emits a row-count reconciliation report. The Membrain source is placed in read-only mode during the production migration window.
Cutover, validation, and automation handoff
We run a final delta migration of any records created or modified in Membrain during the cutover window, then enable Odoo as the system of record. We deliver the automation inventory document listing every active Membrain automation with its trigger, conditions, and recommended Odoo Studio or Python module equivalent. We do not rebuild Membrain automations inside the migration scope; that work is handled by the customer's Odoo admin or a certified Odoo partner. We provide a one-week hypercare window for reconciliation issues.
Platform deep dives
Membrain
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 Membrain 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
Membrain: Not publicly documented — depends on instance type and API Add-on module.
Data volume sensitivity
Membrain 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 Membrain to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Membrain 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 Membrain
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.