Counts Per Million (CPM) is a simple normalization metric representing the raw read count for a gene divided by the total number of mapped reads in a sample, multiplied by one million. It accounts for differences in sequencing depth between samples, making counts comparable when library sizes vary. CPM does not normalize for gene length, so longer genes will inherently have higher CPM values than shorter genes at the same expression level.
Glossary
Counts Per Million (CPM)

What is Counts Per Million (CPM)?
A fundamental unit of measurement in RNA sequencing that scales raw gene counts by library size to enable preliminary comparisons.
CPM is primarily used as a filtering criterion rather than for downstream differential expression analysis. Researchers apply a CPM threshold—often requiring a minimum CPM in a certain number of samples—to remove genes with lowly expressed transcripts before statistical testing. This pre-filtering step reduces the burden of multiple testing correction and improves power by eliminating genes unlikely to be biologically meaningful.
CPM vs. TPM vs. RPKM/FPKM
Comparison of three common normalization units for RNA-seq expression data, highlighting their calculation order, handling of gene length, and suitability for different analytical tasks.
| Feature | CPM | TPM | RPKM/FPKM |
|---|---|---|---|
Full Name | Counts Per Million | Transcripts Per Million | Reads/Fragments Per Kilobase per Million |
Normalization Order | Sequencing depth only | Gene length, then sequencing depth | Sequencing depth, then gene length |
Corrects for Gene Length | |||
Corrects for Sequencing Depth | |||
Sum of Values per Sample | Equals 1,000,000 | Equals 1,000,000 | Variable; not constrained |
Comparable Across Samples | Within-sample only | Not recommended | |
Primary Use Case | Filtering lowly expressed genes | Comparing transcript proportions across samples | Comparing expression within a single sample |
Suitable for Differential Expression | Yes, but TPM preferred |
Key Characteristics of CPM
Counts Per Million (CPM) is the foundational unit of RNA-seq expression normalization. It corrects for the primary technical bias—sequencing depth—by scaling raw counts to a common denominator, making it the essential first step for filtering lowly expressed genes.
Depth-Normalized Scaling
CPM transforms raw read counts by dividing each gene's count by the total mapped reads in the sample and multiplying by one million. This accounts for varying library sizes between samples, where one sample may have 20 million reads and another 50 million. Without this correction, a gene with 100 reads would appear 2.5x more expressed in the deeper sample purely due to technical bias. CPM places all samples on a comparable scale.
The CPM Formula
The calculation is straightforward:
CPM = (Gene Count / Total Mapped Reads) * 10^6
- Gene Count: Raw number of reads mapping to a gene
- Total Mapped Reads: Library size for that sample
- 10^6: Scaling factor for interpretability
A CPM of 1 means that for every million reads sequenced, one read mapped to that gene. This linear scaling preserves the relative proportions of counts within a sample.
Primary Use: Low-Expression Filtering
CPM is the standard metric for defining expressed vs. unexpressed genes. A common threshold is a CPM > 1 in at least n samples (where n is the smallest group size). Genes below this threshold are considered noise and removed before differential expression testing. This filtering reduces the multiple testing burden and improves statistical power by eliminating genes with insufficient data for reliable dispersion estimation.
Key Limitation: No Gene Length Correction
CPM does not account for gene length. A 5kb gene and a 1kb gene expressed at the same biological level will produce different raw counts because longer transcripts generate more fragments. Consequently, CPM values cannot be directly compared between different genes within the same sample. For within-sample comparisons, use Transcripts Per Million (TPM) or Reads Per Kilobase Million (RPKM). CPM is valid only for comparing the same gene across samples.
Relationship to TMM Normalization
CPM is the input to more sophisticated normalization methods like the Trimmed Mean of M-values (TMM) used in edgeR. The TMM algorithm:
- Calculates CPM for all genes
- Trims extreme log-ratios and high-expression genes
- Computes a weighted mean of the remaining M-values
- Derives sample-specific scaling factors
These factors are then applied to the raw library sizes to produce effective library sizes for downstream analysis.
CPM in the Analysis Pipeline
A typical RNA-seq workflow positions CPM as the first normalization step:
- Raw counts from alignment/quantification
- CPM calculation for initial exploration
- Low-expression filtering using CPM thresholds
- TMM/RLE normalization for effective library size
- Differential expression with DESeq2/edgeR
CPM is also used to generate log-CPM values for visualization (e.g., heatmaps, PCA plots) after adding a small prior count to avoid log(0).
Frequently Asked Questions
Clear answers to common questions about the CPM normalization method, its calculation, appropriate use cases, and how it compares to other RNA-seq expression units.
Counts Per Million (CPM) is a simple normalization unit that represents the raw read count for a gene scaled by the total number of mapped reads in the sample and multiplied by one million. The formula is: CPM = (gene_count / total_mapped_reads) * 1,000,000. This transformation accounts for differences in sequencing depth between samples, allowing for more meaningful comparisons of relative expression levels. For example, if a gene has 50 reads in a sample with 10 million total mapped reads, its CPM value is 5. CPM does not normalize for gene length, making it suitable for within-sample comparisons or between-sample comparisons of the same gene, but inappropriate for comparing expression levels of different genes within the same sample.
Enabling Efficiency, Speed & Accuracy
Intelligent Analysis, Decision & Execution
We build AI systems for teams that need search across company data, workflow automation across tools, or AI features inside products and internal software.
Talk to Us
Search across company data
Give teams answers from docs, tickets, runbooks, and product data with sources and permissions.
Useful when people spend too long searching or get different answers from different systems.

