CRM migration

Migrate from Cliniko to Microsoft Dynamics 365 Sales

Field-level mapping, validation, and rollback between Cliniko and Microsoft Dynamics 365 Sales . We move data and schema; workflows are rebuilt natively in Microsoft Dynamics 365 Sales .

Cliniko logo

Cliniko

Source

Microsoft Dynamics 365 Sales

Destination

Microsoft Dynamics 365 Sales  logo

Compatibility

100%

10 of 10

objects map 1:1 between Cliniko and Microsoft Dynamics 365 Sales .

Complexity

BStandard

Timeline

48–72 hours

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

Cliniko is a healthcare practice management platform centered on patients, practitioners, appointments, treatment notes, and billing. Dynamics 365 Sales is a general-purpose CRM that models Accounts, Contacts, Leads, Opportunities, and Activities. The migration maps Cliniko's patient-centric model into Dynamics 365's entity-relationship design, converting healthcare-specific objects into custom Dataverse tables linked to Contact records. Practitioners are mapped to Dynamics 365 Users by email resolution. Appointments and treatment notes land as Dynamics 365 Tasks and Notes with original timestamps. Invoices and line items are migrated as Opportunities with product line items and custom fields for Cliniko-specific status values. Workflows, automated reminders, and appointment-confirmation sequences built in Cliniko do not transfer — FlitStack exports a JSON definition of every active workflow as a rebuild reference for your Dynamics 365 admin or a Power Automate implementation. We use Cliniko's REST API for extraction and the Dataverse Web API for loading, with Bulk API parallelism for record sets above 5,000 rows.

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

Microsoft Dynamics 365 Sales  logo

Microsoft Dynamics 365 Sales

What's pulling them in

  • Deep Microsoft 365, Teams, and Outlook integration makes Microsoft Dynamics 365 Sales a natural fit for Microsoft-first organizations already invested in that ecosystem
  • Sales Enterprise and Premium tiers offer unlimited custom tables and advanced AI-driven forecasting and predictive analytics not available in lower tiers
  • Professional tier pricing at $65 per user per month offers a lower entry cost than Salesforce for SMB teams with straightforward CRM needs
  • Flexible customization options allow businesses to build bespoke apps, tailor forms and views, and integrate with other Dynamics 365 modules
  • Microsoft Copilot AI tools are embedded directly into the sales workflow on Enterprise and Premium, automating routine tasks and providing deal intelligence

Object mapping

How Cliniko objects map to Microsoft Dynamics 365 Sales

Each row shows how a Cliniko object lands in Microsoft Dynamics 365 Sales , 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

Microsoft Dynamics 365 Sales

Contact

1:1
Fully supported

Cliniko patients map directly to Dynamics 365 Contacts. First name, last name, email, phone, date of birth, address, and medical record number are mapped field-by-field. MRN migrates to a custom MRN__c text field on Contact. Insurance profile data (provider, policy number, group number) is stored as custom fields on the Contact record. Unconverted patients with no commercial relationship are flagged for manual review.

Cliniko

Practitioner

maps to

Microsoft Dynamics 365 Sales

SystemUser + Custom Practitioner__c Table

1:1
Fully supported

Practitioners who will own records in Dynamics 365 are resolved by email match to existing SystemUser records. Practitioners without Dynamics licenses are migrated to a custom Practitioner__c Dataverse table linked to a Contact record that stores their profile. Specializations, credentials, and availability patterns are stored as custom fields on Practitioner__c.

Cliniko

Appointment

maps to

Microsoft Dynamics 365 Sales

Task + Custom Appointment__c Table

1:1
Fully supported

Cliniko appointments with a confirmed status are migrated as Dynamics 365 Tasks with Subject = Appointment Type name, ScheduledStart = Cliniko start time, ScheduledEnd = Cliniko end time, and Description = Cliniko notes. The Cliniko appointment ID is stored in Source_System_ID__c for delta-run deduplication. Cancelled and no-show appointments are migrated as Tasks with Status = Cancelled.

Cliniko

Treatment Note

maps to

Microsoft Dynamics 365 Sales

Annotation (Note)

1:1
Fully supported

Cliniko treatment notes map to Dynamics 365 Notes (Annotation entity). The Note Title carries the appointment type and date. The Note Body carries the full clinical note text. The Note is associated to the Contact record via the ObjectId lookup. Original created-at timestamps are preserved as CreatedOn (set during migration via API), with the Cliniko timestamp stored in a custom Cliniko_Created_At__c field.

