import { useState } from "react"; const COLORS = { offWhite: "#f5f6f3", sage: "#bfcac4", darkTeal: "#223f3a", forest: "#0b2d25", olive: "#1a2d0b", accent: "#4a8c6f", warn: "#c97a2e", danger: "#a63d2f", success: "#3a7d5c", }; const Badge = ({ type, children }) => { const colors = { green: { bg: "#1a3a2a", color: "#6fcf97", border: "#2a5a3a" }, yellow: { bg: "#3a3020", color: "#f2c94c", border: "#5a4a2a" }, red: { bg: "#3a2020", color: "#eb5757", border: "#5a2a2a" }, blue: { bg: "#1a2a3a", color: "#6fb1cf", border: "#2a3a5a" }, gray: { bg: "#2a2d2a", color: "#9aaa9a", border: "#3a3d3a" }, }; const c = colors[type] || colors.gray; return ( {children} ); }; const Meter = ({ value, max = 10, color = COLORS.accent }) => (
{value}/{max}
); const Section = ({ id, title, subtitle, badge, badgeType, children, defaultOpen = false }) => { const [open, setOpen] = useState(defaultOpen); return (
{open && (
{children}
)}
); }; const SubSection = ({ title, children }) => { const [open, setOpen] = useState(false); return (
{open && (
{children}
)}
); }; const DeepDive = ({ title, children }) => { const [open, setOpen] = useState(false); return (
{open && (
{children}
)}
); }; const P = ({ children, style = {} }) => (

{children}

); const Highlight = ({ children }) => ( {children} ); const Stat = ({ label, value, sub }) => (
{value}
{label}
{sub &&
{sub}
}
); const Table = ({ headers, rows }) => (
{headers.map((h, i) => ( ))} {rows.map((row, i) => ( {row.map((cell, j) => ( ))} ))}
{h}
{cell}
); export default function Proposal() { return (
{/* HEADER */}
IGT Internal Proposal

Live Leaderboard & Monetization

Feasibility study for a real-time creator ranking website with subscription monetization. Built for one operator. No fluff. Every layer is expandable.

{/* VERDICT BOX */}
Executive Verdict

This is buildable, monetizable, and a natural extension of IGT. Your existing Supabase infrastructure does 80% of the heavy lifting. The real constraints are YouTube API quota (manageable with smart batching) and your time during Season 1. The recommended path: scope and design now, build in June/July, launch for Season 2 or mid-Season 1.

{/* SECTION 1: FEASIBILITY */}

Your existing Supabase tables (videos, video_stats, video_daily_stats, creators) already contain everything needed for a live leaderboard. Supabase exposes a REST API out of the box — a frontend can query it directly with zero backend code. The core challenge isn't "can we do this" — it's quota management and scoring design.

What You Have

Supabase DB, REST API, 3x/day pipeline, 134 creators, video-level stats, scoring logic from Season 1

What You Need

Video-level scoring view, backfill script, public website, auth/paywall layer, refresh frequency upgrade

YouTube Data API gives you 10,000 quota units/day. Here's how the math works:

For a creator with 500 videos:

• Get uploads playlist ID: 1 unit (channels.list)

• Paginate uploads: 500 ÷ 50 = 10 units (playlistItems.list)

• Get video stats: 500 ÷ 50 = 10 units (videos.list)

Total: ~21 units per creator. For all 134 creators: ~2,800 units. Easily fits in one day's quota alongside your existing pipeline.

⚠ The expensive part isn't backfill — it's ongoing refresh of ALL historical videos. 134 creators × ~200 avg eligible videos = 26,800 videos. That's 536 units per full refresh (26,800 ÷ 50). You could do this ~15 times/day and stay under quota, even with your existing pipeline.

Estimated daily budget breakdown:

Verdict: You have headroom. Even aggressive refresh schedules use less than half your quota. The "live" label is justified at 4–6 hour refresh intervals.

Let's be real: "live" doesn't mean real-time websockets updating every second. In the YouTube golf creator space, "live" means "fresher than anyone else" — which is a low bar since nobody else is doing this at all.

A 4–6 hour refresh cycle would make your leaderboard feel genuinely live. Videos published at 9am would have scores by 1pm. That's more than enough to feel real-time to your audience.

Standard tier is the sweet spot. Label it "Updated every 4 hours" on the site and nobody will blink.

The leaderboard needs a per-video composite score that makes intuitive sense to fans and rolls up cleanly to a creator total. Here's the recommended approach:

Per-Video Score (0–100 scale):

Creator Aggregate Score:

Sum of top N video scores (recommend top 10) OR rolling 30-day sum. This prevents creators with 500 videos from dominating purely on volume while still rewarding consistent output.

Recency bonus = max(0, 1 - (age_days / 30))

• Day 0 (just published): 1.0 (full bonus)

• Day 15: 0.5 (half bonus)

• Day 30+: 0.0 (no bonus)

This creates natural leaderboard movement without penalizing older videos — they just lose their recency boost. The other 90% of their score remains stable.

Instead of all-time views, score purely on view velocity — views gained in the last 24/48 hours. This makes the leaderboard ultra-dynamic but requires more frequent refreshes and can be noisy. Better as a "Trending Now" widget than the primary leaderboard.

{/* SECTION 2: REVENUE */}

The leaderboard itself isn't the product — access to it is. You have four monetization paths, and they're not mutually exclusive. The smartest play is a free tier that hooks people and a paid tier that delivers depth.

Easiest to launch Lowest ceiling

IG Subscriptions let you gate content behind a monthly fee. At 10K followers, you're eligible. You set the price ($0.99–$99.99/mo) and subscribers get a badge + access to exclusive content (Stories, Lives, Reels, posts).

The play: Post a teaser screenshot of the leaderboard publicly, then gate the full breakdown (top 50, video-level detail, weekly movers) behind the subscription.

• You keep ~70% of revenue (Apple/Google take 30% on mobile)

• Exclusive content types: Stories, Reels, Lives, Posts, Broadcast Channels

• You can't link out to a paywalled website — the exclusive content must live on IG

Limitation: You'd need to post leaderboard screenshots/carousels as exclusive posts. Not a true "live website" experience.

• Best for: Quick monetization test. Run it for 2 months and see if people pay.

Not life-changing money, but it validates demand with zero build cost.

Medium build effort Highest ceiling

Build the leaderboard website with a free tier (top 10, creator names + overall score) and a paid tier ($4.99–$9.99/mo) that unlocks full rankings, video-level detail, historical trends, and creator comparison tools.

This is the real play. You own the platform, keep ~97% of revenue (Stripe fees only), and build an asset that compounds.

The "dream" scenario isn't unrealistic at scale — fantasy sports apps charge $10+/mo for less interesting data. But getting there requires audience growth beyond 10K.

Zero build cost Relationship-dependent

Sell sponsorships on the leaderboard page itself. "This week's leaderboard powered by [Brand]" or "Creator Spotlight presented by [Brand]." Golf brands (Yippy, etc.) would pay for association with creator performance data.

• Leaderboard page sponsor (monthly): $200–$500/mo at current scale

• Category sponsor (e.g., "Engagement Leader brought to you by..."): $100–$250/mo

• Bundle with IG content sponsorship for premium pricing

• Revenue scales directly with traffic — revisit pricing at 50K, 100K monthly visitors

Long-term play Requires traction first

Charge creators themselves for enhanced profiles on the leaderboard — verified badges, pinned videos, analytics dashboards. Think LinkedIn Premium but for YouTube golf creators.

This only works once the leaderboard has audience credibility. Phase 3+ idea.

{/* SECTION 3: TECHNICAL REQUIREMENTS */}

The entire build is modular — each piece works independently and layers on. You don't need to build everything at once.

Build first ~2–3 hours with Claude

A new Supabase SQL view that calculates a composite score for every eligible video. This is the foundation — everything else reads from it.

• Create view video_leaderboard_scores in Supabase

• Joins: videos → video_stats → creators

• Filters: duration ≥ 600s, not taken down, not excluded, creator is active + eligible

• Computes PERCENT_RANK for volume/engagement/reach

• Adds recency decay based on published_at

• Outputs: video_id, creator canonical_name, score, component scores, published_at, views_live, engagement_rate

Dependencies: None new. Uses existing tables.

Build second ~1 hour with Claude

Rolls up video scores to creator level. Top 10 video scores summed per creator, ranked.

• Create view creator_leaderboard

• Uses LATERAL join or window function to get top 10 scoring videos per creator

• Outputs: creator canonical_name, total_score, avg_score, video_count, top_video_title, rank

This view IS the leaderboard. Everything downstream just displays it.

Build when ready ~4–6 hours with Claude

A new function in IGT_Supabase.gs (or a companion script) that takes a creator's channel_id, pulls their full video catalog, and inserts into your existing tables.

Core function: backfillCreator(channelId)

1. channels.list → get uploads playlist ID

2. Loop playlistItems.list (paginated) → collect all video IDs

3. Filter by duration ≥ 600s (need video details for this)

4. Batch videos.list (50/call) → get snippet + statistics + contentDetails

5. Upsert into videos table + video_stats table

6. Log to pipeline_runs

Creator-level control:

• Add column backfill_status to creators table (values: null, pending, in_progress, complete)

• Script checks: only process creators where backfill_status = 'pending'

• You set backfill_status = 'pending' for any creator you want backfilled

• Script processes one creator per run to stay within quota

Quota safety:

• Track units consumed per run

• Hard stop at 3,000 units per backfill run (leaves 7K for regular pipeline)

• Large creators (1000+ videos) auto-span across multiple days

Build when scored ~8–12 hours with Claude

A static website (HTML/CSS/JS or Next.js) hosted for free on Vercel/Netlify. Queries Supabase REST API directly. No backend server needed.

Option A (Simpler): Static HTML + Supabase JS Client

• Single HTML file with vanilla JS

• Supabase anon key for read-only public access (Row Level Security)

• Host on Netlify (free) or at internetgolftour.com

• Pros: Dead simple, you can understand every line

• Cons: Harder to add auth/paywall later

Option B (Recommended): Next.js + Supabase

• React-based, component-driven

• Supabase Auth for login + subscription management

• Stripe integration for payments (well-documented)

• Vercel free tier hosting

• Pros: Scales to paid features, looks professional

• Cons: More moving parts (but Claude handles the code)

• Enable Row Level Security (RLS) on all tables

• Create a policy: allow SELECT for anon role on leaderboard views only

• Raw data tables (video_daily_stats, etc.) stay locked

• The anon key is safe to expose in frontend code — RLS protects the data

• Paid tier: users log in via Supabase Auth → different RLS policies unlock more data

Build last ~6–8 hours with Claude

Supabase Auth + Stripe Checkout. Only needed if pursuing Path B (website subscription).

• Supabase Auth handles email/password and magic link login

• Stripe Checkout handles payment (no PCI compliance needed on your end)

• Webhook from Stripe → Supabase Edge Function → sets user role to "subscriber"

• RLS policy: subscriber role can access full leaderboard data

• Free users see top 10 only (filtered by view/function)

{/* SECTION 4: TIMELINE */}

Assumes solo operator + Claude, working ~5–8 hours/week on this alongside Season 1 content duties. Each phase is independently valuable — you can stop after any phase and have something useful.

Total: ~28–38 hours of working sessions with Claude over 6–8 weeks. Phase 0 can happen today without touching Season 1 deadlines.

Phase 0 is pure SQL — creating views in Supabase. It doesn't touch your pipeline, doesn't change any existing tables, and takes a single working session. You'd literally just be adding a new "lens" on data you already have. If you want to log this idea AND make progress, Phase 0 is the move.

{/* SECTION 5: SUCCESS vs FAILURE */}

What makes this succeed:

{[ ["First-mover advantage", 9, "Nobody else has this data infrastructure in YouTube golf"], ["Existing demand signal", 8, "A creator literally DM'd you asking for this"], ["Infrastructure readiness", 8, "Supabase + pipeline already built"], ["Low marginal cost", 9, "Hosting is free, API quota has headroom"], ["Content flywheel", 8, "Leaderboard drives IG content, IG drives leaderboard traffic"], ].map(([label, val, note], i) => (
{label}
{note}
))}
{[ ["Distraction from Season 1", 6, COLORS.warn, "Mitigated by modular phasing — Phase 0 is safe, Phase 2+ waits"], ["Low subscription conversion", 5, COLORS.warn, "Mitigated by free tier + IG subs as low-cost test"], ["YouTube API quota changes", 3, "#6fb1cf", "Unlikely short-term; Google rarely reduces quotas"], ["Maintenance burden", 5, COLORS.warn, "Mitigated by SQL views (auto-updating) vs. manual scripts"], ["Creator backlash to rankings", 4, "#6fb1cf", "Mitigated by transparent methodology + existing brand trust"], ].map(([label, val, color, note], i) => (
{label}
{note}
))}
{/* SECTION 6: MAJOR CONSIDERATIONS */}

You said it yourself — don't get distracted. The beauty of this proposal is that Phase 0 (scoring views) is purely additive and takes one afternoon. Everything else queues behind Season 1 milestones. The leaderboard is a Season 2 feature that you happen to design during Season 1.

Recommended guardrail: No Phase 2+ work until Week 4 of Season 1 (May 25+) at the earliest. Your first scored Scorecard (May 18) and Season Standings (May 19) must ship clean before you touch the website.

Start with IG Subscriptions. Here's why: zero build cost, instant validation, and you learn if people will pay for leaderboard access before investing 20+ hours in a website paywall.

Run IG subs for 6–8 weeks. If you get 50+ subscribers at $2.99, that's your green light to build the website with a paid tier. If you get 5 subscribers, you still build the website but keep it free and monetize via sponsorships instead.

You do NOT need to backfill all 134 creators on day one. Start with the top 20–30 most-followed creators. These are the ones fans care about and the ones that make the leaderboard interesting. Expand from there based on demand.

The creator-level control (backfill_status flag) means you literally just flip a switch per creator. Process 2–3 per day. Full roster backfilled in 2 weeks with zero quota stress.

Charging for a service that ranks creators using their public YouTube data is legally fine — YouTube's API Terms of Service allow displaying data from public videos. But before you charge money, you should have your LLC formed and Terms of Service on the website. These were already flagged as priority legal steps.

The DM you got is one signal. But the broader "why now" is that YouTube golf is becoming competitive enough that creators want scorecards. You're building the stat sheet for a sport that doesn't know it's a sport yet. The leaderboard makes that real.

{/* RECOMMENDATION */}
Recommended Next Steps
{[ ["Today", "Log this proposal. File it. Done. Back to Season 1."], ["This weekend", "Build Phase 0 scoring views in a working session (3 hrs). Zero risk to anything."], ["May 18–19", "Ship first scored Scorecard + Season Standings. Season 1 milestone #1."], ["Late May", "Test IG Subscriptions with leaderboard teaser content (Path A validation)."], ["June", "Build backfill script (Phase 1) + public website free tier (Phase 2)."], ["July", "Evaluate: if IG subs validate, add website paywall. If not, go sponsorship route."], ].map(([when, what], i) => (
{when}

{what}

))}

This proposal is a living document. Every section can be drilled into further. When you're ready to build any module, say the word and we'll scope the exact working session. For now — file it, protect Season 1, and know the path is clear when you're ready.

); }