CRM migration

Migrate from My Practice Now to Odoo CRM

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

My Practice Now logo

My Practice Now

Source

Odoo CRM

Destination

Odoo CRM logo

Compatibility

90%

9 of 10

objects map 1:1 between My Practice Now and Odoo CRM.

Complexity

BStandard

Timeline

48–72 hours

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

My Practice Now stores client records, appointment calendars, and invoice data in a flat structure optimized for single-practitioner workflows. Odoo CRM uses a relational model centered on crm.lead (which handles both leads and opportunities), res.partner (unified contact and company record), and account.move (invoices). The migration maps My Practice Now client fields to res.partner fields, appointment records to crm.lead entries with activity logging, and invoice line items to Odoo's account.move and account.move.line tables. Custom fields from My Practice Now (client-specific properties, treatment notes, insurance details) migrate as custom fields on res.partner using Odoo's x_ prefix convention. Owner resolution matches My Practice Now practitioner emails to Odoo user accounts. FlitStack uses Odoo's XML-RPC API to write records in dependency order — res.partner first, then crm.lead with partner_id links, then account.move with partner_id and invoice lines. Reports, automations, and appointment reminders do not migrate and must be rebuilt using Odoo's studio tools or custom modules.

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

My Practice Now logo

My Practice Now

What's pushing teams away

  • Capterra reviewers cite poor customer service and unresponsive support as primary churn drivers, with issues remaining unresolved long enough to erode trust.
  • Negative reviews describe the software as non-intuitive and complicated, contradicting positive reviews and suggesting a steep or inconsistent onboarding experience.
  • Multiple reviews note that implementation is time-consuming and lengthy, which frustrates small practices with limited administrative capacity.

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 My Practice Now objects map to Odoo CRM

Each row shows how a My Practice Now 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.

My Practice Now

Client

maps to

Odoo CRM

res.partner

1:1
Fully supported

My Practice Now client records map directly to Odoo res.partner. The partner serves as the unified contact and company record. Address fields, phone, email, and custom client properties transfer as fields on res.partner. Multiple My Practice Now clients sharing one email are flagged for deduplication before migration.

My Practice Now

Appointment

maps to

Odoo CRM

crm.lead

1:1
Fully supported

Each My Practice Now appointment becomes a crm.lead entry. The appointment date maps to crm.lead create_date, the practitioner maps to user_id, and the appointment type or status maps to stage_id. Notes from the appointment session transfer to the lead description or a custom field on crm.lead for continuity.

My Practice Now

Invoice

maps to

Odoo CRM

account.move

1:1
Fully supported

My Practice Now invoices map to Odoo account.move records with move_type='out_invoice'. Line items map to account.move.line entries with product_id, quantity, and price_unit. Partner_id links to the migrated res.partner record. Fiscal position mapping applies if My Practice Now stores tax information.

My Practice Now

Practitioner

maps to

Odoo CRM

res.users

1:1
Fully supported

My Practice Now practitioner accounts are matched to Odoo res.users by email address before migration begins. If a practitioner's email does not correspond to an existing Odoo user, FlitStack flags that practitioner and either reassigns their appointments to a designated fallback Odoo user or temporarily holds those appointments pending creation of the missing user accounts in Odoo.

My Practice Now

Custom Client Property

maps to

Odoo CRM

res.partner (x_ custom field)

1:1
Fully supported

My Practice Now custom client properties (treatment notes, insurance group, referral source) require custom fields on res.partner in Odoo. Field types are created to match source types. Values are loaded after the custom field definition exists in the Odoo database.

My Practice Now

Service/Product

maps to

Odoo CRM

product.product

1:1
Fully supported

My Practice Now service items are mapped to product.product records with type set to 'service'. Each product.product record is then referenced in account.move.line entries to represent the line items on invoices. If My Practice Now includes a price list, FlitStack translates it into Odoo's pricelist model, associating the appropriate pricing rules with the migrated products and customers.

My Practice Now

Client Notes

maps to

Odoo CRM

mail.message / ir.attachment

many:1
Fully supported

Client notes and session history from My Practice Now are imported as Odoo mail.message records linked to the corresponding res.partner, preserving the original creation timestamp and the practitioner who authored each note. If the notes contain file attachments, FlitStack stores them as ir.attachment records associated with the partner or lead, ensuring the original files remain accessible within Odoo's document management system.

