CRM migration

Migrate from Zedmed to Twenty CRM

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

Zedmed logo

Zedmed

Source

Twenty CRM

Destination

Twenty CRM logo

Compatibility

100%

10 of 10

objects map 1:1 between Zedmed and Twenty CRM.

Complexity

BStandard

Timeline

3–5 days

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

Teams move from Zedmed to Twenty CRM when they need a modern open-source CRM with API access, transparent per-seat pricing, and self-hosting options — instead of Zedmed's on-premise infrastructure, per-user licensing, and limited extensibility. The migration is architecturally complex because Zedmed stores healthcare data (patient demographics, appointment bookings, Medicare/DVA billing items, clinical encounters, prescriptions, referrals, investigation results) that Twenty CRM's standard People, Companies, and Opportunities objects do not natively accommodate. FlitStack AI extracts Zedmed patient records and maps them to Twenty's People object with name, email, phone, address, and custom fields for Medicare/DVA numbers. Appointments become a custom PatientAppointments object linked to the patient People record, preserving appointment type, status, practitioner, date, time, and duration. Clinical encounters, prescriptions, referrals, and investigations migrate as custom objects. Zedmed billing items map to a custom BillingItems object. We preserve original create and update timestamps, practitioner attribution, and source system IDs for audit continuity. The migration runs via direct export from Zedmed's data layer, transforms to Twenty's CSV import format or API, and includes a 24–48 hour delta pickup window. Workflows, automations, and clinical rules do not transfer — we export Zedmed configuration as a rebuild reference for your team.

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

Zedmed logo

Zedmed

What's pushing teams away

  • Browser-based cloud interface introduces friction — copy-paste restrictions, PDF printing requiring specific Chrome settings, and session timeouts disrupt clinical workflows.
  • Steep learning curve with limited training, particularly around billing setup, KPI monitoring, and customising the clinical layout to individual practitioner preferences.
  • No publicly documented API — all data extraction for migration requires engaging Zedmed support directly for database-level access, adding time and complexity to any switch.
  • Outdated interface and limited customisation options compared to newer medical platforms, leading practices seeking a more modern user experience to evaluate alternatives.
  • SMS functionality in v39 is restricted to ZedSMS only, forcing practices on legacy messaging providers to change vendor at upgrade time.

Choosing

Twenty CRM logo

Twenty CRM

What's pulling them in

  • Top open-source CRM on GitHub with 40.6K stars, giving teams full source code access and infrastructure ownership without per-feature licensing surprises.
  • Free self-hosting under AGPL-3.0 means unlimited users and custom objects for the cost of cloud infrastructure alone, typically $20–100/month.
  • Pricing page explicitly mocks competitors for charging add-on fees for API access, webhooks, and workflows — transparency that resonates with RevOps teams burned by Salesforce.
  • Unlimited custom objects and fields with no price impact, letting teams shape the data model to their business rather than forcing business into rigid schemas.
  • Modern TypeScript/React/PostgreSQL stack means developer-led teams can extend, self-host, or integrate without fighting legacy architecture.

Object mapping

How Zedmed objects map to Twenty CRM

Each row shows how a Zedmed object lands in Twenty 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

maps to

Twenty CRM

People

1:1
Fully supported

Zedmed patient records map directly to Twenty's People object. Name fields (firstname, lastname), email, phone, mobilephone, address fields, date of birth, and gender transfer as-is. Medicare/DVA number and healthcare identifier migrate to custom text fields on the People record. Active/inactive status preserved as a custom field.

Zedmed

Practitioner

maps to

Twenty CRM

People (with custom field)

1:1
Fully supported

Zedmed practitioners (doctors, specialists, allied health) map to Twenty's People object with a custom Practitioner_Role__c field set to the practitioner's role type (GP, Specialist, Allied Health). Practitioners must be invited to Twenty as workspace members before import so the relation resolves correctly.

Zedmed

Practice Organization

maps to

Twenty CRM

Company

1:1
Fully supported

Zedmed practice-level data — including clinic name, primary address, contact phone number, email address, and website URL — maps directly to Twenty's Company object. For multi-location practices operating across several sites, each physical location becomes a separate Company record in Twenty, allowing you to maintain clear associations between each site and its assigned practitioners, staff members, and patient cohorts.

