How the Lutheran YouTubers ranking score works — what it measures, how it's calculated, and where the data comes from.
Methodology version: loading…
The ranking score answers a simple question: which Lutheran YouTube channels are both well-watched and fast-growing, relative to their age?
Rather than rewarding raw subscriber counts (which favor older channels) or total views alone (which favor channels that have simply been around longer), the score combines two normalized metrics:
These two metrics are weighted equally and combined into a single score. The lowest-ranked channel always scores 1.0, making the scale easy to interpret: a channel scoring 3.0 is roughly three times as strong as the baseline.
The number of years between a channel's actual activity start and the reference date. We prefer the channel's first published video date when available (fetched once from the uploads playlist and cached permanently). When we don't yet have a first-video date recorded, we fall back to the channel's creation date. This distinction matters for dormant channels that were registered years before their first upload: a channel created in 2015 whose first video was in 2022 is credited with ~4 years of activity, not ~11.
Years Active = (Reference Date − First Video Date) / 365.25
Years Active (fallback) = (Reference Date − Channel Created Date) / 365.25
April 2026 revision: Years Active now anchors to first-upload date when known, replacing the pure channel-creation-date basis. This prevents structural over-penalization of channels that spent years dormant before producing content.
Measures throughput of views per subscriber per year — a unit-coherent rate rather than a lifetime accumulation. A 10-year-old channel and a 6-month-old channel are compared on the same basis: how hard is the current audience watching, per unit of time. The log scale keeps this metric balanced — a 10× difference in raw throughput becomes a 1-point difference in engagement.
Whenever at least two monthly snapshots with view counts are available, Engagement is computed from recent view throughput — the annualized view growth over the rolling 12-month window, divided by current subscribers. This mirrors the Momentum treatment in Step 3 and means a channel whose lifetime views come mostly from a viral moment years ago no longer outranks a channel actively earning views today:
Engagement = log₁₀((Views_now − Views_window-start) × 12 / Months in Window / Subscribers_now)
For channels that don't yet have two months of snapshot history with view data (newly added channels, or the bootstrap phase before the monthly cron has populated a full window), Engagement temporarily falls back to the lifetime throughput formula. Each channel's source is flagged in the API payload as engagementSource:
Engagement (fallback) = log₁₀(Total Views / Years Active / Subscribers)
April 2026 revisions: Years Active was briefly removed and then restored to the denominator after a statistical review found the lifetime-ratio version lacked time coherence. In a subsequent revision, the primary Engagement formula was further upgraded to match Momentum's snapshot-derived recency treatment — so both composite metrics now prefer rolling-window rates when history allows, with lifetime fallbacks during the bootstrap phase.
Measures how quickly a channel is currently gaining subscribers — not a lifetime average. Whenever at least two monthly snapshots are available, momentum is computed as annualized subscriber growth over the most recent 12-month window:
Momentum = (Subscribers_now − Subscribers_window-start) × 12 / Months in Window
For channels that don't yet have two months of snapshot history (newly added channels, or the bootstrap phase before the monthly cron has populated a full window), momentum temporarily falls back to the lifetime average below. This fallback is flagged internally so the methodology remains transparent:
Momentum (fallback) = Subscribers / Years Active
April 2026 revision: Momentum now reflects recent growth, enabled by the monthly snapshot cron. A channel that exploded years ago and has since stagnated no longer outranks a channel actively gaining subscribers today. As the snapshot history grows past 12 months, the window becomes a true rolling-year measure of current momentum.
Both Engagement and Momentum are converted to z-scores — how many standard deviations each channel is above or below the group average — so neither metric dominates the other in the final average.
Engagement is already on a log scale at the source (log₁₀ of a ratio), so it z-scores cleanly. Momentum is a raw subs/year count that's heavily right-skewed (most channels gain a few hundred per year; a handful gain tens of thousands), and can occasionally be negative when a channel loses subscribers. To keep a single mega-growth channel from eating all the variance — and to give negative growth a symmetric treatment — Momentum is passed through a signed-log transform before z-scoring.
signed-log(x) = sign(x) × log₁₀(|x| + 1)
Z_engagement = (Engagement − Average(Engagement)) / StdDev(Engagement)
Z_momentum = (signed-log(Momentum) − Average(signed-log(Momentum))) / StdDev(signed-log(Momentum))
April 2026 revision: Momentum now receives a signed-log transform before z-scoring so skewed growth distributions don't bias the pool statistics. Engagement is left untransformed since it's already log-scaled at the source.
Cross-metric diagnostic: Because both Engagement and Momentum are constructed from subscriber counts (Engagement has subs in the denominator, Momentum in the numerator), they aren't mathematically independent — a shock to a channel's subscriber count propagates into both metrics, in opposite directions. To quantify whether that structural coupling translates into meaningful statistical overlap, the site computes the Pearson correlation coefficient ρ between Z_engagement and Z_momentum across the roster on every refresh and publishes it in the API diagnostics block. If |ρ| is small (typically below ~0.3), the equal-weight average in the next step is defensible — the two metrics are effectively capturing distinct dimensions. If |ρ| grows large, it's a signal that the weighting scheme deserves revisiting (for example, by replacing the simple average with a principal-component composite). The correlation is reported transparently so readers can verify the assumption rather than take it on trust.
Frozen reference distribution: The μ and σ used for z-scoring are not recomputed from the current roster on every refresh. Instead, they are frozen once from the 2025 baseline pool and used as a fixed yardstick for every subsequent year. This is the final piece of the roster-independence fix — the Index anchor was already fixed at a theoretical reference channel (Step 7), and now the distribution that z-scores measure against is also fixed. The same raw Engagement and Momentum values will produce the same z-scores, the same Raw Score, and the same Index today, next year, and in five years, regardless of which channels happen to be on the roster at the time.
Z_engagement = (Engagement − μ_E_reference) / σ_E_reference
Z_momentum = (signed-log(Momentum) − μ_M_reference) / σ_M_reference
where μ_E_reference, σ_E_reference, μ_M_reference, σ_M_reference
are computed once from the 2025 baseline channel set and frozen.
The current roster's own pool statistics are still computed and published separately (in the API diagnostics block as poolStats) so readers can see exactly how far this year's distribution drifts from the frozen reference. The reference distribution itself is also published (as referenceDistribution) so anyone can recompute any channel's z-scores from raw inputs without access to the original 2025 baseline dataset.
The two z-scores are combined as a weighted average and shifted by a fixed offset so that the score's meaning is stable year-to-year regardless of who happens to be in the roster. A channel whose combined z-score sits at −2σ (roughly the 2.5th percentile of a normal pool) maps to a Raw Score of exactly 1.0; the pool average maps to 3.0; a strong channel at +2σ maps to 5.0. A safety floor at 1.0 prevents any rare deeper outlier from creating a negative "distance above floor" that would flip the sign of the gravitas multiplier in the next step.
Raw Score = max(1.0, W_E × Z_engagement + W_M × Z_momentum + 3.0)
where W_E = 0.5 and W_M = 0.5
Weighting: Engagement and Momentum are weighted equally (W_E = W_M = 0.5). This is an explicit design choice, not a derived optimum: the two metrics measure distinct and non-redundant dimensions of channel health — how hard the existing audience watches (Engagement) vs. how fast the audience is expanding (Momentum) — and we have no a-priori reason to privilege one over the other. The weights are exposed as named constants in the code and published alongside the scoring payload so downstream consumers can see the assumption directly.
April 2026 revisions: (a) The Raw Score floor is now a fixed constant (+3) rather than the previous "minimum channel in this year's pool maps to 1.0" anchor. The old anchor made every channel's score depend on the weakest channel in the roster, which meant adding or removing a single channel re-baselined every other channel — breaking cross-year comparability. (b) The equal-weight combination is now surfaced as an explicit design constant rather than left implicit in an arithmetic-mean formula.
Sensitivity to the weight choice. Equal weighting is a design decision, not a derived optimum, so readers deserve to see how much the published ranking depends on that choice. The table below (computed live from the current roster) shows the top 10 channels under five alternative weightings — from a strongly Momentum-biased W_E=0.2, W_M=0.8 through the default 0.5/0.5 to a strongly Engagement-biased 0.8/0.2. Names that appear in every column are robustly top-ranked regardless of how the two metrics are combined; names that shuffle substantially between columns are borderline cases whose position is sensitive to the weighting and should be read with that caveat:
/api/data…A channel with only a handful of subscribers or just a few months of history can post eye-catching engagement and momentum numbers that don't yet reflect sustained performance. The gravitas multiplier ensures that a channel needs both a meaningful audience and time in the game to earn full ranking credit.
It combines two factors:
Gravitas = min(Subscribers / 15,000, 1) × [min(Years Active / 3, 1) + 0.2 × log₁₀(max(Years Active − 3, 0) + 1)]
Final Score = 1.0 + (Raw Score − 1.0) × Gravitas × ShortsPenalty
The ShortsPenalty term applies parallel to gravitas — see Step 9 — and equals 1.0 (no effect) for channels at or below the 40% Shorts-share threshold.
Where the thresholds come from: The 15,000-subscriber and 3-year breakpoints are judgment calls informed by the observed data, not derived optima. The 15K threshold was chosen because the observed roster has a natural gap between ~15K and ~30K subscribers — no channel sits in that range — so picking the threshold inside that gap means no channel is punished for being just below it. A channel at 14.9K gets essentially full sub-factor credit (0.99), and the threshold doesn't arbitrarily bisect the mid-tier. The 3-year age threshold mirrors the conventional "year one is learning, year two is refining, year three is consistent output" pattern observed on creator platforms; the logarithmic bonus beyond 3 years lets long-tenured channels keep earning credit without letting a 20-year-old channel dominate a 10-year-old one by a factor of 2. Both values are exposed as design decisions in the changelog rather than fit from the data, and the sensitivity of the final rankings to modest changes in either threshold is small (most channels are well above or well below both cut-offs).
Channels with 15K+ subscribers and 3+ years of history receive full credit (gravitas = 1.0). Long-tenured channels (10+ years) earn a modest additional bonus from the age-tenure tail (gravitas ≈ 1.18). Channels below 15K subscribers see their score bonus scaled down, and channels with just a few hundred subs barely move off the 1.0 baseline. The effect: a channel needs both a real audience and real tenure to climb the rankings, and no single mega-channel can run away with the index. The logarithmic age-tenure tail was added in April 2026 so that legacy channels with steady (not explosive) growth aren't structurally disadvantaged by the per-year denominator in Momentum. The 15K subscriber threshold was adopted in April 2026 to replace the earlier 100K log-compressed threshold — new channels now reach full gravitas credit much sooner, while the factor is still capped at 1.0 to keep the index readable.
The final score is converted to an easy-to-read index where 100 equals a theoretical reference channel sitting at the pool average on both Engagement and Momentum (combined z-score of 0) while fully earning its Gravitas credit (Gravitas = 1.0). This reference-channel pinning anchors the Index to a fixed statistical landmark rather than to the current roster's median, which means Index values are strictly comparable across years even as channels are added to or removed from the roster.
Index = (Final Score / 3.0) × 100
where 3.0 = Final Score of a hypothetical channel at:
• Z_engagement = 0 (pool average)
• Z_momentum = 0 (pool average)
• Gravitas = 1 (full credit)
A channel scoring 150 is 50% stronger than the theoretical pool-average channel; a channel scoring 75 is 25% below that reference. The actual median of the current roster is reported separately so readers can see where the pack centers on this scale — it's typically within a few points of 100 but shifts slightly year-to-year as the roster evolves.
April 2026 revision: The Index is now anchored to a fixed statistical reference (Raw Score = 3, Gravitas = 1 → Final Score = 3) rather than to the current roster's median channel. The previous "100 = median" anchor meant that adding or removing a single channel shifted every other channel's Index, breaking strict cross-year comparability. The fixed anchor is year-stable and makes Δ Index values mean exactly what they appear to mean.
Raw subscriber and view counts fluctuate day-to-day, and the YouTube API itself rounds subscriber totals to published buckets (e.g. 14K, 14.6K, 15K). To quantify how much of a channel's displayed rank is real signal versus noise, the site runs a parametric bootstrap on every data refresh: each channel's raw subs and views are independently jittered with Gaussian multiplicative noise, the full score pipeline is recomputed against the same frozen z-score reference, and the channel's rank is recorded. This repeats for 400 iterations. The 5th and 95th percentile of each channel's rank distribution form a 90% confidence band.
Per-channel empirical noise: The jitter σ is not a single one-size-fits-all constant. For channels with at least four monthly snapshots in their history, the site fits a simple linear trend on log-subs (and log-views), takes the residuals, and uses their standard deviation as that channel's bootstrap noise scale — an actual measurement of how volatile the channel has been. Channels with sparse history, or whose empirical σ falls outside a sanity band (0.3%–10%), fall back to a pool-wide default of 2%. Each channel's noise scale and its source (empirical or default) are published in the API as bootstrapNoiseSubs, bootstrapNoiseViews, and bootstrapNoiseSource. This means a high-variance channel correctly receives a wider CI, and a historically stable channel receives a tighter CI, rather than all channels being treated as uniformly uncertain.
For b = 1 … 400:
subs_jittered_i = subs_i × (1 + Normal(0, 0.02))
views_jittered_i = views_i × (1 + Normal(0, 0.02))
Recompute full pipeline → record each channel's rank
rankLow = 5th percentile of recorded ranks
rankHigh = 95th percentile of recorded ranks
The rankings table shows a small ±n next to any rank whose 90% CI spans more than one position — a visual cue that the channel's exact placement is inside the noise floor and that it's effectively tied with its immediate neighbors. Channels whose CI collapses to a single rank are statistically stable at that position.
April 2026 addition: The bootstrap CI quantifies measurement uncertainty only (day-to-day API fluctuation, published-value rounding). It does not model structural uncertainty — whether a given channel should or shouldn't be on the roster — since that's a roster-definition question, not a statistical one.
YouTube exposes a single lifetime view counter per channel that includes both long-form uploads and Shorts (videos ≤ 60 seconds). These two formats attract fundamentally different kinds of attention — long-form views tend to reflect intentional, sustained watching, while Shorts views are driven by the vertical-feed algorithm and can accumulate views far out of proportion to audience engagement. Because we cannot get a historical long-form-only view total from the public API, we don't attempt to correct the Engagement metric for Shorts inflation. Instead, we surface a transparency signal so readers can see it for themselves.
On each monthly snapshot (and on every manual refresh), we sample a channel's most recent 50 uploads and compute:
Sample = last 50 uploads (from the channel's uploads playlist)
ShortsShare = |{v ∈ Sample : duration(v) ≤ 60s}| / |Sample|
ShortsViewShare = Σ views(v) for Shorts in Sample / Σ views(v) for all v in Sample
These values appear on the channel row tooltip on the rankings page. A reader comparing two channels with similar Engagement values can check the Shorts share to judge whether those views come from the same kind of attention.
Shorts-heavy badge: A channel whose shortsShare ≥ 40% (i.e., 40% or more of its 50 most recent uploads are Shorts, computed over a sample of at least 10 uploads) is flagged with a small "Shorts-heavy" badge next to its name on the rankings table. The badge tooltip reports both the count-based share and the within-sample view share. Channels below the threshold, or without enough recent uploads in the sample, carry no badge.
Shorts deboost (anti-gravitas): Channels above the 40% threshold also receive a multiplicative penalty applied to their Final Score, parallel to the gravitas multiplier in Step 6. The penalty discounts distance above the Raw-Score floor, so it never pushes a channel below the floor — it caps how far an otherwise-strong score can climb when the channel's recent output is heavily short-form. The curve is concave-up: barely felt at 50% Shorts share, biting hard at 80%+:
ShortsPenalty(s) = max(0.30, 1 − 2.5 × max(0, s − 0.40)²)
s = 0.40 → 1.000 (no penalty)
s = 0.50 → 0.975
s = 0.60 → 0.900
s = 0.70 → 0.775
s = 0.80 → 0.600
s = 0.90 → 0.375
s = 1.00 → 0.300 (floor)
The threshold (40%) and minimum sample size (10) match the visibility-badge rule, so any channel with the badge is also receiving the score discount, and vice versa. The penalty's published per-channel value is exposed in the API as shortsPenalty for transparency.
Earlier methodology versions (≤ v2026.05.3) reported Shorts share as a transparency signal but did not adjust the score, on the principle that any correction factor would itself be debatable. v2026.05.4 introduces this deboost as an explicit editorial design choice: a channel whose recent output is mostly short-form should not be ranked alongside a channel whose engagement and momentum are earned from long-form attention, because the two attract structurally different kinds of viewer attention. The 0.30 floor preserves some signal for all-Shorts channels rather than collapsing them entirely.
April 2026 addition: Shorts metrics are newly introduced as a transparency layer. They do not influence the score. Sample size may be smaller than 50 for channels with fewer total uploads. The sample is always the most recent uploads, so the share reflects the channel's current content mix, not its historical mix.
Subscriber counts, lifetime view counts, and channel creation dates are pulled directly from the official YouTube Data API v3 — the same data source that powers YouTube itself. For each channel we request the statistics and snippet parts, which return subscriberCount, viewCount, and publishedAt (the channel's creation date).
Every channel on the roster is identified by its canonical YouTube handle or channel ID, so lookups always hit the authoritative record — no scraping, no third-party aggregators, no estimates.
The 2025 baseline dataset covers 28 channels with full raw data (subscribers, views, start date). The remaining channels on the 2026 roster — including channels added this year (Red Letter Living, KFUO Radio, Christian News, Lutheran Church Canada, Banned Books, Being Lutheran) and channels without a comparable 2025 snapshot (Javier Perdomo, Worship Anew Online, In With & Under, Lutheran Answers, Richard Bicknase, The Cloud, Issues Etc.) — show Index 2025 and year-over-year Δ as em-dash (—).
Methodology parity: The April 2026 formula changes (first-video-date basis for Years Active where known; throughput-based Engagement with Years Active in the denominator; snapshot-derived recent Momentum where history allows, with lifetime fallback otherwise; signed-log transform on Momentum before z-scoring; explicit equal-weight combination of z-scores; 15K-subscriber linear sub-factor on Gravitas; logarithmic age-tenure tail on Gravitas; fixed-constant Raw Score floor; fixed-anchor Index normalization; bootstrap rank confidence intervals; Shorts transparency sampling) were applied retroactively to the 2025 baseline wherever the required inputs exist, so Index 2025 and Δ values are strictly comparable across years. The 2025 baseline necessarily uses the lifetime-Momentum fallback (no prior monthly snapshots exist), uses channel-creation date when first-video date has not yet been cached for a given channel, and does not report Shorts metrics on historical data since the sample is always drawn from the current uploads feed.
A scheduled cron job runs automatically on the 1st of every month at 02:00 UTC. On each run it:
{ym, subs, views} — tagged with the year-month (e.g. 2026-04) — to that channel's immutable history array.Because snapshots are stamped by year-month, the site can show month-over-month subscriber deltas on the rankings table starting the second month of data collection, and year-over-year (vs. the 2025 baseline) deltas immediately. The "Rankings as of …" timestamp at the top of the rankings reflects the most recent successful YouTube API pull.
Between scheduled runs, any channel can also be refreshed on demand from the private admin console, and a snapshot can be captured manually at any time.
The list of 45 channels was curated by Ad Crucem News to represent active confessional Lutheran content creators — from individual pastors and educators to institutional channels and media ministries. The roster is not a survey of everything calling itself "Lutheran" on YouTube; it's a curated list of channels whose teaching can be expected to reflect historic Lutheran doctrine as the Church has confessed it.
A channel is eligible for inclusion when it meets all of the following:
@handle) or channel ID so that data pulls always resolve to the same record — no disambiguation required, no scraping.Roster curation itself is an editorial act, not a statistical one. Adding a channel is a judgment that the channel falls within the intended category; removing one is a judgment that it no longer does. The criteria above make that judgment reproducible at the "we're transparent about what we did" level, but not mechanically reproducible — two curators working from the same criteria could reasonably arrive at roster lists that differ by a handful of channels at the margin.
Every response from the /api/data endpoint includes a full diagnostics block alongside the ranking payload, so a statistically literate reader can audit the distributional shape of the input metrics without re-running the data through their own pipeline. Specifically, for both the current year and the 2025 baseline, the API publishes:
These diagnostics are not hidden — they're designed to be read. A reader checking "is this formula well-behaved on this year's data?" should be able to answer from the payload alone.
The full raw channel dataset — subscriber counts, lifetime views, channel creation dates, first-video dates, monthly snapshot history, and Shorts-sample metrics, for both the current year and the 2025 baseline — is available as a CSV via the download page. Each row is one channel in one dataset (current or baseline); the history column embeds the channel's full snapshot array as JSON. Combined with the open-source scoring code and the published methodology version, this makes every number on the site end-to-end reproducible.
The download requires a first name, last name, and email address, with email-ownership confirmed via a one-time magic link. Rate limit: one download per email address per 30 days. This prevents the dataset from being abused as an open scraping endpoint while keeping genuine research access friction-free.
Each change to the scoring pipeline that affects computed values gets a new methodology version. The current version is tagged at the top of this page and published in every API response as methodologyVersion. A cited or saved Index value can always be traced back to the formula that produced it by cross-referencing the version against this changelog.
ShortsPenalty(s) = max(0.30, 1 − 2.5 × (s − 0.40)²). Concave-up, barely felt near the threshold, ramping up steeply for mostly-Shorts channels, floored at 0.30.1 + (Raw − 1) × Gravitas to 1 + (Raw − 1) × Gravitas × ShortsPenalty. Methodology Step 6 box now shows the new form; Step 9 documents the curve and rationale in detail.shortsPenalty value now exposed in the API payload alongside the existing shortsShare / shortsViewShare / shortsSampleSize fields, so anyone can verify the discount applied to any given channel.shortsViewShare ≥ 50% to shortsShare ≥ 40%. Switched from view-share to count-share so the badge reflects the channel's upload mix directly (40% or more of the 50 most recent uploads are Shorts), which matches the intuitive reading of "this channel is a Shorts channel" better than the view-weighted variant. Tooltip now reports both the count share and the view share for transparency.api/snapshot.js: cron-driven snapshots are now history-only. Each monthly cron pull appends/replaces the channel's entry in history[] for that year-month, but does not overwrite ch.subs, ch.views, or ch.lastRefreshed. Channel-identity fields (channelId, handle) and channel-level metadata (firstVideoDate, Shorts metrics) continue to update on every cron run, since they reflect "current truth about the channel" rather than the year-over-year snapshot.lib/score.mjs: recentMomentum() and recentEngagement() now strictly bound their rolling window to [refDate − 12 months, refDate's month]. Future-of-refDate history entries (May, June, … of an April-anchored year) accumulate for next year's analysis but no longer pollute today's published metrics.subscriberCount values, so recentMomentum() computed exactly zero growth and the score collapsed to the floor.recentMomentum() now rejects observed |Δsubs| below YouTube's display-rounding floor for the channel's subscriber tier (1K floor at 100K+ subs, 100 floor at 1K–100K, 10 floor below 1K). When |Δsubs| is below the floor, the function returns null and the caller falls back to lifetime subs/years momentum — strictly more accurate than reporting a misleading zero.subsRoundingFloor(subs) documents the assumed rounding tiers per channel size. As more months of snapshot data accumulate, true zero growth becomes distinguishable from rounding-induced zero (a 6-month flat reading on a 100K channel is 6× the rounding floor). Until then, lifetime momentum is the safer estimator.viewCount is reported as a precise integer (no display rounding), so engagement deltas don't suffer the same bug./download: visitor submits first name, last name, and email; server emails a single-use magic link (HMAC-SHA256 signed, 30-minute expiry); clicking the link verifies ownership and delivers the CSV as an attachment in one atomic step.leads.json Vercel Blob and surfaced in the admin console for review./api/dataset.csv endpoint retired — the form flow replaces it. Reproducibility claim remains intact: anyone with an email address can still obtain the full dataset in one friction-free round-trip.engMean, engSd, momLogMean, momLogSd) by resampling the N=28 baseline channel set with replacement. Available in the API payload as referenceDistributionCI. Shows exactly how tightly the "frozen" reference is actually pinned — addresses the pedant's complaint that we were treating sample estimates as population parameters.W_E ∈ {0.2, 0.35, 0.5, 0.65, 0.8}) at every data refresh, with top-10 results for each published in the API payload as sensitivity and rendered as a live comparison table under Step 5 of this page./api/dataset.csv — end-to-end reproducibility without access to Blob storage.engagementSource flag in the API payload.bootstrapNoiseSubs, bootstrapNoiseViews, and bootstrapNoiseSource. Activates per-channel as history accumulates.referenceDistribution.indexExact for downstream tooling.log₁₀(views ÷ years ÷ subs), making it unit-coherent across channels of very different ages.subs ÷ years as a bootstrap fallback.sign(x)·log₁₀(|x|+1)) before z-scoring to tame right-skew and handle negative growth symmetrically.max(1, z_avg + 3)) instead of the previous roster-minimum anchor, so the score scale is stable year-to-year.W_E = W_M = 0.5) and published them in the API payload.log₁₀(views ÷ years ÷ subs). Momentum = subs ÷ years. Raw Score anchored to roster minimum. Index anchored to roster median. No first-video-date lookup, no snapshot history, no bootstrap CIs, no Shorts sampling. The v2026.04 formula is applied retroactively to the 2025 baseline dataset so year-over-year Δ values remain comparable; the 2025 numbers published on this site reflect the retroactive rather than the original v2025 formula.A rigorous methodology doesn't just describe what it measures — it names what it can't. The following are real limitations of this ranking. They're disclosed rather than silently papered over, so readers know where to apply their own judgment on top of the numbers.
(low–high) annotation on the rankings table) is our way of surfacing this, but it doesn't formally correct for the multiple-comparisons problem.Data collected April 2026. Rankings cover 45 channels. Estimated values flagged ~est.