top of page

Internal Lab QC Explained: How to Interpret CRMs, Duplicates, and Blanks

What CRMs, Duplicates, and Blanks Really Tell You - And How to Evaluate Them Properly


It’s not a 20‑gram‑per‑tonne gold drill core sample… but that little QC tab in the assay results is where the real analytical story begins.


Excel spreadsheet showing the tab holding the internal lab QC results
Lab-generated Excel spreadsheet showing internal QC assay results

Most people don’t think twice about the lab’s internal Certified Reference Materials (CRMs), duplicates, and blanks. They’re usually assumed to be “within parameters,” and their evaluation rarely make it into assessment reports and news releases. But if you’ve ever been responsible for data quality, you know that internal lab QC is where digestion issues, interference problems, calibration drift, and contamination can quietly reveal themselves.


And yet, despite its importance, internal QC is one of the most overlooked parts of exploration geochemistry.


This guide is here to change that.


Whether you’re a student, a junior geologist, a data reviewer, or a technical lead, this is your complete, practical, plain‑language guide to understanding internal lab QC: what it is, why it matters, how to evaluate it, and how to avoid the common pitfalls that plague spreadsheet‑based workflows.


1. What Is Internal Lab QC?

Every assay certificate includes a set of quality control samples inserted by the laboratory itself. These are not the same as the external QA/QC samples you submit (field duplicates, pulp duplicate requests, coarse blanks, pulp blanks, and CRMs). Internal QC is the lab’s own check on its digestion, calibration, and measurement performance.


The three core components are:


Certified Reference Materials (CRMs)

Certified reference materials are samples with well‑established values inserted by the lab to check accuracy. They help to indicate whether the digestion and analytical process produced results consistent with the measured values.


Duplicates

Paired samples (pulp or solution) are used to evaluate precision. They help to determine how reproducible, or consistent, the measurements are within that batch of samples.


Blanks

Ultra‑low‑grade materials are used to detect contamination. They help to decide whether external material may have been introduced during preparation or assaying.


Together, these three components form the backbone of analytical defensibility.


2. Why Internal Lab QC Matters More Than People Think

Internal QC is often overshadowed by external QA/QC programs. But internal QC is typically the first and most direct indicator of:

  • Digestion efficiency

  • Interference effects

  • Calibration drift

  • Contamination

  • Instrument stability

  • Method performance

  • Batch‑specific anomalies


If something goes wrong in the digestion or measurement process, internal QC is where it shows up first.


Ignoring those results is a bit like ignoring the rock you’re sitting on while having lunch in the field - it’s right under you, and it might matter more than you think.



Internal Lab QC Evaluation Is a Skill Every Exploration Program Needs

Learning how to evaluate internal lab QC is a core part of every exploration program that relies on assay data. Especially if you’re working on a small or grassroots project that doesn’t warrant a full external QA/QC suite, the internal QC is always produced by the lab and is part of the story to gain an initial understanding of your results.


Internal lab QC is also the simplest and most accessible place to learn the fundamentals of analytical quality:

  • Only 3 sample types

  • Fewer assay results

  • 3 primary formulas

  • Clear, structured outputs typically on 1 spreadsheet

  • Immediate insight into digestion, calibration, and contamination


For students, junior geologists, and small teams, internal QC is the perfect training ground. It teaches the logic behind accuracy, precision, and contamination without the complexity of a full QA/QC program.


In small exploration programs, where budgets are tight and external QA/QC programs may not be fully implemented, internal lab QC is often the only quality control data available, so understanding it isn’t optional.

 

3. The Problem with Spreadsheet‑Based QC Review

Most geologists learn QC review through a patchwork of inherited spreadsheets or a series of ad hoc formulas found in the literature. These often include:

  • spreadsheet- or cell-specific formulas,

  • hidden columns,

  • inconsistent tolerances,

  • mismatched CRM names,

  • broken references when labs change column names,

  • inconsistent handling of <DL values,

  • and no clear narrative explaining what the QC means.


Often, more time is spent fixing the spreadsheet than evaluating the data.


And because the process is tedious, it’s easy to assume the QC is “within parameters.”


But “within parameters” isn’t a defensible standard, especially when the “parameters" aren’t discussed.


