Unknown Impurity Identification by LC-MS/MS
Unknown impurity identification by LC-MS: formula from accurate mass, RDBE, isotope pattern and MS/MS fragment logic, with real CovaMS tool output and its.
Oliver Kraft
CovaSyn

You have a peak at 0.19 area% that was not there in the previous batch. ICH Q3A(R2) says anything at or above 0.10% needs to be identified, so "unknown at RRT 1.12" is not an acceptable end state. You have an accurate mass and an MS/MS spectrum, and no reference standard. This is the workflow that gets you from that spectrum to a defensible structural hypothesis, and the points at which it stops being able to help.
The order the work actually happens in
1. Formula first. Accurate mass plus isotope pattern narrows the elemental composition. Nothing downstream is trustworthy if the formula is wrong. 2. RDBE and the delta to the parent. Degrees of unsaturation tell you whether you added an atom or closed a ring. 3. Fragment logic. MS/MS tells you which part of the molecule changed. 4. Library search. Fast when it works, uninformative when the compound is not in the library. 5. Confirmation. Reference standard, orthogonal data, or synthesis. Software does not do this step.
Steps 1 to 4 are hours of work that can be compressed into minutes. Step 5 is still weeks.
The worked example
Parent API: propranolol, [M+H]+ 260.1645. The new peak has [M+H]+ 276.1594 on a Q-TOF calibrated to better than 3 ppm. Delta to the parent is +15.9949, the classic oxygen addition.
A note on provenance before the numbers: the MS/MS peak list below is constructed from published beta-blocker fragmentation behaviour, not acquired on an instrument. Every tool output quoted is a real call against the live CovaMS tools. The peak list is the input; the outputs are not simulated.
Peak list supplied (m/z, relative intensity): 276.1594 (100), 258.1489 (25), 199.0754 (40), 183.0804 (10), 157.0648 (15), 116.1070 (80), 98.0964 (30), 74.0600 (20).
Step 1: formula from accurate mass
covams_formula at [M+H]+, 5 ppm, returned three candidates:
| Formula | Mass error (ppm) | RDBE | Overall score | Bayesian score |
|---|---|---|---|---|
| C16H21NO3 | 0.075 | 7.0 | 0.985 | 0.870 |
| C9H21N7OS | 2.56 | 3.0 | 0.487 | 0.000025 |
| C10H22N5O2P | 3.68 | 3.0 | 0.265 | 0.00083 |
Verbatim from one covams_formula call. The tool applies the Senior valence rules and the Kind-Fiehn heuristics before scoring, then ranks on a Bayesian combination of mass error, an RDBE prior and element-ratio priors fitted to public training data. The second-ranked formula is only 2.5 ppm away, but seven nitrogens and a sulfur on 275 Da is implausible for a small-molecule degradant, and the Bayesian term punishes it by four orders of magnitude.
Your mass tolerance is the whole ballgame.
The same call at 20 ppm returns ten candidates instead of three, spanning RDBE 2 to 8. If your instrument is not routinely inside 5 ppm, formula determination is not a solved problem for you.
Step 2: the isotope pattern kills the alternatives
Accurate mass alone does not distinguish CHNO from CHNOS. The isotope envelope does. covams_isotope on the two leading candidates, singly charged:
| Formula | M | M+1 | M+2 |
|---|---|---|---|
| C16H21NO3 | 100.0 | 18.03 | 2.15 |
| C9H21N7OS | 100.0 | 13.36 | 5.51 |
Verbatim from two covams_isotope calls. The M+1 ratio counts carbons (roughly 1.1% per carbon), and the M+2 at 5.51% is the sulfur signature. If your measured M+2 is around 2%, the sulfur-containing formula is dead without any further work. This check costs nothing and it is the single highest-yield thing you can do with an already-acquired full-scan spectrum.

Step 3: RDBE tells you what kind of change happened
covams_formula reports RDBE as 1 + C - (H + Cl + Br + F)/2 + N/2 + P/2. For C16H21NO3 it returned 7.0. Propranolol itself (C16H21NO2) is also RDBE 7.
That single comparison is informative. The impurity gained one oxygen and no degrees of unsaturation. So:
- A hydroxylation (aromatic or aliphatic) fits. RDBE unchanged.
- An N-oxide or hydroxylamine fits. RDBE unchanged.
- A ketone from oxidation of the secondary alcohol does not fit. That pathway loses two hydrogens, giving a mass delta of -2.0157 and RDBE 8.
- A new ring does not fit either. RDBE would go up.
You have narrowed a +16 Da unknown to two structural families before touching the MS/MS.
Step 4: fragment annotation, and why hit count is the wrong metric
covams_fragment_annotate matches measured peaks against combinatorially generated fragments of a candidate structure, with common neutral losses allowed. Run against 4-hydroxypropranolol (ring hydroxylation) at 10 ppm, it annotated 8 of 8 peaks, five of them with an explicit fragment structure:
- 116.1070 →
CC(C)NCC(O)COminus H2O, single cleavage, confidence 1.0 - 98.0964 → same side chain minus 2 H2O, confidence 0.898
- 74.0600 →
NCC(O)COminus H2O, paired cleavage, confidence 1.0 - 157.0648 →
COc1ccc(O)c2ccccc12minus H2O, confidence 1.0 - 183.0804 →
CC(O)COc1ccc(O)c2ccccc12minus 2 H2O, confidence 0.945
Now the honest part. The same call against the N-hydroxy isomer also annotated 8 of 8. Coverage did not discriminate the two structures at all. What discriminated them was the *mechanism* field:
| Peak | Ring-hydroxy hypothesis | N-hydroxy hypothesis |
|---|---|---|
| 74.0600 | paired cleavage minus H2O | single cleavage minus CH4 |
| 157.0648 | single cleavage minus H2O | single cleavage minus CH3OH |
| 183.0804 | structure assigned, conf 0.945 | formula only, conf 0.586 |
Losing methane from a hydroxylamine to land on 74.0600 is not a fragmentation anyone would defend at a review board. The ring-hydroxy hypothesis explains the same peaks using nothing but water losses on simple bond cleavages. Read the mechanism and the neutral loss, not the annotation count. A combinatorial annotator with generous neutral losses will explain almost anything if you let it.
The decisive point is the one the annotation implies: the intact aminopropanol ion at 116.1070 requires an unmodified nitrogen side chain. If the oxygen had gone onto the nitrogen, that ion would move to 132.1019. One ion, one decision.
Step 5: library search, and its hard limit
covams_analyze_unknown runs quality assessment, processing, library identification, class prediction and annotation in one call. It graded this spectrum B (spectral entropy 2.6201, normalised entropy 0.8734, precursor present) and returned 10 candidates.
Rank 1 was homatropine, C16H21NO3, overall score 0.597, spectral similarity 0.7023, sourced from MassBank. 4-hydroxypropranolol came back at rank 6, overall score 0.2452, spectral similarity 0.0709, sourced from index_formula rather than from an experimental library entry.

