CRM migration
Field-level mapping, validation, and rollback between Sensei Cloud and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Sensei Cloud
Source
Odoo CRM
Destination
Compatibility
11 of 13
objects map 1:1 between Sensei Cloud and Odoo CRM.
Complexity
BStandard
Timeline
48–72 hours
Overview
Sensei Cloud stores patient records, clinical treatment plans, appointment schedules, and insurance billing data within a dental-practice management model designed for multi-location oral healthcare groups. Odoo CRM operates as a general-purpose CRM with a lead-to-opportunity pipeline model built on PostgreSQL, accessible via XML-RPC API for Community plan users. The migration extracts patient demographics and practice data from Sensei Cloud exports, translates dental-practice entities into Odoo leads and contacts, and handles unmatched dental fields as custom fields on the crm.lead model. Odoo workflow rules, automations, and pipeline stage configurations do not carry over and must be rebuilt in Odoo Studio or via the XML-RPC API. FlitStack AI sequences the migration so foreign-key relationships resolve correctly — patients become leads first, then contacts, then linked to Odoo opportunities if cross-sell activity is tracked post-migration. A delta-pickup window captures any records modified during the cutover window so Odoo reflects the final practice state at go-live.
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 Sensei Cloud 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.
Sensei Cloud
Patient Record
Odoo CRM
crm.lead
1:1Patient demographics (name, DOB, contact info) map directly to crm.lead fields. FlitStack resolves the patient record's primary contact fields into the lead's standard name and email fields. The lead type is set to 'lead' by default; contacts who already have active treatment cases can be flagged for opportunity creation.
Sensei Cloud
Patient Address
Odoo CRM
res.partner
1:1Odoo stores addresses on the res.partner model, which is shared between CRM leads, contacts, and companies. Patient addresses migrate as partner records and linked to the crm.lead via partner_id. Multi-line addresses are parsed into street, street2, city, state_id, zip, country_id fields.
Sensei Cloud
Appointment / Scheduling
Odoo CRM
crm.lead activity / calendar.event
many:1Appointment records from Sensei Cloud do not map to a single Odoo object. Past appointments migrate as crm.lead activities (mail.activity) with type 'appointment', subject containing the appointment type, and date preserved in activity_date_deadline. Upcoming scheduled appointments can generate calendar.event records if the Calendar module is installed in Odoo.
Sensei Cloud
Insurance Carrier / Payer
Odoo CRM
res.partner (type: insurance)
1:1Odoo has no native insurance carrier entity. Insurance payer names migrate as res.partner records with a custom field insurance_carrier = True. Policy numbers and group IDs map to custom char fields on the patient lead record. The partner_is_company flag is set true for carrier records.
Sensei Cloud
Treatment Plan / Procedure Code
Odoo CRM
Custom field on crm.lead
1:1CDT (Current Dental Terminology) procedure codes and treatment descriptions have no Odoo CRM equivalent. FlitStack creates a custom many2one field procedure_code_id pointing to a custom procedure_code model, and a char field treatment_description on crm.lead. Treatment case status (New, In Progress, Completed) maps to a custom picklist field.
Sensei Cloud
Clinical Notes / Tooth Chart
Odoo CRM
Custom field on crm.lead (HTML/text)
1:1Tooth chart data and per-surface clinical notes are preserved as a custom HTML field (x_clinical_notes) on crm.lead for reference. These cannot render as structured data in Odoo's standard UI but are searchable and viewable in the lead form. If clinical notes are extensive, they can alternatively be stored as Odoo attachments.
Sensei Cloud
Provider / Treating Dentist
Odoo CRM
res.users / crm.team
1:1Sensei Cloud provider names are resolved by email match against Odoo res.users records. Unmatched providers are flagged and can be set to a fallback user (practice admin) or invited to Odoo first. Provider assignment per patient record becomes a many2one user_id field on crm.lead.
Sensei Cloud
Referral Source
Odoo CRM
crm.lead / source_id
1:1Referral source (dentist referral, patient referral, marketing campaign) maps directly to Odoo's utm.source and utm.medium fields on crm.lead. If the source does not exist in Odoo, FlitStack creates it. The original referral name is preserved in a custom field for reporting continuity.
Sensei Cloud
Billing / Ledger Entry
Odoo CRM
account.move (via Accounting module)
1:manyBilling records from Sensei Cloud do not map to Odoo CRM records. Outstanding balances, payments, and adjustments migrate to Odoo Accounting (account.move) if the Accounting module is installed. Treatment ledger entries become invoice lines under account.move.line with product references mapped to Odoo product.product.
Sensei Cloud
Document / Attachment
Odoo CRM
ir.attachment
1:1File attachments (treatment consents, insurance cards, imaging exports) migrate to Odoo's ir.attachment model linked to the crm.lead record. File size limits apply per Odoo configuration (default 25MB). Imaging exports from Sensei Imaging are re-uploaded as attachments with the original filename preserved.
Sensei Cloud
Location / Practice Office
Odoo CRM
stock.warehouse or res.company
1:1Multi-location offices in Sensei Cloud map to res.company records in Odoo if the Multi-Company module is enabled (Custom plan). For single-company setups, location is stored as a custom char field on crm.lead. Warehouse records can also be used if the Inventory module is active and location-specific lead routing is needed.
Sensei Cloud
Marketing Opt-In / Consent
Odoo CRM
custom field on crm.lead
1:1Patient marketing consent flags (SMS, email, postal) migrate as boolean custom fields on crm.lead (x_consent_sms, x_consent_email). Odoo does not have a native consent management model in the CRM module; these fields are used by Odoo's email marketing tools to enforce opt-in compliance.
Sensei Cloud
Custom Dental Property
Odoo CRM
ir.model.fields (x_ prefixed)
1:1Sensei Cloud custom properties (per-practice fields created in the Sensei administration console) are inventoried during the assessment phase. Each custom property is evaluated for an Odoo standard equivalent; properties with no equivalent are created as x_ prefixed fields on crm.lead in Odoo Settings > Technical > Models.
| Sensei Cloud | Odoo CRM | Compatibility | |
|---|---|---|---|
| Patient Record | crm.lead1:1 | Fully supported | |
| Patient Address | res.partner1:1 | Fully supported | |
| Appointment / Scheduling | crm.lead activity / calendar.eventmany:1 | Fully supported | |
| Insurance Carrier / Payer | res.partner (type: insurance)1:1 | Fully supported | |
| Treatment Plan / Procedure Code | Custom field on crm.lead1:1 | Fully supported | |
| Clinical Notes / Tooth Chart | Custom field on crm.lead (HTML/text)1:1 | Fully supported | |
| Provider / Treating Dentist | res.users / crm.team1:1 | Fully supported | |
| Referral Source | crm.lead / source_id1:1 | Fully supported | |
| Billing / Ledger Entry | account.move (via Accounting module)1:many | Fully supported | |
| Document / Attachment | ir.attachment1:1 | Fully supported | |
| Location / Practice Office | stock.warehouse or res.company1:1 | Fully supported | |
| Marketing Opt-In / Consent | custom field on crm.lead1:1 | Fully supported | |
| Custom Dental Property | ir.model.fields (x_ prefixed)1: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.
Sensei Cloud gotchas
Legacy conversion leaves messy patient and chart duplicates
Chrome-only browser support affects migration workstation compatibility
Imaging data requires separate Carestream-format conversion pipeline
Billing ledger errors cannot be corrected post-creation
Provider assignments sometimes stored as text rather than foreign key
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
Assess Sensei Cloud export feasibility and scope the data extract
FlitStack AI determines whether your Sensei Cloud plan includes API access via the Developer Program or whether we work from CSV exports. We inventory all standard objects (patient records, appointments, treatment plans, insurance entries) and custom properties from your Sensei Cloud configuration. We also check the export history for any truncation on historical appointments and request extended-range exports from Sensei support if needed. This assessment produces the migration scope document that drives the rest of the process.
Configure Odoo CRM custom fields and company structure
Before data loads, FlitStack AI creates all required custom fields on the crm.lead and res.partner models: date_of_birth, insurance_policy_number, treatment_case_status, clinical_notes, consent flags, and procedure_code fields. If you have multiple practice locations and an Odoo Custom plan, we help configure the res.company records per location. For Standard plan setups, we configure the practice_location custom field for routing. Custom activity types for appointments are registered in the Odoo mail.activity.type table via xmlrpc before the migration run.
Resolve provider and contact owners by email match
Odoo requires a user_id on each crm.lead record. FlitStack AI matches treating provider emails from Sensei Cloud against existing Odoo res.users records. Unmatched providers are flagged in a pre-migration report — your team either invites them to Odoo first or assigns their patient records to a fallback owner. Insurance carrier names are resolved or created as res.partner company records with the insurance_carrier flag set. No crm.lead lands without an assigned user_id after this step.
Run sample migration with field-level diff
A representative slice of patient records (typically 100–500 across a mix of appointment types, insurance scenarios, and clinical note lengths) migrates first. FlitStack AI generates a field-level diff comparing source values against destination values for every mapped field, including custom fields. You verify that patient names, appointment dates, procedure codes, insurance policy numbers, and provider assignments landed correctly. This sample run also validates that Odoo's xmlrpc batch processing handles your record volume without worker timeouts.
Execute full migration with delta-pickup window
The full patient record set loads into Odoo crm.lead with all custom fields populated. A delta-pickup window (24–48 hours) runs concurrently — any patient records modified, new appointments added, or insurance changes made in Sensei Cloud during the cutover are captured and applied to Odoo. All operations are logged in the FlitStack audit trail. If reconciliation identifies missing records, the rollback function reverts Odoo to the pre-migration state so the delta can be re-applied cleanly.
Platform deep dives
Sensei Cloud
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. All 8 core objects map 1:1 between Sensei Cloud and Odoo CRM.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Sensei Cloud and Odoo CRM.
Object compatibility
All 8 core objects map 1:1 between Sensei Cloud 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
Sensei Cloud: Not publicly documented.
Data volume sensitivity
Sensei Cloud 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 Sensei Cloud to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Sensei Cloud 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 Sensei Cloud
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.