CRM migration
Field-level mapping, validation, and rollback between Dent-O-Soft and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Dent-O-Soft
Source
Odoo CRM
Destination
Compatibility
11 of 12
objects map 1:1 between Dent-O-Soft and Odoo CRM.
Complexity
BStandard
Timeline
48–72 hours
Overview
Dent-O-Soft stores dental practice data — patients, appointments, treatment plans, billing records, and supplier contacts — in a clinical management schema that differs fundamentally from Odoo CRM's business relationship model. FlitStack AI's migration engine extracts Dent-O-Soft records via the platform's API, transforms each patient record into an Odoo res.partner contact, maps appointment timestamps to Odoo mail.activity records, and surfaces treatment histories as custom fields (x_treatment_history, x_primary_insurance, x_dental_provider) on the contact form. The migration handles Dent-O-Soft's multi-address practitioner records and supplier contacts by splitting them into separate Odoo contacts with a custom contact_type tag. Foreign-key resolution runs before the main import so that Odoo's parent-company hierarchy (parent_id on res.partner) builds correctly. After the bulk load, a 24–48 hour delta window catches appointments scheduled during the cutover. FlitStack does not migrate clinical workflow rules, imaging files stored in Dent-O-Soft's imaging module, or billing transaction history — those require separate export-for-rebuild workflows documented in the post-migration handoff package.
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 Dent-O-Soft 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.
Dent-O-Soft
Patient
Odoo CRM
res.partner
1:1Dent-O-Soft patient records map directly to Odoo res.partner contacts. The patient's full name splits into firstname and lastname on res.partner. Email, phone, and address fields map 1:1 to their Odoo counterparts. Dent-O-Soft's patient_id becomes x_source_patient_id custom field for traceability and delta-run de-duplication, ensuring that repeated migration runs do not create duplicate contacts in Odoo.
Dent-O-Soft
Patient Insurance
Odoo CRM
res.partner (custom fields)
1:1Insurance provider name, policy number, and group number from Dent-O-Soft patient records migrate to custom fields x_primary_insurance_provider and x_insurance_policy_number on res.partner. Secondary insurance maps to x_secondary_insurance_provider as additional text fields. All insurance fields preserve the original Dent-O-Soft values exactly as entered, including any formatting or special characters present in the source data.
Dent-O-Soft
Treatment History
Odoo CRM
res.partner (custom field)
1:1Dent-O-Soft stores procedure codes, dates, and notes in a treatment history table with multiple rows per patient. FlitStack concatenates this into a structured text block stored in x_treatment_history__c in Enterprise or x_treatment_history on Community, preserving the date, procedure code, and dentist name for each entry. Entries are separated by newlines for readability and searchability within the Odoo interface.
Dent-O-Soft
Appointment
Odoo CRM
mail.activity
1:1Dent-O-Soft appointment records containing date, time, practitioner, procedure_type, and status map to Odoo mail.activity entries linked to the patient res.partner. Activity type defaults to 'appointment' using mail.activity.type configuration, with the original appointment datetime stored in activity_date_deadline and appointment notes preserved in the activity note field including any HTML formatting that exists in the source records.
Dent-O-Soft
Practitioner / Dentist
Odoo CRM
res.partner
1:1Dentists and hygienists in Dent-O-Soft migrate as separate res.partner records tagged with contact_type = 'practitioner' using a custom x_contact_category field. Their professional credentials store in x_credential, license numbers in x_license_number, and specialty designations in x_specialty custom fields on the partner record for complete practitioner profiles in Odoo.
Dent-O-Soft
Supplier / Lab
Odoo CRM
res.partner
1:1Dental labs and material suppliers from Dent-O-Soft map to res.partner with supplier = True flag set on the partner record. Contact type set to 'supplier' in the x_contact_category custom field. Primary contact person name, email, and phone map directly to the corresponding res.partner fields, while lab-specific flags like is_lab store in x_is_dental_lab custom field.
Dent-O-Soft
Emergency Contact
Odoo CRM
res.partner
1:manyDent-O-Soft patients can have multiple emergency contacts stored as separate related table rows. Each emergency contact row becomes its own res.partner record with contact_type = 'emergency' in the x_contact_category field and a parent_id link back to the patient partner record using Odoo's child contact relationship. The relationship type between patient and emergency contact stores in x_emergency_relationship custom field.
Dent-O-Soft
Billing Record
Odoo CRM
account.move (reference only)
1:1Dent-O-Soft billing transactions including charges, payments, and adjustments have no direct Odoo CRM equivalent in the base CRM app. The migration preserves x_last_billing_date and x_outstanding_balance as custom Char fields on res.partner for reference. Full billing history export provided as CSV for Odoo Accounting module import, including invoice numbers, dates, amounts, and payment status for each transaction.
Dent-O-Soft
Clinical Note
Odoo CRM
mail.message
1:1Treatment notes and clinical observations stored in Dent-O-Soft map to Odoo mail.message records attached to the patient res.partner. Author resolved by practitioner email match against Odoo system users. The body field preserves original note text exactly as entered, including any clinical terminology or formatting, with the creation datetime matching the original Dent-O-Soft timestamp to maintain clinical record chronology.
Dent-O-Soft
Appointment Reminder
Odoo CRM
base.automation rule
1:1Automated reminder rules configured in Dent-O-Soft have no Odoo equivalent that migrates automatically between the two platforms. FlitStack exports reminder configuration as a structured JSON document that Odoo administrators use to rebuild automation rules in Odoo's base.automation or mail.activity.plan framework. The export includes trigger conditions, timing offsets, notification channels, and recipient filters from the source system.
Dent-O-Soft
Practice Setting
Odoo CRM
res.company
1:1Multi-location dental practices using Dent-O-Soft's practice identifier system map to separate res.company records in Odoo for each physical location. Each company's name, address, and NPI or tax ID stored in standard Odoo company fields including street, city, state_id, zip, and country_id. The practice name from Dent-O-Soft maps to the res.company name field, and location-specific contact information preserves for each branch.
Dent-O-Soft
Referral Source
Odoo CRM
crm.lead (source field)
1:1Dent-O-Soft tracks referral source for new patients as a field on the patient record. This data transforms into crm.lead.source values on the original patient-contact record in Odoo, allowing practices to maintain referral tracking visibility within the CRM. FlitStack creates source tags in Odoo's crm.lead.source model matching the Dent-O-Soft referral source values, enabling reporting on referral trends by source.
| Dent-O-Soft | Odoo CRM | Compatibility | |
|---|---|---|---|
| Patient | res.partner1:1 | Fully supported | |
| Patient Insurance | res.partner (custom fields)1:1 | Fully supported | |
| Treatment History | res.partner (custom field)1:1 | Fully supported | |
| Appointment | mail.activity1:1 | Fully supported | |
| Practitioner / Dentist | res.partner1:1 | Fully supported | |
| Supplier / Lab | res.partner1:1 | Fully supported | |
| Emergency Contact | res.partner1:many | Fully supported | |
| Billing Record | account.move (reference only)1:1 | Fully supported | |
| Clinical Note | mail.message1:1 | Fully supported | |
| Appointment Reminder | base.automation rule1:1 | Fully supported | |
| Practice Setting | res.company1:1 | Fully supported | |
| Referral Source | crm.lead (source field)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.
Dent-O-Soft gotchas
No API and no documented bulk export path
On-premises deployment with limited remote access
No free trial and no published pricing
Single-language support (English) and small distribution footprint
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
Stand up Odoo custom fields and activity types before migration
FlitStack delivers a custom field manifest listing every x_ prefixed field that must exist on res.partner and mail.activity before the migration runs. This includes x_treatment_history, x_primary_insurance_provider, x_insurance_policy_number, x_date_of_birth, x_source_patient_id, and x_original_create_date. The manifest also includes activity type records that need to exist in mail.activity.type (e.g., 'Dental Appointment', 'Consultation', 'Follow-up'). Your Odoo administrator (or FlitStack's setup team) creates these in developer mode or via Studio before data begins loading. No records can import until custom fields exist — this step prevents the fallback-to-JSON scenario described in Gotcha #4.
Resolve practitioner and supplier owners by email match
Dent-O-Soft stores practitioner_id and supplier_contact_id as foreign keys. FlitStack extracts the practitioner email from Dent-O-Soft's user table and matches it against Odoo system users. Matched practitioners become the mail.activity user_id owner for their appointments. Suppliers matched by contact email become res.partner supplier records with supplier=True. Unmatched practitioners and suppliers are flagged in a pre-migration report — your team either invites them as Odoo users first or assigns their records to a fallback owner (typically the admin user). No activity or contact lands without a resolved owner.
Stage parent records (patients, practitioners, suppliers) before child records
Odoo's database requires res.partner parent records to exist before child emergency contacts can link via parent_id. FlitStack sequences the migration: first all patient partners (as main contacts), then all practitioner partners, then all supplier partners — each batch completes before the next begins. This ensures foreign-key resolution works without orphans. After the main patient batch completes, FlitStack runs a second pass to link emergency contacts to their parent patient using x_source_patient_id as the matching key.
Run sample migration with field-level diff on 200–500 patient records
A representative slice migrates first: 200–500 patient records spanning different states, insurance types, and appointment histories. FlitStack generates a field-level diff report comparing source Dent-O-Soft values against the target Odoo res.partner fields. The diff verifies custom field population, activity date mapping, emergency contact linkage, and owner resolution. You review the diff and approve before the full run commits. This step catches mis-mapped state_id values, incorrect date formats, and missing activity type records before they affect thousands of records.
Execute full migration with 24–48 hour delta-pickup window
Full record batch loads into Odoo: patients → practitioners → suppliers → emergency contacts → appointments as mail.activity records. A delta-pickup window opens at migration start and runs for 24–48 hours after the bulk load completes. Any Dent-O-Soft appointments created or modified during the cutover window are captured and loaded as supplemental mail.activity records. FlitStack's audit log tracks every insert and update. If reconciliation fails, one-click rollback reverts the Odoo database to its pre-migration state. Post-migration, FlitStack delivers the appointment reminder automation export JSON for Odoo admin to rebuild in base.automation.
Platform deep dives
Dent-O-Soft
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 1 of 8 objects need a manual workaround.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Dent-O-Soft and Odoo CRM.
Object compatibility
1 of 8 objects need a manual workaround.
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
Dent-O-Soft: N/A.
Data volume sensitivity
Dent-O-Soft 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 Dent-O-Soft to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Dent-O-Soft 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 Dent-O-Soft
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.