CRM migration

Migrate from Cliniko to Odoo CRM

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

Cliniko logo

Cliniko

Source

Odoo CRM

Destination

Odoo CRM logo

Compatibility

90%

9 of 10

objects map 1:1 between Cliniko and Odoo CRM.

Complexity

BStandard

Timeline

48–72 hours

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

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.

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

Cliniko logo

Cliniko

What's pushing teams away

  • API access is tied to individual user permissions, meaning API keys inherit role-based access controls — a practitioner-key may not expose all records a migration requires, complicating bulk export scoping.
  • Cliniko's automation capabilities (e.g. appointment reminders, form-triggered updates) do not export; they must be manually rebuilt in the destination platform, increasing migration effort for workflow-heavy practices.
  • Large data exports generate in the background and can take considerable time during busy hours, which may delay migration cutover timelines for practices with high appointment volumes.
  • The platform lacks a native HubSpot or Salesforce CRM-style pipeline view for tracking patient leads or referral sources — practices that outgrow Cliniko often cite the need for a dedicated CRM layer.

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

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

maps to

Odoo CRM

crm.lead (via res.partner)

1:1
Fully supported

Cliniko 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

maps to

Odoo CRM

crm.lead

many:1
Fully supported

Individual 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

maps to

Odoo CRM

Custom field on crm.lead + crm.stage

1:1
Fully supported

Cliniko 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

maps to

Odoo CRM

res.users

1:1
Fully supported

Cliniko 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

maps to

Odoo CRM

crm.activity (description) + custom field on crm.lead

1:1
Fully supported

Cliniko 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

maps to

Odoo CRM

Custom field on crm.lead + Odoo Accounting (separate module)

1:1
Fully supported

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

maps to

Odoo CRM

product.template

1:1
Fully supported

Cliniko 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

maps to

Odoo CRM

crm.activity

1:1
Fully supported

Cliniko 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

maps to

Odoo CRM

res.partner or custom field on crm.lead

1:1
Fully supported

Cliniko 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

maps to

Odoo CRM

crm.activity (description) or attachment

1:1
Fully supported

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

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.

Cliniko logo

Cliniko gotchas

Medium

Background export generation delays for large datasets

Medium

Charts export is separate from the main data panel

High

API key permissions gate record visibility

Medium

Form template configurations do not export

Low

The old Appointments export has been deprecated

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 CRM has no native healthcare appointment model — custom fields are required for appointment types, practitioner assignments, and treatment notes

    Cliniko appointment types, practitioner-to-patient assignments, treatment note bodies, and insurance fields have no native Odoo CRM equivalent. Each requires a custom field on crm.lead — Appointment_Type__c, Practitioner__c, Treatment_Summary__c, and insurance custom fields. This means Odoo Enterprise access is required to add custom fields to crm.lead in most deployments; Odoo Community restricts certain model edits. Before migration, your team should decide which custom fields are essential versus nice-to-have so migration scope stays controlled.

  • Cliniko's patient-insurance data model does not map to Odoo — insurance profiles require a separate data strategy

    Cliniko stores insurance provider, policy number, group number, and coverage type as sub-records linked to the patient. Odoo CRM has no insurance object — there is no crm.lead.insurance_id field. We create custom Char and selection fields on crm.lead for provider name, policy number, and group number, but Odoo has no native concept of insurance eligibility checking or claim tracking. If your clinic relies heavily on insurance workflow in Cliniko, that process must be redesigned in Odoo or handled through a separate insurance management module.

  • Appointment types in Cliniko do not translate to Odoo pipeline stages — they require a custom pick-list mapping strategy

    Cliniko appointment types (e.g., Initial Consultation, Follow-up, Telehealth, Standard Treatment) are not sales pipeline stages in Odoo — pipeline stages in crm.stage are designed for sales cycles, not clinical visit types. We create a custom Appointment_Type__c selection field on crm.lead and map each Cliniko appointment type to a pick-list value. Your team may also want to create Odoo CRM stages named by appointment type for Kanban views — this requires manual stage creation in Odoo Settings > CRM > Stages before migration data lands.

  • Cliniko invoicing does not migrate to Odoo CRM — the Odoo Accounting app must be installed and invoices reconciled separately

    Cliniko invoices, payments, and expense records do not have a destination in Odoo CRM — crm.lead has no invoice-related fields. We preserve invoice number, total amount, and payment status as custom reference fields on the lead for audit purposes, but the actual invoice ledger must be handled in the Odoo Accounting app, which is sold as a separate module and requires its own setup. If your clinic needs to retain a full invoice history in Odoo, budget for an Odoo Accounting implementation as a follow-on project.

  • Cliniko automations (appointment reminders, patient notifications, SMS triggers) do not migrate — Odoo automated actions must be rebuilt

    Cliniko workflow rules for appointment reminders, patient SMS notifications, and practitioner alerts are not transferable to Odoo. Odoo Automated Actions and Server Actions can replicate the same business logic, but every rule must be rebuilt from scratch. The migration includes an export of Cliniko automation definitions as a reference document for your Odoo administrator or consultant. Healthcare-specific triggers — such as reminders tied to appointment type or patient insurance status — require custom Odoo Python code or Studio configuration beyond standard automated actions.

Migration approach

Six steps for a successful Cliniko to Odoo CRM data migration

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

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

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

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

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

Context on both ends of the pair

Cliniko logo

Cliniko

Source

Strengths

  • Single flat-rate plan with unlimited patients, users, locations, and storage — no per-seat or per-record throttling.
  • Built-in invoicing, appointment scheduling, treatment notes, and reporting in one cloud-hosted application.
  • Telehealth included at no extra cost, launched and maintained without a paywall.
  • Admin-accessible data export panel covering appointments, patients, invoices, transactions, and more.
  • REST API with HTTPS enforcement, JSON responses, and a published OpenAPI schema for programmatic access.

Weaknesses

  • API keys inherit the role-based permissions of the user they belong to, so a read-only or practitioner-level key may not expose all records needed for a full migration export.
  • Form template builders (the configuration for patient intake forms) are not exported via the data panel and must be recreated manually in the destination.
  • The old Appointments export is deprecated; the replacement Reports-based export has different column layouts that require mapping adjustments during migration scoping.
  • Background export generation for large datasets can be slow during busy hours, with no real-time progress API — only email notification on completion.
  • No native automation export; appointment reminders, form-triggered patient field updates, and similar rules must be manually rebuilt in the destination system.
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 Cliniko and Odoo CRM.

B

Overall complexity

Standard migration

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

  • Object compatibility

    A

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

    Cliniko: Not publicly documented in the OpenAPI schema or public help docs.

  • Data volume sensitivity

    B

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

Estimator

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

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

Can't find your answer?

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 consultation

Most Cliniko-to-Odoo CRM migrations complete in 48–72 hours of clock time for practices with under 50,000 patient records. Larger datasets or setups with many custom fields, practitioner assignments, and complex insurance profiles extend the timeline to 5–10 days. The longest planning step is Odoo schema configuration — creating custom fields, setting up CRM stages, and resolving practitioner-to-user mappings before data lands. We sequence the migration so Odoo is configured before any records are loaded.

Adjacent paths

Related migrations to explore

Ready when you are

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