Method
How a CoA result is judged against its printed limit
Each row is decided by rule from the limit printed beside the result. This page lists the rules, the units that are converted, and every reason a row is marked could not evaluate.
The rules support a reviewer. They do not replace one, and a verdict here is never the release decision.
What is a specification check on a CoA?
- Specification check
- A specification check decides, for each parameter, whether the reported result satisfies the acceptance criterion printed on the certificate: a maximum, a minimum, a range, an absence requirement or a descriptive requirement. Could not evaluate is the outcome when the printed text does not allow that decision without guessing.
Three outcomes exist per row. Pass: the result is inside the printed limit. Fail: it is outside, or the supplier's own result says the test failed. Could not evaluate: the limit or the result cannot be compared as printed, and the row carries the reason. Rows with Report as the specification have no limit; they are listed in grey as report only, and are not counted against the batch.
The overall statement says whether all evaluated parameters are within the specification. It always states how many rows could not be evaluated, because they are outside what that statement covers.
The decision, step by step
The same five operations run on every row.
Read the specification cell
It is classified as a maximum (≤, NMT, max, <), a minimum (≥, NLT, min, >), a range (a dash, to, between, or ±), an absence requirement (Negative, Absent in 25 g), a conformity statement (Conforms, Complies), a description, report-only, or unreadable.
Read the result cell
It becomes a measured value with a unit, a below-detection value (< 0.01), an above value (> 1000), not detected (ND), a conformity statement, a non-compliance statement, descriptive text or nothing.
Align the units
If a unit is missing on one side the other side's unit is used, and the reason says so. % ↔ ppm ↔ mg/kg are converted. Every other difference is flagged, not guessed.
Compare with the limit
≤, ≥, NMT and NLT include the limit; < and > exclude it. The result is compared as printed, with no rounding to the limit's decimals.
Write the status and the reason
The reason names the number, the limit and any conversion. If the supplier's conclusion column disagrees, the reason says that too.
How printed limits and results are read
Generated by running the reader on each example, not typed by hand.
| Printed as the specification | Read as | Kind |
|---|---|---|
| ≤ 0.5 % | ≤ 0.5 % | Maximum |
| NMT 0.5% | ≤ 0.5 % | Maximum |
| max 10 ppm | ≤ 10 ppm | Maximum |
| < 10 cfu/g | < 10 cfu/g | Maximum |
| ≥ 98.0 | ≥ 98.0 | Minimum |
| NLT 98.0% | ≥ 98.0 % | Minimum |
| 98.0 – 102.0 % | 98.0 – 102.0 % | Range |
| 95.0 to 105.0 | 95.0 – 105.0 | Range |
| Between 6.0 and 8.0 | 6.0 – 8.0 | Range |
| 100 ± 5 mg | 95 – 105 mg | Range |
| NMT 10³ cfu/g | ≤ 1000 cfu/g | Maximum |
| Negative | – | Must be absent |
| Absent in 25 g | – | Must be absent |
| Conforms | – | Conformity statement |
| White to off-white powder | – | Description (text match) |
| Report | – | Report only, no limit |
| 99.0 % | A bare value without ≤, ≥ or a range: the direction of the limit is not printed | Not readable |
| Printed as the result | Read as |
|---|---|
| 99.8 % | A measured value |
| 0,62 | A measured value |
| < 0.01 | Below a detection value |
| > 2000 cfu/g | Above a stated value |
| ND | Not detected / absent / negative |
| Not detected | Not detected / absent / negative |
| Complies | A conformity statement |
| Positive | Positive / present |
| Does not comply | A non-compliance statement |
| White powder | Descriptive text |
| n/a | No result |
Results are compared as printed
Some pharmacopoeial general notices round an observed value to the number of decimals in the limit before comparing, so 0.54 % can conform to NMT 0.5 %. CertiClean does not apply that rule, because which rounding rule governs depends on your specification and compendium.
When a fail would become a pass under such rounding, the reason says so and the verdict stays as printed. The decision on which rule applies is yours.
What each pairing gives
Specification down the side, result across the top.
| Specification | Number | < value | ND, Absent, Negative | Complies | Other text |
|---|---|---|---|---|---|
| Maximum (≤, NMT, <) | Compared | Pass if value ≤ limit, else could not evaluate | Pass | Could not evaluate | Could not evaluate |
| Minimum (≥, NLT, >) | Compared | Could not evaluate | Could not evaluate | Could not evaluate | Could not evaluate |
| Range | Compared | Could not evaluate | Could not evaluate | Could not evaluate | Could not evaluate |
| Absent, Negative | 0 passes, above 0 fails | Pass if value ≤ 1, else could not evaluate | Pass | Pass (supplier's statement) | Text match, contradiction fails, else could not evaluate |
| Conforms, Complies | Could not evaluate | Could not evaluate | Could not evaluate | Pass (supplier's statement) | Could not evaluate |
| Description | Could not evaluate | Could not evaluate | Wording check | Pass (supplier's statement) | Wording match passes, contradiction fails, else could not evaluate |
| Report | Report only: no limit to check. Recorded, not counted against the batch. | ||||
A result printed as Fails, Does not comply or Out of specification is a fail whatever the limit says. A result above a value (> 1000 cfu/g) fails a maximum it already exceeds and is otherwise could not evaluate.
What could not evaluate means
An amber row is a request for a person to look. Each reason has a code in the JSON.
| Reason shown | Code in the JSON | What it means and what to do |
|---|---|---|
| No limit printed | no_spec | The row has no specification text. Check the original: the supplier left it blank or the cell was not read. |
| No result printed | no_result | The row has a limit but no result. Nothing can be compared until a value is available. |
| Report only | report_only | The specification says Report, For information or similar. There is no limit to check; the value is recorded and shown in grey, not amber. |
| Specification not readable | spec_unparsed | The limit is a bare number with no ≤, ≥ or range, mixes units, or is written in a way the reader does not recognise. |
| Unit mismatch | unit_mismatch | The specification and the result use units that cannot be compared without guessing (for example ppb against ppm, cfu/g against cfu/mL, or mPa·s against cP). Only % ↔ ppm ↔ mg/kg are converted. |
| Result is a statement | statement_only | The result says Complies or Conforms against a numeric limit. A supplier's statement is not a measured value, so the limit was not checked. |
| Result is not a number | result_not_numeric | The limit is numeric but the result is text such as TNTC, Positive or a note. |
| Detection value too coarse | detection_above_limit | The result is a '<' value that is larger than the limit (for example < 0.01 % against NMT 0.005 %). The printed value cannot prove compliance. |
| Below a detection value, not a maximum | below_detection_not_max | A '<' result or ND against a specification that is a minimum or a range. It cannot be judged without more information. |
| Open-ended result | open_ended_result | A '>' result that does not already pass or breach the limit, so the real value is unknown. |
| Numeric result, descriptive limit | result_not_text | The limit is a description (for example White powder) but the result is a number, or the other way round. |
| Conformity expected | statement_expected | The limit is Conforms or Complies but the result is something else, so a person has to read it. |
| Wording differs | text_differs | A descriptive result such as 'Yellowish granules' against 'White powder'. Only a wording match counts as a pass, only a clear contradiction as a fail; everything else is left to your eyes. |
Judging a result: by hand, by a PDF copy, or by rule
Where each approach is strong and where it leaves the gap.
| What you need | Manual spec check | Generic PDF-to-Excel | CertiClean |
|---|---|---|---|
| Consistency | Depends on the reviewer and the hour. Strong on judgement. | No judgement is made. | The same rule on every row of every certificate. |
| Inclusive and exclusive limits | Easy to blur ≤ 10 with < 10. | Not evaluated. | ≤, ≥, NMT, NLT include the limit; < and > do not. |
| Below-detection results | Case by case. | Left as text. | Pass a maximum only if the value is not above the limit; otherwise amber. |
| Unit mismatch | Noticed if you look. | Not noticed. | % ↔ ppm ↔ mg/kg converted; other differences flagged. |
| Descriptive tests | Strong: you can see the appearance wording. | Copied as text. | Wording match passes, clear contradiction fails, the rest is left to your eyes. |
| What is left undecided | Whatever you overlooked. | Everything. | Listed in amber with the reason. |
Judgement calls (is 'yellowish' within 'white to off-white'?) remain with the reviewer. The rules never turn an undecidable row into a pass.
Questions people ask
Are ≤ and NMT treated the same way?
Yes. ≤, NMT, max and not more than all include the limit, so a result equal to the limit passes. < excludes it: 10 cfu/g fails a limit of < 10 cfu/g. The same holds for ≥, NLT and min on the lower side, and > on the lower side excludes the limit.
How is a range such as 98.0 – 102.0 % read?
As both limits inclusive. 'Between 98.0 and 102.0', '98.0 to 102.0', a dash or an en dash all read the same way, as does 100 ± 2, and a pair such as NLT 98.0 % and NMT 102.0 %.
What happens with results such as < 0.01 or ND?
A '<' result passes a maximum when its value is not above the limit (< 5 ppm passes NMT 10 ppm) and is could not evaluate when it is (< 0.01 % against NMT 0.005 %). Against a minimum or a range it cannot be judged. ND, Not detected, Absent and Negative pass a maximum and an absence requirement.
Why is 'Complies' not a pass against a numeric limit?
A statement is not a measurement. A certificate that prints Complies against NMT 10 ppm gives no number to check, so the row is amber with that reason. Against a descriptive or conformity requirement, the statement is accepted and the reason says it is the supplier's.
Which unit conversions are made?
% ↔ ppm ↔ mg/kg, because they are the same mass ratio: 1 % is 10,000 ppm, and 1 ppm is 1 mg/kg. A % marked v/v or w/v is not converted to ppm. The reason on the row names the conversion.
Why is ppb against ppm flagged instead of converted?
Only the three mass-ratio units above are converted. Any other pair, such as ppb and ppm, µg/g and ppm, cfu/g and cfu/mL or mPa·s and cP, is flagged as a unit mismatch so that nothing is converted that you did not expect.
How are appearance, odour and identification tests judged?
A result that uses the specification's own words passes (White powder against White to off-white powder), a clear contradiction fails (Turbid against Clear), and a conformity statement is accepted as the supplier's. Anything in between is could not evaluate, since only a person can judge it.
What is a report-only row?
A parameter whose specification is Report, For information or similar. It has no limit, so there is nothing to pass or fail. It is shown in grey, recorded in the CSV as REPORT ONLY, and kept out of the could-not-evaluate count.
What if the supplier's own Pass column disagrees with the check?
The row shows the supplier's wording in its own column, and the reason says that the conclusion column disagrees. Such a row is the first one to compare with the original certificate.
Does it use USP, Ph. Eur. or other monograph limits?
No. It only uses what is printed on the certificate. It does not look up monographs, and it does not know your own purchase specification.
Can I enter my own specification and have the CoA checked against it?
Not in this version. The check runs on the printed limits only. If your internal limit is tighter, compare the result column with it separately.