Zedmed

Appointment

maps to

Twenty CRM

Custom Object: PatientAppointments

1:1
Fully supported

Zedmed appointments have no native equivalent in Twenty CRM. We create a PatientAppointments custom object in Settings → Data Model with fields for appointment type, status, date, start/end time, duration, practitioner (linked to People), location, specialty, and notes. Each appointment links to the patient People record via a relation field.

Zedmed

Billing Item / Invoice

maps to

Twenty CRM

Custom Object: BillingItems

1:1
Fully supported

Zedmed billing items (MBS item numbers, Medicare/DVA/private fees, payment status, claiming history) have no native equivalent in Twenty CRM. A BillingItems custom object stores invoice number, item number, fee type, Medicare amount, private amount, payment status, claim status, and payer type — all as custom fields on the object linked to the patient People record.

Zedmed

Clinical Encounter

maps to

Twenty CRM

Custom Object: ClinicalEncounters

1:1
Fully supported

Zedmed clinical encounter records (consultation notes, date, type, practitioner, summary) require a ClinicalEncounters custom object in Twenty. Encounter type (New Patient, Standard, Care Plan, etc.), encounter date, practitioner (linked to People), and clinical notes transfer as custom fields. The object links to the patient People record.

Zedmed

Prescription

maps to

Twenty CRM

Custom Object: Prescriptions

1:1
Fully supported

Zedmed e-prescriptions and prescribing records have no equivalent in Twenty CRM. A Prescriptions custom object captures medication name, dosage, route (oral, topical, etc.), frequency, start date, end date, prescriber (linked to People), status (active/ceased), and notes. The object links to the patient People record.

Zedmed

Referral

maps to

Twenty CRM

Custom Object: Referrals

1:1
Fully supported

Zedmed referral records (referral type, status, referring practitioner, receiving practitioner/organisation, request date, review date, notes) map to a Referrals custom object in Twenty CRM. Referral type (GP to Specialist, Allied Health, etc.), status (Pending, Accepted, Declined), referring and receiving practitioner names, and clinical notes transfer as custom fields.

Zedmed

Investigation Result

maps to

Twenty CRM

Custom Object: InvestigationResults

1:1
Fully supported

Zedmed pathology and imaging results (test type, status, date, results text, units, reference range, pathology lab) require an InvestigationResults custom object. Test type, status (Pending, Received, Reviewed), result date, results summary, and reference range become custom fields. Results link to the patient People record.

Zedmed

Payer / Health Fund

maps to

Twenty CRM

Custom Object: Payers (reference data)

1:1
Fully supported

Zedmed payer records (Medicare, DVA, WorkCover, TAC, private health funds, fee schedules) have no CRM equivalent. We extract payer names and store them as values in a custom select field on BillingItems rather than as separate records. The payer fee schedules migrate as a lookup reference or are preserved as CSV export 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.

Zedmed logo

Zedmed gotchas

High

No public API — database extraction requires Zedmed support

High

v39 forces ZedSMS-only SMS after upgrade

Medium

Clinical WP Templates require RTF format and may be incompatible

Low

Browser cloud restrictions affect document printing

Medium

P1/P2/P3 private fee levels require explicit mapping

Twenty CRM logo

Twenty CRM gotchas

High

Import order is enforced and critical

High

Export limited to 20,000 records and visible columns only

Medium

Soft-deleted records count toward uniqueness and trigger restores

Medium

API rate limits cap at 200 req/min on Organization tier

Low

No native email sequences — follow-up cadences require external tools

