← All case studies
Case study · Nonclinical

From CDMO spreadsheets to decision-ready curves

Vendor cytotoxicity data that scientists hand-normalised became a validated pipeline with QC flags, a one-click IC50 curve generator and a 71-assay automation roadmap.

PBMC cytotoxicity · 8-point titration · 3 donorsassay batch 2026-03 · processed → Notion
0%25%50%75%100%0.010.11101001000concentration (nM, log)viabilityIC50 2.1 nMIC50 2.8 nMIC50 3.4 nM
Donor 1 · IC50 2.1 nMDonor 2 · IC50 2.8 nMDonor 3 · IC50 3.4 nMmean IC50 2.8 nM · CV 23% · 0 values changed silently
“

Flag, don't fix. The pipeline never corrects a value — it surfaces the ones a scientist should look at. Slower on paper, trusted in practice, and the reason it got used.

— The call I made

Challenge:

Inconsistent vendor files, hand-normalised, with no trail back to raw

PBMC cytotoxicity results arrived from the CDMO as CSV and XLSX files that disagreed with each other about units, column names and layout. Scientists normalised them by hand, computed IC50s in ad-hoc spreadsheets, and nothing traced a processed number back to the raw row it came from.

It worked, in the way that a careful person doing it every time works — right up until the day someone else had to do it, or a reviewer asked where a number came from.

  • Inconsistent inputs: Every vendor export was a slightly different shape; every batch needed hand-cleaning before analysis.
  • Ad-hoc IC50s: Curves lived in individual spreadsheets, with no shared method and no donor-variability view.
  • No traceability: Processed values could not be traced back to raw rows — a problem for any result that ends up in a regulatory document.
  • Scientists own the science: Any tool that silently changed a value, or quietly dropped an outlier, would be rejected — and should be.

Solution:

A pipeline that validates and flags, feeding the tools scientists already use

The processing scripts validate the schema, normalise units, detect outliers, average across donors and flag anything that needs a human eye — then write Scispot-ready outputs and keep Raw and Processed databases in Notion so every row is traceable. An interactive IC50 generator turns processed data into dose-response curves with per-donor variability in one click. The first working version ran on one real CDMO file in front of the science team before any roadmap existed.

  • Processing scripts: schema validation, unit normalisation, outlier detection, donor averaging and QC flagging → Scispot-ready outputs
  • Raw and Processed databases in Notion so every row is traceable
  • Interactive IC50 dose-response generator with per-donor variability — the decision view, one click from the data
  • A 71-assay automation roadmap, and an HL7 lab-ingestion PRD broken into nine engineering tickets

The pipeline

Every value is traceable to its raw row; the scientist decides what a flag means.

CDMO export (CSV / XLSX)→Schema validation→Unit normalisation→Outlier detection→Donor averaging→QC flags→Notion · Raw→Notion · Processed→IC50 curve
RowFlagWhyScientist's call
D2 · 12 nMOutlierViability 61% vs donor-mean 44% at this dose; 2.3 SD from the curve.Kept — replicate well confirmed; noted in run log.
D3 · 200 nMUnitColumn reported µg/mL where the template expects nM; converted using the stated MW.Accepted conversion after checking the CDMO sheet.
D1 · 0.01 nMBaselineTop plateau 103%; clamped for fitting, raw value preserved.No change.

Impact:

Scientists review exceptions instead of spreadsheets

A batch that took [X hours] of re-keying now takes minutes of reviewing flags, and every processed value points back to raw data. The IC50 view that used to be an afternoon in a spreadsheet is one click. [METRIC: assays automated to date] of the 71 on the roadmap are live.

Processing time[X hours] of re-keying → minutes of reviewing flags per batch.
TraceabilityEvery processed value traceable to its raw row, across Raw and Processed databases.
Decision viewIC50 dose-response curves with donor variability, generated in one click.
Roadmap71 assays sequenced for automation; HL7 lab ingestion specified as nine engineering tickets.
“

A working prototype on one real CDMO file, demoed to the science team before any roadmap existed. Then weekly with the lab lead, with tickets written tightly enough that engineering shipped without a re-spec.

— How it came together

Want the longer version?

Happy to walk through any of this on a call — the tradeoffs, the parts that didn't work, what I'd do differently.