commvita
Connected care platform
Migrating on and off

Migrating on, and leaving: what the export produces

The door out has to work as well as the door in. What commvita hands over, in which standard, what it doesn’t, and how the audit survives the move.

Live vs demonstrated: Live — real, API-backed platform logic (wired end-to-end today) Demonstrated — representative control surface with seeded data / illustrative UI mock-up
© 2026 Commvita Digital Health Solutions Ltd. All rights reserved.

1 Two doors, and both of them open

I want customers who stay because they want to. That means the door out has to work as well as the door in, and it has to work without me. This page says exactly what commvita hands over, in which standard, and what it doesn’t hand over. Where a screen is a demonstration rather than a wired capability, it says so.

Ahead of the field
The person can take their own record out, and the download is logged. A patient signs in to the portal and downloads their record as a FHIR R4 bundle, built from their own conditions, medications, immunisations and observations, with every category that holds nothing named instead of filled in with something plausible. Every download is written to the export record. No patient-facing system we assessed offers a patient-initiated portability export of this kind.From commvita’s own competitive assessment of this module against the systems it competes with. Our assessment, not an independent one.

2 What comes out, in which standard

The clinical record leaves as FHIR R4. A capability statement describes what the server holds, and the resources are readable individually or as everything held about one patient in a single bundle: patient, conditions, encounters, observations, medication and care plans.

Per patient

FHIR R4 · JSON bundle

Everything held about one person in one call, and the same content the person can pull themselves from the portal. Categories with no records are listed by name, so “nothing recorded” is told apart from “nothing to report”.

Per cohort

OMOP CDM v5.4 · CSV and Parquet

Populated common data model tables for a study cohort, de-identified, with a data quality summary and a ledger entry. This is the analytic export and it’s wired end to end.

Per screen

CSV downloads

Most operational tables in the platform download as CSV from the screen they sit on. Useful, unglamorous, and the thing people reach for first.

FHIR Bulk Export console. A header strip reads FHIR Bulk Data Access IG v2.0.0, output NDJSON, authentication SMART Backend Services with JWT client assertion, asynchronous polling from 202 Accepted to 200 Complete, retention 72 hours. A New export Job form offers level System, output format application/fhir+ndjson, a since date of 01/01/2026 and resource type checkboxes with Patient, Condition and Observation ticked. A job queue lists job-001 System complete in 14 minutes with 47 files and 1240 MB, job-002 Group in progress, job-003 Patient complete with 6 files and 48 MB, and job-004 System failed.
FHIR Bulk Export · a demonstrated consoleCaptured from the running system, build B-591 · seeded data

That console is a demonstrated surface. The bulk asynchronous export it describes, NDJSON output, backend-services authentication, polling and file retention, is the shape of the capability instead of a running job queue: the jobs and their file counts are seeded content held in the page. The live path today is the FHIR R4 read of a patient or a resource type, and the cohort export in the next section. Saying that plainly is what this document is for.

3 The analytic extract, populated and checked

Pick a study cohort and the platform runs a real transformation to OMOP common data model version 5.4, returns a data quality summary against the tables it just built, and offers each table as CSV or Parquet. The screenshot below was produced by pressing the button.

OMOP CDM Transformation, Data Quality tab, run live. A study and cohort are selected. The DQD result reads REVIEW, 62.4 percent source to standard mapped, 4671 persons, 16202 rows. Completeness checks show person year of birth populated 3906 of 4671 failing and measurement value populated 36 of 36 passing. Conformance shows condition occurrence source to standard mapping 70.6 percent as a warning, drug exposure mapping 100 percent passing and referential integrity passing. Plausibility shows no future birth year. An Export CDM v5.4 table lists person 4671 rows, observation_period 4671, visit_occurrence 3060, condition_occurrence 3763, drug_exposure 0, measurement 36 and cdm_source 1, each with CSV and Parquet download buttons.
OMOP CDM v5.4 · materialised from a cohort, with its own data quality reportCaptured from the running system, build B-591 · live run on seeded records

Three things in that picture matter more than the row counts. The result says REVIEW instead of PASS, because 62.4 per cent of source values mapped to a standard concept and the platform won’t present that as clean. Every table is offered in both an open text format and a columnar one. And the extract is de-identified before it’s written: a surrogate person identifier, a per-person date shift, birth month and day suppressed, small counts suppressed and a cohort under ten people blocked outright. The de-identification is described in more depth in the OMOP explainer.

4 How the audit survives the move

An export that leaves no trace isn’t a governed export. Every extract writes a ledger row: an identifier, who took it, the anonymisation tier, the row count, the disclosure decision, a file hash, the destination and the sharing agreement it was taken under.

Extract Ledger table. Five OMOP CDM rows taken minutes earlier, each 16,202 rows, pseudonymised, disclosure Pass, with a file hash such as 68966548fbc04ab7, destination OMOP CDM Parquet or CSV, timestamps of 08 September 2026 and a Released status with a Download action. Below them an earlier extract of 189 rows released, and a row of 7 rows marked Blocked with no file hash.
Extract Ledger · the five runs above, written as they happenedCaptured from the running system, build B-591 · seeded records

The blocked row is the useful one. Seven people is under the disclosure threshold, so no file was produced and no hash exists, and the refusal is on the record next to the releases. A leaked file can be matched back to its row by hash. The ledger itself is read-only and gated to governance roles, because a list of what has left the platform and where it went is disclosive in its own right.

1

The account log is chained

Sign-ins, role changes and other security events are appended with each row hashed over the one before it, and the chain is verified when the log is read. If a historic row were altered, the read says so.

