CRM migration
Field-level mapping, validation, and rollback between Curve Dental and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Curve Dental
Source
Odoo CRM
Destination
Compatibility
10 of 12
objects map 1:1 between Curve Dental and Odoo CRM.
Complexity
BStandard
Timeline
3–7 business days
Overview
Curve Dental stores a dental-practice data model centered on patients with clinical records, treatment plans, insurance details, X-ray images, and appointment schedules tied to providers. Odoo CRM operates on a generic business model that uses res.partner for contacts and companies, crm.lead for leads and opportunities, and crm.team for sales team organization, supporting quotations, activities, and document attachments. During migration, Curve patient records map to Odoo res.partner entries, appointment histories become Odoo activities linked to partner records, and treatment information transfers to custom partner fields or sale.order objects. Clinical images and X-rays move as binary attachments if Curve's export format allows. Dental-specific workflows like recall reminders and provider scheduling must be rebuilt in Odoo using the Odoo Discuss/Activities module or a dental-specific app from the Odoo Apps store. FlitStack sequences the migration to resolve foreign key dependencies — partner records load before leads — and runs a delta pickup window capturing any records modified during the cutover period to ensure data completeness 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 Curve Dental 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.
Curve Dental
Patient
Odoo CRM
res.partner
1:1Curve patients map directly to Odoo res.partner records. The patient record carries name, date of birth, contact info, address, and insurance details — all standard res.partner fields. Chart notes and clinical data stored as free-text on the patient record migrate to res.partner description or custom fields.
Curve Dental
Patient (clinical status)
Odoo CRM
crm.lead
1:manyActive treatment patients or prospects from Curve who are not yet booked as patients split into Odoo crm.lead records. Existing patients with ongoing treatment can remain as res.partner; leads for new patient acquisition become crm.lead so they can progress through Odoo's pipeline stages.
Curve Dental
Appointment
Odoo CRM
mail.activity
1:1Curve appointments (date, time, provider, procedure type, status) migrate as Odoo mail.activity records linked to the res.partner. Each activity carries the original appointment timestamp and assigned provider. Status values such as completed, cancelled, and no-show map to Odoo activity type and completion state for accurate appointment history reconstruction.
Curve Dental
Treatment Plan
Odoo CRM
sale.order
1:1Curve treatment plans containing line items and fee estimates transform into Odoo sale.order quotation records. Individual treatment procedures become sale.order.line entries with product descriptions, quantities, and unit prices preserved from the original treatment documentation. Completed treatment plans map to sale.order records with state set to sale for invoiced procedures.
Curve Dental
Insurance Record
Odoo CRM
res.partner (custom fields)
1:1Curve insurance records (carrier name, policy number, group number, subscriber relationship, eligibility status) require Odoo custom fields on res.partner since Odoo has no native insurance model. We create fields like insurance_carrier, policy_number, group_id, subscriber_name, and eligibility_expiry as char or date fields.
Curve Dental
Provider / Staff
Odoo CRM
res.users
1:1Curve provider and staff records map to Odoo res.users. Provider specialties and license numbers migrate as custom fields on res.users. Email addresses drive user matching — if a Curve provider has no email, we flag them for Odoo admin assignment before migration.
Curve Dental
Clinical Note / Chart Note
Odoo CRM
ir.attachment
1:1Curve clinical notes and chart notes stored as free-text blocks migrate as Odoo ir.attachment records with a text MIME type linked to the res.partner. Rich-text formatting simplifies to plain text during transfer; PDF chart exports from Curve attach as binary files with partner record association maintained for clinical reference access.
Curve Dental
X-ray / Image
Odoo CRM
ir.attachment
1:1Curve X-ray and intraoral image files migrate as Odoo ir.attachment records (binary) attached to the patient res.partner. File size limits on Odoo Community uploads apply — large image sets are batched. TIFF and proprietary dental imaging formats are converted to standard JPEG/PNG during migration.
Curve Dental
Recall / Appointment Reminder
Odoo CRM
mail.activity (custom type)
1:1Curve recall records (next appointment type, due date, reminder status) map to Odoo mail.activity with a custom activity type 'Recall'. We preserve the recall due date and original provider as custom fields on the activity so front-desk staff can recreate reminders in Odoo.
Curve Dental
Billing / Payment
Odoo CRM
account.move
1:1Curve billing transactions and payments map to Odoo account.move (invoices and payments) under the Odoo Accounting module. Patient billing becomes customer invoices linked to the res.partner. If Odoo Accounting is not installed in the target database, billing records migrate as custom fields on res.partner for reference.
Curve Dental
Referral Source
Odoo CRM
crm.lead.source_id
1:1Curve referral source fields documenting how the patient discovered the practice map to Odoo crm.lead source_id if Odoo CRM is installed with the Sources feature enabled in the pipeline configuration. Any referral sources not matching existing Odoo lead sources automatically create as new lead source records during the migration process.
Curve Dental
Family / Guarantor
Odoo CRM
res.partner (commercial partner)
many:1Curve guarantor records representing family members responsible for patient billing merge into Odoo res.partner using the commercial_partner_id linkage mechanism. The guarantor becomes the commercial partner on the patient contact record, preserving billing responsibility assignment without duplicating contact records across the Odoo database.
| Curve Dental | Odoo CRM | Compatibility | |
|---|---|---|---|
| Patient | res.partner1:1 | Fully supported | |
| Patient (clinical status) | crm.lead1:many | Fully supported | |
| Appointment | mail.activity1:1 | Fully supported | |
| Treatment Plan | sale.order1:1 | Fully supported | |
| Insurance Record | res.partner (custom fields)1:1 | Fully supported | |
| Provider / Staff | res.users1:1 | Fully supported | |
| Clinical Note / Chart Note | ir.attachment1:1 | Fully supported | |
| X-ray / Image | ir.attachment1:1 | Fully supported | |
| Recall / Appointment Reminder | mail.activity (custom type)1:1 | Fully supported | |
| Billing / Payment | account.move1:1 | Fully supported | |
| Referral Source | crm.lead.source_id1:1 | Fully supported | |
| Family / Guarantor | res.partner (commercial partner)many: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.
Curve Dental gotchas
Reporting timeout on large databases
Image and x-ray migration requires chunked transfer and post-migration validation
Accounts receivable balances drift after payment ledger migration
Custom form structure and Smart Forms do not export
Curve Pay dispute fee of $25 per chargeback
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 and audit Curve patient and clinical data export
FlitStack requests a full data export from Curve Dental covering patients, appointments, treatment plans, providers, insurance records, recalls, and document attachments. We audit the export schema against Curve's documented data model, identify custom fields and free-text note formats, and flag any binary files (X-rays, intraoral images) for format conversion. This step also maps Curve's internal record IDs to Odoo external identifiers so delta-run de-duplication works correctly.
Design Odoo custom fields and crm.team structure before import
Before data loads, FlitStack creates the custom fields on res.partner (insurance fields, clinical notes, date of birth, recall type) and res.users (provider specialty, license number) based on the Curve data audit. For multi-location practices, we configure crm.team records corresponding to each Curve office and assign providers to their respective teams. This schema-first approach ensures field mapping resolves at import time rather than requiring post-import corrections.
Map and load patient records to res.partner with provider resolution
Patient records load into Odoo res.partner using the CSV import path (Community) or External API (Enterprise). Provider and staff records load into res.users with email-based matching — Curve provider records without email are flagged for admin assignment. Family/guarantor relationships merge into commercial_partner_id links. Chart notes, clinical notes, and tooth-surface data write to custom text fields on the partner record. X-ray and image files upload as ir.attachment records, converting proprietary formats to JPEG/PNG where needed.
Load appointments as mail.activity records and treatment plans as sale.order
Curve appointments migrate as Odoo mail.activity entries linked to res.partner, carrying appointment date, provider (resolved to user_id), procedure type (mapped to activity type), and status. Treatment plans convert to Odoo sale.order and sale.order.line records, preserving procedure descriptions, tooth-surface notation, and fee estimates. Recall records become mail.activity entries with a custom 'Recall' activity type and due dates preserved from the Curve system.
Run sample migration with field-level diff and reconcile before full run
A representative sample — typically 200–500 patient records spanning multiple providers, with appointments, treatment plans, and insurance records — migrates first. FlitStack generates a field-level diff comparing source values against Odoo destination values so you can verify custom field mapping, provider resolution, and activity linkage before committing to the full run. Any mapping errors are corrected in the migration script before the production migration begins.
Execute full migration with delta pickup window and audit log
The full patient database migrates with a 24–48 hour delta pickup window after the initial load completes, capturing any records created or modified in Curve during the cutover period. FlitStack generates an audit log of every operation (create, update, link, attach) with source record IDs and destination Odoo IDs for traceability. One-click rollback is available if reconciliation identifies missing records or malformed links — the rollback reverts Odoo to pre-migration state while preserving the source export for a corrected re-run.
Platform deep dives
Curve Dental
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. All 8 core objects map 1:1 between Curve Dental and Odoo CRM.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Curve Dental and Odoo CRM.
Object compatibility
All 8 core objects map 1:1 between Curve Dental 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
Curve Dental: Not publicly documented.
Data volume sensitivity
Curve Dental exposes a bulk API — large-volume migrations stream efficiently.
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 Curve Dental to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Curve Dental 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 Curve Dental
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.