CRM migration

Migrate from Dentally to Odoo CRM

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

Dentally logo

Dentally

Source

Odoo CRM

Destination

Odoo CRM logo

Compatibility

82%

9 of 11

objects map 1:1 between Dentally and Odoo CRM.

Complexity

BStandard

Timeline

48–72 hours

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

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.

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

Dentally logo

Dentally

What's pushing teams away

  • Multi-site practices report hitting API rate limit ceilings that are not publicly documented and require raising a support ticket to negotiate higher thresholds.
  • Tier-gated advanced features such as full imaging integration and enhanced NHS workflows push growing practices toward the highest pricing tier sooner than expected.
  • Limited public API documentation makes it difficult to scope custom integrations or assess data portability before committing to the platform.
  • Dentally's own migration team manages inbound data transfers, meaning practices cannot self-service an export or cross-check their data independently.
  • Smaller practices on the starter tier report that the 5-user cap becomes restrictive as the team grows, creating pressure to upgrade before the software justifies the cost.

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

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

maps to

Odoo CRM

res.partner

1:1
Fully supported

Dentally 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)

maps to

Odoo CRM

res.partner custom fields

1:1
Fully supported

Dentally 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

maps to

Odoo CRM

mail.activity

1:1
Fully supported

Dentally 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)

maps to

Odoo CRM

crm.team / res.partner

1:1
Fully supported

Dentally 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

maps to

Odoo CRM

No Odoo equivalent (email_marketing module required)

1:1
Fully supported

Dentally 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

maps to

Odoo CRM

res.partner custom fields + sale.order

many:1
Fully supported

Dentally 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

maps to

Odoo CRM

res.partner custom fields (+ account.move if Accounting installed)

many:1
Fully supported

Dentally 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

maps to

Odoo CRM

res.partner custom fields

1:1
Mapping required

Dentally 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

maps to

Odoo CRM

res.company or crm.team

1:1
Fully supported

Dentally 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

maps to

Odoo CRM

No equivalent in Odoo CRM

1:1
Fully supported

Dentally 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)

maps to

Odoo CRM

No equivalent in Odoo CRM

1:1
Fully supported

Dentally 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.

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.

Dentally logo

Dentally gotchas

High

API rate limits are undocumented and require a support request

High

Dentally manages inbound migrations rather than offering self-service export

Medium

Final migration runs the day before go-live, leaving a narrow correction window

Medium

Dentally Vision imaging requires separate product setup

Low

Tier-gated features may be inactive in the migrated environment

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 XML-RPC API is record-at-a-time with no bulk import endpoint

    Odoo exposes its data model exclusively via XML-RPC. There is no native bulk-import REST endpoint equivalent to Salesforce's Bulk API or HubSpot's batch endpoints. Every res.partner, mail.activity, and custom field record must be written individually through the /xmlrpc/2/object API call. For Dentally exports with 10,000+ patient records, this means the Odoo-side load is sequential and rate-limited by Odoo's own request handling. FlitStack handles this by batching writes into Odoo's transaction model and running the migration in off-peak hours to avoid impacting Odoo user performance during business hours.

  • Dentally clinical charting and recall data have no native Odoo CRM destination

    Odoo CRM has no concept of dental patient charts, recall campaign sequences, or clinical treatment notes — these are Dentally-specific objects. When we migrate medical_alert, clinical_notes, charting metadata, and recall campaign configuration, they land as custom Char/Text fields on res.partner. The semantic structure of a Dentally recall sequence (interval, trigger, template, patient-segment) does not transfer — that data is exported as a structured JSON reference package so the Odoo admin can rebuild the recall logic in Odoo's Email Marketing + Automation rules after migration. Teams that rely heavily on automated recall sequences should budget 2–4 weeks of post-migration configuration to rebuild those in Odoo.

  • Multi-site Dentally accounts require Odoo res.company planning before migration

    Dentally supports practices with multiple surgery sites, each with separate patient databases or site-specific data segmentation. Odoo CRM by default runs a single database with one res.company. Consolidating multiple Dentally sites into Odoo requires a decision: a single res.company with crm.team used to segment by location (simpler, one accounting entity), or multiple res.company records with separate contacts (more complex, enables per-site reporting). We cannot auto-assign patients to the correct Odoo company without a site-to-company mapping defined before migration begins. This planning step adds 1–2 days to the discovery phase.

  • Dentally recall campaigns must be rebuilt as Odoo Email Marketing sequences

    A coreDentally feature — automated recall campaigns for hygiene appointments, annual check-up reminders, and post-treatment follow-up sequences — has no structural equivalent in Odoo CRM. The recall interval, patient-segment filter, message template, and trigger logic from each Dentally campaign are exported as structured data. Odoo's Email Marketing module plus Automation rules handles the rebuild, but it requires重新 configuration from scratch. We provide a recall-campaign data export spreadsheet that lists every active campaign's interval, patient criteria, and message content so the Odoo admin can replicate the logic in Odoo Studio or the Automation app.

  • Dentally API rate limits require pagination and extraction scheduling

    Dentally's XML-RPC API enforces rate limits on read requests. Multi-site Dentally accounts with large patient databases may require higher rate limits to be requested in advance via Dentally support. FlitStack's extraction layer respects pagination tokens, stores cursor positions between batches, and retries with backoff on 429 responses. For accounts with 15,000+ patient records, we schedule extraction runs outside practice hours to avoid API contention. We cannot extract complete data in a single request window for very large accounts — the migration plan documents the extraction batch schedule before migration begins.

Migration approach

Six steps for a successful Dentally to Odoo CRM data migration

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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

Context on both ends of the pair

Dentally logo

Dentally

Source

Strengths

  • Strong UK market presence with over 12,000 subscribed practices providing peer credibility and local support networks.
  • Consolidates appointment scheduling, clinical records, NHS referrals, and payments in a single cloud-based platform without on-premise hardware.
  • Native integrations with Xero, DenGro, and NHS e-referrals reduce the need for middleware or manual data re-entry.
  • Patient-facing Dentally Portal and integrated Dentally Vision imaging add capability without requiring separate vendor contracts.

Weaknesses

  • API rate limits are not publicly documented and practices with multi-site or high-volume integrations report needing to request increases through support.
  • Public API documentation is limited, making custom development and third-party integration scoping difficult before commitment.
  • Advanced features including full imaging and enhanced NHS workflows are gated behind higher pricing tiers, increasing cost as practices grow.
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 Dentally and Odoo CRM.

B

Overall complexity

Standard migration

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

  • Object compatibility

    A

    All 8 core objects map 1:1 between Dentally 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

    Dentally: Not publicly documented; practices requiring higher limits must request them via Dentally support.

  • Data volume sensitivity

    B

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

Estimator

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

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

Can't find your answer?

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 consultation

Most Dentally-to-Odoo CRM migrations complete in 48–72 hours for under 10,000 patient records. Multi-site Dentally accounts or setups with heavy clinical custom fields (charting data, recall campaign configuration, per-site invoice histories) extend to 5–7 days because Odoo custom field creation and multi-company planning add discovery time before extraction begins. The longest single step is usually the Odoo API write phase — Odoo's XML-RPC API processes records one at a time, so very large datasets require more clock time than a bulk-API platform would.

Adjacent paths

Related migrations to explore

Ready when you are

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