Zuschauer-Monetarisierung

MOC - Map of Content

Überblick: Wie monetarisieren wir Zuschauer?

Der Tournament wird der erste Ort sein, wo Breakout direkt von Zuschauern (nicht Artists oder Creators) Geld verdient. Das ist essentiell, weil:

  1. Artists + Creators haben begrenzte Budgets. Wenn nur die zwei Gruppen zahlen, sind Einnahmen begrenzt.
  2. Zuschauer sind eine riesige Gruppe. Ein Tournament mit 2.000 Zuschauern, even 1% zahlen, = 20 Menschen.
  3. "Vote with your wallet" ist psychologisch mächtig. Fans wollen ihre Lieblingsartists unterstützen.

Aber: Kritisch ist, dass wir den Tournament nicht hinter eine Paywall stellen. Free Access = größeres Publikum = bessere Einnahmen durch optional tipping.


1. Donation / Tipping System (Core Viewer Monetization)

Konzept: "Support Your Artist"

Während der Tournament-Übertragung können Zuschauer ihre Lieblingsartists mit direkten Spenden unterstützen. Dies ist live, in real-time, gamified.

Technical Architecture (Supabase Realtime)

Flow:
1. Viewer clicks "Tip [Artist]" button on stream page
2. Stripe Payment Intent created (via Netlify Function)
3. Viewer sees popup with amount choices:
   ├─ 1€ ("Applause")
   ├─ 5€ ("Support")
   ├─ 25€ ("VIP")
   ├─ 100€+ (Custom)
4. Payment processed in real-time
5. Supabase Realtime broadcast:
   ├─ Donation-Wall updated (live leaderboard)
   ├─ Artist sees notification
   ├─ Streamer announces "Donation incoming!"
6. Artist receives split (60%), Judge receives (20%), Platform (20%)

Tiering & Gamification

Tier Price Effect Duration Rarity
Applause 1€ Digital confetti animation 5 seconds Common
Support 5€ Username badge on donation-wall 1 minute Frequent
VIP Supporter 25€ Highlighted badge + 1 shout-out from artist 1 song (~3min) Moderate
Platinum 100€ Name read aloud by streamer + highlight on screen 1 hour Rare

User Experience: Why People Donate

Psychological Triggers:

  1. Social Proof: "Others are donating" — donation-wall shows real-time activity
  2. Reciprocity: Artist notices donor, shout-out happens → fan feels special
  3. Competition: Multiple fans donate; leaderboard creates "I want to top that"
  4. Fandom: "I believe in this artist; I'm supporting them directly"
  5. Low Friction: 1€ is not scary; easy to try

Expected Conversion Rates

Based on Twitch (gaming) and YouTube (music):

For Breakout Tournament:

Scenario 1: 500 viewers
├─ 2% conversion = 10 donors
├─ Avg spend = 10€ = 100€ total
├─ Split: 60€ (artist), 20€ (judge), 20€ (platform)

Scenario 2: 2,000 viewers
├─ 2.5% conversion = 50 donors
├─ Avg spend = 10€ = 500€ total
├─ Split: 300€ (artist), 100€ (judge), 100€ (platform)

Scenario 3: 5,000 viewers
├─ 3% conversion = 150 donors
├─ Avg spend = 12€ = 1,800€ total
├─ Split: 1,080€ (artist), 360€ (judge), 360€ (platform)

Platform Revenue Expectation: 100-300€ per tournament (20% of donations)

Technical Implementation

Netlify Function: processStreamDonation

// processDonation.ts
exports.handler = async (event) => {
  const { tournamentId, artistId, judgeId, amount } = JSON.parse(event.body)

  // 1. Create Stripe Payment Intent
  const paymentIntent = await stripe.paymentIntents.create({
    amount: amount * 100, // cents
    currency: 'eur',
    metadata: {
      tournamentId,
      artistId,
      judgeId,
      type: 'stream_donation'
    }
  })

  // 2. Store in Supabase
  const { data } = await supabase
    .from('stream_donations')
    .insert({
      tournament_id: tournamentId,
      artist_id: artistId,
      judge_id: judgeId,
      amount: amount,
      status: 'pending',
      stripe_intent_id: paymentIntent.id
    })

  // 3. Return client secret
  return {
    statusCode: 200,
    body: JSON.stringify({
      clientSecret: paymentIntent.client_secret
    })
  }
}

Supabase Realtime Broadcast (Frontend)

// Components/DonationWall.tsx
useEffect(() => {
  const donations = supabase
    .from('stream_donations')
    .on('INSERT', (payload) => {
      // Real-time update: show new donation on wall
      addDonationToWall(payload.new)
      broadcastNotification(`${donor} donated ${amount}€ to ${artist}!`)
    })
    .subscribe()

  return () => donations.unsubscribe()
}, [tournamentId])

