Short answer: mapping means deciding, for each test code your laboratory system uses (GLU, HBA1C, K), which LOINC term it is, so that the result can be understood by every other system. The method is the same everywhere: list your tests with specimen, units and method; search LOINC along its six axes; decide with the laboratory's scientists, not alone; validate the codes; store the map as a FHIR ConceptMap; and govern it so new tests are mapped before they go live. The LOINC "Top 2000" list covers about 98% of result volume in most laboratories, so the first pass is smaller than the catalogue suggests.
Step 1: inventory
Export every orderable and reportable test from the laboratory information system with: local code, local name, specimen type, units as printed on the report, method or analyser, whether it is quantitative or qualitative, and the result volume over a year. Sort by volume. The top few hundred are where the value is; rare tests can follow.
Step 2: understand the six axes
To map a local laboratory code to LOINC correctly, all six axes of the LOINC term must match the local test: component (the substance measured), property (mass or substance concentration), timing (point in time or collection period), system (the specimen), scale (quantitative, ordinal, nominal or narrative) and method, used only where it changes the meaning of the result.
A LOINC term is defined by six parts, and a correct map matches all six:
| Axis | Question | Glucose examples |
|---|---|---|
| Component | What substance or property? | Glucose |
| Property | Mass, substance, ratio, presence…? | MCnc (mg/dL) vs SCnc (mmol/L) |
| Timing | Point in time or over a period? | Pt vs 24H (urine collection) |
| System | Which specimen? | Ser/Plas vs Bld vs BldC (capillary) vs Urine |
| Scale | Quantitative, ordinal, nominal, narrative? | Qn vs Ord (dipstick +/−) |
| Method | Only when it changes the meaning | Glucometer, immunoassay, PCR |
So 2345-7 (Glucose, MCnc, Pt, Ser/Plas, Qn) is right for a mg/dL serum glucose; 14749-6 is the same test reported in mmol/L; 2339-0 is whole blood; 41653-3 is a capillary glucometer reading; 1518-0 is a 2-hour post-load glucose. Picking 2345-7 for all of them loses exactly the information that makes results comparable. See What is a LOINC code? and UCUM units.
Step 3: search
Searching for candidate LOINC terms is done with RELMA, Regenstrief's free mapping assistant that imports an inventory and proposes candidates with their axes, with search.loinc.org for individual lookups, with a terminology server's $expand operation and a text filter when building the map into software, and with published national mapping tables as a cross-check rather than a final answer.
- RELMA, Regenstrief's free mapping assistant, imports your inventory and proposes candidates with the axes side by side; it is the standard tool for a first pass.
- search.loinc.org for individual lookups; filter by system and property.
- A terminology server
$expandwith a text filter, when you are building the map into software. See Terminology servers explained. - Public maps from other laboratories and national programmes (many countries publish national lab code → LOINC tables) as a cross-check, never as the final word, because their specimens and units may differ from yours.
Step 4: decide with the laboratory
Deciding on each LOINC code is done together with a laboratory scientist who knows the analysers, following fixed rules: prefer method-less terms, code the specimen as reported rather than as collected, let the reported units determine the property, choose ordinal or nominal scales for qualitative results, map panels as well as components, and never force a near match.
The mapping meeting needs a laboratory scientist who knows the analysers, and a rule book:
- Method-less first. Choose a term without a method unless your method changes clinical interpretation (troponin assays, drug screens, molecular tests).
- Specimen as reported, not as collected. A serum/plasma term for chemistry even if the tube was whole blood, because the analyser measured plasma.
- Units decide the property. Mass concentration for mg/dL, substance concentration for mmol/L; if your laboratory reports both, you have two LOINC codes.
- Qualitative results. Ordinal (
Ord) for +/−, 1+/2+; nominal (Nom) for organisms identified; the value then needs its own coding, usually SNOMED CT (LOINC vs SNOMED CT). - Panels. Map the orderable panel (CBC
58410-2, basic metabolic panel51990-0) as well as each component; a DiagnosticReport carries the panel, the Observations carry the components. - Calculated values. eGFR, LDL calculated, anion gap have their own terms that name the formula or say "calculated".
- No match. Record it, request a new term from Regenstrief (they add hundreds every release) and use a local code with a clear system URL meanwhile. Never force a near match.
Step 5: validate
Validating a LOINC map means confirming, for every chosen code, that the term exists and is active in the current LOINC release and that its axes match the inventory row. A terminology server's $lookup operation returns the component, property, system and scale properties for a programmatic check, and flags deprecated terms together with their replacement.
For every chosen code, confirm it exists and is active, and that its axes match your inventory row. Against a terminology server:
GET /CodeSystem/$lookup?system=http://loinc.org&code=14749-6
Check the returned properties (COMPONENT, PROPERTY, SYSTEM, SCALE_TYP) programmatically, flag deprecated terms (LOINC marks them with a status and a replacement) and keep the LOINC version you validated against.
Step 6: store the map as a ConceptMap
A finished local-code-to-LOINC map is stored as a FHIR ConceptMap resource: a source code system for the laboratory's tests, LOINC as the target, and one element per local code with its target LOINC code and an equivalence. Loaded on a terminology server, the ConceptMap drives $translate at import time; kept in version control, it is the audit trail.
{
"resourceType": "ConceptMap",
"url": "https://lab.example.org/fhir/ConceptMap/lis-to-loinc",
"version": "2026-03",
"status": "active",
"sourceUri": "https://lab.example.org/fhir/CodeSystem/lis-tests",
"targetUri": "http://loinc.org",
"group": [{
"source": "https://lab.example.org/fhir/CodeSystem/lis-tests",
"target": "http://loinc.org",
"element": [
{"code": "GLU", "display": "Glucose, serum (mmol/L)", "target": [{"code": "14749-6", "display": "Glucose [Moles/volume] in Serum or Plasma", "equivalence": "equivalent"}]},
{"code": "HBA1C", "display": "HbA1c (IFCC, mmol/mol)", "target": [{"code": "59261-8", "display": "Hemoglobin A1c/Hemoglobin.total in Blood by IFCC protocol", "equivalence": "equivalent"}]},
{"code": "K", "display": "Potassium, serum", "target": [{"code": "2823-3", "display": "Potassium [Moles/volume] in Serum or Plasma", "equivalence": "equivalent"}]}
]
}]
}
Loaded on a terminology server, $translate then does the conversion at import time; kept in version control, it is the audit trail of every decision. Interface engines and the lab connector read the same table.
Step 7: govern
New tests must be mapped to LOINC before results flow; a change of analyser triggers a review of the affected rows; LOINC releases (twice a year) are checked for deprecations; and the map has an owner. Without this, a mapped laboratory drifts back to local codes within a year.
Try it
The Anpheros free FHIR sandbox accepts Observations with LOINC codes and UCUM units and rejects unknown codes with a message that names the problem, which makes it a cheap test bed for a new map. The developer guide on importing lab results walks through a CSV with local codes becoming FHIR Observations.
Related pages
- What is a LOINC code?
- UCUM units in lab results
- LOINC vs SNOMED CT
- Terminology servers explained
- Lab connector: HL7 v2, CSV or JSON to FHIR
- Free FHIR server for development
- Import lab results into FHIR (developer site)
Sources
- LOINC: mapping your local codes
- LOINC: RELMA
- LOINC: Top 2000+ Lab Observations
- LOINC: the six parts of a LOINC name
- HL7 FHIR R4: ConceptMap
- HL7 FHIR R4: using LOINC with FHIR
Frequently asked questions
How long does a mapping project take?
For a general hospital laboratory, the top few hundred tests take a few weeks of part-time work with RELMA and a scientist; the long tail takes months and is best done as tests are ordered. The governance process matters more than the initial speed.
Should I map orders or results?
Both, but results first: they are what other systems consume. Orderable panels get their own LOINC panel codes; individual reportable analytes get component codes.
What if my laboratory reports a test in two units?
Then it is two LOINC terms, one per property (mass vs substance concentration). Decide which unit is canonical for exchange and convert consistently, keeping the original.
Can an AI assistant do the mapping?
It can propose candidates quickly, and that is useful for a first pass. Every proposal still needs a check of the six axes against your actual specimen, units and method by someone who knows the laboratory, and validation of the code against the current LOINC release.
Try it free in the sandbox
Your first FHIR call in 5 minutes. An HL7 FHIR R4 API with the patient's consent built in: try it in the sandbox, then connect your own app or clinic system.
Free · 30 synthetic patients · no card

The more you log, the clearer your record
Your health history in one place, under your control.
Free · Works in your browser · No card