Pair-specific challenges

  • Clinical data has no native CRM equivalent — custom objects are mandatory

    Zedmed stores clinical encounters, e-prescriptions, referral letters, and investigation results (pathology, imaging) with structured clinical metadata that Twenty CRM's standard People, Companies, and Opportunities objects cannot represent natively. FlitStack creates ClinicalEncounters, Prescriptions, Referrals, and InvestigationResults custom objects in Twenty's Settings → Data Model before importing data. This requires upfront planning: custom fields must exist before CSV import, and your team needs to configure field types (select, text, date, number) for each clinical property. Clinical notes with free-text formatting are stored as long-text fields — formatting from Zedmed's structured encounter records does not carry over as structured data.

  • Appointment records require a custom object — not an Opportunity

    Zedmed appointments have appointment type, status, practitioner, date/time, duration, location, specialty, and clinical notes. Twenty CRM has no native appointment or scheduling object. We represent Zedmed appointments as a PatientAppointments custom object with fields for appointment type (New Patient, Standard, Care Plan), status (Booked, Attended, Did Not Attend, Cancelled), date, start/end time, duration in minutes, practitioner relation, location, and notes. The object links to the patient People record via a relation field. Each appointment links to the practitioner via a separate relation to the practitioner People record — not the standard Opportunity contact role model.

  • Billing items have no native equivalent in Twenty CRM

    Zedmed's billing model integrates with Medicare Online claiming, DVA, WorkCover, TAC, and private health funds, tracking MBS item numbers, fee schedules (Medicare/DVA/private), payment status, and claiming history (paid, unpaid, bulk billed, patient billed). Twenty CRM has no native billing or invoice module. A custom BillingItems object is required, with fields for invoice number, MBS item number, Medicare fee, private fee, payment status, claim status, and payer type. FlitStack migrates billing history as read-only records for audit continuity. New billing entries must be created manually or via custom development post-migration.

  • Zedmed's export mechanisms are not API-first — data extraction requires direct database access or manual export

    Zedmed's architecture is not designed around a public REST or GraphQL API for bulk data extraction. Export typically requires direct access to Zedmed's database (for on-premise deployments) or manual CSV exports through the Zedmed interface. On-premise Zedmed installations expose the underlying SQL Server or PostgreSQL database directly, which allows FlitStack to run structured SELECT queries. Cloud Zedmed instances may require the Zedmed team to provide a data export, and the Zedmed v35 migration documentation suggests support-assisted exports are the primary path. This adds time and coordination to the migration that API-first platforms do not require.

  • Australian healthcare-specific fields (Medicare/DVA) need custom fields in Twenty CRM

    Zedmed's data model includes Medicare numbers (MBS reference number + individual number), DVA file numbers, and healthcare identifiers (IHI) used in Australian healthcare claiming. Twenty CRM has no native Medicare or DVA field — these must be created as custom text fields on the People object before migration. Medicare number format requires concatenation of reference number and individual number from separate Zedmed fields. DVA number field structure is different from Medicare. Practices need to decide whether inactive patient records (marked as inactive in Zedmed) are imported as inactive People records or archived separately.

Migration approach

Six steps for a successful Zedmed to Twenty CRM data migration

  1. Discovery audit and extraction from Zedmed

    FlitStack AI conducts a discovery phase against Zedmed: sample data extraction from the Zedmed database (for on-premise) or coordinated export (for cloud instances) to understand the data model in your specific practice setup. We identify all patient records, practitioner records, appointments, billing items, clinical encounters, prescriptions, referrals, and investigation results. We document field formats, value distributions, null rates, and duplicates. This produces a Zedmed-specific mapping document that names every source table and field alongside its Twenty CRM destination object and field — including which fields require custom objects and which require custom fields in Settings → Data Model.

  2. Build Twenty CRM schema: custom objects and custom fields

    Before any data loads, your Twenty CRM workspace requires the custom objects (PatientAppointments, BillingItems, ClinicalEncounters, Prescriptions, Referrals, InvestigationResults) and custom fields (Medicare_Number__c, DVA_Number__c, Provider_Number__c, Practitioner_Role__c, etc.) created in Settings → Data Model. FlitStack delivers a schema setup plan based on the discovery audit so your admin creates all required fields before validation runs. Practitioners must also be invited to Twenty as workspace members before the migration, otherwise practitioner-to-patient relations cannot resolve during import.

  3. Run a test migration with field-level diff

    A representative sample of records migrates first — typically 100–500 records spanning patients, practitioners, appointments, and billing items. We generate a field-level diff comparing source Zedmed values against the migrated Twenty records so you can verify Medicare number formatting, practitioner relations, appointment status values, and billing item accuracy. Custom object field types and relation mappings are validated at this stage. Any incorrect mappings are corrected before the full run.

  4. Execute full migration with practitioner and patient relations

    The full migration runs in the correct import order: Company records first (if multiple practice locations exist), then People records for patients and practitioners, then custom objects (ClinicalEncounters, Prescriptions, Referrals, InvestigationResults linked to patient People records), then PatientAppointments, then BillingItems. Practitioner-to-patient relations resolve by matching practitioner email or Zedmed practitioner ID to the practitioner People record created in step one. Each operation is logged in the audit trail.

  5. Delta pickup for in-flight records and go-live

    A delta-pickup window (24–48 hours) captures any appointments booked, billing items created, or patient records updated in Zedmed during the cutover period. FlitStack runs a final reconciliation comparing source record counts and a spot-check of field values against Twenty records. An audit log documents record counts per object and any records that required manual resolution. One-click rollback is available if reconciliation identifies unexpected discrepancies. Workflows, automations, prescribing rules, and clinical protocols do not migrate — FlitStack exports Zedmed configuration settings as a reference document for your team to rebuild in Twenty's workflow builder.