Risks & Mitigation

Risk 1: Fraud / Chargebacks

Risk 2: Over-Donation (Bots/Spammers)

Risk 3: "Fake Hype" (Platform artificially inflates donations)


2. Viewer Entry Submissions (Premium Feature)

Concept: "Vote on Stage"

Viewers without music production skills can still participate by submitting song choices or artist picks for consideration in the tournament.

How It Works

Viewer Submission Flow:
1. Open tournament page
2. Click "Submit Artist for Voting" button
3. Choose up to 5 artists from existing entries
4. Pay 5-50€ tier to "vote" (different from watching)
5. Their votes are visible (e.g., "Supported by [Name]")
6. Winner of most viewer votes wins "Audience Favorite" award

Pricing & Tiers

Tier Price Submissions Bonus
Casual Voter Free Can view results only N/A
Bronze Voter 5€ Vote for 1 artist Bronze badge
Silver Voter 15€ Vote for 3 artists Silver badge + shout-out
Gold Voter 50€ Vote for 5 artists + advisory Gold badge + interview

Expected Adoption

Expected Platform Revenue: 480€ per tournament

Why Viewers Pay

  1. Exclusivity: "I helped pick the winner" is cool
  2. Ownership: Voting creates sense of participation
  3. Community: Leaderboard shows other voters (social proof)
  4. Prize upside: If their choice wins, they feel victory

3. Virtual Goods & Cosmetics (Future Expansion)

Concept: Support Without Direct Money-Gift

Viewers buy cosmetic items (emotes, effects, badges) that appear during stream. Money goes 50% to artist, 50% platform.

Examples (for Month 3+)

Item Price Use
Artist Emote 2€ Use in stream chat
Supporter Badge 5€ Show on profile permanently
Custom Alert Animation 10€ When you donate, custom effect plays
Shout-out Frame 3€ Your name frames the artist's video

Expected Adoption: Very low initially (maybe 50€/tournament), but good for monetization diversity later.


4. Ad Revenue from Stream Hosting (Future)

Concept: Sponsor the Stream

Breakout can earn ad revenue if tournament is streamed on Twitch/YouTube.

How It Works

Tournament hosted on Twitch:
├─ Pre-roll ads (viewers watch 5-30 sec before tournament starts)
├─ Mid-roll ads (ad break after each judge announces a decision)
├─ Chat sponsorships (Twitch advertises products in sidebar)
└─ Bits/Channel Points (Twitch takes 50%, streamer gets 50%)

Platform (Breakout) gets:
├─ Revenue share from Twitch (if Breakout is channel owner)
├─ Or: Sponsored by brands (2,000€ to promote product during tournament)

Expected Ad Revenue

Expected Platform Revenue: 50-100€ per tournament (low, not primary focus)

Why Focus on Donations Instead

Ad revenue requires:

Donations are better because:


5. Tournament Entry Submissions (Viewer-As-Artist)

Concept: "Entry Pass" for Non-Artists

Some viewers are closet producers/singers and want to participate. We can charge a premium for this.

How It Works

Viewer clicks "I want to compete!"
↓
Chooses "Entry Pass" option (not standard artist submission)
↓
Payment: 20-50€ (more expensive than artist entry at 19,99€)
↓
Same rules: submit song, compete in tournament
↓
But: flagged as "Viewer Entry" so judges know

Why Charge More?

  1. Lower quality expected: Viewer entries might be hobby-grade
  2. Curation: We need to accept/reject viewer entries (artist entries auto-accepted)
  3. Separation of tiers: Don't want all entries to be hobby-grade
  4. Revenue: Viewer engagement = willingness to pay premium

Expected Adoption


Critical Principle: Tournament Must Be FREE to Watch

Why Not Paywall?

Arguments FOR Paywall

Arguments AGAINST (WINNING)

Math: Free vs Paid

Scenario A: Paywall Tournament (25€)

1,000 viewers convert to 5% = 50 paying
50 × 25€ = 1,250€ direct revenue
But: Sponsorship value drops 70% (smaller audience = less attractive)
Net revenue: 1,250€ + 0€ sponsors = 1,250€

Scenario B: Free Tournament

2,000-5,000 viewers (4-5x more)
2% donate avg 10€ = 40-100 donors
40-100 × 10€ = 400-1,000€ donations
Sponsorship value: 2,000+ viewers = attractive to sponsors = 5,000€
Net revenue: 500€ donations + 5,000€ sponsors = 5,500€

Winner: Free tournament, monetize donations + sponsorships


Viewer Monetization Roadmap

Tournament 1 (Month 2)

Feature Status Revenue Expected
Donation System ✅ MVP 100-300€
Voter Submissions ❌ Not ready 0€
Virtual Goods ❌ Not ready 0€
Ad Revenue ❌ Not ready 0€
Total Expected 100-300€

