Doku: Boost-Platzierung entschieden + umgesetzt (Slot-Grenzen, Kategorie-Boost)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Kevin Adametz 2026-07-13 12:28:03 +00:00
parent 7a32c66d11
commit d92e0f65c8
3 changed files with 47 additions and 54 deletions

View file

@ -1,58 +1,49 @@
# Boost-Platzierung — offene Punkte (Thema für Montag, 13.07.2026)
# Boost-Platzierung — ENTSCHIEDEN + UMGESETZT (13.07.2026)
Stand: 10.07.2026 abends. Kontext: Boost-Add-on ist seit heute Ende-zu-Ende live
(Kauf-Modal mit Pflicht-Schalter + Verlängerungs-Hinweis, Ausspielung auf Start-
und Branchenseite mit Badge „Top-Platzierung", sofortige Cache-Invalidierung,
Hinweis in der Kunden-PM-Liste). Zwei Dinge sind bewusst noch ungelöst.
Stand: 13.07.2026. Kontext: Boost-Add-on ist seit 10.07. Ende-zu-Ende live.
Die zwei offenen Punkte von Montag sind entschieden und umgesetzt.
## 1. Hero „Im Fokus" als Slider
## Entscheidung (User, 13.07.2026)
**Angedacht (User, 10.07.):** Das große Hero-Fenster der Startseite soll die
Top-Meldungen als Slider durchlaufen — insbesondere, wenn mehrere geboostete
PMs gleichzeitig aktiv sind.
1. **Harte Slot-Grenzen:** max. **5** gleichzeitige Boosts auf der Startseite,
max. **3** je Branchenseite (Kategorieseite) — die Grenzen entsprechen genau
den sichtbaren Plätzen (Startseite: Lead + 4 Seitenleiste; Branchenseite:
Lead + 2 Top-Slots). Verkauft wird nur, was sichtbar ist.
2. **Zwei Boost-Stufen mit Preisunterscheidung:**
- **Startseiten-Boost** (voller Preis, 12/20/35 Credits für 7/14/30 Tage):
erscheint wie bisher auf Startseite **und** Branchenseite.
- **Kategorie-Boost** (50 % vom Boost-Preis, aufgerundet: **6/10/18
Credits**): erscheint **nur** auf der Branchenseite der Rubrik.
3. **Hero-Slider:** vorerst **nicht** umgesetzt — durch die Slot-Grenze
(5 = sichtbare Plätze) entsteht kein Sichtbarkeits-Überhang. Bleibt als
spätere Ausbaustufe notiert (dann könnte die Grenze steigen), ebenso die
Zeitraum-Buchung wie im Anzeigengeschäft.
**Ist-Zustand:** Statisch. Die jüngste geboostete PM ist der Lead, weitere
geboostete rutschen in die Seitenleiste „Was sonst zählt"
(`HomePageData` → `focus-hero.blade.php`). Branchenseite analog (Lead + 2 Top-Slots).
## Umsetzung (13.07.2026, Suite: 1222 grün)
**Ideen:**
- `boosts.placement` (`home`/`category`, Enum `BoostPlacement`; Bestandsboosts
= `home`), Preise/Slots in `config/credits.php` (`boost_category`,
`boost_slots`).
- `BoostService::slotAvailability()` prüft je Ausgabe (Portal × Sprache, beim
Kategorie-Boost zusätzlich je Rubrik); Kauf am vollen Inventar wirft
`BoostNotAllowedException::soldOut()` mit dem frühesten freien Termin.
**Verlängerungen** brauchen keinen freien Slot (die PM hält ihren);
die Stufen verlängern unabhängig voneinander.
- Startseite (`HomePageData`) zeigt nur `home`-Boosts; Branchenseite
(`CategoryPageData`) zeigt Kategorie-Boosts **mit Vorrang** vor
Startseiten-Boosts (die 3 Kategorie-Slots sind die verkaufte Garantie,
Startseiten-Boosts füllen nur übrige Plätze).
- Kategorie-Boost invalidiert nur die Branchenseiten-Caches, nicht die
Startseite.
- Kunden-UI (PM-Seite): zwei Boost-Angebote im Add-on-Panel; bei vollem
Inventar „Derzeit ausgebucht — der nächste Platz wird am TT.MM.JJJJ frei."
statt der Kauf-Buttons (serverseitig gegated).
- Preisseite (`/preise`, beide Staffeln + Leistungsbeschreibungs-Note zu
Slot-Begrenzung, de/en), Buchungsseiten-Preisliste ergänzt.
- Tests: `BoostServiceTest` (Slots/Preise/Verlängerung),
`Web/BoostPlacementTest` (Platzierung/Vorrang/Cache),
`PressReleaseShowAddonsTest` (UI/Ausgebucht), `CreditPricingServiceTest`.
- **Alpine-Rotation im bestehenden Hero (empfohlen, kleinster Eingriff):**
`HomePageData` liefert statt einem `leadRelease` eine kleine Lead-Liste
(alle aktiven Boosts + jüngste Meldung als Abschluss-Slide). `focus-hero`
rendert alle Slides serverseitig (SEO: Inhalte im Markup, erste Slide
sichtbar) und rotiert per Alpine alle ~6–8 s mit Punkten/Pfeilen, Pause bei
Hover. Kein neues Paket nötig, Cache-Verhalten bleibt unverändert.
- **Fairness durch Rotation statt „Neueste gewinnt":** Reihenfolge der Slides
nicht nach `published_at`, sondern rotierend (z. B. nach Boost-Beginn oder
round-robin je Cache-Build), damit bei mehreren Käufern jeder regelmäßig die
erste Slide bekommt.
- **Abgrenzung:** Slider nur im Hero der Startseite; Branchenseite erst einmal
statisch lassen (weniger Traffic-Druck, weniger Aufwand).
## 2. Was passiert, wenn viele gleichzeitig boosten? (Begrenzung?)
**Problem heute:** Es gibt keine Obergrenze. Sichtbare Plätze sind aber endlich
(Startseite: Lead + 4 Seitenleiste; Branchenseite: Lead + 2). Ab dem 6. aktiven
Boost je Ausgabe zahlt jemand, ohne auf der Startseite aufzutauchen —
Beschwerde-/Erstattungsrisiko. Aktuell unkritisch (wenige Kunden), vor
Skalierung aber zu entscheiden.
**Ideen:**
- **Harte Slot-Grenze mit „Ausverkauft" (empfohlen):** z. B. max. 5 aktive
Boosts je Ausgabe (Portal). `BoostService` prüft die Verfügbarkeit im Gate,
das Kauf-Modal zeigt statt der Laufzeit-Buttons „Derzeit ausgebucht — frei ab
TT.MM." (frühestes `ends_at`). Ehrlich, einfach zu erklären, kein
Preis-Mechanik-Umbau.
- **Slider löst die Grenze auf:** Mit Hero-Slider (Punkt 1) skaliert die
Sichtbarkeit — alle aktiven Boosts rotieren durch die erste Position, die
Slot-Grenze kann dann höher liegen (oder als weiches Limit nur die
Slider-Länge deckeln, z. B. max. 8 Slides).
- **Zeitraum-Buchung wie im Anzeigengeschäft (später):** Boost bucht einen
konkreten Kalender-Zeitraum je Slot (Verfügbarkeitskalender im Modal).
Sauberste Lösung bei echter Nachfrage-Konkurrenz, aber deutlich mehr UI/Logik
— nichts für den Launch.
**Empfehlung für Montag:** Slot-Grenze (klein, z. B. 5/Ausgabe) + Hero-Slider
mit Rotation beschließen; Zeitraum-Buchung als spätere Ausbaustufe notieren.
**Hinweis [EXTERN]:** Die aktualisierte Boost-Note der Preise-Seite
(Leistungsbeschreibung, „was Sie bekommen und was nicht") sollte mit in die
anwaltliche Freigabe des Rechtstexte-Pakets.

View file

@ -32,6 +32,8 @@ R2.2+R2.3 erledigt: Hub-Landing komplett ueberarbeitet (datengetriebenes Tarif-G
**10.07. abends — API-Legacy-Paritaet (neues Arbeitsdokument `dev/release/api-legacy-paritaet.md`):** User-Vorgabe: /service-API muss beim Cutover verhaltensgleich zum Altsystem laufen. Alt-Vertrag vollstaendig aus dem Symfony-Code (`_businessportal24.com/`) extrahiert; Prod-Aktivitaets-Logs (User, `dev/api/` — enttrackt via .gitignore, Kundendaten!) ausgewertet: **ein echter Client (connektar), 5 Endpoints, Sofort-Publish beim POST belegt; 2 der 5 Endpoints (Company-/Kontakt-Create) laufen heute auf 410.** Entscheidungen: Sofort-Publish nachbilden + Admin-Schalter fuer KI-Pruefung der Legacy-Einlieferungen; Legacy-API und v1 bleiben getrennt; Ablehnungs-Rueckkanal spaeter in v1. S1+S2 noch am 10.07. umgesetzt: Legacy-Compat-Controller fuer die 5 connektar-Endpoints (inkl. Company-/Kontakt-Create, die vorher 410 liefen), Anlegen = Einreichen mit Sofort-Publish via Permission `api:immediate-publication` (WS-7: connektar zuweisen!), Admin-Schalter "KI-Pruefung Legacy-API" (neue app_settings-Tabelle, Toggle auf /admin/press-releases) + KI-Spalte/Pruef-Button in der Admin-PM-Liste; API-Einlieferer-Mails gehen an Pressekontakt/Firmen-Mail statt an den Einlieferer (User-Entscheidung). Tests: LegacyServiceParityTest. **Offen: S4 Testdaten (User-Vorgaben ausstehend), S5 Staging-Smoke, S7 Mailing.**
**13.07. — Boost-Platzierung entschieden + umgesetzt (Suite: 1222 gruen):** User-Entscheidung: harte Slot-Grenzen (5 Startseite, 3 je Branchenseite = exakt die sichtbaren Plaetze; Hero-Slider damit vorerst unnoetig, bleibt Ausbaustufe) + zweite Boost-Stufe **Kategorie-Boost** (nur Branchenseite, 50 % aufgerundet: 6/10/18 Credits; Startseiten-Boost unveraendert 12/20/35 inkl. Branchenseite). Umsetzung: `boosts.placement` + `BoostPlacement`-Enum, `credits.boost_category`/`boost_slots`, `BoostService::slotAvailability()` (je Portal x Sprache, Kategorie zusaetzlich je Rubrik; Verlaengerung haelt ihren Slot; ausgebucht -> Exception mit fruehestem freien Termin), Startseite zeigt nur Home-Boosts, Branchenseite Kategorie-Boosts mit Vorrang, Kategorie-Boost invalidiert nur Kategorie-Caches, Add-on-Panel mit zwei Angeboten + „Derzeit ausgebucht — frei ab"-Anzeige, Preise-/Buchungsseite + Lang-Keys (de/en) inkl. Slot-Hinweis in der Leistungsbeschreibungs-Note (**[EXTERN]: in anwaltliche Freigabe aufnehmen**). Details in `dev/release/boost-platzierung-offen.md`.
**Wiedereinstieg / naechste Schritte:**
1. ~~Klaerungsliste Rechtstexte~~ **erledigt 06.07.**; ~~R3.1-Restbacklog~~ **erledigt 06.07.** (siehe oben).
2. **[EXTERN]:** Postfach `info@pressekonto.com` anlegen (Haupt-Rechts-Mail, 06.07.); CONTACT_EMAIL_*-Support-Postfaecher je Brand; REPORT_EMAIL_* optional · R1.2 Stripe-Live · R1.4 Preisfreigabe · R5.4 Favicons · anwaltliche Freigabe AGB v0.6/Datenschutz v0.3. (~~Depublikations-Preis~~ entschieden: 35 EUR netto.)
@ -51,7 +53,7 @@ R2.2+R2.3 erledigt: Hub-Landing komplett ueberarbeitet (datengetriebenes Tarif-G
**Wartet auf Dich / extern (nicht durch mich abschliessbar):** R6.5 Branch merge + Release-Tag (Dein Go; Push ist erfolgt) · R1.2 Stripe-Live · R1.4 Preisfreigabe · R1.5 Refund-Entscheidung · (~~R2.5 legal-request-Texte~~ erledigt 10.07., Wortlaut aus freigegebenem Meldeverfahren) · R5.4 Favicons · R6.3 Staging-Rehearsal · R6.4 Go-Live-Kette · Postfach `info@pressekonto.com` · anwaltliche Freigabe.
**Thema für Montag (13.07., Entscheidung User):** Boost-Platzierung — Hero „Im Fokus" als Slider + Begrenzung gleichzeitiger Boosts. Ist-Stand, Risiko (mehr zahlende Boosts als sichtbare Plätze) und 3 Lösungsideen inkl. Empfehlung in `dev/release/boost-platzierung-offen.md`.
~~**Thema für Montag (13.07., Entscheidung User):** Boost-Platzierung~~ **entschieden + umgesetzt 13.07.** (Slot-Grenzen 5/3, Kategorie-Boost zu 50 %, Slider vertagt — s. Stand-Block + `dev/release/boost-platzierung-offen.md`).
**Bewusst nachgelagert (nicht Teil dieses Release):** Sentry/APM · User-Panel-Vollflow · Newsletter-DOI · EN-Rechtstexte · T11-DSA-Queue-Ausbau.

View file

@ -40,7 +40,7 @@ Staging-Rehearsal (R6.3) mit echtem Datenbestand wiederholen.
- [ ] **Blacklist blockiert Publish** — Automatisiert: `PressReleaseBlacklistTest`. Manuell: PM mit Blacklist-Wort einreichen → automatische Ablehnung mit Begründung.
- [ ] **Buchungsseite komplett**: Abo, Einzel-PM, Credits, Unternehmer-Checkbox (T1neu) — Automatisiert: `Billing/BookingsPageTest`, `Billing/CheckoutFlowTest`, `CreditTopupTest`. Manuell: Modal-Optik, USt-Aufschlüsselung, Checkbox-Zwang; Buchungs-/Verlängerungsdatum des Abos wird angezeigt (`SubscriptionPeriodResolver`, 09.07. — braucht Stripe-Daten, also Staging).
- [ ] **Tarifwechsel im Buchungs-Modal** (neu 07.07.) — Abo-Swap mit anteiliger Verrechnung, Downgrade ohne Gutschrift erst zum Periodenende, Kontingent-Sperre beim Wechsel. Automatisiert: `Billing/CheckoutFlowTest`. Manuell auf Staging: Upgrade + Downgrade je einmal durchspielen.
- [ ] **Add-ons Boost/Veröffentlichungsnachweis** — Buchung über Credits an der PM-Seite; Add-ons-Modal statt Toast bei fehlendem Guthaben (07.07.). Automatisiert: `BoostServiceTest`, `ProofPdfAndExtraPmTest`, `PressReleaseShowAddonsTest`. Manuell: Boost buchen, Nachweis-PDF herunterladen.
- [ ] **Add-ons Boost/Veröffentlichungsnachweis** — Buchung über Credits an der PM-Seite; Add-ons-Modal statt Toast bei fehlendem Guthaben (07.07.). **Neu 13.07.:** zwei Boost-Stufen (Startseiten-Boost 12/20/35, Kategorie-Boost nur Branchenseite 6/10/18) mit Slot-Grenzen (5 Startseite, 3 je Branchenseite) — bei vollem Inventar zeigt das Panel „Derzeit ausgebucht — frei ab TT.MM." statt der Kauf-Buttons. Automatisiert: `BoostServiceTest`, `ProofPdfAndExtraPmTest`, `PressReleaseShowAddonsTest`, `Web/BoostPlacementTest`. Manuell: beide Boost-Stufen buchen (Startseiten-Boost erscheint auf Start- + Branchenseite, Kategorie-Boost nur auf der Branchenseite), Nachweis-PDF herunterladen.
- [ ] **PM-Statistiken sichtbar** (neu 10.07.) — Kachel „Aufrufe" + „Geteilt" (mit Kanal-Aufschlüsselung) auf der Kunden-PM-Seite. Automatisiert: `Web/PressReleaseTrackingTest`. Manuell: PM im Frontend aufrufen/teilen → Zahlen steigen.
## D. Billing & Stripe (Staging mit Stripe-Testmode)