CRM migration
Field-level mapping, validation, and rollback between Zedmed and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Zedmed
Source
Odoo CRM
Destination
Compatibility
12 of 12
objects map 1:1 between Zedmed and Odoo CRM.
Complexity
BStandard
Timeline
5–10 business days
Overview
Zedmed is a practice-management system built for Australian medical clinics — its data model centres on patients, practitioners, appointments, clinical encounters, and Medicare/DVA/WorkCover billing (MBS item codes, bulk-billing flags, claiming rules). Odoo CRM is a general-purpose sales and pipeline tool whose core objects are res.partner (contacts and companies), crm.lead (leads and opportunities), crm.stage (pipeline stages), and account.move (invoices). The migration maps Zedmed patient records to res.partner contacts with addresses and phone numbers, Zedmed appointments to Odoo CRM activities and calendar events with original start/end times, and Zedmed billing records to Odoo account.move invoices with MBS item codes preserved as custom invoice line descriptions. We do not migrate Zedmed's clinical notes, prescription data, or scanned documents — those contain sensitive clinical content that requires separate clinical-system governance. We do not migrate Zedmed's automations or workflow rules (appointment reminders, recall systems, clinical task triggers) because those are destination-rebuild items in Odoo's Studio automation layer. We access Zedmed via scoped read access and API where available, then write to Odoo via xmlrpc/External API using batched inserts to respect Odoo's 1-request-per-second throttle limit.
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.
Why teams make this switch
Leaving
What's pushing teams away
Choosing
What's pulling them in
Object mapping
Each row shows how a Zedmed 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.
Zedmed
Patient
Odoo CRM
res.partner
1:1Zedmed patient records map to Odoo res.partner contacts. Patient name, date of birth, Medicare number, DVA number, address, and phone are migrated as standard contact fields. Each patient's primary practitioner in Zedmed resolves to an Odoo user by email match.
Zedmed
Patient (Medicare/DVA/HICAPS details)
Odoo CRM
res.partner + custom fields
1:1Medicare number, concession card type, HICAPS fund, and bulk-billing flag have no native Odoo CRM equivalents. We create x_medicare_number, x_concession_type, x_hicaps_fund, and x_bulk_billing_flag custom fields on res.partner to preserve this billing context for downstream accounting reconciliation. These fields are populated during the migration run and remain editable in Odoo after go-live.
Zedmed
Appointment
Odoo CRM
calendar.event / mail.activity
1:1Zedmed appointments with practitioner, start time, duration, appointment type (standard, long, procedural), and status map to Odoo calendar.event records linked to the patient res.partner. DNA (did not attend) status is stored as a custom field on the calendar event for reporting purposes.
Zedmed
Appointment Type
Odoo CRM
mail.activity.type
1:1Zedmed appointment type categories (standard, long, procedural, telehealth) map to Odoo mail.activity.type records. Each activity type carries the default Odoo duration and responsible-user setting. Original appointment type names are preserved as the activity type description. This preserves the original scheduling context for future reporting and workflow triggers in Odoo.
Zedmed
Payer (Medicare / DVA / WorkCover / TAC / Private)
Odoo CRM
account.move (invoice) + custom fields
1:1Zedmed payers are not native Odoo CRM contacts — they are billing entities. We map them to custom res.partner records of type 'payer' with x_payer_type (Medicare, DVA, WorkCover, TAC, Private, HICAPS) so that Odoo invoices can reference the correct payer. Medicare and DVA are modelled as government payers; WorkCover and TAC as third-party liability payers.
Zedmed
MBS Item Code / Fee Record
Odoo CRM
account.move.line (description) + product.product
1:1Zedmed MBS item codes (e.g. 23, 36, 44) and associated fees per payer are mapped to Odoo product.product records with the item code stored as x_mbs_item_code on the product. Invoice lines reference these products so billing history is queryable in Odoo reporting. Fee schedule tier values (P1/P2/P3, bulk-billing rates) are stored as custom fields on the product.
Zedmed
Invoice / Claim Record
Odoo CRM
account.move
1:1Zedmed billing invoices with status (paid, unpaid, claimed, rejected) map to Odoo account.move records. Claimed-to-Medicare status is stored as a custom field on the invoice. Original invoice number from Zedmed is preserved as x_source_invoice_ref for audit traceability. This ensures full traceability of billing records across systems after go-live.
Zedmed
Clinical Note / Encounter
Odoo CRM
mail.message (internal note)
1:1Zedmed clinical encounter notes contain sensitive health information and cannot be migrated to a CRM platform without explicit patient consent and clinical governance review. We flag these as not migratable in the migration plan. Practices should retain clinical notes in Zedmed or a dedicated clinical records system and link patients via the x_source_zedmed_id field for cross-referencing.
Zedmed
Practitioner / User
Odoo CRM
res.users
1:1Zedmed practitioner records (name, provider number, specialty) map to Odoo res.users by email match where an email exists, or by name lookup where email is absent. Zedmed provider numbers are stored as x_provider_number on the Odoo user record for Medicare claiming traceability.
Zedmed
Referral / Referring Practitioner
Odoo CRM
res.partner (contact) with x_referral_source flag
1:1Zedmed referral information (referring doctor name, referral date, expiry date) maps to a custom field set on the patient res.partner: x_referral_doctor_name, x_referral_date, x_referral_expiry. The referring practitioner is stored as a separate res.partner contact of type 'referrer' to allow Odoo to track referral source analytics.
Zedmed
Recall / Reminder
Odoo CRM
mail.activity with custom x_recall_type
1:1Zedmed recall rules (e.g. 6-month diabetes check, annual health assessment) become Odoo scheduled activities with a custom x_recall_type field and custom x_recall_interval field. The activity is linked to the patient res.partner and queued to the responsible practitioner user on the recall due date.
Zedmed
Document / Attachment
Odoo CRM
ir.attachment
1:1Zedmed file attachments (referral letters, consent forms, pathology results) that are stored outside of clinical notes are re-uploaded to Odoo's ir.attachment model and linked to the corresponding res.partner record. File size limits per Odoo configuration apply (default 25MB per file).
| Zedmed | Odoo CRM | Compatibility | |
|---|---|---|---|
| Patient | res.partner1:1 | Fully supported | |
| Patient (Medicare/DVA/HICAPS details) | res.partner + custom fields1:1 | Fully supported | |
| Appointment | calendar.event / mail.activity1:1 | Fully supported | |
| Appointment Type | mail.activity.type1:1 | Fully supported | |
| Payer (Medicare / DVA / WorkCover / TAC / Private) | account.move (invoice) + custom fields1:1 | Fully supported | |
| MBS Item Code / Fee Record | account.move.line (description) + product.product1:1 | Fully supported | |
| Invoice / Claim Record | account.move1:1 | Fully supported | |
| Clinical Note / Encounter | mail.message (internal note)1:1 | Fully supported | |
| Practitioner / User | res.users1:1 | Fully supported | |
| Referral / Referring Practitioner | res.partner (contact) with x_referral_source flag1:1 | Fully supported | |
| Recall / Reminder | mail.activity with custom x_recall_type1:1 | Fully supported | |
| Document / Attachment | ir.attachment1: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.
Zedmed gotchas
No public API — database extraction requires Zedmed support
v39 forces ZedSMS-only SMS after upgrade
Clinical WP Templates require RTF format and may be incompatible
Browser cloud restrictions affect document printing
P1/P2/P3 private fee levels require explicit mapping
Odoo CRM gotchas
Odoo.sh version gating blocks assisted migrations from trial
Enterprise modules fail to install on Community after database restore
Custom module view inheritance breaks between Odoo major versions
Custom fields risk losing their application context on Community
API access for Community is gated behind the Custom Plan
Pair-specific challenges
Migration approach
Audit Zedmed data and build the mapping plan
We read Zedmed's patient list, appointment history, practitioner roster, payer configurations, and invoice records via scoped API access. We produce a field-level mapping document showing every Zedmed field, its Odoo destination (standard field, custom field, or not migratable), and the transformation logic. We flag clinical notes, prescription data, and scanned documents as not migratable and deliver the exclusion list for your clinical governance sign-off.
Pre-create Odoo schema and custom fields
Before any data moves, we create the Odoo custom fields on res.partner (medicare_number, bulk_billing_flag, private_fee_tier, recall fields, source_zedmed_id), the custom fields on res.users (provider_number, specialty), the x_mbs_item_code product.product fields, and the x_source_invoice_ref field on account.move. We also create the mail.activity.type records for appointment types and recall types. If you run Odoo multi-company, we set up the company structure first. All custom fields are defined in Odoo Studio or via direct database migration scripts, depending on your instance configuration.
Resolve practitioners and payer entities
We match Zedmed practitioners to Odoo res.users by email address where available. Provider number, specialty, and practitioner name are preserved as custom fields (x_provider_number, x_specialty) on the Odoo user record. Where Zedmed practitioners have no email address, we match by full name and flag any unresolved practitioners in a pre-migration report so your team can either create Odoo user accounts or assign a fallback owner before the migration run.
Run sample migration with field-level diff
We migrate a representative slice of 100–300 patients, their appointments from the past 12 months, and a sample of invoices. We generate a field-level diff comparing source values in Zedmed with destination values in Odoo — verifying Medicare numbers, appointment times, practitioner assignments, and invoice totals. You review the diff and approve the mapping before the full run commits. Any mapping corrections are made against the sample set first.
Execute full migration with ordered sequencing and delta pickup
Full migration runs in the correct dependency order: res.company setup → res.partner (patients and payers) → res.users (practitioners) → product.product (MBS item codes) → calendar.event (appointments) → account.move (invoices). We use Odoo's External API with batched writes respecting the 1-request-per-second throttle. A delta-pickup window captures any Zedmed records modified during the cutover. We generate an audit log of every record created, updated, or skipped. One-click rollback is available if reconciliation fails.
Validate and hand over with rebuild reference documents
We run post-migration validation: record count reconciliation against Zedmed source counts, spot-check of Medicare numbers, appointment dates, and invoice totals. We deliver an automation rebuild reference document listing every Zedmed workflow (appointment reminder, recall rule, claiming trigger) with the equivalent Odoo Studio configuration steps. We provide 30 days of post-migration support for any data discrepancy fixes. We also verify that custom fields are populated correctly and that no records were inadvertently skipped during the batch process.
Platform deep dives
Zedmed
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. All 8 core objects map 1:1 between Zedmed and Odoo CRM.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Zedmed and Odoo CRM.
Object compatibility
All 8 core objects map 1:1 between Zedmed and Odoo CRM.
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
Zedmed: Not publicly documented.
Data volume sensitivity
Zedmed 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 Zedmed to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Zedmed to Odoo CRM migration with a real engineer — 30 minutes, free, written quote within 24 hours.
Book a free 30 minute consultationAdjacent paths
Other ways to leave Zedmed
Other ways to arrive at Odoo CRM
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.