/auth/login-audit
2

An export never returns more than the caller could already read

The export catalogue resolves what a given person may request instead of listing everything to everyone, and refusals carry their reason. It’s an interface capability with no screen of its own today.

/export/catalogue/export/requests
3

Identity travels with the record, except where it must not

A per-patient bundle carries the national identifier and local identifiers, which is what makes it loadable into a receiving system. The cohort extract doesn’t: it carries surrogate identifiers and shifted dates, so it can’t be re-linked from the file alone.

/fhir/r4/OMOP CDM

5 What doesn’t come out

The honest half of a portability promise is the list of things it doesn’t cover. All of these are true of this build.

Not available today. There’s no one-click export of the entire deployment as a single archive. There’s no bulk NDJSON job running behind the bulk export console. Modules that hold their own operational content, boards, heatmaps and the demonstrated consoles named in this document, export what their screen shows instead of a modelled feed. There’s no import of a comma-separated file: nothing in the platform takes a spreadsheet of patients or staff and loads it. And this page makes no statement at all about escrow, support, service levels or contract terms, because those aren’t settled and I won’t imply they’re.

What that adds up to for a buyer: the clinical record and the analytic dataset leave in published standards with an audit trail, and the operational and governance surfaces leave as tables. If a receiving system needs more than that, it’s an integration project, and it should be priced as one not assumed.

6 Migrating on

Coming in is a job with a shape: agree the source systems, map the fields, run it in dry-run, look at what failed, then run it for real and keep the ability to reverse it. commvita holds that job as a record instead of as a project plan.

A migration job carries a name, the source system, the data types in scope and whether it’s a dry run. Field mappings are held per source system. Running a job records what it did, including failed records and validation issues, and a completed job can be rolled back to a recorded state. The job register and its statistics are wired; the transfer itself isn’t performed by this build, so treat the record counts on a run as the shape of the reporting and not as data that moved.

Batch file adapter registry. Five adapters listed with type, direction, remote host or mailbox, schedule, status, last run and next run: an inbound SFTP adapter on a spine host running every four hours and active, a bidirectional AS2 pathology adapter on demand and active, an outbound MESH referrals adapter on an hourly schedule and active, an outbound SFTP export paused, and an outbound claims SFTP adapter running at 02:00 and active. Each row carries an enable toggle, a Configure button and a Run Now action.
Batch file adapters · a demonstrated registry of feedsCaptured from the running system, build B-591 · seeded data

Feeds are the other half. Message routes, a queue, a dead-letter queue with replay, and a mapper from HL7 v2 to FHIR are present as control surfaces with seeded content, as is the batch adapter registry above. They show how a deployment would be wired and what an operator would see. No live message engine is running behind them in this build. The FHIR R4 interface described in section two is the live route in as well as out.

7 The version where the question doesn’t arise

The Flow Edition is self-hosted at £1 per instance. The deployment runs on the buyer’s own infrastructure, so the data never leaves it, and leaving is a matter of switching off a service you already run instead of asking somebody to release your record.

That edition exists for a specific reason, and the argument for it’s set out in the exit and continuity explainer, which deals with what a continuity programme looks like when a national platform is withdrawn. This document is the narrower question: what physically comes out, and in what shape.

Where it lives in commvita

CapabilityRouteModel / APIStatus
FHIR R4 capability statement and resource readsAPI only/fhir/r4/metadata · Patient, Condition, Encounter, Observation, MedicationStatement, CarePlan● Live
Everything held about one patient, as one bundleAPI only/fhir/r4/Patient/{id}/$everything● Live
The person’s own record, downloaded by them/portalAPI /portal/fhir-export · names empty categories · written to the export record● Live
OMOP CDM v5.4 extract, CSV and Parquet/omop-cdm · /clinical-studiesAPI /studies/{id}/cohorts/{id}/omop-cdm · de-identified · disclosure gated · DQD● Live
Extract ledger/clinical-studiesAPI /studies/extracts · hash, destination, sharing agreement, blocks under n=10● Live
Export catalogue resolved per callerAPI only/export/catalogue · /export/requests · no screen● Live
Tamper-evident account logAPI only/auth/login-audit · hash chained, verified on read● Live
Migration jobs: dry run, run, rollback, statistics/nhs-integrationsAPI /migration/jobs · /migration/field-mapping/{system}; the run doesn’t move data in this build● Live
Bulk asynchronous export console (NDJSON)/fhir-bulkSeeded job queue and history held in the page☉ Demonstrated
Message routes, queue, dead-letter replay, HL7 to FHIR mapper/hl7-engine · /transformation-studioFixed responses behind /hl7/; no live engine☉ Demonstrated
Batch file adapters (SFTP, AS2, MESH)/batch-adaptersSeeded registry and processing log☉ Demonstrated
What we’re not promising. It isn’t a guarantee of a migration outcome, and nothing here is a contractual term: escrow, support and service levels aren’t settled and aren’t claimed. It isn’t a data-quality promise either. The extract reports its own mapping rate and will say REVIEW when the record it was built from is incomplete, and the receiving organisation still has to decide whether that’s fit for what they intend. commvita is decision support: it produces the file, the checks and the trail, and a named person decides what to do with them. Non-SaMD.
© 2026 Commvita Digital Health Solutions Ltd. All rights reserved. HL7 FHIR R4FHIR Bulk Data Access IGOHDSI OMOP CDM v5.4 HL7 v2UK GDPR Art. 20 portabilityUK GDPR Art. 30 records of processing ICO anonymisation guidanceNon-SaMD