CRM migration
Field-level mapping, validation, and rollback between Cliniko and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Cliniko
Source
Odoo CRM
Destination
Compatibility
9 of 10
objects map 1:1 between Cliniko and Odoo CRM.
Complexity
BStandard
Timeline
48–72 hours
Overview
Cliniko stores patient records, appointments, treatment notes, and invoicing in a healthcare-specific model built around practitioners and appointment types. Odoo CRM uses a sales-centric model: contacts in res.partner, opportunities in crm.lead, and pipeline stages in crm.stage. There is no native healthcare appointment equivalent in Odoo — appointment types, practitioner assignments, treatment notes, and insurance fields all require custom field creation and careful mapping to crm.lead records. We map Cliniko patients to Odoo CRM leads via res.partner lookups, preserving name, contact details, and DOB as direct fields while storing insurance profiles, appointment types, practitioner assignments, and treatment notes in custom fields on the lead. Appointments become leads with expected_revenue as the appointment date and stage set by appointment status. Practitioners are resolved by email match to Odoo users, with unmatched practitioners flagged for admin assignment before migration runs. Cliniko invoices migrate as invoice-number references since Odoo CRM does not carry billing natively — the Odoo Accounting app handles that post-migration. Automations, appointment reminders, patient notification rules, custom forms, and report templates do not migrate and must be rebuilt in Odoo's Automated Actions or Studio. We sequence the migration to handle foreign-key resolution correctly: partners first, then leads, then activities, with a delta-pickup window capturing in-flight changes during the cutover.
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 Cliniko 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.
Cliniko
Patient
Odoo CRM
crm.lead (via res.partner)
1:1Cliniko patients map to Odoo crm.lead records backed by res.partner contacts. Name, email, phone, and address map directly. Insurance profiles, patient forms, and practitioner assignments store as custom fields on the lead. Each patient in Cliniko may have multiple practitioners — all assignments preserved as a multi-line custom field on the lead record.
Cliniko
Appointment
Odoo CRM
crm.lead
many:1Individual Cliniko appointments map to crm.lead records. The appointment date becomes expected_revenue on the lead. Appointment type maps to a custom pick-list field (Appointment_Type__c) since Odoo pipeline stages are sales-oriented, not scheduling-oriented. Each appointment creates one lead — multiple appointments for the same patient create multiple leads unless your team specifies a merge rule.
Cliniko
Appointment Type
Odoo CRM
Custom field on crm.lead + crm.stage
1:1Cliniko appointment types (Initial Consultation, Follow-up, etc.) do not have a native Odoo equivalent. We create a custom Appointment_Type__c pick-list field on crm.lead and optionally map the most common types to crm.stage names if your team wants Kanban view by appointment type. Stages must be created manually in Odoo Settings > CRM > Stages before migration.
Cliniko
Practitioner
Odoo CRM
res.users
1:1Cliniko practitioners resolve to Odoo users by email match. Practitioner specialty, working hours, and appointment-type associations do not have Odoo equivalents — these store as custom fields on the user record or on the crm.lead as Practitioner__c. Unmatched practitioners are flagged before migration; your admin assigns them to an Odoo user or creates a placeholder user.
Cliniko
Treatment Note
Odoo CRM
crm.activity (description) + custom field on crm.lead
1:1Cliniko treatment notes migrate as crm.activity records linked to the crm.lead, with the note body stored in the activity description field. Rich-text formatting is stripped — plain text transfers. Very long notes may need splitting across multiple activity records if they exceed Odoo's activity description character limit. A summary also stores in a custom field Lead_Treatment_Summary__c for quick reference.
Cliniko
Invoice / Payment
Odoo CRM
Custom field on crm.lead + Odoo Accounting (separate module)
1:1Cliniko invoices store as custom fields on crm.lead (Invoice_Number__c, Total_Amount__c, Payment_Status__c) for reference. The actual invoice records require Odoo Accounting — if your clinic needs full billing in Odoo, install the Accounting app post-migration and reconcile Cliniko invoices as Odoo vendor bills manually or via a follow-on engagement. Odoo CRM alone does not handle invoicing.
Cliniko
Product / Service (billable items)
Odoo CRM
product.template
1:1Cliniko billable items (treatment types, products sold) map to Odoo product.template records. Product name, sale price, and cost map directly. Stock quantities in Cliniko require the Odoo Inventory app to be enabled — inventory tracking is handled separately post-migration if needed.
Cliniko
SMS / Communication Log
Odoo CRM
crm.activity
1:1Cliniko SMS and communication logs stored per patient migrate as crm.activity records with Type=Other and the message content in the description field. Odoo's native SMS integration requires the Odoo Marketing SMS app — communications carry over as plain text records without native SMS reply tracking.
Cliniko
Insurance Provider
Odoo CRM
res.partner or custom field on crm.lead
1:1Cliniko insurance provider records are linked to patients but Odoo has no native insurance carrier object. We create Insurance_Provider__c and Insurance_Policy_Number__c custom fields on crm.lead. If the clinic manages many insurance carriers, we can optionally map them to res.partner records (company type = Insurance) and link via a many2one field, but this requires Odoo Enterprise for custom relationship fields.
Cliniko
Patient Form / Intake Document
Odoo CRM
crm.activity (description) or attachment
1:1Cliniko patient forms and intake documents have no Odoo native equivalent. Form data and completed intake answers migrate as crm.activity descriptions or as PDF attachments stored on the crm.lead's attachment list. The form structure itself must be rebuilt in Odoo Studio or via a third-party form integration if electronic intake is needed post-migration.
| Cliniko | Odoo CRM | Compatibility | |
|---|---|---|---|
| Patient | crm.lead (via res.partner)1:1 | Fully supported | |
| Appointment | crm.leadmany:1 | Fully supported | |
| Appointment Type | Custom field on crm.lead + crm.stage1:1 | Fully supported | |
| Practitioner | res.users1:1 | Fully supported | |
| Treatment Note | crm.activity (description) + custom field on crm.lead1:1 | Fully supported | |
| Invoice / Payment | Custom field on crm.lead + Odoo Accounting (separate module)1:1 | Fully supported | |
| Product / Service (billable items) | product.template1:1 | Fully supported | |
| SMS / Communication Log | crm.activity1:1 | Fully supported | |
| Insurance Provider | res.partner or custom field on crm.lead1:1 | Fully supported | |
| Patient Form / Intake Document | crm.activity (description) or attachment1: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.
Cliniko gotchas
Background export generation delays for large datasets
Charts export is separate from the main data panel
API key permissions gate record visibility
Form template configurations do not export
The old Appointments export has been deprecated
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
Export Cliniko data via bulk export and API
We use Cliniko's built-in Data Exports (Settings > Data Exports) for patient records, appointments, treatment notes, and billing items. Large exports run in the background — Cliniko sends an email notification when the file is ready. We supplement with the Cliniko REST API for real-time validation of practitioner email addresses and appointment-type enumeration. API requests are paginated; practices with 100,000+ appointments may need chunked export requests spread over several hours to avoid hitting Cliniko's export generation timeout.
Audit and validate source data before mapping
We run a data-quality audit against the Cliniko export: duplicate patients identified by email and phone, orphaned appointments (no linked patient), patients with missing practitioner assignments, and treatment notes exceeding Odoo's activity description length. Insurance profiles with incomplete provider or policy data are flagged for manual review. This audit produces a pre-migration data-cleaning checklist that your team resolves before mapping begins.
Configure Odoo CRM schema with custom fields
Before data loads, we create the custom fields on crm.lead: Appointment_Type__c (selection), Practitioner__c (char), Appointment_Duration__c (integer), Treatment_Summary__c (text), Insurance_Provider__c (char), Insurance_Policy_Number__c (char), Insurance_Group_Number__c (char), Invoice_Number__c (char), Total_Amount__c (float), Payment_Status__c (selection), clinic_location__c (char), source_cliniko_id__c (char), cliniko_created_at__c (datetime), and date_of_birth__c (date). CRM stages are configured to reflect appointment statuses. Odoo Enterprise is required for custom field creation in most production deployments. We also configure default values for selection fields to streamline data entry and set field-level validation rules to catch missing data early.
Resolve practitioners and run test migration
Cliniko practitioner records are matched to Odoo res.users by email address. Practitioners without an Odoo user account are flagged — your admin creates the user before migration or assigns a fallback user. We run a test migration of 100–300 records (a representative sample of patients across appointment types and practitioners) and produce a field-level diff report. Your team verifies custom field values, stage assignment, and activity descriptions before the full run commits.
Execute full migration with delta-pickup window
The full dataset loads into Odoo CRM. A delta-pickup window (typically 24–48 hours) runs after the main migration, capturing appointments created or patient records updated in Cliniko during the cutover. FlitStack AI maintains scoped read access to Cliniko throughout — your team keeps seeing patients without interruption. Every migration operation is recorded in an audit log, and one-click rollback is available if reconciliation identifies missing records or mapping errors.
Platform deep dives
Cliniko
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. All 8 core objects map 1:1 between Cliniko and Odoo CRM.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Cliniko and Odoo CRM.
Object compatibility
All 8 core objects map 1:1 between Cliniko 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
Cliniko: Not publicly documented in the OpenAPI schema or public help docs.
Data volume sensitivity
Cliniko 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 Cliniko to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Cliniko 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 Cliniko
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.