# YouTube Operations Hub - Konzeptübersicht ## 1. Übersicht Der YouTube Operations Hub ist ein integriertes Modul im Payload CMS zur Verwaltung von YouTube-Kanälen, Video-Content, Aufgaben und Team-Workflows. Er wurde speziell für Multi-Channel-Betreiber entwickelt, die mehrere YouTube-Kanäle professionell managen. ### Hauptfunktionen - **Kanalverwaltung**: Mehrere YouTube-Kanäle mit Branding und Metriken - **Content-Pipeline**: Video-Workflow von Idee bis Veröffentlichung - **Task-Management**: Aufgabenzuweisung und -verfolgung - **Benachrichtigungen**: Systemweite Notifications für Team-Mitglieder - **Rollenbasierter Zugriff**: Feingranulare Berechtigungen --- ## 2. Datenmodell ### 2.1 Collections ``` ┌─────────────────────┐ ┌─────────────────────┐ │ YouTube Channels │────<│ YouTube Content │ │ (youtube-channels) │ │ (youtube-content) │ └─────────────────────┘ └─────────────────────┘ │ │ │ │ ▼ ▼ ┌─────────────────────┐ ┌─────────────────────┐ │ YT Tasks │────<│ YT Notifications │ │ (yt-tasks) │ │ (yt-notifications) │ └─────────────────────┘ └─────────────────────┘ │ ▼ ┌─────────────────────┐ │ Users │ │ (mit youtubeRole) │ └─────────────────────┘ ``` ### 2.2 YouTube Channels (`youtube-channels`) Verwaltet YouTube-Kanäle mit allen relevanten Metadaten. | Feld | Typ | Beschreibung | |------|-----|--------------| | `name` | text (lokalisiert) | Kanalname (z.B. "BlogWoman by Caroline Porwoll") | | `slug` | text (unique) | Interner Kurzname (z.B. "blogwoman") | | `youtubeChannelId` | text | YouTube Channel ID (UCxxxxx) | | `youtubeHandle` | text | YouTube Handle (@blogwoman) | | `language` | select | Sprache: `de`, `en` | | `category` | select | Kategorie: `lifestyle`, `corporate`, `b2b` | | `status` | select | Status: `active`, `planned`, `paused`, `archived` | **Branding-Gruppe:** | Feld | Typ | Beschreibung | |------|-----|--------------| | `branding.primaryColor` | text | Primärfarbe (Hex, z.B. #1278B3) | | `branding.secondaryColor` | text | Sekundärfarbe (Hex) | | `branding.logo` | upload (media) | Kanal-Logo | | `branding.thumbnailTemplate` | upload (media) | Thumbnail-Vorlage | **Content-Serien (Array):** | Feld | Typ | Beschreibung | |------|-----|--------------| | `contentSeries[].name` | text (lokalisiert) | Serienname | | `contentSeries[].slug` | text | Serien-Slug | | `contentSeries[].description` | textarea (lokalisiert) | Beschreibung | | `contentSeries[].color` | text | Farbe für UI | | `contentSeries[].isActive` | checkbox | Aktiv-Status | **Veröffentlichungsplan:** | Feld | Typ | Beschreibung | |------|-----|--------------| | `publishingSchedule.defaultDays` | select (hasMany) | Standard-Veröffentlichungstage | | `publishingSchedule.defaultTime` | text | Standard-Uhrzeit | | `publishingSchedule.shortsPerWeek` | number | Shorts pro Woche (Default: 4) | | `publishingSchedule.longformPerWeek` | number | Longform pro Woche (Default: 1) | **Metriken (via YouTube API):** | Feld | Typ | Beschreibung | |------|-----|--------------| | `currentMetrics.subscriberCount` | number | Abonnenten | | `currentMetrics.totalViews` | number | Gesamtaufrufe | | `currentMetrics.videoCount` | number | Anzahl Videos | | `currentMetrics.lastSyncedAt` | date | Letzter Sync | ### 2.3 YouTube Content (`youtube-content`) Verwaltet einzelne Videos durch den gesamten Produktionsprozess. | Feld | Typ | Beschreibung | |------|-----|--------------| | `title` | text (lokalisiert) | Video-Titel | | `slug` | text | URL-Slug | | `channel` | relationship | Zugehöriger Kanal | | `contentSeries` | text | Content-Serie | | `format` | select | Format: `short`, `longform`, `premiere` | | `status` | select | Status (siehe Status-Workflow) | | `priority` | select | Priorität: `urgent`, `high`, `normal`, `low` | | `assignedTo` | relationship (users) | Zuständige Person | | `createdBy` | relationship (users) | Ersteller | **Status-Workflow:** ``` idea → script_draft → script_review → script_approved → shoot_scheduled → shot → rough_cut → fine_cut → final_review → approved → upload_scheduled → published → tracked ↓ discarded ``` **Script-Felder:** | Feld | Typ | Beschreibung | |------|-----|--------------| | `description` | textarea (lokalisiert) | Beschreibung | | `hook` | text (lokalisiert) | Hook/Einstieg | | `keyPoints[]` | array (lokalisiert) | Kernpunkte | | `callToAction` | text (lokalisiert) | Call-to-Action | | `scriptContent` | richText (lokalisiert) | Vollständiges Script | | `scriptUrl` | text | Link zu externem Script | **Zeitplanung:** | Feld | Typ | Beschreibung | |------|-----|--------------| | `shootDate` | date | Drehdatum | | `editDeadline` | date | Schnitt-Deadline | | `reviewDeadline` | date | Review-Deadline | | `scheduledPublishDate` | date | Geplante Veröffentlichung | | `actualPublishDate` | date | Tatsächliche Veröffentlichung | **Medien:** | Feld | Typ | Beschreibung | |------|-----|--------------| | `thumbnail` | upload (media) | Haupt-Thumbnail | | `thumbnailAlt` | upload (media) | Alternatives Thumbnail | | `videoFile` | upload (media) | Video-Datei | | `rawFootage[]` | array | Rohmaterial | **Freigaben:** | Freigabe | Felder | |----------|--------| | Script Approval | `approved`, `approvedBy`, `approvedAt`, `notes` | | Medical Approval | `required`, `approved`, `approvedBy`, `approvedAt`, `notes` | | Legal Approval | `approved`, `approvedBy`, `approvedAt`, `notes`, `disclaimerIncluded` | | Final Approval | `approved`, `approvedBy`, `approvedAt`, `notes` | **YouTube-Metadaten:** | Feld | Typ | Beschreibung | |------|-----|--------------| | `youtubeVideoId` | text | YouTube Video ID | | `youtubeUrl` | text | YouTube URL | | `youtubeMetadata.youtubeTitle` | text (lokalisiert) | YouTube-Titel | | `youtubeMetadata.youtubeDescription` | textarea (lokalisiert) | YouTube-Beschreibung | | `youtubeMetadata.tags[]` | array | Tags | | `youtubeMetadata.visibility` | select | `public`, `unlisted`, `private` | | `youtubeMetadata.chapters` | textarea | Kapitelmarken | | `youtubeMetadata.pinnedComment` | textarea (lokalisiert) | Angepinnter Kommentar | **Performance-Metriken:** | Feld | Typ | Beschreibung | |------|-----|--------------| | `performance.views` | number | Aufrufe | | `performance.likes` | number | Likes | | `performance.comments` | number | Kommentare | | `performance.shares` | number | Shares | | `performance.watchTimeMinutes` | number | Watch Time | | `performance.avgViewDuration` | number | Avg. View Duration | | `performance.avgViewPercentage` | number | Avg. View % | | `performance.ctr` | number | Click-Through-Rate | | `performance.impressions` | number | Impressions | | `performance.subscribersGained` | number | Gewonnene Abonnenten | ### 2.4 YT Tasks (`yt-tasks`) Aufgabenverwaltung für Video-Produktion. | Feld | Typ | Beschreibung | |------|-----|--------------| | `title` | text (lokalisiert) | Aufgabentitel | | `description` | textarea (lokalisiert) | Beschreibung | | `video` | relationship | Zugehöriges Video | | `channel` | relationship | Zugehöriger Kanal | | `taskType` | select | Aufgabentyp | | `status` | select | Status | | `priority` | select | Priorität | | `assignedTo` | relationship (users) | Zuständige Person | | `dueDate` | date | Fälligkeitsdatum | | `completedAt` | date | Abschlussdatum | | `completedBy` | relationship (users) | Abgeschlossen von | | `blockedReason` | text (lokalisiert) | Blockierungsgrund | | `attachments[]` | array | Anhänge (file, note) | | `comments[]` | array | Kommentare (author, content, createdAt) | **Task Types:** - `script_write` - Script schreiben - `script_review` - Script Review - `shoot_prep` - Dreh-Vorbereitung - `shoot` - Dreh - `edit` - Schnitt - `graphics` - Grafiken - `thumbnail` - Thumbnail - `review` - Review - `upload` - Upload - `track` - Tracking - `comments` - Kommentare beantworten - `other` - Sonstiges **Task Status:** - `todo` - Offen - `in_progress` - In Bearbeitung - `blocked` - Blockiert - `waiting_review` - Wartet auf Review - `done` - Erledigt - `cancelled` - Abgebrochen ### 2.5 YT Notifications (`yt-notifications`) Benachrichtigungssystem für Team-Mitglieder. | Feld | Typ | Beschreibung | |------|-----|--------------| | `title` | text (lokalisiert) | Benachrichtigungstitel | | `message` | textarea (lokalisiert) | Nachricht | | `recipient` | relationship (users) | Empfänger | | `type` | select | Benachrichtigungstyp | | `link` | text | Link zur Aktion | | `relatedVideo` | relationship | Zugehöriges Video | | `relatedTask` | relationship | Zugehörige Aufgabe | | `read` | checkbox | Gelesen | | `readAt` | date | Gelesen am | | `emailSent` | checkbox | E-Mail gesendet | **Notification Types:** - `task_assigned` - Aufgabe zugewiesen - `task_due` - Aufgabe fällig - `task_overdue` - Aufgabe überfällig - `approval_required` - Freigabe erforderlich - `approved` - Freigegeben - `rejected` - Abgelehnt - `video_published` - Video veröffentlicht - `comment` - Kommentar - `mention` - Erwähnung - `system` - Systemmeldung --- ## 3. User-Erweiterung ### 3.1 Neue Felder in Users Collection | Feld | Typ | Beschreibung | |------|-----|--------------| | `youtubeRole` | select | YouTube-Rolle des Users | | `youtubeChannels` | relationship (hasMany) | Zugewiesene Kanäle | ### 3.2 YouTube-Rollen | Rolle | Beschreibung | Berechtigungen | |-------|--------------|----------------| | `none` | Kein YouTube-Zugriff | - | | `viewer` | Nur Ansicht | Lesen | | `editor` | Bearbeiter | Lesen, eigene Inhalte bearbeiten | | `producer` | Produzent | Lesen, Bearbeiten, Tasks verwalten | | `creator` | Creator | Wie Producer + Inhalte erstellen | | `manager` | Manager | Vollzugriff auf alle YouTube-Funktionen | --- ## 4. Access Control ### 4.1 Zugriffsfunktionen (`src/lib/youtubeAccess.ts`) ```typescript // Manager oder Super-Admin isYouTubeManager: Access // Creator oder höher (creator, manager) isYouTubeCreatorOrAbove: Access // Mindestens Viewer-Zugriff hasYouTubeAccess: Access // Zugewiesene Inhalte oder Manager canAccessAssignedContent: Access // Eigene Benachrichtigungen canAccessOwnNotifications: Access ``` ### 4.2 Berechtigungsmatrix | Collection | Read | Create | Update | Delete | |------------|------|--------|--------|--------| | youtube-channels | hasYouTubeAccess | isYouTubeManager | isYouTubeManager | isYouTubeManager | | youtube-content | canAccessAssignedContent | isYouTubeCreatorOrAbove | canAccessAssignedContent | isYouTubeManager | | yt-tasks | canAccessAssignedContent | isYouTubeCreatorOrAbove | canAccessAssignedContent | isYouTubeManager | | yt-notifications | canAccessOwnNotifications | isYouTubeCreatorOrAbove | canAccessOwnNotifications | isYouTubeManager | --- ## 5. API Endpoints ### 5.1 Custom API Routes | Endpoint | Methode | Beschreibung | |----------|---------|--------------| | `/api/youtube/dashboard` | GET | Dashboard-Daten (Stats, Tasks, Videos) | | `/api/youtube/my-tasks` | GET | Eigene offene Aufgaben | | `/api/youtube/complete-task/[id]` | POST | Aufgabe als erledigt markieren | ### 5.2 Standard Payload API | Endpoint | Beschreibung | |----------|--------------| | `/api/youtube-channels` | CRUD für Kanäle | | `/api/youtube-content` | CRUD für Videos | | `/api/yt-tasks` | CRUD für Aufgaben | | `/api/yt-notifications` | CRUD für Benachrichtigungen | --- ## 6. Datenbank-Schema ### 6.1 Haupttabellen ```sql youtube_channels youtube_channels_locales youtube_channels_content_series youtube_channels_content_series_locales youtube_channels_publishing_schedule_default_days youtube_content youtube_content_locales youtube_content_key_points youtube_content_key_points_locales youtube_content_raw_footage youtube_content_youtube_metadata_tags yt_tasks yt_tasks_locales yt_tasks_attachments yt_tasks_comments yt_notifications yt_notifications_locales users_rels (für youtubeChannels Relationship) ``` ### 6.2 Enums ```sql enum_users_youtube_role enum_youtube_channels_language enum_youtube_channels_category enum_youtube_channels_status enum_youtube_content_format enum_youtube_content_status enum_youtube_content_priority enum_youtube_content_visibility enum_yt_tasks_task_type enum_yt_tasks_status enum_yt_tasks_priority enum_yt_notifications_type ``` --- ## 7. Hooks & Automatisierungen ### 7.1 Task-Erstellung Hook Bei Erstellung eines neuen Videos wird automatisch eine Task erstellt: ```typescript // src/hooks/youtube/createTaskOnVideoCreate.ts afterChange: async ({ doc, operation, req }) => { if (operation === 'create') { await req.payload.create({ collection: 'yt-tasks', data: { title: `Script für "${doc.title}"`, video: doc.id, channel: doc.channel, taskType: 'script_write', assignedTo: doc.assignedTo, // ... } }) } } ``` ### 7.2 Benachrichtigungs-Hook Bei Task-Zuweisung wird automatisch eine Notification erstellt: ```typescript // src/hooks/youtube/notifyOnTaskAssignment.ts afterChange: async ({ doc, previousDoc, operation, req }) => { if (doc.assignedTo !== previousDoc?.assignedTo) { await req.payload.create({ collection: 'yt-notifications', data: { title: 'Neue Aufgabe zugewiesen', recipient: doc.assignedTo, type: 'task_assigned', relatedTask: doc.id, // ... } }) } } ``` --- ## 8. Admin-UI Konfiguration ### 8.1 Gruppierung Alle YouTube-Collections sind unter der Gruppe "YouTube" zusammengefasst: ```typescript admin: { group: 'YouTube', } ``` ### 8.2 Spalten-Konfiguration | Collection | Spalten | |------------|---------| | youtube-channels | name, youtubeHandle, status, language | | youtube-content | title, channel, status, format, scheduledPublishDate | | yt-tasks | title, video, taskType, status, assignedTo, dueDate | | yt-notifications | title, type, recipient, read, createdAt | --- ## 9. Mehrsprachigkeit Alle kundenorientierten Felder sind lokalisiert (de/en): - Kanal-Namen - Video-Titel und Beschreibungen - Scripts - Task-Titel und Beschreibungen - Benachrichtigungen - Content-Serien --- ## 10. Dateien-Übersicht ``` src/ ├── collections/ │ ├── YouTubeChannels.ts │ ├── YouTubeContent.ts │ ├── YtTasks.ts │ └── YtNotifications.ts ├── lib/ │ └── youtubeAccess.ts ├── hooks/youtube/ │ ├── createTaskOnVideoCreate.ts │ └── notifyOnTaskAssignment.ts ├── app/(payload)/api/youtube/ │ ├── dashboard/route.ts │ ├── my-tasks/route.ts │ └── complete-task/[id]/route.ts └── migrations/ └── 20260112_150000_add_youtube_operations_hub.ts ``` --- ## 11. Erweiterungsmöglichkeiten ### Geplante Features 1. **YouTube API Integration** - Automatischer Metriken-Sync - Video-Upload direkt aus CMS - Kommentar-Import 2. **Analytics Dashboard** - Performance-Vergleich zwischen Videos - Trend-Analyse - ROI-Berechnung 3. **Workflow-Automatisierung** - Automatische Status-Änderungen - Deadline-Erinnerungen - Team-Kapazitätsplanung 4. **Content-Kalender** - Visuelle Übersicht - Drag & Drop Planung - Konflikt-Erkennung --- *Letzte Aktualisierung: 12.01.2026*