Watch a specimen become a signed result.
A multi-tenant laboratory information system. Ordering, custody, validation, quality control and release, with every rule visible and every step recorded.
Six links, and none of them collapses into another.
Collapse any two and a real workflow breaks. Move the specimen along the chain to see which one.
A patient is a person, not a visit.
One record carries every order they have ever had, at every laboratory that uses LabFlow. Identity is the root of the chain, so nothing below it can be attributed to the wrong human.
An order is not a specimen.
One order can need three tubes, and one tube can serve six tests. That many to many relationship is the domain rather than an inconvenience, so merging the two would make half the real workflows unexpressable.
The accession number is generated by the database.
Never by a client counter and never from a timestamp, because two technicians receiving specimens at the same second must not be able to produce the same one. It is human readable and carries a check digit, since it is transcribed by hand far more often than anyone plans for.
An ordered test with no result yet is a real state.
It is queryable, it ages, and it is the thing a technician works from. That state is the worklist. Fold the test into the result and the worklist has nothing to list until the work is already done.
A result is versioned, never overwritten.
A correction is a new row at version 2 pointing at the row it supersedes, and the earlier row stays released and true as of then. That earlier value is the one a clinician acted on, which is exactly what an incident review needs and exactly what a status flip to amended destroys.
A report is a snapshot, signed by a person.
It records the results as they stood at a moment. Amending a result later does not silently rewrite a report that was already issued, and the clinician who received the original is told about the amendment. An amendment nobody is told about is worse than the original error.
What LabFlow is
Four claims, each one checkable further down this page.
A result is a decision, not a row.
Everything else on this page follows from that one sentence.
Who may change it. What its status means, and who else is allowed to mean something different by the same word. What context has to be on screen before a person accepts it. Why it can never be quietly overwritten, and why a report issued last March still says what it said last March.
A laboratory information system that treats a result as a row in a table will get all of those wrong in the same way, and the wrongness will not show up in a demo. It shows up eighteen months later, in a case review, when nobody can say what the clinician was looking at.
So the rest of this page is not a feature list. It is six or seven places where you can operate the rule yourself and watch what it refuses to do.
The worklist, while you are reading this.
Results arrive, ages climb, and one row is validated by a person. Every flag carries an icon and a word as well as a colour.
| Accession | Patient | Test | Value | Flag | Status | Since receipt |
|---|---|---|---|---|---|---|
| A-24-0191 | Declan O Suilleabhain | Creatinine | 168 umol/L | High | entered | 14 min |
| A-24-0190 | Sofia Berhanu | Haemoglobin | 14.2 g/dL | Normal | released | 38 min |
| A-24-0189 | Tomasz Wierzbicki | Potassium | 6.9 mmol/L | Critical high | entered | 52 min |
| A-24-0188 | Priya Ramanathan | Basic Metabolic Panel | 6 of 8 | Partial | in_progress | 1 h 07 min |
| A-24-0187 | Marcus Vandermolen | HbA1c | 8.4 % | High | entered | 1 h 22 min |
| A-24-0186 | Ifeoma Adeyemi | Haemoglobin | 9.1 g/dL | Low | validated | 1 h 41 min |
Eight states. One writer.operable
Pick the state a result is in. The legal moves light up with the capability each one needs, and the rest say why they refuse.
Amended is deliberately not in this list. A correction is a new row at version 2 that supersedes the previous one, and the previous one stays released. There are two clinically meaningful values after an amendment, and a status field that flips destroys the first.
Auto-validation suggests. A person releases.
Rules that check a result against its resolved range, its delta from the patient's own previous value and the quality-control state of the run are genuinely useful. What they produce is a suggestion and a reason, not a release.
Anything describing itself as automatically verifying results is making a claim the product cannot back, and in a regulated setting it is the first claim anybody examines.
Whoever entered a result may not validate it, unless the tenant has explicitly turned on single-person operation. Small laboratories genuinely need that, so it is a setting rather than a default, and the mode in force is recorded on the transition.
Both buttons are inert on this page on purpose. This is a design specification, not a running system, and a control that appeared to release a result would be lying about what happens next.
Haemoglobin, LOINC 718-7
A reference range is a function, not a column.operable
Move the patient and the range moves with them. Move the value and the flag steps. Both are the real rule, running here.
Show the resolved interval as a table
| Boundary | Value | Source |
|---|---|---|
| Critical low | 7.0 g/dL | per test, not per patient |
| Reference low | 12.0 g/dL | adult female, not pregnant |
| Reference high | 15.5 g/dL | adult female, not pregnant |
| Critical high | 20.0 g/dL | per test, not per patient |
| Measured | 9.1 g/dL | this result |
Intervals shown here are an example configuration for one laboratory and one method. Real intervals are established by the laboratory that reports them, which is exactly why they cannot be two columns on a test row: they depend on age, sex, method, instrument and sometimes pregnancy, and they change over time.
The check that catches a swapped tube.operable
A delta check compares a result against the same patient's own previous value. Choose which previous value this specimen is compared with.
Show the compared values as a table
| Point | Value | When |
|---|---|---|
| Previous | 14.2 g/dL | 1 day ago |
| Current | 9.1 g/dL | this specimen |
| Limit | 2.0 g/dL | within 7 days |
A failed delta check flags for review. It never blocks, because blocking would stop a genuinely deteriorating patient from being resulted, which is the opposite of the intent. Beyond the configured window the comparison is meaningless and is not made.
Quality control gates patient results.operable
Turn a rule off and watch what stops being caught, and what the release gate then allows. That coupling is the whole point of quality control.
Potassium 6.9 mmol/L
A critical value is a phone call, and the phone call is a record.
Critical is not a stronger shade of abnormal. It means delay causes harm, so the obligation is not to display it prominently but to close a loop: identify it against per-test thresholds, escalate it to a responsible clinician, and record who was told, when, by which channel and who acknowledged it.
A notification that was sent and never acknowledged is an open safety issue with its own ageing, not a completed task. And a critical result cannot reach released without a recorded escalation, enforced in the transition function rather than in the interface, because the interface is not the only path to the field.
15 Jul 11:02:14 · automatic
15 Jul 11:04:41 · by S. Okonkwo, technician
15 Jul 11:09:03 · escalated, no answer on first attempt
Custody is a history, not a column.
When a specimen's integrity is questioned, the history is the answer. A location field that gets overwritten has already thrown the answer away.
Seventeen actions exist, and the awkward ones are the point. A specimen that could not be collected, or was collected badly, is part of its history.
Storage is one of room_temp, refrigerated, frozen or ultra_frozen, and a change of storage is itself an action rather than an edit to a field.
For patients
One history, every laboratory you have used.
Your results are yours. When two laboratories both run on LabFlow you do not get two accounts and two portals — you get one timeline, with the laboratory named on every entry.
Booking, results and sharing are one account across every participating laboratory. A laboratory that does not use LabFlow is not in this timeline, and the timeline says so rather than looking complete.
You choose what each laboratory sees.
A share grant is scoped to categories, has an expiry, and can be revoked. Turn a category off and it leaves the grant immediately.
clinician · Riverbend Family Practiceexpires 12 Oct 2024
Dr H. Lindqvist can see haematology, chemistry and imaging. microbiology and genetics are excluded, and results in those categories are not returned by any query this grant authorises.
Twelve personas, twelve applications.
Not one screen with permission holes cut into it. Pick a role and the shell changes, because a phlebotomist on a doorstep and a pathologist validating a panel are doing different jobs.
A technician enters results and may not validate them. That is not a permission checkbox somebody can tick, it is the four-eyes principle expressed as two distinct capabilities, and the transition function is what enforces it.
Honest limits
What LabFlow does not do.
Every one of these is a real boundary rather than a roadmap tease. Finding one of them out after you have committed is worse than reading it here.
LabFlow is HIPAA conscious: audit logging, least-privilege access, tenant isolation and recorded consent are designed in. It is not certified, and no software can be, so the word compliant does not appear.
How a laboratory joins.
An application moves through five states and a person reviews it. Listing a laboratory that runs clinical tests is not a self-serve checkout.
Nothing here is purchasable yet.
There is no payment gateway, by design. Quotes are given by conversation. LabFlow is privately developed and self-funded, so a quote reflects actual engineering and infrastructure cost rather than a markup priced for a funding round.
Every message lands in a real inbox rather than a ticket queue, which is a consequence of the size of the team and not a service promise.
Deliberately unavailable. No payment gateway exists, so a button that took your card details would be a lie about what happens next. Pricing is published at /pricing and quoted in conversation.