Patients now expect a portal to do two things well: show them their lab results and let them see and manage appointments. Both sound simple from the outside, and both are deceptively involved underneath, because the data lives in clinical systems that were never designed with a patient-facing app in mind. Getting results and appointment data from the EHR and lab systems into a portal — reliably, matched to the correct patient, and shown at the right time — is an integration problem. This guide is about solving it with Mirth Connect.
We have built patient-facing health products for startups and health systems, EHR integrations for 30+ of them, and the routing patterns below are what make a portal feel trustworthy rather than flaky.
Key Terms
| Term | What it means |
|---|---|
| ORU | HL7 v2 message type carrying lab and diagnostic results from a lab system or EHR |
| MDM | HL7 v2 message type carrying clinical documents (imaging reports, discharge summaries) |
| SIU | HL7 v2 message type carrying scheduling information — appointments, cancellations, reschedules |
| ADT | HL7 v2 message type carrying patient demographic and visit events (admit, discharge, transfer) |
| DiagnosticReport | FHIR R4 resource representing a lab result or diagnostic finding |
| DocumentReference | FHIR R4 resource representing a clinical document available for retrieval |
| Appointment | FHIR R4 resource representing a scheduled patient visit |
| Release rules | Logic applied before a result reaches the patient — governs timing, sensitivity, and audit trail |
| Idempotency | Guaranteeing that processing the same message twice produces only one result in the portal |
The Two Data Stories a Portal Tells
A patient portal is built on two data streams: results and appointments. Results arrive as HL7 v2 ORU and MDM messages and map to FHIR DiagnosticReport and DocumentReference resources. Appointments arrive as SIU messages and map to the FHIR Appointment resource. Both need to be coordinated through a single integration engine — and Mirth Connect is where that happens.
Strip a patient portal down and it is mostly two feeds. The first is results and reports: lab values, imaging reports, and clinical documents that arrive from the EHR or a lab system as HL7 v2 ORU result messages and MDM document messages, and map to FHIR resources like DiagnosticReport and DocumentReference. The second is appointments: upcoming and past visits the patient should be able to see and sometimes manage, which flow as HL7 v2 SIU scheduling messages and map to the FHIR Appointment resource. Underpinning both is patient demographic data, arriving as ADT, that ensures every result and appointment lands on the right person's record.
If these message types are unfamiliar, our guide to HL7 explains them, and the FHIR R4 specification documents the resources. The important point is that a portal is not one feed — it is several, and they need to be coordinated.
What HL7 message types are used for patient portal integration?
The three core message types are ORU (lab and diagnostic results), MDM (clinical documents like imaging reports and discharge summaries), and SIU (scheduling — appointments, cancellations, and reschedules). ADT messages carry patient demographic updates and are used to keep patient matching accurate. On the FHIR side, these map to DiagnosticReport, DocumentReference, and Appointment resources respectively.
Why Route Portal Data Through Mirth Connect
Mirth Connect sits between clinical systems and the portal to filter, transform, gate, and match data. Without it, you have one fragile direct connection per source system. With it, you have one engine that applies release rules, confirms patient matches, de-duplicates messages, and fans out to the portal, notification system, and audit log in a single channel.
It is tempting to wire the portal straight to each source system. That falls apart quickly because a portal needs more than raw data — it needs data that is filtered, formatted, gated, and matched. Mirth Connect gives you one place to do all of that.
| Without Mirth Connect | With Mirth Connect |
|---|---|
| One fragile connection per source system | One engine, many sources flowing through controlled channels |
| No central place to apply release rules | Release rules enforced in the transformer before data reaches the patient |
| Patient matching handled ad-hoc per system | Single matching layer keyed on trusted identifiers |
| No idempotency — duplicates possible | Idempotency checks prevent the same result appearing twice |
| Audit trail scattered or missing | One audit destination per channel — complete, consistent record |
| Notification logic per system | Single notification destination fires on every relevant event |
If Mirth is new to you, our complete guide to Mirth Connect and the architecture and deployment guide are the place to start.
Results and Appointments: How They Differ
Results and appointments have different message shapes, different timing rules, and different sensitivity levels. Results carry clinical sensitivity and require release gating and strict patient matching. Appointments are lower-risk, more about status sync, and often support two-way updates. Mirth handles both — but the channel logic for each is different.
| Dimension | Lab Results & Reports | Appointments |
|---|---|---|
| HL7 message type | ORU (results), MDM (documents) | SIU (scheduling events) |
| FHIR resource | DiagnosticReport, DocumentReference | Appointment |
| Direction | EHR/lab → portal (one-way) | EHR ↔ portal (two-way for cancels/reschedules) |
| Timing sensitivity | High — release rules govern when patient sees it | Low — show as soon as confirmed |
| Clinical sensitivity | High — some results need gating | Low |
| Deduplication need | Critical — resent ORUs are common | Moderate |
| Key failure mode | Wrong patient match; result shown too early | Status out of sync; patient cancels but EHR doesn’t know |
The lab side shares a lot with general lab integration, which we cover in depth in our lab and LIS integration guide.
The Architecture: How a Mirth Channel Routes Portal Data
Each Mirth channel follows the same pattern: source connector receives the message → filter decides portal relevance → transformer applies release rules and maps to the portal’s format → destination 1 posts to the portal → destination 2 fires the patient notification → destination 3 writes the audit record. All three destinations fire from a single inbound message.
Step 1 — Source connector receives the message. An ORU result, SIU appointment update, or ADT demographic change arrives from the EHR or lab system over MLLP or HTTP.
Step 2 — Filter decides portal relevance. Not every HL7 message belongs in the portal. The filter passes only messages that match your portal-routing criteria — result type, ordering provider, patient portal enrollment status.
Step 3 — Transformer applies release rules and maps the data. This is the most important component. The transformer checks the result against your release policy, maps HL7 fields to the portal’s data model or FHIR resources, confirms the patient match against a reliable identifier, and checks idempotency to prevent duplicates.
Step 4 — Destination 1 posts to the portal. The mapped, gated, matched data is posted to the portal’s API or written to its database.
Step 5 — Destination 2 fires the patient notification. An email or push alert tells the patient that new content is available — without including clinical detail in the message itself.
Step 6 — Destination 3 writes the audit record. A timestamped log records what was released, when, under which release rule, and to which patient. This is your compliance paper trail.
Our HL7 v2 to FHIR R4 mapping guide covers the field-level work, and channel design patterns keep multiple portal feeds organized.
What FHIR resources do lab results map to?
An HL7 v2 ORU message maps to a FHIR DiagnosticReport resource, which carries the result status, ordered test, and individual observations. Each discrete result within the ORU maps to an Observation resource linked to the DiagnosticReport. Clinical documents (MDM messages — imaging reports, discharge summaries) map to DocumentReference. Patient demographics from ADT map to the Patient resource and anchor the matching logic.
Result Release: The Rule That Catches Teams Off Guard
Under the 21st Century Cures Act information-blocking rules, patients are generally entitled to their results promptly. Most organizations now release the majority of results automatically. The Mirth transformer is where your release policy is enforced before a result reaches the patient, and the audit destination is where you prove what happened. Getting this layer right is what keeps a portal both compliant and defensible.
The trickiest part of portal results is not technical — it is policy made technical. Organizations must balance prompt patient access with lawful, specific handling for defined result categories, and they need an auditable record of every release decision.
Mirth is the natural place to encode this:
- The transformer checks each result against your release policy before posting
- The audit destination timestamps what was released, when, and under which rule
- The filter can hold messages in a queue when manual review is required
The current federal rules are summarized at healthit.gov. Your release logic lives in Mirth, not in the portal application itself — that keeps it auditable, version-controlled, and changeable without a portal release.
How does the 21st Century Cures Act affect portal result release?
The 21st Century Cures Act information-blocking rules generally require that patients receive access to their electronic health information promptly and without delay. Most lab results and clinical notes now fall under this requirement. Organizations can apply specific, lawful exceptions for defined categories, but must have an auditable trail. The Mirth transformer is where release rules are applied per result, and the audit destination is the paper trail. Gating all results in the portal application rather than the integration engine is a common design mistake — it creates a compliance blind spot.
Reliability, Matching, and Idempotency
Three failure modes destroy patient trust in a portal: wrong-patient matches, duplicate results, and silent message loss. All three are preventable in the Mirth channel. Robust matching logic prevents mismatches. Idempotency checks prevent duplicates. A dead-letter and replay path ensures no message is silently dropped.
Patient mismatching is the most serious. Attaching a result to the wrong person is a safety issue. The transformer should match on a hierarchy of reliable identifiers — MRN, then enterprise patient identifier, then demographic confirmation — and reject or flag messages where the match is ambiguous rather than defaulting to a probabilistic guess.
Duplication happens because HL7 systems resend messages. The same ORU can arrive two or three times as the upstream system retries on no-ACK. The transformer should track a message fingerprint (MSH-10 message control ID plus the result identifier) and skip messages it has already processed.
Silent loss is the failure mode that is hardest to catch in testing. A message fails to post to the portal, the channel retries twice, and then the message is dropped with no alert. Every channel needs a dead-letter destination and a replay path so failed messages are held for reprocessing, not discarded. Our guide to message replay and dead letter queues covers this in detail.
How do you prevent duplicate results in a patient portal?
Track a message fingerprint in a lookup table — combine the HL7 MSH-10 message control ID with the result identifier (OBR-3 or OBX-3). Before posting to the portal, check the fingerprint against the table. If it already exists, acknowledge the message and skip the post. Update the table after every successful delivery. This handles the most common duplication scenario: upstream systems that retry on slow ACKs.
Notifications and the Patient Experience
The notification layer is what turns a passive data repository into a product patients actually use. When Mirth releases a result or syncs an appointment change, a channel destination fires the notification in the same flow — keeping alert and content consistent. The rule is restraint: batch low-urgency updates, never put clinical detail in the notification itself, and honor patient preferences inside the channel logic.
Notification design rules that matter for compliance and experience:
- Never put clinical detail in the notification body. A message preview on a lock screen is not a private channel. “You have a new lab result available” is correct. The actual value is not.
- Batch low-urgency updates. A patient who gets a push notification for every minor administrative change stops trusting the portal quickly.
- Honor preferences in the transformer. A patient who wants daily digest rather than instant alerts can be handled in the channel before the notification destination fires — not as a bolt-on in the portal application.
- Align alert timing with release timing. The notification should fire at the same moment the result becomes visible in the portal — not before, not minutes after.
A Realistic Rollout: Phased by Risk
Start with appointments — lower clinical risk, immediately useful. Add demographics sync before results flow. Introduce results in a single category your release policy handles cleanly, run it in parallel with existing processes, then widen. Never go live with results, matching, and notifications all at once.
Phase 1 — Appointments. Stand up the SIU → Appointment channel, test status sync including cancellations, and confirm two-way updates work if your portal supports self-service scheduling. Patients seeing their upcoming visits builds confidence in the portal with no clinical sensitivity involved.
Phase 2 — Demographics sync. Before any results flow, ensure patient matching is solid. Stand up the ADT → Patient sync and validate that MRN resolution is clean across your patient population. Fix matching gaps now — not after results are live.
Phase 3 — Results, limited category. Choose a result category your release policy handles cleanly — for example, routine labs with no manual review requirement. Run the ORU channel in parallel with existing delivery processes while you confirm matching, de-duplication, and release timing all behave. Monitor the audit log, not the portal UI.
Phase 4 — Widen to full result set. Once Phase 3 is stable for two weeks, extend the release rules and result types. Add document delivery (MDM → DocumentReference) if needed. Enable notifications.
Throughout all phases, track: messages received, messages posted, messages gated by release rules, messages failed and replayed. These four numbers tell you whether the system is working.
Security and Compliance
Portal data is PHI. A BAA is required. Patient-facing FHIR access must use SMART on FHIR scopes so patients see only their own data. Mirth Connect itself requires HIPAA-compliant infrastructure — encrypted at rest and in transit, audit logging enabled, access controls per channel.
- Business Associate Agreement with every party that handles PHI in the pipeline
- TLS 1.2+ on all MLLP and HTTP connections
- At-rest encryption on the Mirth message store
- SMART on FHIR
patient/*.readscopes on any FHIR-based patient access layer - Audit logs retained per your organization’s retention policy (minimum 6 years under HIPAA)
- Role-based access to Mirth channels — not every developer needs write access to production channels
We sign BAAs with US health systems and digital health customers and build on HIPAA-compliant, SOC 2 Type II, and ISO 27001 certified infrastructure with FHIR R4 native architecture.
This content describes engineering patterns. It does not include actual Protected Health Information. All data examples are synthetic.
How Nirmitee.io Approaches Patient Portal Work
Healthcare is the only industry we serve. Patient-facing products are a core part of our work — we built AffEx Health with a patient dashboard and consultation flow, and PainPal, a chronic-pain mobile app with Apple Health integration, shipped as a HIPAA-compliant build for a startup with no tech team in under 8 weeks. We have built EHR integrations for 30+ healthtech startups, and the Mirth routing patterns in this guide are what we use in production.
Our architecture is FHIR R4 native, which makes mapping results and appointments to portal-ready resources straightforward. If you are connecting an EHR to a patient portal and want results and appointments to flow reliably — or want the integration built — see our Mirth Connect integration services or book a call to talk through your specific setup.
Related Guides
- What is Mirth Connect? Complete Guide for Healthcare Leaders
- Mirth Connect Architecture, Channels, and Deployment Guide
- HL7 v2 to FHIR R4 Mapping Guide
- Lab and LIS Integration: ORU, ORM, and DiagnosticReport
- Mirth Connect Channel Design Patterns
- Message Replay and Dead Letter Queues in Mirth Connect
- Mirth Connect Cerner Integration Guide



