CRM migration

Migrate from PracticeHub to Odoo CRM

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

PracticeHub logo

PracticeHub

Source

Odoo CRM

Destination

Odoo CRM logo

Compatibility

100%

11 of 11

objects map 1:1 between PracticeHub and Odoo CRM.

Complexity

BStandard

Timeline

4–8 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

PracticeHub stores patient data as dedicated objects — patients with healthcare fields (date of birth, blood type, allergies, emergency contact), appointments with practitioner and visit-type metadata, prescriptions, and files. Odoo CRM uses a modular model: res.partner holds contacts and companies, crm.lead handles leads and opportunities, and ir.attachment stores files. There is no native healthcare-equivalent object in Odoo, so patient medical metadata migrates to custom fields on res.partner, medical history documents migrate as ir.attachment records linked to the partner, and appointment records become crm.lead entries or calendar events with custom visit-type fields. PracticeHub exposes a REST API at https://{account_domain}.{region}.practicehub.io/api with a hard rate limit of 1 request per second per account — large patient databases require staged batch extraction with pagination. FlitStack AI sequences the migration so foreign keys resolve correctly: practitioners matched by email to Odoo users, clinic locations mapped to a custom clinic field, and files downloaded from PracticeHub and re-uploaded as binary ir.attachment records. Workflows, automation rules, and notification triggers are Odoo-specific constructs that do not transfer — we export definitions as a rebuild reference for the Odoo admin. A 24–48 hour delta-pickup window captures new appointments created in PracticeHub during cutover before the final reconciliation and one-click rollback.

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

PracticeHub logo

PracticeHub

What's pushing teams away

  • The 1 request per second API rate limit makes bulk data extraction painfully slow for practices with thousands of patient records to migrate.
  • Limited public pricing transparency and vague enterprise sales process frustrate small practices seeking quick cost comparisons.
  • Some users report that advanced billing and insurance claim workflows are less mature than dedicated EHR platforms.
  • Support responsiveness varies; smaller customer accounts report slower ticket resolution times.
  • The platform's breadth across compliance, scheduling, and patient engagement means no single feature set is as deep as purpose-built alternatives.

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

Each row shows how a PracticeHub 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.

PracticeHub

Patient

maps to

Odoo CRM

res.partner

1:1
Fully supported

PracticeHub patient maps to Odoo res.partner, which is the unified model for contacts and companies. Standard fields (name, email, phone, address) migrate directly. Healthcare-specific fields — date_of_birth, blood_type, allergies, emergency_contact — map to custom fields on res.partner that must be pre-created in Odoo before migration data loads.

PracticeHub

Patient (contact details)

maps to

Odoo CRM

res.partner (contact fields)

1:1
Fully supported

Patient first_name, last_name, email, phone, mobilephone, address_line_1, address_line_2, city, state, zip, and country map directly to Odoo res.partner fields. The address stored as structured fields in PracticeHub maps to Odoo's street, street2, city, state_id, zip, and country_id fields — address components must be parsed if PracticeHub exports as a single string.

PracticeHub

Appointment

maps to

Odoo CRM

crm.lead

1:1
Fully supported

PracticeHub appointment records map to Odoo crm.lead entries with the patient linked via res.partner. Fields like visit_type, visit_status, and appointment_date become custom fields on the lead or are encoded in the lead name. The appointment_time field is preserved as a note or custom datetime field. Lead stages (New, In Progress, Completed, Cancelled) are mapped value-by-value to Odoo crm_stage entries.

PracticeHub

Appointment (practitioner)

maps to

Odoo CRM

res.users

1:1
Fully supported

The practitioner_id and practitioner_email on a PracticeHub appointment map to an Odoo res.users record matched by email. Unmatched practitioners are flagged before migration — the admin either invites them to Odoo or assigns their appointments to a fallback user. This ensures activity ownership resolves correctly in Odoo after migration.

PracticeHub

Prescription

maps to

Odoo CRM

ir.attachment

1:1
Fully supported

Prescription records (medication_name, dosage, frequency, prescribing_doctor, prescription_date) do not have a native equivalent in Odoo CRM. FlitStack creates a prescription_summary custom field on res.partner and stores the structured prescription data as a JSON-serialized note or text field. If the source has PDF prescriptions, they are downloaded and re-uploaded as ir.attachment records linked to the patient partner.

PracticeHub

Document

maps to

Odoo CRM

ir.attachment

1:1
Fully supported

PracticeHub documents (title, description, file_url) and files (file_name, file_url, file_type) map to Odoo ir.attachment. The ir_attachment record requires res_model set to res.partner and res_id set to the partner id so the file attaches to the correct patient record in Odoo. FlitStack downloads files from PracticeHub URLs and re-uploads them as binary content to ir_attachment — this step is required because PracticeHub stores files externally.

PracticeHub

Clinic Location

maps to

Odoo CRM

res.partner (custom field)

1:1
Fully supported

PracticeHub clinic_location stored as a value on patient records maps to a custom pick-list field (Clinic_Location__c) on res.partner in Odoo. If multiple clinic locations exist, a value-mapping table maps each PracticeHub location name to the corresponding Odoo clinic identifier. This prevents clinic data from being lost when patients have a location attribute in the source.