My Practice Now

Appointment Reminders

maps to

Odoo CRM

mail.activity

1:1
Fully supported

Appointment reminder rules defined in My Practice Now have no direct equivalent within the Odoo CRM data model, because Odoo handles reminders through its calendar module rather than as CRM attributes. FlitStack exports the complete reminder configuration—including notification timing, channels, and recipient logic—as a structured reference document that your Odoo administrator can use to recreate the rules manually in Odoo calendar and mail.activity, preserving the same reminder behavior after migration.

My Practice Now

Billing Settings

maps to

Odoo CRM

account.fiscal.position / res.partner

1:1
Fully supported

Tax identification numbers and billing preferences stored in My Practice Now are mapped to Odoo res.partner fields such as vat and property_payment_term_id, while any tax region mappings are represented as account.fiscal.position records. This configuration-level data is loaded during the migration alongside the actual record data, ensuring that fiscal and payment term settings are applied automatically to the migrated partners and invoices in Odoo.

My Practice Now

Reporting / Dashboards

maps to

Odoo CRM

No equivalent

1:1
Fully supported

My Practice Now report definitions and dashboard configurations do not migrate because they are platform‑specific UI constructs with no direct Odoo equivalent. The underlying data—client records, appointments, and invoices—is fully present in Odoo and can be queried using Odoo's built‑in reporting tools, pivot views, or custom SQL views built against the migrated tables. Your team will need to rebuild any custom reports and dashboards in Odoo using Studio or SQL‑based reporting.

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.

My Practice Now logo

My Practice Now gotchas

Medium

Research data is sparse and often misattributed

High

Thinkific export scope determines what we can migrate

Medium

Content files require separate media migration

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

  • Invoice-to-partner link requires res.partner to exist before account.move

    Odoo's account.move requires a valid partner_id that points to an existing res.partner record. My Practice Now invoices store client IDs, but the client must first be migrated as a res.partner entry; without that link the invoice write fails Odoo's foreign‑key validation. FlitStack enforces a strict order—res.partner records are loaded before any account.move rows—and it pre‑checks for orphaned invoice references, flagging any that lack a matching partner so they can be resolved before the migration run commits.

  • Custom fields must be created before data loads or Odoo rejects the import

    Odoo enforces field validation at write time, rejecting any attempt to write data to a field that does not yet exist in the model. My Practice Now custom client properties have no native Odoo counterpart, so each property must be created as an x_ prefixed field on res.partner—either through the Odoo UI (Settings > Technical > Custom Fields) or via a direct SQL INSERT into ir.model.fields—before the migration can load values. FlitStack generates a pre‑migration field‑creation script that reflects the source property data types and names, then executes it before any record loads begin, ensuring all target fields are present and correctly typed.

  • Practitioner-to-user email resolution creates orphaned leads without a fallback owner

    Odoo crm.lead records must have a user_id set; without an owner the lead is invisible to sales teams in the kanban view and cannot be assigned to stage actions. My Practice Now practitioner accounts often use email addresses that have not yet been provisioned as Odoo internal users, which would leave those appointments orphaned in the pipeline. FlitStack performs a pre‑migration email‑to‑user lookup against Odoo res.users, flags any practitioners that do not match, and either assigns them to a configurable fallback user or pauses the migration of their appointments until the missing Odoo accounts are created.

  • Appointment reminders map to Odoo calendar module which is separate from CRM

    My Practice Now appointment reminder rules—including email notifications, SMS alerts, and pre‑appointment prompts—have no direct counterpart in the Odoo CRM data model. Odoo's reminder functionality resides in the calendar module (calendar.event and calendar.alarm) and is connected to crm.lead through mail.activity relations, meaning reminders are not stored as plain data fields but as linked calendar events. FlitStack exports the full reminder configuration as a JSON reference file that your Odoo administrator can use to recreate the rules manually in Odoo calendar and mail.activity, but the reminder definitions themselves do not automatically transfer during migration.

  • Invoice line items require product.product records to exist before account.move.line writes

    Odoo's account.move.line entries that include a product_id must reference an existing product.product record; if the product does not exist, the line write fails validation. My Practice Now often stores service items as plain text descriptions rather than formal product entities. To handle this, the migration either creates minimal product.product records for each unique service text (with a default type of 'service') or maps the line to a non‑product invoice line using an explicit account_id instead of product_id. This choice is made during the mapping phase and documented in the pre‑migration design plan so that stakeholders can decide how they want services represented in Odoo.

