Worked example
Six real supplier certificates, checked against a specification
Each of these is a genuine Certificate of Analysis from a different laboratory or supplier, with its own layout, units and pass/fail convention. Every document is linked to its source, so any line below can be verified independently.
The specification limits shown are an example, for demonstration only — in a live engagement the limits come from your own spec sheet.
These six were chosen because they are awkward, not because they are tidy: one states no limits at all, one reports per serving instead of per kilogram, one is a preliminary certificate, one has a text layer that cannot be parsed by machine, and one is not an ingredient certificate at all.
| Analyte | Result | Lab's own spec | Example spec | Outcome |
|---|---|---|---|---|
| Arsenic | 0.051 ppm | Record Only | ≤ 0.1 ppm | Pass |
| Cadmium | 0.004 ppm | Record Only | ≤ 0.1 ppm | Pass |
| Mercury | <0.001 ppm | Record Only | ≤ 0.05 ppm | Pass |
| Lead | 0.117 ppm | Record Only | ≤ 0.1 ppm | Out of specThe lab's specification column reads "Record Only" — it renders no verdict at all. A 17% exceedance, on a document containing no FAIL to scan for. |
| Gluten (as gliadin) | <2.5 ppm | <10 ppm | ≤ 20 ppm | Pass |
| Soy allergens | <2.5 ppm | <2.5 ppm | ≤ 5 ppm | Pass |
| Glyphosate | <0.4 — printed unit: % | Record Only | — | Data qualityGlyphosate is conventionally reported in ppm. Blindly converting 0.4% would produce "4,000 ppm" and a spectacular false alarm. Escalated, not converted. |
| Pesticide panel (second lab, same PDF) | <LOQ, all analytes | ISO 17025 method | ≤ LOQ | PassA Columbia Laboratories report bundled behind the first sheet — different lab, different letterhead, same lot. Three of its six pages are just the analyte reference list. |
| Analyte | Result | Lab's verdict | Example spec | Outcome |
|---|---|---|---|---|
| Lead | 895.3 ppb | PassNMT 1,000 ppb | ≤ 500 ppb | Out of specThe lab's PASS is correct — against the lab's limit. Against a tighter receiving spec it's a 79% exceedance. The clearest case here for why a supplier's verdict is not a substitute for your specification. |
| Arsenic | 460.1 ppb | Pass (NMT 1,500) | ≤ 500 ppb | Near limit92% of the ceiling. Passes today. |
| Cadmium | 24.3 ppb | Pass | ≤ 300 ppb | Pass |
| Mercury | 20.1 ppb | Pass | ≤ 500 ppb | Pass |
| Total alkaloids | 2.040 w/w% | Report Only | ≤ 2.0% | Out of specA marginal 2% breach — and in the raw text this row runs together with an unrelated "NMT 2%" sub-limit printed against a different analyte, so a parser can attach the wrong limit to the wrong row. |
| Total plate count | 4,900 CFU/g | Pass | ≤ 10,000,000 | Pass |
| Salmonella | Absent / 25 g | Pass | Absent | PassNote the denominator — compare with 750 g and 1,500 g below. |
| Analyte | Result | Example spec (from bundled sheet) | Outcome |
|---|---|---|---|
| 13 microbiological & mycotoxin analytes | not machine-readable — see below | TVC ≤ 100,000 cfu/g · E. coli ≤ 10 · Enterobacteriaceae ≤ 100 · Salmonella negative /25 g | Human review |
| Aflatoxin B1 | <5 ppb | ≤ 5 ppb | Pass |
E.coli cfu/g Yeasts cfu/g Total Viable Count cfu/g Microbiological Parameters Salmonella in 25g Moulds cfu/g Enterobacteriaceae cfu/g ... Result 8.26 Bacillus Cereus cfu/g 2.85 Result Staphylococcus Aureus cfu/g <10 1,500 Clostridium Perfringens cfu/g <10 <10 20 20 Not Detected
| Analyte | Result | Lab's own spec | Example spec | Outcome |
|---|---|---|---|---|
| Aerobic plate count | <250 cfu/g | none stated | ≤ 10,000 cfu/g | Pass |
| Salmonella | Negative / 1,500 g | none stated | Negative | Pass |
| Listeria | Negative / 25 g | none stated | Negative | Pass |
| Scorched particles | 7.5 mg (Disc A) / 25 g | none stated | — | No specA visual grading result, not a value any numeric comparison applies to. |
| Analyte | Result | Example spec | Outcome |
|---|---|---|---|
| Salmonella | Not detected / 750 g | Not detected | Pass |
| Listeria | Not detected / 125 g | Not detected | Pass125 g here against 25 g on the certificate above — the same divergence, on a second pathogen. |
| Protein (Kjeldahl) | 87.8 %m/m | ≥ 87% (minimum) | PassA minimum-type limit, unlike every heavy-metal row above. A validation layer that assumes "higher is worse" would mis-flag this one. |
| Analytes | Values | Document type | Outcome |
|---|---|---|---|
| Ag, As, Ba, Cd, Cr, Hg, Pb, Se | ~100 ± 0.5 µg/mL each, expanded uncertainty (k=2) | Calibration certificate — not an incoming-ingredient COA | Routed, not checked |
Notes on this example
All six documents are real and publicly published, and each is linked above so any line can be checked against its source. The specification limits are illustrative; a live engagement uses your actual specs from the first lot.
What isn't represented here: every document above is born-digital. A genuinely scanned or photographed certificate — image only, no text layer — is the one important case missing, and it's the case where OCR quality rather than layout logic is the limiting factor. Better said than quietly omitted.