4. How to Evaluate Internal Lab QC (Step‑by‑Step)


Step 1: Evaluate CRM Recoveries (Accuracy)

CRMs indicate whether the digestion and analytical process returned concentrations close to the certified values - in other words, accuracy.


When to use tighter vs. wider recovery ranges:

Use tighter tolerances (±10–15%) for near‑total digestions (e.g., four‑acid, peroxide fusion) and elements known to recover well.

Use wider tolerances (±20–30%) for partial digestions (e.g., aqua regia), refractory elements, or matrices known to cause lower recoveries.

In other words, different digestion chemistries and matrices will behave differently depending on how they are broken down and analysed.


Look for:

  • Recoveries within your tolerance (e.g., ±10% to 30% of the measured value)

    • Recovery % = (Measured Value / Certified Value) × 100

      • To check for accuracy

      • Plot these values per analyte with lines for the tolerances

    • Bias % = ((Measured Value – Certified Value) / Certified Value) × 100

      • To check for + or - differences

      • Note the high and low biases in the interpretation

  • Consistent performance across analytes

  • Patterns (e.g., all low recoveries for a specific element)

  • Method‑specific behaviour (e.g., partial digestions)


Red flags include:

  • Multiple analytes outside tolerance

  • Systematic bias (all high or all low)

  • Inconsistent performance across CRMs


Step 2: Evaluate Duplicate Precision (Reproducibility)

Duplicates assess precision: how reproducible the measurement is.


When to use tighter vs. wider RPD tolerances:

Use tighter tolerances (10–15% RPD) for high‑level analytes, well‑behaved elements, and methods with low noise.

Use wider tolerances (20–30% RPD) for low‑level pathfinders, noisy elements (e.g., As, Sb, Hg), or matrices prone to heterogeneity.

Precision depends on concentration, method noise, and sample homogeneity.


Use:

  • Relative Percent Difference (RPD)

    • |Sample1 – Sample2| / ((Sample1 + Sample2) / 2) × 100

      • An absolute value to check differences between duplicate pairs

      • Plot these values per analyte with lines for the tolerances

  • A 5× to 10× DL rule (precision is typically meaningless near detection limits)

    • Exclude from the interpretation if both values are below the detection limit or when the RPD is less than the DL rule


Red flags include:

  • High RPDs for key project-specific analytes

  • Inconsistent precision across the batch

  • Failures clustered in specific element groups


Step 3: Evaluate Blank Behaviour (Contamination)

Blanks reveal whether analytes are being introduced during preparation or analysis.


When to use stricter vs. looser blank thresholds:

Use stricter thresholds (≤3× DL) for sensitive elements, pathfinders, or projects where contamination risk is high.

Use looser thresholds (≤5× DL) for elements with naturally higher background, methods with higher noise, or matrices prone to trace carryover.

No lab produces perfect zeros because background varies by method and element.


Look for:

  • Values below DL

    • Blank Mean = Σ(blank values) / n

      • To check the average value of blank samples per analyte

      • Plot the average blank values per analyte with horizontal lines showing the threshold and the DL rule

    • Blank SD = sqrt( Σ(x – mean)² / (n – 1) )

      • To check how far from the average the blanks stray, and include outliers in the interpretation

  • Patterns across analytes


Red flags include:

  • Elevated values in multiple blanks

  • Contamination in key pathfinder elements

  • Patterns that match digestion or instrument issues


Step 4: Look for Patterns Across QC Components

This is where interpretation comes into play, and it will form the basis of your overall conclusion about the quality of the data:

  • Low CRM recoveries + high duplicate RPDs → possible digestion instability

  • Blank contamination + CRM failures → likely preparation contamination

  • Duplicate failures only → may be due to sample heterogeneity

  • CRM failures only → probable calibration or digestion issues


Internal QC is its most powerful when interpreted holistically in context with the project's purpose.


Step 5: Document Your Interpretation

A defensible QC review includes:

  • What thresholds were used?

  • What passed?

  • What failed?

  • What was below the detection limit?

  • What do the results mean?

  • Where caution is warranted?


The interpretation is the part that most workflows skip and, likely, the part that matters the most in technical reporting. And when you lay out all the steps - accuracy, precision, contamination, pattern recognition, interpretation - it’s clear why people can find QC review tedious.