That inversion is the lesson, not a bug. Library ranking is dominated by similarity to spectra that exist in the library. Homatropine is a correct-formula compound with a real reference spectrum. 4-hydroxypropranolol had no experimental spectrum to match against, so it could only ever enter as a formula-level candidate and score near zero on the similarity term. A compound with no library spectrum cannot win a library search, no matter how well it explains your fragments. Impurities and degradants are precisely the compounds least likely to have library spectra.
One more caveat: the class prediction returned "Hydroxy compounds" at probability 1.0 from a single rule-based match, while the run summary reported predicted_class: "Unknown". Treat the class layer as a coarse hint, and read absence of a good hit as a statement about the library, not about your sample.
What this does not tell you
- It does not identify anything. The output is a ranked hypothesis. Confirmation needs an authentic reference standard with matching retention time and MS/MS, or NMR on isolated material. This is roughly Schymanski level 3 (tentative candidate) at best.
- It does not resolve regiochemistry. 4-hydroxy versus 5-hydroxy versus 7-hydroxy propranolol are indistinguishable on this evidence. Chromatography against standards or NMR resolves that.
- It does not quantify. Area percent is not mass percent. Response factors for a degradant are usually unknown and often differ from the parent by more than a factor of two.
- It does not know your matrix. Excipient adducts, in-source fragments and dimers all look like unknowns. Rule those out before you start structure work.
- It cannot rank a compound it has never seen. See step 5.
Frequently asked questions
How many molecular formulas fit a given accurate mass?
It depends almost entirely on mass tolerance and mass. For an unknown at m/z 276.1594 as [M+H]+, covams_formula returned three candidate formulas at 5 ppm and ten at 20 ppm. The top candidate, C16H21NO3, sat at 0.075 ppm error with an overall score of 0.985. At higher masses the candidate count explodes: the same tool returned 45 formulas for a 5 ppm window at m/z 647.
What is RDBE and how do I use it on an impurity?
RDBE, ring and double bond equivalents, is calculated as 1 + C - (H + Cl + Br + F)/2 + N/2 + P/2. It counts rings plus pi bonds. The useful move is comparing the impurity RDBE with the parent. In our example both parent and impurity were RDBE 7 with a +15.9949 mass delta, which is consistent with hydroxylation or N-oxidation and inconsistent with ring closure or oxidation of an alcohol to a ketone.
Can a spectral library identify an unknown degradation product?
Usually not. Library search scores similarity against spectra that already exist in the library, and degradants and process impurities rarely have reference spectra. In our run, covams_analyze_unknown ranked homatropine first at spectral similarity 0.7023 because it has a MassBank entry, while the chemically sensible candidate ranked sixth at similarity 0.0709 because it entered only as a formula-level candidate.
How do I tell N-oxidation from ring hydroxylation by MS/MS?
Look for a fragment that isolates the nitrogen-containing part of the molecule. For propranolol the aminopropanol ion at m/z 116.1070 is unmodified if the added oxygen is on the ring, and shifts by +15.9949 to 132.1019 if it is on the nitrogen. One diagnostic ion answers the question. Fragment annotation coverage alone does not: both isomers explained 8 of 8 peaks in our runs.
What impurity level triggers a mandatory identification?
ICH Q3A(R2) sets the identification threshold for a new drug substance at 0.10%, or 1.0 mg per day intake, whichever is lower, for a maximum daily dose up to 2 g per day. The reporting threshold is 0.05%. Above the identification threshold you owe a structure. Below the reporting threshold you do not report at all. Check the thresholds against your actual daily dose before you spend instrument time.
Does in-silico fragment annotation replace a reference standard?
No. Annotation narrows the hypothesis space and tells you which experiment is decisive, which is where most of the calendar time goes. It cannot distinguish positional isomers, it cannot confirm stereochemistry, and its confidence values reflect internal consistency, not truth. Regulatory identification still requires an authentic standard or isolated material with orthogonal structural data.
Related reading
- Mass balance in forced degradation: closing the gap
- Extractables and leachables: a screening workflow
- Forced degradation study design under ICH Q1A(R2)
- Nitrosamine risk assessment: an ICH M7 workflow
Every call in this article runs on the CovaSyn free tier, so you can put your own unknown through covams_formula and covams_fragment_annotate before your next OOS investigation.
Tools for this topic
Use these in your AI agent right away.
- CovamsMass spectra, formula prediction, impurity profiling.