Migration approach

Six steps for a successful My Practice Now to Odoo CRM data migration

  1. Audit My Practice Now data model and export structure

    FlitStack connects to My Practice Now via available export mechanisms—CSV export or API access—to catalog all client records, appointments, invoices, custom properties, and service items. We capture field data types, relational constraints, and data‑quality flags such as duplicate email addresses, missing practitioner links, and orphaned invoice references. The audit output forms the source‑side schema map that informs the design of the Odoo field mapping plan and identifies any pre‑migration cleanup needed before data loads.

  2. Create Odoo custom fields and configure partner/lead model

    Prior to any data loads, FlitStack creates the custom fields on res.partner using Odoo's x_ prefix convention (or module-based field definitions) for each custom client property discovered in My Practice Now. We also define the stage_id values on crm.lead to align with My Practice Now appointment statuses, and we configure practitioner‑to‑user email resolution rules by querying Odoo res.users so that each practitioner maps to the correct Odoo user before appointments and leads are migrated.

  3. Migrate res.partner records with field-level mapping

    Client records migrate as res.partner entries via Odoo's XML‑RPC API, with address fields, contact information, and custom properties mapped according to the field mapping plan. Practitioner assignments are resolved by matching the practitioner email to an Odoo user_id in res.users; any unmatched emails are flagged for fallback handling. FlitStack applies deduplication logic to detect clients that share identical email addresses, and it flags those records for manual merge review before the migration commits to the target database.

  4. Migrate appointments as crm.lead entries and invoices as account.move

    Each appointment record is transformed into a crm.lead entry, using stage_id mapping to reflect My Practice Now appointment status, user_id assignment derived from the practitioner email resolution, and tag_ids to capture service type for segmentation. Appointments linked to a practitioner inherit the resolved user_id, ensuring ownership in the kanban pipeline. Invoice records generate account.move entries (move_type='out_invoice') with partner_id linking back to the migrated res.partner, and each invoice line creates an account.move.line entry that references the corresponding product.product record created from My Practice Now service items.

  5. Run field-level diff validation and delta-pickup window

    FlitStack runs a sample migration on a representative subset (typically 100–500 records) to produce a field‑level diff report that compares each source value against the corresponding Odoo field after migration. The report verifies custom field population, confirms invoice totals and line‑item amounts, and checks stage_id mapping consistency. Once the full migration is committed, a delta‑pickup window captures any My Practice Now records created or modified during the cutover period, ensuring Odoo reflects the latest source state at go‑live. An audit log records all writes, and rollback capability is available should reconciliation reveal any discrepancies.

Platform deep dives

Context on both ends of the pair

My Practice Now logo

My Practice Now

Source

Strengths

  • Combines appointment scheduling, invoicing, and client notes in a single interface for small practices
  • Intuitive and simple to use according to positive G2 reviewers
  • Responsive development team that incorporates user feature requests
  • Mobile app allows creating and accessing client notes on the go
  • Great tech support cited by satisfied users

Weaknesses

  • Poor customer service and slow issue resolution reported in negative reviews
  • Non-intuitive and complicated interface according to some users
  • Lengthy, time-consuming implementation process
  • Inconsistent user experience — same product praised as intuitive and criticized as confusing
  • Sparse public documentation makes research and comparison difficult
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 My Practice Now 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

    My Practice Now: Not publicly documented at the individual storefront level; Thinkific generally applies org-level rate limits.

  • Data volume sensitivity

    B

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

Estimator

Estimate your My Practice Now 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 My Practice Now to Odoo CRM data migrations

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

Can't find your answer?

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

Book a free 30 minute consultation

Most My Practice Now to Odoo CRM migrations complete in 48–72 hours of clock time for under 10,000 client records. Larger datasets with detailed invoice histories exceeding 50,000 records extend to 7–10 days. The longest planning step is mapping custom client properties to Odoo custom fields and sequencing invoice line items to account.move structure. Cutover delta-pickup adds 24–48 hours to the final window.

Adjacent paths

Related migrations to explore

Ready when you are

Move from My Practice Now.
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