Methodology

How the Lutheran YouTubers ranking score works — what it measures, how it's calculated, and where the data comes from.

Methodology version: loading…

What the Score Measures

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.

How It's Calculated

1

Years Active

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.

2

Engagement

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.

3

Momentum

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.

4

Standardize

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.

5

Raw Score

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:

Loading sensitivity analysis from /api/data
6

Gravitas Adjustment

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:

  • Subscriber factor — a linear ramp that reaches full credit at 15,000 subscribers and stays there. A channel at 15K or more sits at 1.0. Below 15K the factor scales down proportionally (7,500 subs = 0.5, 1,500 subs = 0.1, 150 subs = 0.01). Above 15K, channels are neither penalized nor amplified — the subscriber race above 15K is already reflected in Engagement and Momentum.
  • Age factor — ramps linearly from 0 to 1 over the first 3 years, then adds a logarithmic bonus for channels with more than 3 years of history, rewarding durable tenure without running away
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.

7

Index (Fixed-Anchor at 100)

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.

8

Rank Uncertainty (Bootstrap)

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.

9

Short-Form (Shorts) Transparency

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:

  • Shorts share (by count): fraction of sampled videos whose duration is ≤ 60 seconds.
  • Shorts view share (within sample): fraction of total views across the sampled videos that come from the Shorts in that sample.
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.

In plain English: A channel ranks high when it has an engaged audience (lots of views relative to its subscriber count), it's growing quickly for its age, and it has the track record to back it up. All three matter. The index makes it easy to see how far above or below the middle each channel sits.

Data Sources

Channel data

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.

Refresh cadence & monthly snapshots

A scheduled cron job runs automatically on the 1st of every month at 02:00 UTC. On each run it:

  1. Calls the YouTube Data API for every channel on the roster.
  2. Overwrites each channel's current subscriber and lifetime-view counts with the fresh values.
  3. Appends a history entry {ym, subs, views} — tagged with the year-month (e.g. 2026-04) — to that channel's immutable history array.
  4. Recomputes all scores, indices, and median against the new data.

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.

Channel roster & inclusion criteria

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:

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.

Published diagnostics

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.

Downloadable dataset

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.

Version & Changelog

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.

v2026.05.4 — May 2026 (Shorts deboost / anti-gravitas)

v2026.05.3 — May 2026 (Shorts-heavy badge tuning)

v2026.05.2 — May 2026 (annual anchor preservation)

v2026.05.1 — May 2026 (rounding-floor fix in recent Momentum)

v2026.04.10 — April 2026 (confessional-fidelity roster criterion)

v2026.04.9 — April 2026 (dataset download flow)

v2026.04.8 — April 2026 (final polish)

v2026.04.7 — April 2026 (honest disclosure)

v2026.04.6 — April 2026 (reproducibility & presentation)

v2026.04.5 — April 2026 (first-video date sanity clamp)

v2026.04.4 — April 2026 (history-aware Engagement and bootstrap noise)

v2026.04.3 — April 2026 (frozen z-score reference)

v2026.04.2 — April 2026 (statistical refinement)

v2026.04.1 — April 2026 (transparency layer)

v2026.04 — April 2026 (major statistical overhaul)

v2025 — baseline

Known Limitations

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.

Construct limitations

Statistical limitations

Data-source limitations

Scope limitations

Data collected April 2026. Rankings cover 45 channels. Estimated values flagged ~est.