PracticeHub

Referring Doctor

maps to

Odoo CRM

res.partner (custom field)

1:1
Fully supported

PracticeHub referring_doctor and referring_doctor_email fields have no Odoo CRM native equivalent. These migrate as custom fields on res.partner. If the referring doctor is an existing Odoo contact, the field can store the partner id; otherwise it stores the free-text name for manual reconciliation post-migration.

PracticeHub

Insurance Provider

maps to

Odoo CRM

res.partner (custom fields)

1:1
Fully supported

PracticeHub insurance_provider and policy_number map to custom text fields on res.partner in Odoo. If the insurance company exists as a company record in Odoo, the insurance_provider field can store a res.partner id linking to the insurer as a related company. This preserves the carrier relationship for billing workflows in Odoo.

PracticeHub

Medical History / Notes

maps to

Odoo CRM

mail.message / ir.attachment

1:1
Fully supported

PracticeHub medical_history is a free-text or structured field with no Odoo CRM native equivalent. It migrates as a long-text custom field on res.partner (medical_history__c) for searchability. If medical history is stored as a PDF or structured document in PracticeHub, it is downloaded and re-attached as an ir.attachment record linked to the patient partner, preserving the original document.

PracticeHub

Custom Patient Fields

maps to

Odoo CRM

res.partner (custom fields)

1:1
Fully supported

PracticeHub allows custom fields per patient object — any field not covered by the standard mappings above requires a corresponding custom field on res.partner in Odoo. FlitStack audits the full PracticeHub field list during pre-migration, generates a custom-field creation checklist for the Odoo admin, and maps each field with type-aware handling (text, date, pick-list, boolean, integer) before data loads.

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.

PracticeHub logo

PracticeHub gotchas

High

1 req/sec API rate limit severely restricts bulk migration speed

Medium

Region-specific API base URLs must be resolved before extraction

Medium

Patient Library assets export as separate binary blobs

Low

Prescription records may reference external Chewy pharmacy integration

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.lead has no native healthcare fields — custom fields on res.partner required for every medical attribute

    Odoo's crm.lead model is designed for sales leads and opportunities; it has no native fields for date_of_birth, blood_type, allergies, emergency_contact, or insurance metadata. Migrating a PracticeHub patient record means creating custom fields on res.partner for every healthcare attribute — Odoo's custom field system (Settings > Technical > Models > Fields) requires admin access and must be configured before data loads. Medical history documents and PDFs that are stored as file references in PracticeHub must be downloaded and re-uploaded as ir.attachment binary records linked to res.partner in Odoo. FlitStack generates a custom-field creation checklist as part of the pre-migration plan so the Odoo admin can pre-configure the schema before extraction begins.

  • PracticeHub API rate limit of 1 request per second makes large patient database extraction a multi-day operation

    PracticeHub's documented API rate limit is 1 request per second per account. For a healthcare practice with 15,000 patient records, extracting all records with full field sets requires 15,000+ sequential API calls — roughly 4.2 hours at minimum per extraction pass. In practice, pagination, field selection, and error handling extend this to a full day or more per extraction run. FlitStack sequences extraction in staged batches with automatic retry on 429 responses, progress logging, and resumable checkpoints so large database pulls do not fail mid-run. The migration plan documents the estimated extraction duration upfront based on patient record count.

  • File attachments stored as URLs in PracticeHub require download-and-re-upload to Odoo's binary attachment model

    PracticeHub stores file attachments (diagnostic images, exercise routines, PDF prescriptions) as URL-based references attached to patient records. Odoo's ir.attachment model stores files as binary blobs in the database with db_datas or as external files referenced by store_fname. There is no direct URL-import path in Odoo — FlitStack downloads each file from the PracticeHub URL, decodes it, and writes it as binary content to ir_attachment.datas with res_model set to res.partner and res_id set to the target patient partner id. Files that are inaccessible (expired URLs, access-restricted resources) are logged and surfaced in the migration report for manual re-upload post-migration.

  • Appointment-to-lead mapping requires a patient partner record to exist before appointments can be linked

    Odoo crm.lead records have a partner_id field that links to res.partner — without a partner record, the lead has no patient association in Odoo. PracticeHub appointments are linked to patients, so the migration must load all patient records (res.partner) before appointment records (crm.lead) to ensure partner_id foreign keys resolve correctly. FlitStack sequences the migration in the correct dependency order: patients first, then appointments, then prescriptions and files, then delta-pickup. Circular dependency risks (appointment references a patient not yet migrated) are flagged and resolved before the appointment phase begins.

  • Automation rules in PracticeHub do not transfer — Odoo's ir.actions.server and base.automation are platform-specific

    PracticeHub appointment reminders, patient notification triggers, and task-assignment rules are Odoo-incompatible constructs. Odoo's automation engine uses ir.actions.server records, base.automation rules, or Studio-defined workflows — these require manual reconfiguration in the destination. FlitStack exports PracticeHub automation definitions as a JSON specification during the pre-migration audit, which the Odoo admin uses as a reference to rebuild equivalent rules in Odoo. This is a known migration boundary disclosed upfront: no workflow, automation, or notification logic migrates automatically.

