CRM migration
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
Source
Microsoft Dynamics 365 Sales
Destination
Compatibility
10 of 10
objects map 1:1 between Cliniko and Microsoft Dynamics 365 Sales .
Complexity
BStandard
Timeline
48–72 hours
Overview
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.
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.
Source platform
Cliniko platform overview
Scorecard, SWOT, gotchas, and pricing for Cliniko.
Destination platform
Microsoft Dynamics 365 Sales platform overview
Scorecard, SWOT, gotchas, and pricing for Microsoft Dynamics 365 Sales .
Data migration guide
The complete Microsoft Dynamics 365 Sales migration guide
Data model, import mechanisms, field mapping strategy, pitfalls, and cutover — by the engineers running it.
Destination checklist
Microsoft Dynamics 365 Sales migration checklist
Pre- and post-cutover tasks for moving onto Microsoft Dynamics 365 Sales .
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 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
Microsoft Dynamics 365 Sales
Contact
1:1Cliniko 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
Microsoft Dynamics 365 Sales
SystemUser + Custom Practitioner__c Table
1:1Practitioners 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
Microsoft Dynamics 365 Sales
Task + Custom Appointment__c Table
1:1Cliniko 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
Microsoft Dynamics 365 Sales
Annotation (Note)
1:1Cliniko 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
Microsoft Dynamics 365 Sales
Custom AppointmentType__c Table
1:1Cliniko 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
Microsoft Dynamics 365 Sales
Opportunity + OpportunityProduct
1:1Cliniko 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
Microsoft Dynamics 365 Sales
Product (Dynamics 365 Product Catalog)
1:1Cliniko 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
Microsoft Dynamics 365 Sales
Account
1:1Cliniko 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
Microsoft Dynamics 365 Sales
SharePoint Integration via Dynamics 365
1:1Cliniko 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
Microsoft Dynamics 365 Sales
Custom InsuranceProfile__c Table
1:1Cliniko 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.
| Cliniko | Microsoft Dynamics 365 Sales | Compatibility | |
|---|---|---|---|
| Patient | Contact1:1 | Fully supported | |
| Practitioner | SystemUser + Custom Practitioner__c Table1:1 | Fully supported | |
| Appointment | Task + Custom Appointment__c Table1:1 | Fully supported | |
| Treatment Note | Annotation (Note)1:1 | Fully supported | |
| Appointment Type | Custom AppointmentType__c Table1:1 | Fully supported | |
| Invoice | Opportunity + OpportunityProduct1:1 | Fully supported | |
| Product | Product (Dynamics 365 Product Catalog)1:1 | Fully supported | |
| Company | Account1:1 | Fully supported | |
| Patient Attachment / File | SharePoint Integration via Dynamics 3651:1 | Fully supported | |
| Insurance Profile | Custom InsuranceProfile__c Table1: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
Microsoft Dynamics 365 Sales gotchas
Professional tier 15-table custom table limit blocks migrations
October 2024 pricing increase applies at renewal for all customers
Custom fields must be created in the UI before API writes
Power Platform request limits apply to bulk migrations
Activity records orphaned to inactive owners fail silently
Pair-specific challenges
Migration approach
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.
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.
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.
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.
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
Cliniko
Source
Strengths
Weaknesses
Microsoft Dynamics 365 Sales
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. All 8 core objects map 1:1 between Cliniko and Microsoft Dynamics 365 Sales .
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Cliniko and Microsoft Dynamics 365 Sales .
Object compatibility
All 8 core objects map 1:1 between Cliniko and Microsoft Dynamics 365 Sales .
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 Microsoft Dynamics 365 Sales migration scoping. Not seeing yours? Book a call.
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 consultationAdjacent paths
Other ways to leave Cliniko
Other ways to arrive at Microsoft Dynamics 365 Sales
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.