Cliniko

Appointment Type

maps to

Microsoft Dynamics 365 Sales

Custom AppointmentType__c Table

1:1
Fully supported

Cliniko appointment types (Initial Consultation, Follow-Up, Telehealth, etc.) have billable flags, default duration, and colour coding that have no native Dynamics 365 equivalent. We create an AppointmentType__c custom table with fields for Name, DefaultDurationMinutes, IsBillable, and ClinikoID__c. Each migrated appointment Task references its appointment type via a lookup to AppointmentType__c.

Cliniko

Invoice

maps to

Microsoft Dynamics 365 Sales

Opportunity + OpportunityProduct

1:1
Fully supported

Cliniko invoices map to Dynamics 365 Opportunities. Invoice number becomes Opportunity.Name. Invoice total maps to Amount. Line items from the invoice become Opportunity Product records linked to the Opportunity. Cliniko payment status (Paid, Due, Overdue, Cancelled) is mapped via value_mapping to a custom PaymentStatus__c picklist field on the Opportunity. Tax amounts and discounts are stored as custom currency fields.

Cliniko

Product

maps to

Microsoft Dynamics 365 Sales

Product (Dynamics 365 Product Catalog)

1:1
Fully supported

Cliniko products (supplements, session bundles, equipment) map to Dynamics 365 Product records. Product Name, Description, and Unit Price transfer directly. Stock quantity from Cliniko is stored as a custom Stock_Quantity__c field on the Dynamics Product record since Dynamics 365 Sales does not track inventory natively.

Cliniko

Company

maps to

Microsoft Dynamics 365 Sales

Account

1:1
Fully supported

Cliniko companies (referral sources, insurance providers, partner organizations) map to Dynamics 365 Accounts. Company name maps to Account.Name. Address, phone, and website transfer directly. The Cliniko company type field (referral, insurance, partner) is stored as a custom AccountType__c picklist on the Account.

Cliniko

Patient Attachment / File

maps to

Microsoft Dynamics 365 Sales

SharePoint Integration via Dynamics 365

1:1
Fully supported

Cliniko file attachments (patient forms, signed consent documents, imaging references) re-upload to a SharePoint library connected via Dynamics 365's native SharePoint integration. Files are organized by Contact in a PatientFiles folder. FlitStack maps the Cliniko attachment URL to the SharePoint file location in a custom Attachment_URL__c field on the Contact for traceability during the cutover window.

Cliniko

Insurance Profile

maps to

Microsoft Dynamics 365 Sales

Custom InsuranceProfile__c Table

1:1
Fully supported

Cliniko insurance profiles (provider name, policy number, group number, coverage details) have no native Dynamics 365 equivalent. A custom InsuranceProfile__c Dataverse table is created with lookup to the Contact record. Fields include Provider__c, PolicyNumber__c, GroupNumber__c, and CoverageType__c. The Cliniko insurance profile ID is preserved in ClinikoID__c for reference.

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

Microsoft Dynamics 365 Sales  logo

Microsoft Dynamics 365 Sales gotchas

High

Professional tier 15-table custom table limit blocks migrations

High

October 2024 pricing increase applies at renewal for all customers

Medium

Custom fields must be created in the UI before API writes

Medium

Power Platform request limits apply to bulk migrations

Medium

Activity records orphaned to inactive owners fail silently

