06 · Capabilities
Opt-in

Lab testing & COA capture

Capture third-party / in-house lab Certificates of Analysis against a batch — store the PDF, the raw frame, headline composition and per-analyte results with a pass/fail verdict.

5 min read · updated 28/05/2026

Opt-in Capability · off

Lab Testing is switched offLab Testing

You can read the guide. An owner or manager flips this Capability on in settings — it then lights up across the app.

Overview

When a lab sends back a Certificate of Analysis for a batch — fat and SNF, the safety pass/fails, an aflatoxin reading — that PDF usually ends up in a WhatsApp chat or a paper file. You can read it once, then never query it. Lab testing keeps the COA as a record you can search: the PDF itself, the lab's original numbers, the headline composition, and one clear verdict per batch — pass, fail, or conditional.

Opt-in Capability · off

Lab Testing is switched offLab Testing

You can read the guide. An owner or manager flips this Capability on in settings — it then lights up across the app.

This is an opt-in Capability, and it is not switched on for anyone yet. It ships dormant — the data shape is built, but there is no screen, no way to enable it, and no live workflow in the app today. It comes alive when the Dairy Pack (and later the Pharma Pack) compose it; until then there is nothing to turn on.

Where to find it

There is no menu item for this yet. The Capability is a dormant skeleton — not mounted in the web app, not in any sidebar, and absent from the feature catalog, so even an Owner cannot find or enable it today. When it is wired, it will surface on web only, against a batch.

Key concepts

  • A Certificate of Analysis is the lab's signed report for one sample — the document everything here hangs off.
  • The overall verdict is the headline gate: pass, fail, or conditional. It is the one field a vertical Pack reads to decide whether a batch is good to ship.
  • The ULR number is the 18-character Unique Laboratory Report code (for example TC1151624000009910F) that proves a NABL-accredited lab issued the report. Lab identity also carries the lab name and its NABL cert (like TC-11516).
  • An analyte is one thing the lab measured — fat, SNF, aflatoxin M1, coliform count. Analytes fall into four groups: compositional, adulterant, microbiological, and residue/contaminant.
  • A result status says whether one reading sat inside its FSSAI limit: in_spec, out_of_spec, or not_evaluated (captured, but not yet compared to a limit).

Common workflows

These describe the shape a COA maps onto when the Capability is live. They are not yet clickable screens.

1
Attach the COA PDF
The original PDF is stored against the batch, so the inspector evidence never leaves the system. The lab's exact frame is kept verbatim too, so a re-read never loses fidelity.
2
Record the lab and provenance
Lab name, NABL cert, ULR number, report number, and the sample-received / analysis-completed / report-issued dates go onto the report.
3
Capture the headline composition
Fat % and SNF % are stored as numbers you can trend, alongside the overall verdict for the batch.
4
Log per-analyte results
Each measured analyte gets a row — the reading, the FSSAI limit as printed on that COA, the cited method, and an in-spec / out-of-spec status. Only the analytes that COA actually reported get rows.

The analyte catalog itself is national, not per-tenant: FSSAI milk limits are "All India," so the same analyte dictionary is shared across every business.

Role notes

Only one role touches this Capability.

Owner holds every non-Pack permission on the tenant, so the Owner is the one who would manage lab testing once it is enabled. But Capability permissions are not registered in the live catalog yet, so today even the Owner does not hold a lab-testing permission — there is nothing to grant and nothing to enable. No other role (Manager, Operator, Sales, Warehouse, Delivery, Accountant) has any binding here.

Tips & time-savers

Tip
When this goes live, you will not need to re-key the numbers off the PDF — the original lab frame is kept verbatim, so the headline fields and per-analyte rows are read straight from the COA, not retyped.

The verdict is deliberately small — pass / fail / conditional — so a Pack can act on it without parsing the whole results table. One field decides the batch.

Gotchas

Warning
There is no way to switch this on today. It ships dormant — no screen, no enable toggle, no catalog entry — so nothing about lab testing will appear in the app until a Pack composes it in a later release. Don't promise a customer a live screen yet.

This Capability owns only the verdict. It does not, by itself, quarantine a failed batch — that fail-to-quarantine step lives in the vertical Pack (for example the Dairy Pack's qc_fail disposal reason). A fail here is the signal; the Pack does the holding.

Related