SpecFlag / sample run
coa@getspecflag.com

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.

Magnesium 7 — heavy metals, allergens & glyphosate
Analytical Resource Laboratories (ISO/IEC 17025) · Lot 23032 · source PDF
AnalyteResultLab's own specExample specOutcome
Arsenic0.051 ppmRecord Only≤ 0.1 ppmPass
Cadmium0.004 ppmRecord Only≤ 0.1 ppmPass
Mercury<0.001 ppmRecord Only≤ 0.05 ppmPass
Lead0.117 ppmRecord 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 ppmPass
Soy allergens<2.5 ppm<2.5 ppm≤ 5 ppmPass
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 analytesISO 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.
A flag no numeric check would ever produce. This certificate is headed "Preliminary Results Only (may be subject to change)" and footed "does not constitute a guarantee of quality for the entire production lot." Every number on it stands or falls on its own — but a preliminary certificate sitting in the file as final release evidence is a finding in its own right.
Kratom leaf powder — alkaloids, heavy metals & microbiology
Santé Laboratories, LLC · Lot 0001350 · source PDF
AnalyteResultLab's verdictExample specOutcome
Lead895.3 ppbPassNMT 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.
Arsenic460.1 ppbPass (NMT 1,500)≤ 500 ppb Near limit92% of the ceiling. Passes today.
Cadmium24.3 ppbPass≤ 300 ppbPass
Mercury20.1 ppbPass≤ 500 ppbPass
Total alkaloids2.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 count4,900 CFU/gPass≤ 10,000,000Pass
SalmonellaAbsent / 25 gPassAbsent PassNote the denominator — compare with 750 g and 1,500 g below.
Turmeric powder — certificate bundled with process flow, MSDS & spec sheet
BiOrigins / Madar Corporation Ltd (UK) · Batch 4512604 · 10-page combined file · source PDF
AnalyteResultExample 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 ppbPass
Why this block can only be escalated, not parsed. The PDF's text layer emits every analyte name first, then every result in a separate block, with no positional link between them. This is the actual extracted text:
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
"1,500" is almost certainly the total viable count — but nothing in the extractable text proves it, and guessing on a microbiological result is not acceptable. Low-confidence blocks go to a person instead of producing a confident-looking number. A text-dump-plus-regex tool would emit silent garbage here.
Three more findings that aren't numbers. (1) The certificate states the data "may have been supplied by an approved supplier" — so it may be transcribed by the distributor rather than issued by the testing lab. (2) The file mixes footers reading "Page 1 of 8" and "Page 1 of 10" — two documents merged without renumbering. (3) The allergen and pesticide statements, on Madar Corporation letterhead, twice refer to materials supplied to "Cotswold Ingredients" — another company's name left in from a reused template.
Whey protein concentrate 80% — a certificate with no specifications
ACE International LLP / Mahaan Foods (Davisco product) · Lot JE 006-8-286 · source PDF
AnalyteResultLab's own specExample specOutcome
Aerobic plate count<250 cfu/gnone stated≤ 10,000 cfu/gPass
SalmonellaNegative / 1,500 gnone statedNegativePass
ListeriaNegative / 25 gnone statedNegativePass
Scorched particles7.5 mg (Disc A) / 25 gnone stated No specA visual grading result, not a value any numeric comparison applies to.
This document states no limits whatsoever — results only. Every judgement has to come from your own spec, because there is nothing on the page to compare against. A workflow built around reading the lab's PASS/FAIL column has nothing to read here.
Closing line: "This certificate is generated by electronic system and it is valid without signature." Separately, this lot was produced 02 Jun 2018 and expired 01 Jun 2020 — past expiry dates deserve a flag too, which is a date check rather than a spec check.
Whey protein isolate, instantised — supplier certificate
BRAICON, manufactured in the Netherlands · Batch 22764734 · source PDF
AnalyteResultExample specOutcome
SalmonellaNot detected / 750 gNot detectedPass
ListeriaNot detected / 125 gNot 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.
The denominator problem, stated plainly. Across three of these documents Salmonella is reported as "absent in 25 g", "not detected / 750 g" and "negative / 1,500 g". All three land in a summary spreadsheet as the same clean PASS, while representing a 60-fold difference in how much material was actually tested. If you compare lots across suppliers, sample size belongs in its own column.
Heavy metals plasma standard — a certified reference material
Thermo Fisher Scientific / Alfa Aesar · Lot 1520171 · source PDF
AnalytesValuesDocument typeOutcome
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
Included deliberately, to show the classification step working. This is a calibration standard; forcing it through an ingredient spec template would produce meaningless flags. The right behaviour is to recognise the document type and route it to a reference-material log.

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.