TubeGap User Guide
How it works
TubeGap finds what your buyers search for on YouTube and shows which of those searches have weak or missing videos, so you know what to make next. One run goes:
- Seeds: you type the problems your buyers have, in their words.
- Expand: YouTube autocomplete turns each seed into the real searches people type. Free, about 10 seconds per seed.
- Cluster: near-duplicate searches are grouped, one video per cluster.
- Score: each cluster's top 10 YouTube videos are looked up and rated 0–100. Uses about 102 of your 10,000 daily quota units per cluster.
- Pick and publish: you choose the best clusters and make one video for each.
Expanding is free and unlimited; scoring is limited to about 95 clusters a day.
One-time setup
Do these once; after that, just start both apps.
- Create the tables: run
TubeGap.UpdateDbonce. - Get a YouTube API key: in Google Cloud Console, create a project, enable YouTube Data API v3, then Credentials > Create credentials > API key. Restrict the key to YouTube Data API v3.
- Store the key: right-click
TubeGap.Api> Manage User Secrets, and set"YouTube": { "ApiKey": "your-key" }. KeepApiKeyempty inappsettings.json. - Point Blazor at the API:
GlobalPublicVars.APIUrlinTubeGap.Sharedmust match the API's port, ending in/api/. - Run both apps: right-click the solution > Configure Startup Projects > Multiple startup projects, set
TubeGap.ApiandTubeGap.Blazorto Start.
The API opens Swagger at /swagger; the app opens in a second browser tab. The top bar shows today's YouTube quota.
Creating a project
Make one project per product or niche, and one YouTube channel per niche. Go to Projects > New project; the defaults work for a first run. Change settings later with Settings on the project page.
| Setting | What it does | Default |
|---|---|---|
| Language / Region | Language and country of suggestions and results | en / US |
| Prefixes | Words put before each seed ("how to" + seed) | how to, best, what is, why |
| Suffixes | Words put after each seed (seed + "app") | for, vs, app, software, free, checklist, tutorial, tips |
| Exclude words | Drops any phrase containing these words | none |
| Alphabet soup | Also queries seed + a to z | on |
| Must share a seed word | Drops phrases with no word from the seed | on |
| Min words | Drops phrases shorter than this | 2 |
| Cluster similarity % | Word overlap needed to share a cluster | 60 |
| Rescore after (days) | When a score counts as stale | 30 |
| Small channel under (subs) | Cutoff for a "small" channel | 10,000 |
| Score weights | How much each factor counts (scaled to 100) | 35 / 15 / 25 / 10 / 15 |
Prefixes, suffixes and exclude words are one per line. For finding clients, add question prefixes: how do i, can i, should i, do i need, how much.
Seeds and expanding
A good seed is a problem your buyer types before they know your product exists. Start with 5 to 10.
- Use their words, not yours: "salon no shows", not your product's feature name.
- Problems beat product categories: "booth rent collection" finds questions; "salon software" finds brand comparisons.
- Ask your salesperson and support person for the 20 questions they hear most; those make the best seeds.
On the project's Seeds tab, paste seeds one per line and click Add seeds (duplicates are skipped). Then:
- Expand all seeds re-runs every seed. Use it after changing prefixes, suffixes or exclude words.
- Expand new seeds only runs seeds never expanded.
- Stop after this seed ends a run early.
Each seed takes about 10 seconds. When the run finishes, clusters rebuild and the page moves to the Report tab. Re-expanding updates phrases in place, never duplicates them.
Phrases and clusters
Skim the Phrases tab after each expand; two minutes here saves quota later. It lists every phrase with its hits, best rank, cluster and seed.
Hits is how many of TubeGap's autocomplete queries returned the phrase. It ranks phrases against each other within a project; it is not searches per month.
Clusters group phrases that share most of their meaningful words. Filler words (how, to, best, for) and years are ignored, and endings are trimmed, so "apps" matches "app". The most-searched phrase leads each cluster and is your video's target title.
| What you see | Fix in Settings | Then |
|---|---|---|
| Off-topic phrases (other industries, jobs) | Add the words to Exclude words | Expand all seeds |
| Near-duplicates in separate clusters | Lower Cluster similarity % (try 40) | Expand any seed |
| Unrelated phrases in one cluster | Raise Cluster similarity % (try 75) | Expand any seed |
Matching is by words only: "booking" and "scheduling" stay in separate clusters.
Scoring and quota
You can score about 95 clusters a day: each lookup uses about 102 of the 10,000 daily YouTube units, which reset at midnight Pacific.
- Score top N (Report tab) scores the most-searched unscored clusters first. Start with 5 to 10.
- Also rescore results older than N days re-checks stale scores in the same run.
- The chart icon on a row scores just that cluster.
- Stop after this one ends a run early.
A run is capped to the quota left and stops if YouTube reports the quota used up. The top-bar badge shows today's usage. The report uses the latest lookup per cluster.
Reading the report
Sort by Score, then expand rows to judge for yourself. Unscored rows show only Hits and Phrases until looked up.
| Column | Meaning | Good sign |
|---|---|---|
| Score | Overall opportunity, 0–100 (weighted mix of the five factors below) | 60+ green, 40–59 yellow |
| Target phrase | Most-searched phrase in the cluster; use it as the title | — |
| Hits | Autocomplete results across the cluster (relative, not volume) | Higher |
| Phrases | Similar phrases one video should cover | — |
| Views/mo | Median of each top video's lifetime views ÷ its age in months | Hundreds or more |
| Title match | Share of top 10 titles containing the phrase | Low: nobody targets it |
| Age (mo) | Median age of the top 10 videos | High: stale results |
| Small ch. | Share of top 10 from channels under 10k subscribers | High: a new channel can rank |
| Top video now | The video currently ranking first | — |
Default weights: Demand (views/mo) 35, Title gap 25, Autocomplete 15, Small channels 15, Age 10. No videos – open gap means people search it and nothing answers it; in a niche these are often the quickest wins.
Expanding a row shows its similar phrases and the 10 competing videos with channel, subscribers, views and publish date.
Picking topics and making videos
Pick clusters with a high score, a searcher who is your buyer, and competing videos you can clearly beat. The score can't judge the last two; you do.
- Skip mismatched searchers: a high score on a homeowner question is no use if you sell to businesses.
- Favor questions: aim for about 70% question-answering videos and 30% demos or comparisons.
- In tiny niches, views/mo is near zero everywhere; lean on hits, title match and open gaps.
For each video:
- Use the target phrase as the title, or close to it.
- Say the phrase in the first 15 seconds and put it in the description.
- Answer the question honestly in the first minute or two.
- Show how your product handles it.
- End with one call to action: a free trial link in the description and a pinned comment.
- Cover the cluster's similar phrases in the script and description.
Keep videos to 3–6 minutes. Start at 2–3 a week and move to 5 once quality holds; watch average view duration in YouTube Studio. After 4–6 weeks, add the search terms from YouTube Studio as new seeds.
Troubleshooting
| Problem | Likely cause | Fix |
|---|---|---|
| Expand finds 0 phrases | Autocomplete blocked or failing | Check the API's console output; try again later |
| Score returns a failure | Bad API key, or YouTube Data API v3 not enabled | Check user secrets and the Cloud Console |
| "Daily quota used up" | 10,000 units spent | Wait until midnight Pacific |
| Pages show no data | Blazor can't reach the API | Run both apps; check the GlobalPublicVars.APIUrl port |
| "Unhandled exception" in the browser | A component error | Set "DetailedErrors": true in Blazor's appsettings, restart, check the browser console |
| No Swagger page | Browser not opening /swagger | launchBrowser: true and launchUrl: "swagger" in launchSettings.json |
| Old layout or menu after a change | File not saved, or hot reload missed it | File > Save All, stop and restart, Ctrl+F5 |