CRM migration
Field-level mapping, validation, and rollback between Henry Schein One and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Henry Schein One
Source
Odoo CRM
Destination
Compatibility
12 of 12
objects map 1:1 between Henry Schein One and Odoo CRM.
Complexity
BStandard
Timeline
72–120 hours
Overview
Henry Schein One is a dental-vertical practice management platform spanning Dentrix (on-premise), Dentrix Ascend (cloud), Dentally (UK/Australia), and OMSVision (oral surgery). Its data model centers on patient records, treatment plans, appointment schedules, insurance ledgers, and clinical notes — all organized around a provider-centric schema. Odoo CRM uses a flat res.partner (contact/company) model for patients and providers, a crm.lead model for leads and opportunities, and stores pipeline stages in crm.stage tied to crm.team. The core migration challenge is translating Henry Schein One's multi-table dental schema — with its provider assignments, insurance plan relationships, and perio-chart history — into Odoo's relational partner-plus-opportunity structure. We extract via the Henry Schein One API Exchange (700+ endpoints, SOC 2 Type II compliant), transform records to Odoo's xmlrpc/jsonrpc import format, create custom fields for insurance plan IDs and provider license numbers, and sequence the load so foreign keys resolve correctly. Workflows, automated recalls, and e-prescribing rules do not migrate — we export them as rebuild-reference CSVs for your Odoo administrator. The delta-pickup window captures any records modified between the extraction snapshot and the final go-live sync.
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 Henry Schein One 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.
Henry Schein One
Patient Record (Dentrix)
Odoo CRM
res.partner
1:1Henry Schein One patient records map directly to Odoo res.partner. Patient name, date of birth, contact information, address, and emergency contact map as-is. Provider assignment is stored as a custom partner field (x_provider_id) pointing to the treating provider's partner record. Multi-location patients get a single partner record with branch stored in a custom field.
Henry Schein One
Provider / Staff Record (Dentrix)
Odoo CRM
res.partner (with contact_type = 'contact' and x_is_provider = True)
1:1Dentrix provider records (dentist, hygienist, office manager) migrate as Odoo res.partner records with a boolean custom field x_is_provider set to True. Provider license numbers (state-specific, e.g., NPI in the US) are stored as x_npi_number custom char fields. Provider specialty maps to res.partner function (e.g., 'Dentist', 'Hygienist').
Henry Schein One
Appointment / Schedule
Odoo CRM
crm.lead (type = 'opportunity') + calendar.event
1:1Scheduled appointments in Dentrix Ascend become Odoo calendar.event records linked to the patient res.partner. The appointment status (confirmed, completed, no-show, cancelled) maps to a custom selection field x_appointment_status on the event. Future confirmed appointments also generate a crm.lead opportunity record with stage set to 'New' and a note referencing the appointment date, so the pipeline reflects upcoming patient activity.
Henry Schein One
Treatment Plan
Odoo CRM
sale.order + custom x_treatment_plan_note field
1:1Dentrix treatment plans — which list proposed procedures with CDT codes, surfaces, teeth involved, and fee estimates — map to Odoo sale.order (quotation) records. Each line item in the treatment plan becomes a sale.order.line with the CDT code stored in x_cdt_code and surfaces/tooth data in x_surface and x_tooth_number custom fields on the line. Treatment plan status (proposed, accepted, completed) maps to sale.order state.
Henry Schein One
Insurance Plan / Ledger (Patient-Level)
Odoo CRM
custom x_insurance_plan_id, x_group_number, x_subscriber_id fields on res.partner
1:1Henry Schein One stores insurance plan name, group number, subscriber ID, and employer information per patient ledger. These have no native Odoo equivalent — we create four custom char fields on res.partner: x_insurance_plan_id, x_group_number, x_subscriber_id, x_employer_name. EDI eligibility status (active/inactive/pending) maps to a selection field x_edi_eligibility_status. Insurance EDI re-enrollment must be completed post-migration with your EDI clearinghouse.
Henry Schein One
Clinical Note / Progress Note
Odoo CRM
crm.lead.description (longtext) + ir.attachment
1:1Progress notes and clinical observations stored in Dentrix (free-text, per-visit) migrate as ir.attachment records linked to the patient res.partner, with the note body stored as the attachment description. We extract structured fields (chief complaint, diagnosis, treatment rendered) into custom char fields x_chief_complaint and x_diagnosis_code on the partner record. Plain-text notes are attached as .txt files. Rich-text formatting may not survive the round-trip.
Henry Schein One
Perio Chart / Clinical Measurement
Odoo CRM
custom x_perio_chart_summary field on res.partner + ir.attachment
1:1Periodontal chart data — probing depths, recession measurements, BOP flags per tooth — has no Odoo native equivalent. We extract the most recent perio chart summary (e.g., 'Generalized Stage II Periodontitis') as a custom selection field x_perio_summary on res.partner and attach the full perio chart export as a PDF ir.attachment. Historical perio data is preserved but not queryable in Odoo's standard search.
Henry Schein One
Office / Location Record
Odoo CRM
res.company
1:1Multi-location Dentrix setups store practice locations as separate databases or location codes. We map each location to an Odoo res.company record with the practice name, address, and phone. Provider assignments to locations are preserved via x_location_id custom field on the provider's res.partner record. For Odoo Community (no multi-company), we use a single company with x_location_id as a selection field on partners.
Henry Schein One
Inventory / Supply Item (if applicable)
Odoo CRM
product.product
1:1If the Henry Schein One setup includes supply inventory or in-office product records (used in OmsVision or DSO configurations), these map to Odoo product.product with type='product'. Unit of measure, SKU, and unit cost map directly. Restocking thresholds and reorder rules map as Odoo product_rule records.
Henry Schein One
Billing Ledger / Ledger Entry
Odoo CRM
account.move + x_ledger_balance custom field on res.partner
1:1Historical ledger balances (patient account balance in Dentrix) do not map to Odoo accounting (which is invoice-centric). We set the patient's opening balance as a custom decimal field x_account_balance on res.partner. The balance is for reference only — actual accounting records (invoices, payments) migrate separately under the Odoo Accounting app if included in scope. Open ledger items are flagged for manual reconciliation post-migration.
Henry Schein One
Lab Case / Referral (OMSVision)
Odoo CRM
crm.lead + project.task
1:1Oral surgery and specialty practices using OMSVision track lab cases and specialist referrals. Each lab case becomes a crm.lead with a linked project.task (created via Odoo's crm_project module). Case status (pending, in-lab, returned, referred) maps to the task stage. Referring provider information migrates as a separate res.partner contact with x_is_referring_provider set to True.
Henry Schein One
Automated Recall / Patient Outreach Workflow
Odoo CRM
Odoo CRM automation rules (rebuild required)
1:1Henry Schein One automated recall workflows (hygiene recall, treatment follow-up, appointment reminder sequences) are platform-native automation logic that cannot be extracted as data. We export a CSV listing every active recall rule — trigger conditions, intervals, message templates — as a rebuild reference for Odoo's CRM automation studio. The rebuild is a separate engagement; we do not migrate the automation logic itself.
| Henry Schein One | Odoo CRM | Compatibility | |
|---|---|---|---|
| Patient Record (Dentrix) | res.partner1:1 | Fully supported | |
| Provider / Staff Record (Dentrix) | res.partner (with contact_type = 'contact' and x_is_provider = True)1:1 | Fully supported | |
| Appointment / Schedule | crm.lead (type = 'opportunity') + calendar.event1:1 | Fully supported | |
| Treatment Plan | sale.order + custom x_treatment_plan_note field1:1 | Fully supported | |
| Insurance Plan / Ledger (Patient-Level) | custom x_insurance_plan_id, x_group_number, x_subscriber_id fields on res.partner1:1 | Fully supported | |
| Clinical Note / Progress Note | crm.lead.description (longtext) + ir.attachment1:1 | Fully supported | |
| Perio Chart / Clinical Measurement | custom x_perio_chart_summary field on res.partner + ir.attachment1:1 | Fully supported | |
| Office / Location Record | res.company1:1 | Fully supported | |
| Inventory / Supply Item (if applicable) | product.product1:1 | Fully supported | |
| Billing Ledger / Ledger Entry | account.move + x_ledger_balance custom field on res.partner1:1 | Fully supported | |
| Lab Case / Referral (OMSVision) | crm.lead + project.task1:1 | Fully supported | |
| Automated Recall / Patient Outreach Workflow | Odoo CRM automation rules (rebuild required)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.
Henry Schein One gotchas
Proprietary image encoding breaks image links post-migration
Insurance EDI re-enrollment required with every payer
API Exchange restrictions limit third-party data access
PCI compliance does not transfer between systems
Jarvis Analytics generates derived data that does not export
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
Audit Henry Schein One API Exchange data model and identify extraction endpoints
FlitStack AI connects to your Henry Schein One API Exchange credentials (OAuth 2.0, SOC 2 Type II compliant) and inventories every available endpoint for your account. We map patient records, provider records, appointment schedules, treatment plans, and insurance ledgers to the corresponding API response schemas. Any custom properties (perio-chart fields, provider-specific clinical note types, OMSVision lab case fields) are catalogued separately. We also perform a pre-extraction data quality check: duplicate patients, orphaned provider references, and records with missing required fields are flagged and reported before any data moves. This step produces the migration scope document and a field-mapping matrix for Odoo.
Stand up Odoo custom fields and company/location structure
Before patient data lands, FlitStack AI creates all required custom fields on res.partner, sale.order, and calendar.event — including x_insurance_plan_id, x_npi_number, x_cdt_code, x_appointment_status, x_perio_summary, and 15 others identified in the scope document. For multi-location practices, we configure res.company records and x_location_id selection values. We configure crm_stage records matching your practice's case-stage taxonomy (e.g., 'Exam Scheduled', 'Treatment Proposed', 'Case Accepted', 'In Progress', 'Completed'). If your target is Odoo Community, we also prepare the PostgreSQL import schema and credentials for direct INSERT — this is coordinated with your Odoo administrator.
Extract and transform data with foreign-key sequencing
We extract data in dependency order: (1) res.partner records for providers — because patient records and appointments reference provider IDs; (2) res.partner records for patients — which reference location IDs and responsible party data; (3) res.company and location records if not already present; (4) calendar.event records for appointments linked to patient and provider partner IDs; (5) sale.order records for treatment plans linked to patient partners. Transformation scripts convert Henry Schein One field names to Odoo field names, apply value mappings for state codes and insurance status selections, and store original system IDs in x_source_system_id for traceability. Insurance ledger balances are stored as x_account_balance on patient partners.
Run a sample migration with field-level diff before full commit
A representative slice migrates first — typically 200–500 patient records across multiple providers and locations, spanning appointments, treatment plans, and insurance records. We generate a field-level diff comparing the source Henry Schein One API response against the destination Odoo record, flagging any field that did not map cleanly. You review the diff, verify recall date mapping, insurance field completeness, and provider linkage before we commit to the full run. Imaging files (X-rays, perio charts, DICOM files) are extracted in parallel and attached to the sample patient records for verification. Any mapping gaps discovered in the sample are corrected before the full migration begins.
Execute full migration with delta-pickup and post-migration audit
The full record set loads into Odoo via the External API (Custom plan) or PostgreSQL direct import (Community). A delta-pickup window — typically 24–48 hours — captures any new appointments, patient updates, or treatment plan changes that occurred in Henry Schein One during the cutover window. We run a post-migration audit comparing record counts, account balance totals, and appointment date ranges against the pre-migration snapshot. The audit log captures every insert and update operation; a one-click rollback script is available if reconciliation reveals discrepancies. We deliver the recall-rule export CSV, the EDI re-enrollment checklist, and a handoff call with your Odoo administrator to review the rebuilt automation plan.
Platform deep dives
Henry Schein One
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. All 8 core objects map 1:1 between Henry Schein One and Odoo CRM.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Henry Schein One and Odoo CRM.
Object compatibility
All 8 core objects map 1:1 between Henry Schein One 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
Henry Schein One: Not publicly documented per-org limits; enterprise customers receive dedicated API capacity.
Data volume sensitivity
Henry Schein One 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 Henry Schein One to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Henry Schein One 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 Henry Schein One
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.