So how do we make QC less of a chore and more streamlined, defensible, and consistent?


5. Why I Built Python Lab_QAQC

After too many seasons of reviewing internal QC manually, I wanted a workflow that was:

  • Transparent

  • Reproducible

  • Reviewer‑friendly

  • Method‑aware

  • Matrix‑aware

  • Easy to learn

  • Easy to audit


Introducing the Python Lab_QAQC toolkit - built from years of QA/QC experience across drilling programs, surface exploration, and academic research; paired with the practical Python workflow habits of an intermittent coder who values clear logic and thorough notes; and accelerated with AI to take development from weeks to just a few days.


6. What Python Lab_QAQC Does

The toolkit reads the internal QC from assay certificates and automatically:

  • Calculates CRM recoveries

  • Evaluates duplicate RPDs

  • Checks blank contamination

  • Applies user‑defined tolerances

  • Handles <DL values with a configurable substitution rule

  • Builds a unified QC summary

  • Generates a clear narrative explaining what the QC means

  • Produces clean, minimal plots for reporting


No black boxes.

No fragile formulas.

Just reproducible QC interpretation - and a clear path to draw your own conclusions.


7. Example Outputs


Graphs

Lollipop graph showing blank sample status of internal lab QC results
Example Blank Status graph output

Example Interpretation Text

QC Summary for A25-15567Final (Metadata: A25-15567, Date: 14/11/2025)
Laboratory: Actlabs

This batch includes 5 total samples, consisting of 3 CRM samples, 1 duplicate samples, and 1 blanks.

Understanding the digestion chemistry and detection technique is important for interpreting CRM recoveries, duplicate precision, and blank performance. The method used for this batch is summarized below.

Aqua regia digestion (HCl–HNO₃) combined with ICP‑MS detection provides high sensitivity for trace elements. The digestion effectively dissolves sulfides, carbonates, and other labile hosts, but does not fully decompose silicate minerals or refractory phases such as zircon, chromite, barite, or monazite. As a result, elements hosted in resistant minerals may show systematic under‑recovery. ICP‑MS offers low detection limits but is susceptible to matrix‑dependent polyatomic interferences (e.g., Cl‑based species, oxide/hydroxide clusters), depending on whether collision/reaction cell technology is used. Precision is typically 5–10% RSD for analytes present at ≥10× the detection limit, with recoveries influenced by mineralogy, matrix composition, and interference‑control settings.

CRM Behaviour:
CRM performance provides insight into digestion consistency, calibration stability, interference behaviour, and whether the method is operating within its expected analytical envelope.

CRM tolerance applied: 80–120% recovery.
• CRM Recovery (%):
  Recovery % = (Measured Value / Certified Value) × 100
• CRM Bias (%):
  Bias % = ((Measured Value – Certified Value) / Certified Value) × 100

The CRM results show 2 analyte‑level deviations across 3 CRM runs. Deviations by analyte:

  • Al: 76.7%
  • B: 133.3%

The CRM deviations originate from a single CRM material, a pattern that often reflects CRM‑specific behaviour (e.g., matrix mismatch or certified value uncertainty) rather than a batch‑wide analytical issue.

When CRM deviations occur, review digestion conditions, calibration stability, and interference‑control settings to confirm whether the method is performing within its expected analytical envelope.

Duplicate Behaviour:
Duplicate samples evaluate analytical precision. For analytes present at ≥10× the detection limit, precision is typically 5–10% RSD. Elements near the detection limit, or are sensitive to adsorption, partial digestion, or matrix effects commonly show higher RPD values.

Duplicate tolerance applied: ≤30% RPD.
• Duplicate Relative Percent Difference (RPD):
  RPD % = |Sample1 – Sample2| / ((Sample1 + Sample2) / 2) × 100

The duplicate samples show that all analytes above 10× DL meet the ≤30.0% RPD precision criterion, indicating stable analytical precision for this batch.

Vegetation samples often show elevated duplicate variability due to heterogeneous organic content and incomplete digestion of resistant components.

Blank Behaviour:
Blank samples help identify contamination, memory effects, and instrument carryover. Exceedances should be considered when interpreting low‑grade sample results, particularly for coarse blanks.