Automate internal workflows
Use AI to route work, draft outputs, trigger actions, and keep approvals and logs in place.
Useful when repetitive work moves across multiple tools and teams.

Add AI to products and internal tools
Build assistants, guided actions, or decision support into the software your team or customers already use.
Useful when AI needs to be part of the product, not a separate tool.
Related Terms
Understanding Counts Per Million requires familiarity with the broader normalization landscape and the statistical frameworks that consume normalized data for differential expression testing.
Transcripts Per Million (TPM)
An alternative normalization unit that addresses a key limitation of CPM. While CPM only corrects for sequencing depth, TPM first normalizes for gene length and then for depth. This produces a metric where the sum of all TPMs in a sample equals one million, allowing for direct comparison of transcript proportions across samples. For differential expression analysis, TPM is generally preferred over CPM because it accounts for the fact that longer genes generate more reads.
DESeq2 Normalization
The median of ratios method used by DESeq2 is a more sophisticated approach than CPM. It computes a size factor for each sample by taking the median ratio of each gene's count to its geometric mean across all samples. This method is robust to outlier genes and compositional biases, making it the standard for differential expression testing. CPM is often used as a preliminary filtering metric before applying DESeq2's normalization.
Trimmed Mean of M-values (TMM)
The normalization method implemented in edgeR, TMM calculates scale factors by computing a weighted trimmed mean of log expression ratios between samples. It trims away genes with extreme expression and high variability before estimating the normalization factor. Like DESeq2's method, TMM is more robust than CPM for between-sample normalization, as it accounts for the fact that a minority of highly expressed genes can dominate total read counts.
limma-voom Transformation
The voom (variance modeling at the observational level) method transforms raw count data into log-counts per million (logCPM) with associated precision weights. This bridges the gap between RNA-seq count data and the limma linear modeling framework originally designed for microarrays. The transformation estimates the mean-variance relationship of the log-counts, allowing established linear modeling tools to be applied to sequencing data with proper statistical rigor.
Batch Effect Correction
CPM normalization does not correct for batch effects—systematic non-biological variation introduced by processing samples in different groups, on different days, or by different technicians. Tools like ComBat-seq use negative binomial regression to adjust for known batch covariates while preserving count data properties. Failing to correct for batch effects can lead to spurious differential expression calls, even when using properly normalized data.
Pseudobulk Aggregation
In single-cell RNA-seq analysis, CPM is often calculated after pseudobulk aggregation—summing counts from individual cells grouped by sample and cell type. This creates synthetic bulk profiles that can be analyzed with established tools like DESeq2 and edgeR. Pseudobulk methods avoid the inflated false positive rates of single-cell-level differential testing while preserving the biological replicates necessary for valid statistical inference.

About the author
Prasad Kumkar
CEO & MD, Inference Systems
Prasad Kumkar is the CEO & MD of Inference Systems and writes about AI systems architecture, LLM infrastructure, model serving, evaluation, and production deployment. Over 5+ years, he has worked across computer vision models, L5 autonomous vehicle systems, and LLM research, with a focus on taking complex AI ideas into real-world engineering systems.
His work and writing cover AI systems, large language models, AI agents, multimodal systems, autonomous systems, inference optimization, RAG, evaluation, and production AI engineering.
Partnered with leading AI, data, and software stack.
How We Work
Custom AI workflows for your Business
One-fit-all AI don't work for modern businesses. At Inferensys, we aim to understand your business & custom requirements; which we use to define most efficient agentic workflows, the data, and the tools for your business.
01
Review the use case
We understand the task, the users, and where AI can actually help.
Read more02
Pick the right approach
We define what needs search, automation, or product integration.
Read more03
Build the first useful version
We implement the part that proves the value first.
Read more04
Improve from there
We add the checks and visibility needed to keep it useful.
Read moreThe first call is a practical review of your use case and the right next step.
Talk to Us