Transparency

What the data can’t say

Every number on this site has conditions attached — a reporting delay, a thin sample, an attribution gap, a stripped field. This page names each one, and what it means when you read the number.

9named conditionsEach is a stated condition on the data, not a flaw in the dashboard.

Reporting

2conditions

What YouTube's feed hasn't reported yet, or reports as an artifact.

  • Reporting lag

    What’s missing

    YouTube's reporting pipeline is two to three days behind real time. Every chart and aggregate in the dashboard stops at the most recently complete date.

    Reading this

    Numbers for the last two to three calendar days are always absent. This is not a gap in the dashboard — it is a gap in what YouTube exposes.

    Enforced by
    • dashboard/src/lib/db.ts · getReportingCutoff

      Returns the latest date with complete reporting data; all charts filter to date ≤ cutoff.

  • Pre-publish stub rows

    What’s missing

    When a video is scheduled, YouTube sometimes records reporting rows for the day before it published — usually a row of zero views and null impressions.

    Reading this

    Every aggregation filters out these stub rows using the pre_publish_stub = 0 guard. The stub rows remain in the database for provenance.

    Enforced by
    • dashboard/src/lib/db.ts

      All summary CTEs include WHERE pre_publish_stub = 0.

    • scripts/build-public-db.js

      Sets pre_publish_stub = 1 when date < published_at for the video.

    Since schema v9

Sampling

2conditions

Where a number is too thin a sample to read directionally.

  • Click-rate thin-sample tiers

    What’s missing

    Click rate from fewer than 50 impressions is noise. Four tiers encode sample size: noise / low / medium / high.

    Reading this

    Any click rate in the noise or low tier reflects too few impressions to read directionally. The four-segment glyph after every click-rate cell encodes which tier applies.

    Enforced by
    • dashboard/src/lib/ctr-confidence.ts

      Tier boundaries and classification logic.

    • dashboard/src/components/ConfidencePip.tsx

      Renders the four-segment glyph on every click-rate display (variant="ctr").

    Since schema v9
  • Average watch time thin-sample tiers

    What’s missing

    Average watch time below 10 views is noise; 10 to 29 is directional; 30 to 99 is readable; 100 or more is reliable.

    Reading this

    The same four-tier encoding applies to watch-time cells. Readings below the 30-view threshold tend to be dominated by a handful of unusually long or short sessions.

    Enforced by
    • dashboard/src/lib/ctr-confidence.ts

      AVD confidence boundaries (avdConfidenceTier function).

    Since schema v9

Attribution

2conditions

Where the parts don't sum to the whole, and the gap is shown.

  • Unattributed impressions

    What’s missing

    YouTube's per-source impression rows don't always sum to the per-video impression total. The gap is real and surfaced rather than redistributed.

    Reading this

    Some impressions come from surfaces YouTube doesn't expose through its reporting feed. The unattributed share is visible on the Honesty panel; traffic charts reflect only attributed impressions.

    Enforced by
    • dashboard/src/lib/db.ts · getUnattributedImpressions

      Computes the channel-level unattributed impression share.

    Since schema v9
  • Channel-snapshot reconciliation gap

    What’s missing

    The channel-level snapshot sometimes shows higher totals than the sum of per-video reporting rows.

    Reading this

    This is YouTube's own attribution gap. The dashboard charts the difference rather than hiding it, so readings on total channel views may slightly overcount relative to per-video sums.

    Enforced by
    • dashboard/src/lib/db.ts · getChannelReconciliation

      Returns the per-day delta between channel snapshot and per-video sum.

Withheld content

1condition

What the public dataset deliberately leaves out before it ships.

  • Comment text and non-public videos stay out

    What’s missing

    A public channel ships in full — real titles, real video IDs, real thumbnails. Two things never enter the public dataset: the text of viewer comments (counts only), and videos that aren't public on YouTube.

    Reading this

    Every public video is fully analyzable under its real title and ID. Individual comments and non-public uploads are not recoverable from the public data.

    Enforced by
    • scripts/build-public-db.js

      Excludes comment text and non-public videos from the public dataset at build time.

Missing data

2conditions

What YouTube doesn't expose for a channel this size, or at all.

  • Size-gated demographic data

    What’s missing

    YouTube only returns audience demographics once a channel clears a minimum-size threshold. This channel is currently below that threshold.

    Reading this

    Country, age, and gender breakdowns are not available in the current dataset. When the channel grows past the threshold, demographic data will appear in a future pipeline update.

  • Revenue and monetization absent

    What’s missing

    Revenue, CPM, and ad-breakdown data are not in the dataset. This channel is not yet in the YouTube Partner Program.

    Reading this

    Monetization metrics (CPM, RPM, ad revenue) are not analyzable from this dataset.

Keep verifying

The rest of the honesty layer

The limits registry is one of three honesty surfaces. Beside it sit the methodology notes and the live data-quality readout. Each names a different part of what the data can and can't say.