Blank tolerance applied: values > 3.0× DL flagged.
BDL substitution rule applied: half.
• Blank Mean:
  Blank Mean = Σ(blank values) / n
• Blank Standard Deviation (SD):
  Blank SD = sqrt( Σ(x – mean)² / (n – 1) )

The blank results show 2 analytes exceeding blank thresholds, suggesting possible low‑level contamination, memory effects, or instrument carryover. Affected analytes include:
  • Cr (300.0 > DL 100.0)
  • Mn (900.0 > DL 100.0)

When blank exceedances occur, review recent high‑grade samples, rinse sequences, and contamination‑control procedures. Consider whether affected analytes could influence the interpretation of low‑grade samples in this batch.

Note: QC results reflect internal laboratory quality‑control performance for this batch. They highlight patterns that may warrant further review but should be interpreted alongside laboratory documentation and project context.

Status Definitions:
- OK: Assay results fall within the defined tolerance.
- Fail: Assay results exceed the defined tolerance.
- Fail_RPD: Duplicate RPD exceeds the precision tolerance.
- BDL_Substitution: One value is below the detection limit and a substitution was applied.
- BothBDL: Both values are below the detection limit; evaluation is not meaningful.
- Below10xDL: Values are below 10× the detection limit; evaluation is not meaningful.
- Needs Investigation: Conditions prevent reliable evaluation (e.g., certified ≥ DL but measured < DL, or borderline blank values).
- NotApplicable: Certified value or both measurements are below DL; evaluation is not required.
- NotEvaluated: Required assay data are missing.

Usage

 

Link to download Python_LabQAQC: https://github.com/d-benz/Python-Lab_QAQC

*Note: This is the first version and was tested on a small set of internal QC reports. Both the parsing and logic will continue to be refined. All feedback is welcome.


8. Final Thoughts

Internal lab QC isn’t as exciting as getting results showing multi-gram-per-tonne gold-in-rock samples, but it’s foundational. It’s the quiet part of the assay certificate that tells you whether the numbers you’re about to interpret are trustworthy.


Understanding it makes you:

  • a better data manager

  • a better data reviewer

  • a better steward of exploration decisions


Every so often, a project needs a tool that doesn’t exist yet - so you build it. The Python-Lab_QAQC grew out of that need, and I hope it’s useful to others who are also working toward clearer and more defensible geochemistry.

 

Ready to Move On to External QA/QC?

Internal lab QC is the simplest and most accessible place to learn the fundamentals of analytical quality: accuracy, precision, contamination, and defensible interpretation. Once you’re comfortable evaluating internal QC, you’re ready to expand into full external QA/QC programs used in more advanced exploration, resource estimation, and mining.


A great next step is:

Smee, B.W., Bloom, L., Arne, D., and Heberlein, D. (2024). Practical applications of quality assurance and quality control in mineral exploration, resource estimation and mining programmes: a review of recommended international practices. Geochemistry: Exploration, Environment, Analysis, 24(2), 1-21.


This paper by Smee et al. (2024) offers an excellent overview of the broader QA/QC framework and outlines how to design robust, defensible programs for larger projects.




About the Author:

Dr. Diana Benz has almost 30 years of experience in the mineral exploration industry searching for diamonds and metals in a range of roles: from heavy minerals lab technician to till sampler, rig geologist, project manager and business owner/lead consultant. She has a Bachelor of Science in General Biology, a Master of Science in Earth Sciences researching diamond indicator mineral geochemistry, and a PhD in Natural Resources and Environmental Studies using geochemical multivariate statistical analysis techniques to interpret biogeochemical data for metallic mineral exploration. Diana has conducted fieldwork in Canada (BC, NWT, YT and ON) as well as in Greenland. She has also been involved, remotely through a BC-based office, in mineral exploration projects in South America, Africa, Eurasia, Australia and the Middle East. Diana is the owner/operator/lead consultant of Takom Exploration Ltd., a boutique geological and environmental firm focused on mineral exploration in BC and the Yukon. She currently holds 3 mineral properties in central BC.

Comments


© 2012-2026 Takom Exploration Ltd.

bottom of page