# Universal Features - Dokumentation *Letzte Aktualisierung: 08. Januar 2026* ## Übersicht Die Universal Features erweitern das Payload CMS um wiederverwendbare Collections und Blocks für Blog, News, Testimonials, Newsletter, FAQ, Team und Prozess-Darstellungen. Alle Features sind Multi-Tenant-fähig. **Wichtig:** Frontends verwenden die **Production-API** (cms.c2sgmbh.de). --- ## API-Endpoints für Frontend ### Collections | Collection | Endpoint | Beschreibung | |------------|----------|--------------| | Posts | `GET /api/posts` | Blog, News, Presse | | Testimonials | `GET /api/testimonials` | Kundenbewertungen | | FAQs | `GET /api/faqs` | FAQ-Einträge | | Team | `GET /api/team` | Team-Mitglieder | | Services | `GET /api/services` | Leistungen | | Timelines | `GET /api/timelines` | Chronologische Events | | Workflows | `GET /api/workflows` | Prozess-Darstellungen | ### Beispiel: Posts laden ```typescript // Featured Blog-Posts für Tenant C2S laden const posts = await fetch( 'https://cms.c2sgmbh.de/api/posts?where[tenant][equals]=4&where[type][equals]=blog&where[isFeatured][equals]=true&locale=de&limit=6' ).then(r => r.json()) ``` ### Newsletter API | Endpoint | Methode | Beschreibung | |----------|---------|--------------| | `/api/newsletter/subscribe` | POST | Newsletter-Anmeldung | | `/api/newsletter/confirm` | GET/POST | Double Opt-In Bestätigung | | `/api/newsletter/unsubscribe` | GET/POST | Abmeldung | ```typescript // Newsletter-Anmeldung const response = await fetch('https://cms.c2sgmbh.de/api/newsletter/subscribe', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ email: 'user@example.com', firstName: 'Max', tenantId: 4, source: 'footer' }) }) ``` --- ## Collections ### 1. Posts Collection **Pfad:** `src/collections/Posts.ts` **Slug:** `posts` **Admin-Gruppe:** Content Die Posts Collection dient zur Verwaltung von Blog-Artikeln, News, Pressemitteilungen und Ankündigungen. #### Felder | Feld | Typ | Beschreibung | Pflicht | |------|-----|--------------|---------| | `title` | Text | Titel des Beitrags | Ja | | `slug` | Text | URL-Pfad (unique) | Ja | | `type` | Select | Art des Beitrags | Ja | | `isFeatured` | Checkbox | Hervorgehobener Beitrag | Nein | | `excerpt` | Textarea | Kurzfassung (max. 300 Zeichen) | Nein | | `featuredImage` | Upload | Beitragsbild | Nein | | `content` | RichText | Hauptinhalt | Ja | | `categories` | Relationship | Kategorien (hasMany) | Nein | | `author` | Text | Autorname | Nein | | `status` | Select | draft/published/archived | Nein | | `publishedAt` | Date | Veröffentlichungsdatum | Nein | | `meta` | Group | SEO-Einstellungen | Nein | #### Post-Typen - `blog` - Blog-Artikel (Standard) - `news` - News/Aktuelles - `press` - Pressemitteilung - `announcement` - Ankündigung --- ### 2. Testimonials Collection **Pfad:** `src/collections/Testimonials.ts` **Slug:** `testimonials` **Admin-Gruppe:** Content Kundenstimmen und Bewertungen für Referenz-Seiten. #### Felder | Feld | Typ | Beschreibung | Pflicht | |------|-----|--------------|---------| | `quote` | Textarea | Zitat/Bewertungstext | Ja | | `author` | Text | Name des Kunden | Ja | | `role` | Text | Position/Rolle | Nein | | `company` | Text | Unternehmen | Nein | | `image` | Upload | Portrait-Foto | Nein | | `rating` | Number | Bewertung 1-5 Sterne | Nein | | `source` | Text | Quelle (z.B. "Google Reviews") | Nein | | `sourceUrl` | Text | Link zur Original-Bewertung | Nein | | `date` | Date | Datum der Bewertung | Nein | | `isActive` | Checkbox | Sichtbarkeit | Nein | | `order` | Number | Sortierung | Nein | --- ### 3. Newsletter Subscribers Collection **Pfad:** `src/collections/NewsletterSubscribers.ts` **Slug:** `newsletter-subscribers` **Admin-Gruppe:** Marketing DSGVO-konforme Speicherung von Newsletter-Anmeldungen mit Double Opt-In. #### Felder | Feld | Typ | Beschreibung | Pflicht | |------|-----|--------------|---------| | `email` | Email | E-Mail-Adresse | Ja | | `firstName` | Text | Vorname | Nein | | `lastName` | Text | Nachname | Nein | | `status` | Select | Anmeldestatus | Ja | | `interests` | Select (hasMany) | Interessengebiete | Nein | | `source` | Text | Anmeldequelle | Nein | | `subscribedAt` | Date | Anmeldedatum (auto) | Nein | | `confirmedAt` | Date | Bestätigungsdatum (auto) | Nein | | `unsubscribedAt` | Date | Abmeldedatum (auto) | Nein | | `confirmationToken` | Text | Token für Double Opt-In (auto) | Nein | | `ipAddress` | Text | IP-Adresse (DSGVO) | Nein | | `userAgent` | Text | Browser-Info | Nein | #### Double Opt-In Flow 1. User meldet sich an → Status: `pending`, Token generiert 2. E-Mail mit Bestätigungs-Link wird automatisch gesendet 3. User klickt Link → Status: `confirmed` 4. Willkommens-E-Mail wird gesendet 5. Abmeldung jederzeit über Link möglich #### Status-Werte - `pending` - Ausstehend (Double Opt-In) - `confirmed` - Bestätigt - `unsubscribed` - Abgemeldet - `bounced` - E-Mail nicht zustellbar --- ### 4. FAQs Collection **Pfad:** `src/collections/FAQs.ts` **Slug:** `faqs` **Admin-Gruppe:** Content Häufig gestellte Fragen mit Kategorisierung. #### Felder | Feld | Typ | Beschreibung | Pflicht | |------|-----|--------------|---------| | `question` | Text | Frage | Ja | | `answer` | RichText | Antwort | Ja | | `category` | Text | Kategorie | Nein | | `order` | Number | Sortierung | Nein | | `isActive` | Checkbox | Sichtbarkeit | Nein | --- ### 5. Team Collection **Pfad:** `src/collections/Team.ts` **Slug:** `team` **Admin-Gruppe:** Content Team-Mitglieder und Mitarbeiter. #### Felder | Feld | Typ | Beschreibung | Pflicht | |------|-----|--------------|---------| | `name` | Text | Name | Ja | | `role` | Text | Position/Rolle | Nein | | `image` | Upload | Portrait-Foto | Nein | | `bio` | Textarea | Kurzbiografie | Nein | | `email` | Email | E-Mail-Adresse | Nein | | `phone` | Text | Telefon | Nein | | `socialLinks` | Array | Social Media Links | Nein | | `order` | Number | Sortierung | Nein | | `isActive` | Checkbox | Sichtbarkeit | Nein | --- ### 6. Services Collection **Pfad:** `src/collections/Services.ts` **Slug:** `services` **Admin-Gruppe:** Content Leistungen und Dienstleistungen. #### Felder | Feld | Typ | Beschreibung | Pflicht | |------|-----|--------------|---------| | `title` | Text | Leistungsname | Ja | | `slug` | Text | URL-Pfad | Ja | | `excerpt` | Textarea | Kurzbeschreibung | Nein | | `content` | RichText | Detailbeschreibung | Nein | | `icon` | Text | Icon-Name | Nein | | `image` | Upload | Bild | Nein | | `category` | Relationship | Service-Kategorie | Nein | | `order` | Number | Sortierung | Nein | --- ### 7. Timelines Collection **Pfad:** `src/collections/Timelines.ts` **Slug:** `timelines` **Admin-Gruppe:** Content Chronologische Events für Geschichte, Meilensteine, Releases. #### API ```typescript // Timeline laden fetch('https://cms.c2sgmbh.de/api/timelines?tenant=4&slug=company-history&locale=de') ``` #### Timeline-Typen - `history` - Unternehmensgeschichte - `milestones` - Projektmeilensteine - `releases` - Produkt-Releases - `career` - Karriere/Lebenslauf - `events` - Ereignisse - `process` - Prozess/Ablauf --- ### 8. Workflows Collection **Pfad:** `src/collections/Workflows.ts` **Slug:** `workflows` **Admin-Gruppe:** Content Komplexe Prozesse mit Phasen, Abhängigkeiten und Status-Tracking. #### API ```typescript // Workflow laden fetch('https://cms.c2sgmbh.de/api/workflows?tenant=4&type=project&locale=de') ``` #### Workflow-Typen - `project` - Projektabläufe - `business` - Geschäftsprozesse - `approval` - Genehmigungs-Workflows - `onboarding` - Mitarbeiter-/Kundeneinführung - `support` - Support/Service-Prozesse - `development` - Entwicklungsprozesse --- ### 9. Favorites Collection (BlogWoman) **Pfad:** `src/collections/Favorites.ts` **Slug:** `favorites` **Admin-Gruppe:** Content Affiliate-Produkte für Blogger/Influencer mit Kategorien und Badges. #### API ```typescript // Alle Favorites eines Tenants fetch('https://cms.c2sgmbh.de/api/favorites?where[tenant][equals]=4&locale=de') // Nach Kategorie filtern fetch('https://cms.c2sgmbh.de/api/favorites?where[tenant][equals]=4&where[category][equals]=fashion') ``` #### Felder | Feld | Typ | Beschreibung | Pflicht | |------|-----|--------------|---------| | `title` | Text | Produktname | Ja | | `slug` | Text | URL-Pfad (auto) | Ja | | `description` | RichText | Beschreibung (lokalisiert) | Nein | | `image` | Upload | Produktbild | Nein | | `affiliateUrl` | Text | Affiliate-Link | Ja | | `price` | Text | Preis (Freitext) | Nein | | `category` | Select | fashion, beauty, travel, tech, home | Nein | | `badge` | Select | investment-piece, daily-driver, grfi-approved, new, bestseller | Nein | | `priceRange` | Select | budget, mid, premium, luxury | Nein | | `isActive` | Checkbox | Sichtbarkeit | Nein | | `order` | Number | Sortierung | Nein | --- ### 10. Series Collection (BlogWoman) **Pfad:** `src/collections/Series.ts` **Slug:** `series` **Admin-Gruppe:** Content YouTube-Serien mit eigenem Branding für Content-Reihen. #### API ```typescript // Alle Serien eines Tenants fetch('https://cms.c2sgmbh.de/api/series?where[tenant][equals]=4&locale=de') // Einzelne Serie nach Slug fetch('https://cms.c2sgmbh.de/api/series?where[tenant][equals]=4&where[slug][equals]=grfi') ``` #### Felder | Feld | Typ | Beschreibung | Pflicht | |------|-----|--------------|---------| | `title` | Text | Serienname (lokalisiert) | Ja | | `slug` | Text | URL-Pfad (auto) | Ja | | `description` | RichText | Beschreibung (lokalisiert) | Nein | | `logo` | Upload | Serien-Logo | Nein | | `coverImage` | Upload | Cover-Bild für Hero | Nein | | `brandColor` | Text | Hex-Farbcode (#RRGGBB) | Nein | | `youtubePlaylistId` | Text | YouTube Playlist ID | Nein | | `isActive` | Checkbox | Sichtbarkeit | Nein | --- ## Blocks Alle Blocks können in der Pages Collection verwendet werden. ### Block-Übersicht #### Content Blocks | Block | Slug | Beschreibung | |-------|------|--------------| | Posts List | `posts-list-block` | Blog/News-Liste | | Testimonials | `testimonials-block` | Kundenstimmen | | Newsletter | `newsletter-block` | Anmeldeformular | | Process Steps | `process-steps-block` | Prozess-Schritte | | Timeline | `timeline-block` | Chronologie | | FAQ | `faq-block` | FAQ-Akkordeon | | Team | `team-block` | Team-Mitglieder | | Services | `services-block` | Leistungen | #### BlogWoman Blocks (NEU) | Block | Slug | Beschreibung | |-------|------|--------------| | Favorites | `favorites-block` | Affiliate-Produkte Grid/Liste/Karussell | | Series | `series-block` | YouTube-Serien Übersicht | | Series Detail | `series-detail-block` | Serien-Einzelseite mit Hero | | Video Embed | `video-embed-block` | YouTube/Vimeo Embed mit Privacy Mode | | Featured Content | `featured-content-block` | Kuratierte Mixed-Content Sammlung | ### 1. Posts List Block **Slug:** `posts-list-block` Zeigt eine Liste von Blog-Artikeln, News oder anderen Post-Typen an. #### Konfigurationsoptionen | Option | Typ | Standard | Beschreibung | |--------|-----|----------|--------------| | `title` | Text | - | Überschrift | | `subtitle` | Text | - | Untertitel | | `postType` | Select | blog | Beitragstyp-Filter | | `layout` | Select | grid | Darstellung | | `columns` | Select | 3 | Spaltenanzahl (bei Grid) | | `limit` | Number | 6 | Anzahl Beiträge | | `showFeaturedOnly` | Checkbox | false | Nur hervorgehobene | | `filterByCategory` | Relationship | - | Kategorie-Filter | | `showExcerpt` | Checkbox | true | Kurzfassung anzeigen | | `showDate` | Checkbox | true | Datum anzeigen | | `showAuthor` | Checkbox | false | Autor anzeigen | | `showCategory` | Checkbox | true | Kategorie anzeigen | | `showPagination` | Checkbox | false | Pagination | | `showReadMore` | Checkbox | true | "Alle anzeigen" Link | | `backgroundColor` | Select | white | Hintergrundfarbe | #### Layout-Optionen - `grid` - Karten im Grid - `list` - Listenansicht - `featured` - Featured + Grid - `compact` - Kompakt (für Sidebar) - `masonry` - Masonry-Layout --- ### 2. Testimonials Block **Slug:** `testimonials-block` Zeigt Kundenstimmen aus der Testimonials Collection. #### Layout-Optionen - `slider` - Karussell - `grid` - Karten im Grid - `single` - Einzeln (Featured) - `masonry` - Masonry-Layout - `list` - Listenansicht --- ### 3. Newsletter Block **Slug:** `newsletter-block` Anmeldeformular für Newsletter mit DSGVO-Hinweis. #### Layout-Optionen - `inline` - Eingabe + Button nebeneinander - `stacked` - Untereinander - `with-image` - Mit Bild (50/50) - `minimal` - Nur Input - `card` - Karten-Design --- ### 4. FAQ Block **Slug:** `faq-block` FAQ-Akkordeon mit Schema.org Markup. #### Konfigurationsoptionen | Option | Typ | Beschreibung | |--------|-----|--------------| | `title` | Text | Überschrift | | `subtitle` | Text | Untertitel | | `displayMode` | Select | all / selected / byCategory | | `selectedFaqs` | Relationship | Handverlesene FAQs | | `filterCategory` | Text | Kategorie-Filter | | `layout` | Select | accordion / list / grid | | `expandFirst` | Checkbox | Erste FAQ offen | | `showSchema` | Checkbox | JSON-LD generieren | --- ### 5. Team Block **Slug:** `team-block` Team-Mitglieder aus der Team Collection. #### Layout-Optionen - `grid` - Karten im Grid - `list` - Listenansicht - `carousel` - Karussell - `compact` - Kompakt --- ### 6. Services Block **Slug:** `services-block` Leistungen aus der Services Collection. #### Layout-Optionen - `grid` - Karten im Grid - `list` - Listenansicht mit Details - `icons` - Icon-Grid - `tabs` - Tab-Navigation --- ### 7. Favorites Block (BlogWoman) **Slug:** `favorites-block` Zeigt Affiliate-Produkte aus der Favorites Collection. #### Konfigurationsoptionen | Option | Typ | Beschreibung | |--------|-----|--------------| | `title` | Text | Überschrift | | `subtitle` | Text | Untertitel | | `displayMode` | Select | all / selected / byCategory | | `selectedFavorites` | Relationship | Handverlesene Favorites | | `filterCategory` | Select | Kategorie-Filter | | `layout` | Select | grid / list / carousel | | `columns` | Select | 2 / 3 / 4 Spalten | | `limit` | Number | Anzahl Produkte | | `showPrice` | Checkbox | Preis anzeigen | | `showBadge` | Checkbox | Badge anzeigen | --- ### 8. Series Block (BlogWoman) **Slug:** `series-block` Übersicht aller YouTube-Serien mit Filteroptionen. #### Konfigurationsoptionen | Option | Typ | Beschreibung | |--------|-----|--------------| | `title` | Text | Überschrift | | `subtitle` | Text | Untertitel | | `displayMode` | Select | all / selected | | `selectedSeries` | Relationship | Handverlesene Serien | | `layout` | Select | grid / list / featured | | `showDescription` | Checkbox | Beschreibung anzeigen | --- ### 9. Series Detail Block (BlogWoman) **Slug:** `series-detail-block` Hero-Bereich für eine einzelne Serie mit Branding. #### Konfigurationsoptionen | Option | Typ | Beschreibung | |--------|-----|--------------| | `series` | Relationship | Serien-Referenz | | `layout` | Select | hero / compact / sidebar | | `showLogo` | Checkbox | Logo anzeigen | | `showPlaylistLink` | Checkbox | YouTube-Link anzeigen | | `useBrandColor` | Checkbox | Markenfarbe verwenden | --- ### 10. Video Embed Block (BlogWoman) **Slug:** `video-embed-block` Datenschutzfreundliches Video-Embedding für YouTube/Vimeo. #### Konfigurationsoptionen | Option | Typ | Beschreibung | |--------|-----|--------------| | `videoUrl` | Text | YouTube/Vimeo URL | | `title` | Text | Video-Titel | | `aspectRatio` | Select | 16:9 / 4:3 / 1:1 / 9:16 | | `privacyMode` | Checkbox | youtube-nocookie.com verwenden | | `autoplay` | Checkbox | Automatisch abspielen | | `showControls` | Checkbox | Player-Controls anzeigen | | `thumbnailImage` | Upload | Custom Thumbnail | --- ### 11. Featured Content Block (BlogWoman) **Slug:** `featured-content-block` Kuratierte Sammlung aus verschiedenen Content-Typen. #### Konfigurationsoptionen | Option | Typ | Beschreibung | |--------|-----|--------------| | `title` | Text | Überschrift | | `subtitle` | Text | Untertitel | | `items` | Array | Gemischte Content-Items | | `layout` | Select | grid / masonry / featured | **Item-Typen:** - `post` - Blog-Artikel - `video` - Video - `favorite` - Affiliate-Produkt - `series` - YouTube-Serie - `external` - Externer Link --- ## Multi-Tenant Konfiguration Alle Collections sind für Multi-Tenant konfiguriert: ```typescript // payload.config.ts multiTenantPlugin({ tenantsSlug: 'tenants', collections: { posts: {}, testimonials: {}, 'newsletter-subscribers': {}, faqs: {}, team: {}, services: {}, timelines: {}, workflows: {}, favorites: {}, // BlogWoman series: {}, // BlogWoman // ... weitere Collections }, }) ``` ### Tenant-Zuordnung Jedes Dokument enthält ein `tenant`-Feld. Die Access-Control sorgt für Isolation: - **Authentifizierte Admins:** Sehen alle Dokumente - **Anonyme Requests:** Nur Dokumente des passenden Tenants ### Tenant-IDs | ID | Name | Slug | |----|------|------| | 1 | porwoll.de | porwoll | | 4 | Complex Care Solutions GmbH | c2s | | 5 | Gunshin | gunshin | --- ## Dateien-Übersicht ``` src/ ├── collections/ │ ├── Posts.ts │ ├── Categories.ts │ ├── Testimonials.ts │ ├── NewsletterSubscribers.ts │ ├── FAQs.ts │ ├── Team.ts │ ├── Services.ts │ ├── ServiceCategories.ts │ ├── Timelines.ts │ ├── Workflows.ts │ ├── Favorites.ts # BlogWoman │ └── Series.ts # BlogWoman ├── blocks/ │ ├── PostsListBlock.ts │ ├── TestimonialsBlock.ts │ ├── NewsletterBlock.ts │ ├── ProcessStepsBlock.ts │ ├── TimelineBlock.ts │ ├── FAQBlock.ts │ ├── TeamBlock.ts │ ├── ServicesBlock.ts │ ├── FavoritesBlock.ts # BlogWoman │ ├── SeriesBlock.ts # BlogWoman │ ├── SeriesDetailBlock.ts # BlogWoman │ ├── VideoEmbedBlock.ts # BlogWoman │ ├── FeaturedContentBlock.ts # BlogWoman │ └── index.ts ├── lib/ │ ├── tenantAccess.ts │ └── email/ │ ├── newsletter-service.ts │ └── newsletter-templates.ts ├── hooks/ │ └── sendNewsletterConfirmation.ts └── app/(payload)/api/newsletter/ ├── subscribe/route.ts ├── confirm/route.ts └── unsubscribe/route.ts ``` --- ## URLs ### Production (für Frontends) | Resource | URL | |----------|-----| | Posts API | https://cms.c2sgmbh.de/api/posts | | Testimonials API | https://cms.c2sgmbh.de/api/testimonials | | FAQs API | https://cms.c2sgmbh.de/api/faqs | | Team API | https://cms.c2sgmbh.de/api/team | | Services API | https://cms.c2sgmbh.de/api/services | | Timelines API | https://cms.c2sgmbh.de/api/timelines | | Workflows API | https://cms.c2sgmbh.de/api/workflows | | Newsletter Subscribe | https://cms.c2sgmbh.de/api/newsletter/subscribe | ### Development | Resource | URL | |----------|-----| | API Base | https://pl.porwoll.tech/api | | Admin Panel | https://pl.porwoll.tech/admin | --- ## Changelog ### Version 1.3 (08.01.2026) - **BlogWoman Collections hinzugefügt:** - Favorites Collection (Affiliate-Produkte) - Series Collection (YouTube-Serien) - **BlogWoman Blocks hinzugefügt:** - FavoritesBlock (Grid/Liste/Karussell) - SeriesBlock (Serien-Übersicht) - SeriesDetailBlock (Serien-Hero) - VideoEmbedBlock (Privacy-Mode) - FeaturedContentBlock (Mixed-Content) - Dateien-Übersicht aktualisiert - Multi-Tenant Konfiguration erweitert ### Version 1.2 (18.12.2025) - Dokumentation auf Production-URLs aktualisiert - API-Endpoints für Frontend hinzugefügt - Newsletter Double Opt-In Flow dokumentiert - Timelines und Workflows Collections hinzugefügt - FAQ, Team, Services Blocks dokumentiert ### Version 1.1 (14.12.2025) - Timelines Collection für chronologische Darstellungen - Workflows Collection für Prozesse - FAQs Collection mit Kategorisierung - Team Collection mit Social Links - Services Collection mit Kategorien ### Version 1.0 (30.11.2025) - Posts Collection um `type`, `isFeatured`, `excerpt` erweitert - Testimonials Collection erstellt - NewsletterSubscribers Collection erstellt (DSGVO-konform) - 5 neue Blocks für Pages implementiert - Multi-Tenant Integration für alle Collections --- *Letzte Aktualisierung: 08. Januar 2026*