Turn any Certificate of Analysis PDF into verified Excel.
Every analyte, limit and pass/fail — recomputed and cross-checked against the lab's printed verdict. Digital or scanned.
| Analyte | Result | Limit | Verdict |
|---|---|---|---|
| Lead (Pb) | 0.30 mg/kg | ≤ 1.0 | pass |
| Arsenic (As) | 0.08 mg/kg | ≤ 0.5 | pass |
| Cadmium (Cd) verdict_mismatch | 1.2 mg/kg | ≤ 1.0 | lab: pass · computed: fail |
| E. coli | Absent / 25 g | Absent | pass |
What it catches that a plain extractor misses
General document-AI pulls the fields. Coatables checks the part that carries the liability.
The math vs the verdict
Recomputes pass/fail and flags where the lab's printed verdict disagrees.
No limit, no pass
“PASS” without a value or basis is flagged, never accepted.
mg/kg · ppm · %
Units canonicalized and converted; mismatched unit classes flagged.
Scans, honestly
Low-confidence fields on scanned CoAs are flagged for human review.
The lab said PASS. We check the math agrees.
A vision model reads the PDF; a deterministic layer does the part that has to be exact.
Read every analyte
Vision reads digital PDFs and scans natively — analyte, result, unit, limit, method, LOD/LOQ and the lab's printed verdict.
Recompute, deterministically
Limit notation and units are normalized, then pass/fail is recomputed from the numbers — not guessed by a model.
Cross-check the verdict
Our computed verdict is compared to the lab's printed one. Any disagreement, missing field or low-confidence read is flagged.
Lighter than a QMS. More trustworthy than an extractor.
| Generic PDF extractor | COA management platform | Coatables | |
|---|---|---|---|
| Pulls the fields to Excel/JSON | ✓ | ✓ | ✓ |
| Recomputes pass/fail from the numbers | — | — | ✓ |
| Cross-checks the lab's printed verdict | — | — | ✓ |
| Tuned for supplement lab reports | — | ✓ | ✓ |
| No login · no onboarding · no contract | ✓ | — | ✓ |
| One PDF, one deadline | ✓ | — | ✓ |
Pay per page. No subscription.
1 credit = 1 page — a typical supplement CoA is 1–2 pages. Credits don't expire.
- Verified XLSX + JSON export
- Digital + scanned PDFs
- All verification flags
- Everything in Starter
- Priority processing
- Best value per page
- Everything in Lab
- Lowest per-page rate
- Credits never expire
Try it free on our sample certificate first. Money-back if a verification is wrong.
The honest answers
Does it handle scanned CoAs, not just digital PDFs?
Yes — a vision model reads scans natively, so there's no separate OCR step. But scans are less reliable than digital PDFs: low-confidence fields are flagged for you to check, and on dense multi-panel certificates a whole panel can occasionally be missed. Confirm every panel you expect is present, and use a digital PDF when you have one. We never promise a scan is 100% right.
What limit notation can it read?
The deterministic layer normalizes ≤, <, ≥, >, NMT, NLT, max, min, ranges like X–Y, microbial Absent in 25 g, and ND / <LOQ — then recomputes pass/fail from the parsed value and the structured limit.
Is this a replacement for QA review?
No. Coatables is an extraction and verification assistant. The verdict column is for review, not for release sign-off — a human QA reviewer stays in the loop, especially on flagged rows.
Which certificates does v1 support?
Third-party supplement lab reports — heavy metals, microbiology and contaminants — across a bounded set of common lab formats. It is not a general “any document” extractor; that's deliberate, so accuracy stays high on the formats it does cover.
Where does my CoA go? Do you store it?
No. Your file is processed in memory and never written to a database — we don't keep your CoAs or the extracted results. It's sent over an encrypted connection to our extraction provider, whose API does not use your data to train models. Your recent results are cached only in your own browser (you can clear them anytime). No account, no file store.
Do I need an account?
No login. You buy a credit pack, upload a CoA, and draw down credits as you verify. Payments are handled by Polar. Your recent results stay in your browser (localStorage) so they survive a refresh — and never leave your device.