Skip to content
FHIRVendors

FHIR service

FHIR Migration Services

FHIR migration covers three distinct jobs: moving interfaces from HL7 v2, CDA or proprietary APIs onto FHIR; upgrading existing FHIR implementations from DSTU2 or STU3 to R4; and moving FHIR data from one server or platform to another. Each carries its own risks, but all share one rule: consumers of the old interface must keep working until they have moved.

  • Legacy-to-FHIR migration from HL7 v2 messages, C-CDA documents and proprietary APIs
  • FHIR version upgrades from DSTU2 or STU3 to R4, and planning for R4B or R5
  • Server-to-server and platform migrations with data fidelity checks
  • Parallel running, consumer cutover and rollback planning

Three types of FHIR migration

Migration typeMain challengeHelpful references
HL7 v2 / CDA / proprietary to FHIRSemantic mapping and replacing event-driven behaviorHL7 v2-to-FHIR IG, C-CDA on FHIR IG
DSTU2 or STU3 to R4Breaking structural changes in resources and profilesFHIR R4 version maps and change logs
FHIR server or platform switchPreserving IDs, history, references and search behaviorBulk Data export, transaction Bundles

Many organizations combine types, for example retiring an STU3 server and moving to a managed R4 service in one program. Treat each as a separate risk register even if they share a timeline.

Migrating from HL7 v2, CDA or proprietary APIs

This is rarely a full replacement. HL7 v2 remains the norm for many real-time hospital feeds, so a typical migration converts v2 messages into FHIR resources for downstream consumers while the source keeps sending v2. Our FHIR vs HL7 v2 guide explains why the two coexist.

  • Segment-to-resource mapping: PID to Patient, PV1 to Encounter, OBX to Observation, and so on, including local Z-segments that have no standard equivalent.
  • Event semantics: a v2 ADT A08 is an update notification; deciding how that becomes FHIR create, update or a Subscription notification needs deliberate design.
  • Document decomposition: C-CDA sections can be stored as a DocumentReference, decomposed into discrete resources, or both. Decomposition creates duplicate-detection work.
  • Proprietary API retirement: publish a FHIR alternative, migrate consumers one by one, then deprecate with a firm date.

Upgrading DSTU2 or STU3 implementations to R4

FHIR R4 (4.0.1) was the first release with normative content, and US Core and the CMS-referenced IGs are built on it. Older implementations face real breaking changes rather than renames. Examples that affect most upgrades:

  • MedicationRequest replaced MedicationOrder (from DSTU2), and medication-related resources were restructured.
  • AllergyIntolerance and Condition changed `clinicalStatus` and `verificationStatus` from simple codes to CodeableConcepts in R4.
  • Profiles must be re-targeted, typically from Argonaut Data Query (DSTU2) or older US Core versions to a current US Core release.
  • Search parameters and operations may change name or behavior, which breaks client queries even when data converts cleanly.
{
  "resourceType": "Condition",
  "clinicalStatus": {
    "coding": [{
      "system": "http://terminology.hl7.org/CodeSystem/condition-clinical",
      "code": "active"
    }]
  },
  "code": { "coding": [{ "system": "http://snomed.info/sct", "code": "44054006" }] },
  "subject": { "reference": "Patient/example" }
}
Condition.clinicalStatus in R4 is a CodeableConcept bound to an HL7 terminology code system

If you are weighing a jump beyond R4, see FHIR R4 vs R5; for US regulatory work, R4 remains the target.

Moving between FHIR servers or platforms

Even when both servers run R4, a move can break consumers. Decide up front whether resource IDs must be preserved (clients often store them), whether version history and `meta.lastUpdated` values matter, how references between resources are rewritten if IDs change, and whether search results and paging behave identically. Export via `$export` or paged reads, load via transaction Bundles or the target's bulk import, then reconcile counts and sample records resource type by resource type.

Run in parallel, with a rollback path

Keep the old interface or server live while consumers move, compare outputs between old and new, and define in advance what would trigger a rollback and how long one would take.

Questions to ask a migration partner

  • Which migration types have you delivered, and what were the source and target versions or platforms?
  • How do you inventory existing consumers and their dependencies before cutover?
  • How do you prove data fidelity: counts, checksums, field-level comparisons, clinical review?
  • What is your approach to IDs, references and history when moving servers?
  • How do you handle v2 Z-segments and local codes that do not map cleanly?
  • What does the rollback plan look like, and has it been tested?

Migration is often the first phase of a broader FHIR implementation; when that is the case, evaluate partners for both.

Engagement models and cost drivers

Migrations suit a fixed-price assessment that inventories sources, consumers and mapping complexity, followed by a delivery phase priced against that inventory. Cost rises with the number of message types or resource types, the proportion of custom extensions and local codes, data volume and history depth, the number of consumers to coordinate, and the length of the parallel-run period.

Frequently asked questions

Can HL7 v2 messages be converted to FHIR automatically?

Conversion tooling and the HL7 v2-to-FHIR mapping work can handle standard segments, but every real-world interface has local conventions and Z-segments. Expect to review and extend any automated mapping, and to test with production-like message samples.

Is upgrading from STU3 to R4 just a library update?

No. R4 introduced structural changes to several commonly used resources and to search parameters, and profiles must be re-targeted. Data, server and client code all need changes and testing.

Should we migrate straight to R5?

For US regulatory use cases, no: US Core and the CMS-referenced IGs target R4. R5 may make sense for specific non-regulatory features, but check that your server, partners and tooling support it before committing.

How do we avoid breaking apps that use our current API?

Inventory consumers, publish the new endpoint alongside the old one, run both in parallel, communicate a deprecation date and monitor traffic on the old endpoint before switching it off.

Related FHIR services

Related guides

Listed fhir migration providers

Vendors in our directory that state they offer this service. Not a ranking · affiliated company shown first and labelled · others alphabetical.

Find the Right FHIR Integration Partner for Your Healthcare Project

Tell us what you need to build or connect. We review every request and share a short list of relevant vendors from our directory — no obligation.