Mirth Connect is one of those products you only hear about if you’re already in healthcare IT, but if you are, you’ve almost certainly touched it. It’s an open-source integration engine. The layer that sits between two healthcare systems that need to exchange data and don’t speak the same dialect of HL7. Now owned by NextGen Healthcare (which is itself owned by Thoma Bravo as of 2024), the open-source edition is still actively maintained and remains the default tool a lot of small clinics use to glue their stack together.
This isn’t a feature-list blog post. The vendor page does that better. This is what running Mirth in production actually feels like, after a few clinic deployments.
What Mirth is, in concrete terms
You build “channels” in Mirth. A channel is: here’s a source (e.g. An MLLP listener on port 6661 for HL7v2 messages from the lab), here’s a filter (drop messages that aren’t result type), here’s a transformer (map fields, normalize patient IDs, handle the lab’s special way of encoding null), here’s a destination (write to the EHR’s inbound FHIR Bundle endpoint).
The transformers are written in JavaScript (Mirth bundles Rhino). The UI is a Swing desktop client that connects to a Mirth server. Clunky-looking in 2026, but it works, and once you internalize the model it’s genuinely productive.
Where it actually earns its keep
- Translating between HL7v2 and FHIR. This is the bread and butter. Almost every clinic has an old lab or imaging system that only emits HL7v2 ORU/ADT messages, and a newer EHR or analytics tool that wants FHIR resources. Mirth’s built-in HL7v2 parser plus the FHIR connector covers most of that translation without writing a custom shim.
- Decoupling integrations. When the lab vendor changes their HL7 segment layout (which they will), you update one channel transformer instead of touching the EHR. That’s the whole reason an integration engine exists.
- Filtering and routing. One inbound stream can fan out to multiple destinations (the EHR, an analytics database, an audit log, a copy to a billing system) with different filters on each. This is hard to do cleanly without an engine in the middle.
- Retry + queueing. When the destination is down, Mirth queues. When it comes back, the queue drains. You don’t lose lab results because Epic was being rebooted.
Where it’s painful
Three things bit me on every deployment:
- HL7v2 is not a standard. It’s a suggestion. Every vendor extends or violates it. You’ll end up writing a lot of JavaScript to handle the "this lab puts patient MRN in PID-2 instead of PID-3, except when it doesn’t" cases. Mirth doesn’t fix this; it just gives you somewhere reasonable to put the workaround.
- The Swing UI hates merge conflicts. Channels are stored as XML files. If two people edit the same channel in different branches and try to merge, you’re going to have a bad time. The community Git plugin helps, but the workflow is still “one person owns this channel at a time.”
- Performance tuning is opaque until it isn’t. Mirth runs fine on a $20 droplet for a small clinic until one day a vendor batches up 50,000 backlogged messages and the JVM heap dies. Watch your heap settings, and put inbound channels behind queues you can pause.
When to use Mirth vs. Something else
Reach for Mirth when:
- You’re a small or mid-sized clinic / lab / specialty practice and you need to wire up 2–20 systems that talk HL7v2, FHIR, or both.
- You want to keep the integration logic in-house and version-controlled rather than depending on a vendor’s “professional services” line item.
- You’re fine running a JVM and the Java-based admin client.
Reach for something else when:
- You’re building a green-field, FHIR-only stack. In that case a thinner FHIR-native gateway (HAPI FHIR, Aidbox, Medplum) is usually a better fit.
- You need a hosted SaaS integration engine because you don’t want to manage infrastructure. Redox, Smile CDR, and others occupy this slot.
- You’re a single-system shop with one feed. You don’t need an integration engine, you need a small script.
If you want help with one
I’ve set up and rescued Mirth deployments for clinics. Channel design, HL7v2→FHIR translation, version upgrades, the post-mortem on the queue that died at 3am. Drop a line if you’re standing one up or trying to dig one out.