Paste a v2.5.1 message (ADT, ORM, ORU, SIU, ACK) and get a FHIR R4 message Bundle — or paste a Bundle and get the pipe-delimited message back. Every mapped element is traced field by field, and anything the mapping drops is listed rather than silently lost.
● Runs entirely in your browser — no uploads, no network callsHL7 v2.5.1 and FHIR R4 do not line up one-to-one. v2 is a positional, segment-oriented wire format with a lot of site-local convention baked in; FHIR is a resource graph with required codings and canonical value sets. Any converter has to make choices, so this one makes them visible: the Mapping trace tab lists every element it read and where it put it, and the Not carried over tab lists every populated field it did not read. If a field matters to you and it shows up in that second list, the conversion lost it.
MSH MSA ERR EVN PID PV1
AL1 DG1 IN1 MRG ORC OBR
OBX NTE SCH ZDS — the segment set defined in this
site's HL7 v2.5.1 reference, which is where the field names and code tables
used here come from. Segments outside that set are reported as unmapped rather than dropped quietly.
ADT A01/A02/A03/A04/A05/A08/A11/A13/A28/A31/A40, ORM^O01, ORR^O02, ORU^R01, SIU^S12 and ACK. Structure validation (required segments present, segment order) runs against those definitions.
HL7 → FHIR emits a Bundle of type: "message": a
MessageHeader built from MSH, followed by the resources it produced, each with a
fullUrl. Resource ids are derived deterministically from the content, so converting the
same message twice gives byte-identical output — useful for diffing two messages through the converter.
FHIR → HL7 accepts that Bundle, any other Bundle, or a single bare resource.
urn:hl7:codesystem:NAME placeholders, and assigning authorities become
urn:hl7:namespace:NAME. Substitute your own canonical URLs before using the output
anywhere real.instant does not, so Bundle.timestamp gets Z appended when
MSH-7 carries no offset, and that is flagged in Issues.ContactPoint.value, and come back in XTN-1. Same number, different components.NTE-2 (source of comment) has no home in a FHIR Annotation; it is left
unread, so it shows up in Not carried over.OBX-2 is re-derived from value[x] on the way back. For the string types
the original is kept in an extension so ST and TX survive the trip; for everything else the value
determines the type.ombCategory. If you are not on US Core, drop them.RGS, AIS, AIP,
NK1, GT1, PR1 and the rest are reported, not mapped — and
when a structure requires one of them, the reverse direction says so instead of pretending.Z segments have no FHIR equivalent. ZDS is carried as an identifier with
system urn:dicom:uid; other Z segments are reported, not converted.Press Round-trip check on any sample. Five of the six built-in messages come back byte-identical apart from the simplifications listed above; the SIU sample loses its RGS and AIS segments, which this converter does not map, and says so. The check is the honest answer to "can I trust this?" for your message, not just for the samples.