Epic's HL7v2 feeds are still the workhorse for getting clinical data out of a major health system in 2026, even with FHIR APIs available for the modern surface. ADT for admit-discharge-transfer, ORM for orders, ORU for results, plus the SIU and DFT feeds. The trick is not parsing HL7v2; it is delivering the resulting FHIR resources in a way that holds up under morning admit waves, supports replay when the downstream FHIR server has a bad afternoon, and leaves an audit trail the Epic interface team trusts. The seven patterns below work in production this year.
For broader context, the clinical data exchange hub is a useful starting point. The terminology-side picks that pair with these patterns sit in best FHIR terminology servers for WHODrug lookup in 2026.
1. MLLP Listener Per Feed Type
Epic interface teams typically deliver each feed (ADT, ORM, ORU) over a dedicated MLLP TCP connection on its own port. The integration engine that handles these well runs a listener per feed, with separate worker pools, separate back-pressure, and separate restart paths. A blocked ORU worker pool should never block ADT delivery, and the cleanest way to enforce that is at the listener level.
2. Trigger Event Router Before Parsing
Before the HL7v2 segments get parsed, route by MSH-9 (trigger event). ADT^A01 (admit) goes one way, ADT^A04 (registration) another, ADT^A08 (update) another. The reason is that the downstream FHIR resource graph differs by trigger event, and trying to handle that with a single mapper turns into the kind of conditional logic that bites two years later.
3. Persistent Queue Worker Chain
Some platforms (for example, Interbox by Health Samurai) ship with queue-driven PostgreSQL-backed worker chains where each stage of the HL7v2-to-FHIR pipeline is a separate worker with its own queue. MLLP receipt, segment parsing, FHIR assembly, and the FHIR server write each get their own worker. The queue persists messages between stages so a worker crash in the middle of the chain does not lose the message.
For Epic interface teams that have lived through a worker pool that died mid-batch and left orphaned messages, this model removes a class of incidents. The alternative is a Kafka-style stream the engine reads from; both work.
4. Hash-Diff Before The FHIR Write
A common Epic feed pattern is sending ADT^A08 updates that are mostly unchanged from the prior version. Writing every A08 as a PUT against the FHIR Patient resource burns server cycles and pollutes the version history. The pattern that holds up is hashing the incoming resource against the last-written hash and skipping the write when nothing material changed. Less traffic on the FHIR server, cleaner version history, and the audit trail stays meaningful.
5. Per-Trigger-Event Replay Buffer
Epic interface teams occasionally need to replay a window of messages. The pattern that works is a per-trigger-event replay buffer (often 24 to 72 hours) inside the integration engine, accessible by a tool the on-call engineer can use without raising a ticket with the Epic team. The replay should write through the same hash-diff path so that re-delivered messages do not double-write the FHIR store.
6. Side-By-Side Inspection For Operator Triage
When an Epic ORU result lands as something the downstream team did not expect, the fastest triage path is a side-by-side view of the raw HL7v2 segments and the resulting FHIR Observation. Pipelines that surface this in an operator console (rather than asking the engineer to grep two log files) shorten triage from hours to minutes.
7. Per-Sending-Facility Audit Trail
In a multi-hospital Epic instance, MSH-4 identifies which hospital generated the message. Pipelines that preserve this through to the FHIR resource (usually via Meta.source or a custom extension) give the audit team a clean answer to "what came from which hospital and when," which is the first question in every payer audit. The top 5 FHIR terminology servers for MedDRA-driven workflows covers the vocabulary side. The right combination is the one the team can defend in the next interface review.
Sources
- IG - HL7 V2-to-FHIR Implementation Guide, ADT/ORU/ORM message-to-Bundle mappings