# Youtube SEO

> Advanced YouTube SEO analysis and optimization for channels and videos. Routes to specialized sub-skills for audits, single-video deep dives, metadata optimization, channel branding, keyword research, thumbnails, and competitor intel. Models YouTube's modern recommender (session watch time / Reinforce / persona matching) not just keyword match. Use when user says "YouTube SEO", "optimize my video", "rank my YouTube video", "YouTube channel audit", "YouTube keywords", or provides a YouTube URL.

- Skill: `deeployco/youtube-seo` (Agent Skill)
- Install (CLI): `npx skillmds@latest add deeployco/youtube-seo`
- Raw SKILL.md: https://api.skillmd.com/api/skills/deeployco/youtube-seo/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Marketing & Growth
- Author: deeployCO (https://skillmd.com/u/deeployco)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/deeployco/youtube-seo

---


# YouTube SEO Orchestrator (Advanced)

Master skill for YouTube SEO work. Detect intent, delegate to the right
sub-skill, and provide the shared advanced ranking model that every
sub-skill references. If intent is ambiguous, ask once before proceeding.

## Routing Table

| User intent / input | Sub-skill |
|---------------------|-----------|
| "audit my channel", channel URL alone, "full YouTube check" | `youtube-seo-audit` |
| Single video URL, "analyze this video", "why isn't this ranking" | `youtube-seo-video` |
| "optimize title/description/tags", "rewrite metadata", "improve CTR copy" | `youtube-seo-optimize` |
| "channel branding", "about page", "banner", "playlists", "channel trailer" | `youtube-seo-channel` |
| "YouTube keywords", "topic research", "what should I make a video about" | `youtube-seo-keywords` |
| "thumbnail review", "CTR thumbnail", "is my thumbnail good" | `youtube-seo-thumbnail` |
| "competitor analysis", "what are [channel] doing", "competing videos" | `youtube-seo-competitor` |

## Advanced Ranking Model

YouTube's recommender is NOT a keyword-match system. It is a multi-surface
reinforcement-learning recommender that optimizes for **long-term user
satisfaction** (the "Reinforce" paper, Covington et al. 2016 + DRL updates).
Each surface has its own objective:

| Surface | Primary objective | Dominant signal |
|---------|-------------------|-----------------|
| **Browse** (Home feed) | Session watch time + return rate | CTR-on-impression, persona match, freshness |
| **Suggested** (sidebar / autoplay) | Next-video watch time | Topical adjacency, session continuation, co-view graph |
| **Search** | Query satisfaction | Keyword/entity match, APV for that query, click depth |
| **Shorts feed** | Swipe-through rate + watch loops | Hook in <1s, loopability, audio trend |
| **Notifications** | Open rate in first hour | Subscriber affinity, bell-on CTR history |
| **External** | Retention of new viewers | Intro strength, subscribe-from-external rate |

A video can be strong on one surface and dead on others. Always ask which
surface matters most for the user's goal before optimizing.

### Tier 1 — Watch-time & session signals (dominant)

- **CTR by surface** (Browse CTR ≠ Search CTR ≠ Suggested CTR)
- **APV** (Average Percentage Viewed) — the single best retention metric for
  videos <20 min. Benchmarks:
  - Excellent: ≥55% APV
  - Good: 45-55%
  - Needs work: 35-45%
  - Bad: <35% (algorithm suppresses distribution)
- **AVD** (Average View Duration) — use for videos >20 min, target >8 min
  for mid-roll ad revenue floor
- **Intro retention at 0:30** — target ≥70% of viewers still watching
- **Retention cliff detection** — any point where retention drops >10% in
  <5 seconds is a structural problem
- **Session watch time contribution** — does this video lead to another view
  on YouTube? Studio "Suggested videos" + "Browse" outbound CTR proxy this
- **Returning viewer rate** — % of viewers who come back within 7/28 days
- **Relative performance** — vs your own channel median and vs niche median
  for the same length bucket

### Tier 2 — Metadata & semantic signals

- **Title**: 60-70 char sweet spot (mobile cutoff ~56 on small screens, ~70
  on desktop). Keyword in first 40 chars for Search; emotional driver first
  for Browse.
- **Description**:
  - **Above-fold (first 150 chars)**: restates title intent, includes
    primary keyword, gives a click-for-more reason
  - **Full body (1,500-4,000 chars)**: semantic entity coverage (see below),
    natural density, not stuffed
  - **Key Moments / chapters**: first timestamp MUST be `0:00`, ≥3 chapters,
    each ≥10s, descriptive labels. Triggers Google Search "Key Moments"
    rich result and `VideoObject.hasPart[].Clip` schema eligibility.
  - **Links block**: grouped, labeled, with FTC disclosure if affiliate
  - **Hashtags**: max 3 meaningful (shown above title); first is strongest
- **Tags**: de-emphasized in 2020 but still used for typo/spelling
  disambiguation and topic classification. 5-15, first = exact keyword,
  total <500 chars.
- **Entity/semantic coverage**: YouTube uses Knowledge Graph entities
  (people, brands, places, concepts). Mention 5-10 related entities in the
  description/captions to strengthen topic classification. Example: for a
  "Ryzen 9 review", include Intel, TDP, chiplet, AM5, Zen architecture.
- **Captions**: manually uploaded `.srt`/`.vtt` outrank auto-captions for
  Search. Translated captions unlock international impressions.
- **Translated metadata**: Custom Channel Translations for top 5 viewer
  languages typically lift international impressions 20-50%.
- **Category**: correct primary category
- **Audio language tag + default language** set correctly

### Tier 3 — Thumbnail / pre-click signals

- **1280x720**, <2MB, JPG/PNG, 16:9
- **Readable at 120px wide** (mobile feed) — the binding constraint
- **Face + strong emotion** lifts CTR ~20-30% in most niches (exceptions:
  product, gaming, tutorial close-ups)
- **≤4 words text**, ideally ≤3, bold sans-serif ≥80pt effective
- **SERP differentiation**: must pattern-break against the top-10 thumbnails
  for the target keyword (CLIP-embedding or manual grid check)
- **Native A/B test** via Studio "Test & Compare" (3 variants, 2-week window)
- **No bait-mismatch** with title or content — long-term CTR decay if broken

### Tier 4 — Engagement & velocity signals

- **Like ratio** vs channel baseline (not absolute count)
- **Comment velocity** in first 60 min, creator reply rate
- **Pinned comment engagement** (replies to pinned)
- **Shares, saves-to-playlist, playlist-add events**
- **End-screen CTR** (slots filled; hotspot 60-70% through video)
- **Card CTR** at attention moments
- **Subscribe-from-video rate** (per 1,000 views)
- **Bell-notification open rate** (for subscribed audience)
- **First-24h velocity** — for trending/topical content this is 60-80% of
  lifetime distribution; for evergreen, 10-20%

### Tier 5 — Channel-level signals

- **Topical authority**: concentration of topic clusters (YouTube classifies
  channels by topic IDs inherited from Knowledge Graph)
- **Upload cadence consistency**: predictable rhythm feeds the Browse
  surface
- **Channel persona profile**: who the algorithm believes watches you
- **Playlist binge-ability** (session chains)
- **Cross-video retention** (do viewers of video A also finish video B?)
- **Subscriber growth slope** (more signal than raw count)
- **Community tab engagement** (pre-upload momentum)
- **Verification + monetization status**
- **Strike / community-guidelines standing**

### Tier 6 — Technical / safety signals

- **Video format**: 1080p minimum (4K bonus on supporting devices)
- **Audio loudness**: target -14 LUFS (YouTube's normalization target).
  Under -16 LUFS feels quiet and correlates with lower retention.
- **Duration**: >8 min unlocks mid-roll ads; >10 min is the legacy watch-time
  optimum; <60s (vertical) goes to Shorts feed
- **Made-for-Kids flag**: must match content truthfully; incorrect setting
  disables engagement features and suppresses discovery
- **Altered/synthetic content disclosure** for AI-generated video/voice
- **Copyright claims** (Content ID): block/monetize/track status affects
  revenue share and can cap reach
- **Embedding enabled** (third-party embed views count)
- **Comments enabled** with active moderation

### Shorts-specific signals

- **First 0.5-1.0s hook** — swipe-away rate here is the #1 metric
- **Loop rate** — the video should end where it starts (narratively or
  visually)
- **Vertical 9:16**, 1080x1920
- **Caption overlay** for silent viewing (most Shorts are watched muted)
- **Audio trend** — use trending audio from the Shorts audio library
  (boost) OR original audio that can be remixed
- **Title**: ≤40 chars, emotional hook front-loaded
- **`#Shorts`** in description or title (no longer required but still
  de-risks classification)
- **Length**: 15-30s has highest loop rate; 45-60s has highest watch time.
  Pick based on goal (discovery vs watch time)

## Data Sources

**First-party only.** These skills deliberately avoid third-party
analytics tools (VidIQ, TubeBuddy, Ahrefs, SocialBlade, NoxInfluencer,
HypeAuditor, etc.) — they rate-limit, change their HTML, or return
errors. Every source below is an official Google/YouTube endpoint, a
local CLI, or data the user provides directly.

Priority order (degrade gracefully from top to bottom):

| Source | Use | How |
|--------|-----|-----|
| **YouTube Data API v3** | Full snippet, tags, statistics, topicDetails, contentDetails, playerCaptions, commentThreads, search, channels, playlistItems | `YOUTUBE_API_KEY` env var + `scripts/fetch_video.py` / `scripts/fetch_channel.py` |
| **YouTube Studio CSV exports** (user-provided) | Real CTR, APV, retention curves, traffic sources, audience, impressions — the only source for Tier 1 signals | Ask user to export from Studio → Analytics → Advanced Mode → download CSV |
| **yt-dlp** | Full metadata, auto + manual captions, chapters, transcript, audio extract, `ytsearch:` SERP, channel playlists — works without an API key | `yt-dlp --dump-json --skip-download URL`, `yt-dlp "ytsearch50:query" --flat-playlist -J` |
| **YouTube suggest API** | Keyword expansion (no key, no rate limit in practice) | `suggestqueries.google.com/complete/search?client=firefox&ds=yt&q={seed}` |
| **Google Trends** (WebFetch) | Trending vs evergreen, seasonality, breakout topics | `trends.google.com/trends/api/explore...` |
| **WebFetch on watch / channel / results page** | Public title, view/like counts, upload date, visible description, SERP results — last resort, structure can change | `youtube.com/results?search_query=...`, `youtube.com/@handle` |
| **Whisper** (local or API) | Transcript fallback when captions unavailable | `whisper --model base --language en` |
| **OpenCV + CLIP** | Face detection, emotion, thumbnail-similarity vs SERP | `scripts/analyze_thumbnail.py` |
| **FFmpeg / loudnorm** | Audio loudness (LUFS), true peak, loudness range | `ffmpeg -i IN -af loudnorm=print_format=json -f null -` |
| **seo-dataforseo MCP** *(OPTIONAL — only if explicitly available and not erroring)* | Extra YouTube SERP positions and volume estimates | `serp_youtube_organic_live_advanced`, `keywords_for_youtube` — skip on any error, do not retry |

### Data Source Matrix (what you need for what)

| Analysis | Minimum data | Ideal data |
|----------|-------------|-----------|
| Metadata score | WebFetch only | API + Studio CSV |
| Retention diagnosis | Studio CSV | Studio CSV + transcript |
| Thumbnail score | Image URL | Image + SERP grid + CLIP embeddings |
| Competitor intel | API + WebFetch | API + yt-dlp transcripts + Studio benchmarks |
| Audio/loudness | yt-dlp audio extract | FFmpeg loudnorm pass |

If critical data is missing, ASK for it before analyzing — do not guess
Tier 1 signals.

## Niche Benchmarks (APV, CTR, like ratio)

Benchmarks vary. When possible, compute live from top-10 SERP for the
target keyword. Use these as fallback medians:

| Niche | CTR (Browse) | APV (long-form) | Like/view ratio |
|-------|-------------|-----------------|-----------------|
| Tech review | 4-8% | 40-50% | 3-5% |
| Gaming | 5-10% | 45-55% | 4-6% |
| Education / how-to | 4-7% | 40-50% | 4-6% |
| Vlog / lifestyle | 3-6% | 35-45% | 3-5% |
| Finance / business | 5-9% | 45-55% | 3-5% |
| Music / entertainment | 6-12% | 50-65% | 5-8% |
| Kids (MFK compliant) | 8-15% | 55-70% | N/A (disabled) |
| Shorts (any) | 8-20% | 80-100%+ (loops) | 5-10% |

If the user's numbers are 1.5x median, recommend scaling (more similar
content); if <0.7x median, recommend structural change.

## Output Conventions (all sub-skills must follow)

1. **Score card** (0-100) with weighted sub-scores
2. **Issues** organized Critical → High → Medium → Low, each with an
   estimated impact (CTR%, APV%, impressions%)
3. **Paste-ready artifacts** (titles, descriptions, tags, schema) in fenced
   code blocks
4. **Rationale block** citing which Tier signal each fix targets
5. **Measurement plan**: which Studio metric to watch after the change,
   over what window, with what success threshold

## Error Handling

Fail loud, degrade gracefully, never fabricate. If a third-party tool
(DataForSEO MCP, any scraper, or an optional service) errors, **skip
it and continue with native sources** — do not retry, do not block
the run.

| Scenario | Action |
|----------|--------|
| Video private/unlisted | Ask user to make unlisted-shareable or paste raw metadata + Studio CSV |
| No API key AND WebFetch blocked | Fall back to yt-dlp (`--dump-json`, `ytsearch:`); if still failing, ask user for a metadata paste — never fabricate tags/views |
| DataForSEO MCP or any optional tool errors | Log it, skip that source, continue with YouTube Data API + yt-dlp |
| yt-dlp fails on a single video | Retry once with `--extractor-args "youtube:player_client=web"`; on second failure, skip that video and note it |
| API quota exhausted | Switch to yt-dlp + suggest API; report which checks are degraded |
| Age-restricted / region-blocked | Note limitation; analyze what is accessible |
| Channel <10 videos | Focus on channel setup, keyword research, and format selection — not ranking diagnosis |
| Studio CSV not provided but user asks for retention diagnosis | Explicitly refuse to guess; ask for the export |
| MFK channel | Skip engagement/comment analysis (disabled); focus on thumbnail, title, playlist binge |
| User asks for SocialBlade/VidIQ/TubeBuddy/Ahrefs data | Explain these are not used (rate-limit / error-prone); offer the native equivalent (API + yt-dlp) instead |