Pair-specific challenges

  • Cliniko appointment types have no native Dynamics 365 equivalent — appointment semantics require a custom Dataverse table

    Cliniko appointment types carry billable flags, default durations, and category labels (telehealth, initial consult, procedure) that define the semantics of each booking. Dynamics 365 Sales has no native appointment-type entity — the built-in Task and Phone Call activity types have no equivalent concept. FlitStack creates an AppointmentType__c custom Dataverse table with Name, DefaultDurationMinutes, IsBillable, and ClinikoID__c fields. Each migrated Task then carries a lookup to AppointmentType__c so reporting by appointment category works in Dynamics 365 without relying on string-matching in the Task Subject. This requires a pre-migration schema setup step in the target Dynamics environment before data loading begins.

  • Practitioners without Dynamics 365 user licenses cannot own records — email-match orphaning must be resolved before migration

    Dynamics 365 requires a licensed SystemUser to own a record. Cliniko practitioners may include administrative staff or referring clinicians who do not hold (and should not be billed for) a Dynamics 365 Sales license. FlitStack resolves each Cliniko practitioner by email against existing SystemUser records: matched practitioners become record Owners directly; unmatched practitioners are migrated to a custom Practitioner__c table linked to a Contact record that stores their profile. Unresolved practitioners (no email in either Cliniko or Dynamics) are flagged in a pre-migration audit report so the admin can either invite them to Dynamics 365 or assign a fallback owner before the migration run commits.

  • Cliniko invoice payment status requires explicit value-by-value mapping to a custom Opportunity field

    Cliniko invoice statuses (Paid, Due, Overdue, Partially Paid, Cancelled, Refunded) are arbitrary strings defined at the account level. Dynamics 365 Opportunity Stage is a sales-pipeline stage pick-list not semantically equivalent to billing status. FlitStack creates a custom PaymentStatus__c picklist on the Opportunity record and builds a value-mapping table for each Cliniko status string found in the data. If a Cliniko practice has added custom status values outside the standard set, those appear in the pre-migration audit and must be mapped individually before the migration run. This prevents silent data loss where Cliniko's payment state maps to a blank or default Dynamics field value.

  • Patient file attachments require SharePoint re-upload — Cliniko's file storage is not directly portable

    Cliniko stores file attachments (signed forms, imaging references, intake documents) in its own cloud storage with per-attachment URLs. Dynamics 365 Sales does not host files natively — it relies on SharePoint Online document libraries connected via the native SharePoint integration. FlitStack downloads each attachment from Cliniko's storage during the export phase, then re-uploads to a SharePoint PatientFiles library organized by Contact record GUID. A custom Attachment_URL__c field on the Contact records the Cliniko source URL for traceability during the cutover window. File size limits from Cliniko's export apply; attachments exceeding 50 MB are flagged in the audit report for manual handling.

  • Multi-location Cliniko setups require location-scoped user resolution to avoid practitioner-to-owner assignment collisions

    Cliniko supports multiple locations with practitioners who may work across locations. Dynamics 365 user records are tenant-global — a practitioner with one email address exists as a single SystemUser regardless of location. When the same practitioner appears in Cliniko appointments at multiple locations, FlitStack resolves their email to one SystemUser and maps all appointment Tasks to that owner. The Cliniko location ID is preserved in a custom Location__c field on the Task so location-based reporting can filter within Dynamics 365 without requiring separate user accounts per location. Practices that need strict per-location data isolation in Dynamics 365 must configure access teams or security roles pre-migration.

Migration approach