Platform deep dives

Context on both ends of the pair

Zedmed logo

Zedmed

Source

Strengths

  • Integrated Medicare, DVA, WorkCover, and health fund claiming with Tyro EFTPOS and MA Online directly in the billing workflow.
  • Dual deployment — Zedmed Cloud handles server maintenance and security; Zedmed On-premise gives full server control for practices preferring it.
  • Comprehensive clinical module covering e-prescribing, pathology results, referrals, chronic disease management, and drawing on images within one system.
  • Per-user pricing with discounted rates for part-time and admin staff, plus a free Doctor's App on iOS for practitioners.
  • Multi-location functionality allows single-app management across multiple clinic sites with separate or shared configurations.

Weaknesses

  • No publicly documented API — all data extraction for migration requires direct engagement with Zedmed support for database-level access.
  • Browser-based cloud interface introduces workflow friction: 2FA requires phone fallback, copy-paste and PDF printing need specific browser settings.
  • Interface is perceived as dated compared to newer medical platforms; limited customisation options for UI and workflow adaptation.
  • Upgrade paths introduce breaking changes — v39 deprecates legacy SMS providers in favour of ZedSMS only, forcing provider changes at migration time.
  • Limited third-party integrations beyond HealthLink, Tyro, and HL7 messaging — no modern REST API for EHR or analytics integrations.
Twenty CRM logo

Twenty CRM

Destination

Strengths

  • AGPL-3.0 open-source license with full source code on GitHub — no vendor lock-in, no sunset risk.
  • Unlimited users and unlimited custom objects on self-hosted, with no feature gating based on headcount.
  • REST and GraphQL APIs available on all paid tiers, not locked behind an enterprise add-on fee.
  • MCP server and webhooks shipped as standard features, not premium upgrades.
  • Modern PostgreSQL-backed data model that developer teams can query, extend, and self-host.

Weaknesses

  • Recent v1.0 release means limited production hardening compared to CRMs with multi-year operational track records.
  • No native email sequencing or sales engagement tools — follow-up cadences require a separate platform.
  • No native two-way email sync or inbox integration, requiring third-party connectors for full activity logging.
  • Self-hosting 'free' pricing hides real infrastructure and DevOps costs that stack up over time.
  • Workflow automation is functional but lacks the complexity needed for sophisticated multi-step sales motions.

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 Zedmed and Twenty 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

    Zedmed: Not publicly documented.

  • Data volume sensitivity

    B

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

Estimator

Estimate your Zedmed to Twenty 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 Zedmed to Twenty CRM data migrations

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

Can't find your answer?

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

Book a free 30 minute consultation

Most Zedmed-to-Twenty migrations complete in 3–5 days of clock time for practices with under 10,000 patient records and no years of clinical history. Practices with complex custom objects — years of pathology results, bulk billing records, or multi-practitioner appointment histories — extend to 2–4 weeks. The longest planning step is creating the required custom objects and custom fields in Twenty's Settings → Data Model before data import begins, because Twenty requires fields to exist before CSV records can reference them.

Adjacent paths

Related migrations to explore

Ready when you are

Move from Zedmed.
Land in Twenty 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