Migration approach

Six steps for a successful PracticeHub to Odoo CRM data migration

  1. Pre-migration audit and schema mapping

    FlitStack reviews the PracticeHub REST API endpoint structure, enumerates all patient fields (standard and custom), appointment fields, practitioner records, prescription fields, document and file attachment references, and clinic location values. We generate a field-by-field mapping plan that identifies which PracticeHub fields map to Odoo standard fields, which require custom fields on res.partner or crm.lead, and which require custom field creation in Odoo before migration data loads. This audit output includes a custom-field creation checklist for the Odoo admin and a data-cleanse specification if duplicate patients or inconsistent address formats are found in the source.

  2. Set up Odoo schema — custom fields and crm stages

    Before any data moves, the Odoo admin (or FlitStack with admin credentials) creates the custom fields required for healthcare metadata: date_of_birth__c, blood_type__c, allergies__c, emergency_contact__c, insurance_provider__c, policy_number__c, clinic_location__c, contact_status__c, visit_type__c, and prescription_summary__c on res.partner; planned_date__c, appointment_time__c, visit_type__c, and reminder_sent__c on crm.lead. Odoo crm_stage entries are configured to match PracticeHub appointment visit_status values (New, In Progress, Completed, Cancelled). This step produces a ready-to-receive Odoo environment so the migration data load encounters no schema gaps.

  3. Extract patient records in staged batches from PracticeHub API

    FlitStack pulls PracticeHub patient records via the REST API using paginated GET requests, batching at 50 records per page to manage the 1-request-per-second rate limit. Extraction runs in a background job with automatic retry on HTTP 429 responses, progress logging, and a resumable checkpoint so a network interruption does not restart from zero. Extracted records are written to a staging area, cleaned (duplicate check on email, address normalization), and validated against the mapping plan before loading into Odoo.

  4. Run sample migration with field-level diff

    A representative slice — typically 50–200 patient records spanning different clinic locations and contact statuses — migrates first. FlitStack generates a field-level diff comparing source PracticeHub field values against the destination Odoo res.partner and crm.lead field values. The diff report is reviewed jointly with the Odoo admin to verify that date_of_birth maps correctly, pick-list values resolve as expected, and attachments are linked to the correct partner record. Custom field mapping is validated at this stage. No full migration commits until the sample diff is approved.

  5. Execute full migration with delta-pickup window

    With the schema validated, FlitStack runs the full migration: patients → res.partner first, then appointments → crm.lead with practitioner_email matched to res.users, then prescriptions and file attachments downloaded and re-uploaded to ir.attachment. During the cutover window, PracticeHub remains fully operational — the API stays in read-only mode so clinic staff can continue booking appointments. A 24–48 hour delta-pickup window captures any new patients or appointments created after the initial extraction cut-off. After delta records are loaded and reconciled, the final cutover is confirmed. An audit log records every operation; one-click rollback reverts to the pre-migration state if reconciliation finds data discrepancies.

Platform deep dives

Context on both ends of the pair

PracticeHub logo

PracticeHub

Source

Strengths

  • No setup fees and no minimum contract terms reduce upfront commitment for small practices.
  • Multi-region API infrastructure supports UK (Neptune/London) and ANZ (Sydney) deployments with region-specific base URLs.
  • Patient mobile app handles appointment management, reminders, check-in, and payments as a bundled feature.
  • Built-in policy and compliance management reduces third-party tooling for accreditation workflows.
  • Publicly documented migration guide for Cliniko switchers signals active competitive positioning.

Weaknesses

  • API rate limit of 1 request per second is extremely restrictive for bulk data migration of large patient bases.
  • No publicly documented bulk export endpoint; all extraction relies on paginated REST API calls.
  • Limited pricing transparency with no self-serve pricing page found in research.
  • Patient Library binary assets (images, documents) may require separate handling from structured record exports.
  • Region-based URL architecture requires account-domain and region identification before any API calls can be made.
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. 1 of 8 objects need a mapping; the rest are 1:1.

B

Overall complexity

Standard migration

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

  • Object compatibility

    B

    1 of 8 objects need a mapping; the rest are 1:1.

  • 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

    PracticeHub: 1 request per second per account.

  • Data volume sensitivity

    B

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

Estimator

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

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

Can't find your answer?

Walk through your PracticeHub to Odoo CRM migration with a real engineer — 30 minutes, free, written quote within 24 hours.

Book a free 30 minute consultation

Most PracticeHub-to-Odoo CRM migrations complete in 4–8 weeks from kickoff to final sync for practices with under 5,000 patient records. The longest planning step is pre-migration audit and Odoo custom field setup — that phase alone can take 1–2 weeks if the Odoo admin needs to configure multiple healthcare fields. The PracticeHub API extraction phase takes 1–5 days depending on patient record volume and the 1-request-per-second rate limit. Larger practices with 10,000+ records, multiple clinic locations, and prescription data extend the timeline to 8–12 weeks.

Adjacent paths

Related migrations to explore

Ready when you are

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