Six steps for a successful Cliniko to Microsoft Dynamics 365 Sales data migration

  1. Pre-migration audit and schema provisioning in Dynamics 365

    FlitStack extracts a full Cliniko data export including patients, practitioners, appointments, treatment notes, invoices, products, companies, and insurance profiles. We run a schema audit comparing Cliniko field names and pick-list values against Dynamics 365's standard Contact, Account, Task, Opportunity, and Product entities. Any Cliniko field with no standard Dynamics equivalent is flagged for custom column creation in Dataverse. We provision custom tables (AppointmentType__c, Practitioner__c, InsuranceProfile__c) and custom columns (MRN__c, PaymentStatus__c, Location__c, Attachment_URL__c, etc.) in the target Dynamics 365 environment before any data loads run. A schema setup plan is delivered to your Dynamics admin for review and approval.

  2. Practitioner-to-User resolution and fallback owner assignment

    FlitStack matches Cliniko practitioner email addresses against existing Dynamics 365 SystemUser records by email domain and exact address. Matched practitioners become the OwnerId on their respective appointment Tasks and invoice Opportunities. Practitioners without a Dynamics 365 license are migrated to the custom Practitioner__c table linked to a Contact record. Practitioners with no email or no match are flagged in an unresolved-owners report — your admin either creates a Dynamics user for them or assigns a named fallback owner before the migration run. No record lands without a resolved or assigned owner.

  3. Load sequence: Contacts, Accounts, Products, then Activities and Opportunities

    Dynamics 365 requires parent records to exist before child records can reference them via lookup. FlitStack sequences the migration in dependency order: (1) Patients → Contacts with MRN__c and custom fields; (2) Companies → Accounts; (3) Products → Product Catalog; (4) Practitioners → Practitioner__c or SystemUser resolution; (5) Appointments → Tasks with Contact lookup via Source_System_ID__c; (6) Treatment Notes → Annotations linked to Contact; (7) Invoices → Opportunities with Opportunity Products. AppointmentType__c is loaded before Tasks so the lookup resolves on first pass. Each phase runs with batch-level validation against Dynamics 365's Dataverse API response schema.

  4. Sample migration with field-level diff and appointment-type verification

    A representative slice of 200–500 records spanning patients, appointments, invoices, and practitioners is migrated first. FlitStack generates a field-level diff comparing the Cliniko source value against the Dynamics 365 loaded value for every mapped field, including custom columns. Appointment-type lookups on Task records are verified to confirm AppointmentType__c resolution. Practitioner email-to-owner resolution is spot-checked. The diff is shared with your team for sign-off before the full run proceeds. Any mapping corrections identified at this stage are applied to the migration engine and the sample is re-run.

  5. Full migration run with delta-pickup window and rollback readiness

    The full Cliniko data export is processed through the migration engine. A delta-pickup window of 24–48 hours runs concurrently with the migration run: any Cliniko records modified or created during the migration window are captured and applied to Dynamics 365 in a second pass. FlitStack maintains an audit log of every record created, updated, or skipped in Dynamics 365. If reconciliation fails — record counts mismatch, duplicate detection triggered, or owner resolution gaps — one-click rollback reverts the Dynamics 365 environment to its pre-migration state using the audit log as the revert manifest. Your team continues working in Cliniko throughout the migration with scoped read-only API access.

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.
Microsoft Dynamics 365 Sales  logo

Microsoft Dynamics 365 Sales

Destination

Strengths

  • Native integration with Microsoft 365, Teams, Outlook, and SharePoint for unified productivity workflow
  • Unlimited custom tables and complex workflows on Enterprise tier enable deep customization for complex sales processes
  • AI-driven predictive analytics and deal intelligence on Enterprise and Premium tiers help sales teams prioritize pipeline
  • Dataverse unified data layer provides a consistent API and data model across all Dynamics 365 and Power Platform apps
  • Strong security model with Field-Level Security and Record Ownership rules for governance-conscious enterprises

Weaknesses

  • Sales Professional tier caps custom tables at 15, creating a migration ceiling for highly customized SMB environments
  • October 2024 pricing increases of $15 per user across all tiers apply to existing customers upon renewal
  • Implementation typically requires costly certified partners, adding 30–50% to total project cost
  • Updates and platform releases can disrupt customizations and plugins, requiring regression testing after each wave
  • Non-Microsoft integrations require additional configuration or middleware, limiting flexibility for heterogeneous tech stacks

Complexity grading

How hard is this migration?

Standard CRM migration. All 8 core objects map 1:1 between Cliniko and Microsoft Dynamics 365 Sales .

B

Overall complexity

Standard migration

Derived from compatibility, mapping clarity, API constraints, and data volume across Cliniko and Microsoft Dynamics 365 Sales .

  • Object compatibility

    A

    All 8 core objects map 1:1 between Cliniko and Microsoft Dynamics 365 Sales .

  • 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 Microsoft Dynamics 365 Sales 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 Microsoft Dynamics 365 Sales data migrations

Answers to the questions buyers ask most during Cliniko to Microsoft Dynamics 365 Sales migration scoping. Not seeing yours? Book a call.

Can't find your answer?

Walk through your Cliniko to Microsoft Dynamics 365 Sales migration with a real engineer — 30 minutes, free, written quote within 24 hours.

Book a free 30 minute consultation

A Cliniko-to-Dynamics 365 Sales migration typically completes in 48–72 hours of clock time for setups with fewer than 50,000 patient records and one location. Multi-location Cliniko environments with practitioners spanning several locations, or datasets with more than 200,000 appointment records, extend the timeline to 7–14 days. The pre-migration schema setup (creating custom Dataverse tables and columns) adds 3–5 business days and runs in parallel with your Dynamics admin's review. Custom field count and invoice-line complexity are the primary timeline drivers after record volume.

Adjacent paths

Related migrations to explore

Ready when you are

Move from Cliniko.
Land in Microsoft Dynamics 365 Sales , 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