Terminology

How to map local lab codes to LOINC, step by step: the six axes, the tools, the pitfalls and a ConceptMap

Most laboratories report with their own test codes. Mapping them to LOINC makes results comparable and readable by any FHIR system. A step-by-step method: inventory, the six LOINC axes, RELMA, specimen and unit traps, validation on a terminology server, a FHIR ConceptMap, and governance for new tests.

by Published 7 min read

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.

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 $expand with 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 panel 51990-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.

Sources

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.

Anpheros Platform

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

This guide is for information and does not replace medical advice. For decisions about your health, talk to your doctor. In an emergency, call your local emergency number (112 in Europe).
Written by
The Anpheros team

Anpheros builds a medical record that the patient controls and can share with any clinic, on an HL7 FHIR R4 platform, based in the EU. These guides help you understand and organise your health; they do not replace your doctor.

About Anpheros →
Anpheros

The more you log, the clearer your record

Your health history in one place, under your control.

Symptom diaryPatterns show over time
Emergency cardQR in your phone's Wallet
All your resultsLabs and reports together
You decideWho sees what, and for how long
Create your free account

Free · Works in your browser · No card