Tournament 2-4 (Month 3-5)

Feature Status Revenue Expected
Donation System ✅ Optimized 300-500€
Voter Submissions ✅ Full Launch 500-1,000€
Virtual Goods ✅ MVP 50-100€
Ad Revenue ❌ Pending 0€
Total Expected 850-1,600€

Tournament 5+ (Month 6+)

Feature Status Revenue Expected
Donation System ✅ Optimized 500-1,000€
Voter Submissions ✅ Scaled 1,000-2,000€
Virtual Goods ✅ Expanded 200-500€
Ad Revenue ✅ Full Launch 200-500€
Total Expected 1,900-4,000€

Technical Spec: Donation Flow (Detailed)

Database Schema (Supabase)

CREATE TABLE stream_donations (
  id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
  tournament_id UUID NOT NULL REFERENCES tournaments(id),
  artist_id UUID NOT NULL REFERENCES artists(id),
  judge_id UUID NOT NULL REFERENCES creators(id),
  donor_id UUID REFERENCES auth.users(id), -- can be anonymous
  amount DECIMAL(10, 2) NOT NULL,
  donor_name VARCHAR(100),
  donor_email VARCHAR(255),
  status VARCHAR(20) DEFAULT 'pending', -- pending, completed, failed
  stripe_intent_id VARCHAR(255),
  created_at TIMESTAMP DEFAULT NOW(),
  updated_at TIMESTAMP DEFAULT NOW()
);

CREATE INDEX idx_tournament_donations ON stream_donations(tournament_id);
CREATE INDEX idx_artist_donations ON stream_donations(artist_id);
CREATE INDEX idx_status ON stream_donations(status);

Payment Intent Webhook (stripeWebhook)

// stripeWebhook handles payment_intent.succeeded
exports.handler = async (event) => {
  const sig = event.headers['stripe-signature']
  const webhookEvent = stripe.webhooks.constructEvent(
    event.body,
    sig,
    process.env.STRIPE_WEBHOOK_SECRET
  )

  if (webhookEvent.type === 'payment_intent.succeeded') {
    const paymentIntent = webhookEvent.data.object
    const { tournamentId, artistId, judgeId } = paymentIntent.metadata

    // Calculate splits (60/20/20)
    const artistShare = paymentIntent.amount * 0.60
    const judgeShare = paymentIntent.amount * 0.20
    const platformShare = paymentIntent.amount * 0.20

    // Update donation status
    await supabase
      .from('stream_donations')
      .update({ status: 'completed' })
      .eq('stripe_intent_id', paymentIntent.id)

    // Log splits for accounting
    await supabase.from('payment_splits').insert({
      donation_id: paymentIntent.metadata.donationId,
      artist_payout: artistShare,
      judge_payout: judgeShare,
      platform_revenue: platformShare
    })

    // Optional: Trigger notification to artist
    await notifyArtist(artistId, `Donation received: ${artistShare}€`)
  }

  return { statusCode: 200, body: 'received' }
}

Real-Time Broadcasting (Frontend)

// Broadcast to all tournament viewers that a donation happened
const broadcastDonation = (donation: Donation) => {
  supabase
    .from('stream_donations')
    .on('INSERT', (payload) => {
      const newDonation = payload.new
      // Update donation wall
      setDonations(prev => [newDonation, ...prev])
      // Trigger visual effect (confetti, sound, etc.)
      triggerDonationEffect(newDonation.tier)
      // Announce to streamer
      notifyStreamer(`${newDonation.donor_name} tipped ${newDonation.amount}€!`)
    })
    .subscribe()
}

Conversion Optimization: How to Increase Donations

A/B Tests (Month 2-3)

  1. Donation Button Placement

    • Test 1: Top-right corner (always visible)
    • Test 2: Bottom-left (non-obtrusive)
    • Test 3: Follow cursor (intrusive, probably bad)
    • Measure: Click-through rate, conversion rate
  2. Messaging

    • Test 1: "Support Your Artist"
    • Test 2: "Vote with Your Wallet"
    • Test 3: "Help [Artist] Win"
    • Measure: CTR, conversion, average spend
  3. Price Anchoring

    • Test 1: Default 5€ suggested
    • Test 2: Default 10€ suggested
    • Test 3: Tiered (1€ / 5€ / 25€ / 100€)
    • Measure: Average revenue per donor
  4. Social Proof

    • Test 1: Live donation-wall (shows recent donors)
    • Test 2: Leaderboard (shows top donors, real-time ranking)
    • Test 3: Artist acknowledgment ("Thanks to [Donor]!")
    • Measure: Repeat donation rate, donor lifetime value

Expected Uplift


Verweise