CRM migration
Field-level mapping, validation, and rollback between Dentally and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Dentally
Source
Odoo CRM
Destination
Compatibility
9 of 11
objects map 1:1 between Dentally and Odoo CRM.
Complexity
BStandard
Timeline
48–72 hours
Overview
Dentally and Odoo CRM serve fundamentally different data models. Dentally is a dental-practice management system: its core entities are patients, appointments, treatment plans, recall campaigns, and invoices — with clinical charting fields, medical alerts, and practitioner assignments baked into every record. Odoo CRM's model centres on leads, opportunities, and contacts, with a pipeline kanban, activity scheduling, and a quotation system that pulls from the Sales app. There is no Odoo-native dental module in the standard install, so Dentally's clinical data maps to Odoo as custom fields on res.partner — the records move but the semantic structure changes. FlitStack AI extracts Dentally data via the XML-RPC API with pagination and rate-limit awareness, deduplicates multi-site patient records by email and phone, creates Odoo custom fields for every non-standard Dentally property, maps practitioner names to Odoo sales team members, and sequences the import through Odoo's API in dependency order: partners first, then leads, then activities. Recall campaigns, appointment reminders, and clinical workflow automations do not transfer — those require Odoo's Email Marketing module and Automation rules to be designed and configured post-migration. We run a sample migration against a small batch (50–200 records) with a field-level diff before committing the full dataset, and we capture a 24–48 hour delta window so any patients created in Dentally during the cutover are backfilled into Odoo before 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 Dentally 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.
Dentally
Patient
Odoo CRM
res.partner
1:1Dentally patients map directly to Odoo res.partner records. Patient name, email, phone, and full address are stored on the partner record. Dentally's patient_id is stored as x_source_id for delta-run traceability. Multi-site patients with the same email across Dentally databases are deduplicated and flagged for review before insertion.
Dentally
Patient (medical_alert, medical_history)
Odoo CRM
res.partner custom fields
1:1Dentally clinical data — medical alerts, medical history, clinical notes, and charting information — has no native Odoo CRM equivalent. We create Char/Text custom fields on res.partner (x_medical_alert, x_clinical_notes) via Odoo Settings > Technical > Models. These fields preserve the data for reference but lose semantic structure.
Dentally
Appointment
Odoo CRM
mail.activity
1:1Dentally appointments map to Odoo mail.activity records linked to res.partner. Appointment date, time, duration, status, and practitioner name populate the activity fields. The activity_type_id is set to 'Reminder' or 'Call' based on appointment type. Historical completed appointments migrate as logged activities; future appointments create scheduled Odoo activities.
Dentally
Appointment (practitioner)
Odoo CRM
crm.team / res.partner
1:1Dentally practitioner names map to Odoo sales team members. Each unique practitioner in Dentally is matched by name/email to an existing Odoo user — if no match exists, the practitioner is stored as a custom field on the activity (x_dentist_name) for admin assignment post-migration. Team structure is planned in advance.
Dentally
Recall Campaign
Odoo CRM
No Odoo equivalent (email_marketing module required)
1:1Dentally recall campaigns — automated hygiene reminders, check-up sequences, post-treatment follow-ups — have no structural equivalent in Odoo CRM. We export the campaign configuration (type, interval, message templates) as a structured JSON data package. Rebuilding requires Odoo's Email Marketing app, contact segmentation by last-appointment date, and Automation rules — scoped as a post-migration configuration task.
Dentally
Treatment Plan / Treatment Item
Odoo CRM
res.partner custom fields + sale.order
many:1Dentally treatment plans and individual treatment items (with status, fee, and notes) map to a combination of res.partner custom fields (x_treatment_plan, x_last_treatment) and sale.order records in Odoo's Sales app. If the Odoo Sales app is not installed, treatment history is stored entirely as custom fields. Treatment items with pricing are surfaced as sale.order.line records linked to the partner.
Dentally
Invoice / Payment Record
Odoo CRM
res.partner custom fields (+ account.move if Accounting installed)
many:1Dentally invoice records — invoice number, date, total, status (paid/unpaid/overdue), and outstanding balance — are mapped to res.partner custom fields (x_last_invoice_date, x_invoice_status). If Odoo Accounting is installed, we link to account.move records. Patient invoice history is preserved as a JSON blob in a notes field for financial reference. Note: Odoo invoicing is a separate module — if not present, invoice data migrates as reference text only.
Dentally
Patient Custom Fields
Odoo CRM
res.partner custom fields
1:1Dentally supports custom fields on patients via Settings > Custom Fields. Each custom field (text, tick box, dropdown) is created as a matching custom field on res.partner in Odoo via Settings > Technical > Fields before migration. Dropdown/preset-option fields require Odoo selection fields with matching values — we map the pick-list values explicitly.
Dentally
Practice / Site
Odoo CRM
res.company or crm.team
1:1Dentally supports multiple sites (separate practice databases). In Odoo, multi-site setups consolidate into one res.company record with crm.team used to segment pipeline by location. If separate legal-entity accounting per site is required, we create multiple res.company records and map patients to the correct company via a custom field. This requires Odoo admin planning before migration.
Dentally
Dentally Portal Settings
Odoo CRM
No equivalent in Odoo CRM
1:1Dentally Portal — patient-facing online booking, digital forms, and payment portal — has no direct Odoo CRM equivalent. Online booking requires Odoo's Website + Appointments module (separate install). We document the Dentally Portal configuration so it can inform the Odoo Website builder setup. Form templates are exported as reference data for rebuilding in Odoo Studio.
Dentally
Dentally Vision (imaging)
Odoo CRM
No equivalent in Odoo CRM
1:1Dentally Vision integrates digital imaging (X-rays, intraoral scans) directly within the practice management workflow. Odoo has no native imaging module. We export image file references and any associated metadata as a file manifest, noting that image files require a separate document management strategy — Odoo Documents app or an external PACS system.
| Dentally | Odoo CRM | Compatibility | |
|---|---|---|---|
| Patient | res.partner1:1 | Fully supported | |
| Patient (medical_alert, medical_history) | res.partner custom fields1:1 | Fully supported | |
| Appointment | mail.activity1:1 | Fully supported | |
| Appointment (practitioner) | crm.team / res.partner1:1 | Fully supported | |
| Recall Campaign | No Odoo equivalent (email_marketing module required)1:1 | Fully supported | |
| Treatment Plan / Treatment Item | res.partner custom fields + sale.ordermany:1 | Fully supported | |
| Invoice / Payment Record | res.partner custom fields (+ account.move if Accounting installed)many:1 | Fully supported | |
| Patient Custom Fields | res.partner custom fields1:1 | Mapping required | |
| Practice / Site | res.company or crm.team1:1 | Fully supported | |
| Dentally Portal Settings | No equivalent in Odoo CRM1:1 | Fully supported | |
| Dentally Vision (imaging) | No equivalent in Odoo CRM1: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.
Dentally gotchas
API rate limits are undocumented and require a support request
Dentally manages inbound migrations rather than offering self-service export
Final migration runs the day before go-live, leaving a narrow correction window
Dentally Vision imaging requires separate product setup
Tier-gated features may be inactive in the migrated environment
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
Extract Dentally data via XML-RPC API with pagination and rate-limit awareness
FlitStack connects to Dentally using the XML-RPC API with read-only credentials scoped to the account's patient, appointment, invoice, treatment, and custom-field data. We paginate through all records in batches, storing pagination cursors between runs to handle interruptions gracefully. Rate-limit headers are respected with exponential backoff. For multi-site accounts, we run a separate extraction per site and tag each record with its source site ID for Odoo res.company assignment later. A data manifest is generated listing record counts per object, any extraction errors, and the time-stamp of the last record pulled.
Analyze Dentally schema and plan Odoo custom field creation
We inspect every Dentally custom field definition (type, required flag, pick-list options) and map each to an Odoo custom field definition on res.partner, mail.activity, or crm.lead. For clinical fields (medical_alert, clinical_notes, charting metadata) and recall campaign data with no Odoo equivalent, we flag these as custom_field_required and prepare the field creation plan. For multi-site accounts, we work with your Odoo admin to define the res.company and crm.team structure before any records are written. This step produces a written schema plan that your Odoo admin approves before we touch the Odoo database.
Deduplicate multi-site patient records and clean data
Dentally allows the same patient to appear in multiple site databases. In Odoo, res.partner has no multi-database concept — one email address equals one partner record. We deduplicate by matching email addresses first, then phone numbers as a secondary signal. Duplicates are surfaced in a review report with both Dentally records visible so your team decides which is the canonical record. Address formatting, phone number formatting, and null/missing required fields are standardised before insertion. Any patient without an email or phone is flagged for manual review.
Run sample migration and generate field-level diff
A representative sample (50–200 records spanning patients, appointments, treatment plans, and invoices) is migrated first into a staging Odoo database. We generate a field-level diff showing every Dentally source value against its Odoo destination field — including custom fields, mapped activity types, and practitioner assignments. You review the diff and confirm the mapping before we commit to the full run. Any mapping adjustments (field type corrections, pick-list value additions, practitioner-to-user matching refinements) are incorporated before the production migration.
Execute full migration with delta pickup window and audit log
The full dataset loads into Odoo via the XML-RPC API in dependency order: res.partner first (with custom fields created), then crm.lead, then mail.activity records linked to partners. Every operation is logged with sourceDentally ID, destination Odoo ID, timestamp, and operator. A 24–48 hour delta pickup window runs after the main load: any patient created or modified in Dentally during the cutover window is captured and inserted into Odoo before go-live. One-click rollback reverts all FlitStack-written records if reconciliation fails. The final deliverable includes an audit CSV listing every migrated record and its Odoo ID.
Platform deep dives
Dentally
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. All 8 core objects map 1:1 between Dentally and Odoo CRM.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Dentally and Odoo CRM.
Object compatibility
All 8 core objects map 1:1 between Dentally 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
Dentally: Not publicly documented; practices requiring higher limits must request them via Dentally support.
Data volume sensitivity
Dentally 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 Dentally to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Dentally 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 Dentally
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.