Doku: Boost-Platzierung entschieden + umgesetzt (Slot-Grenzen, Kategorie-Boost)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
7a32c66d11
commit
d92e0f65c8
3 changed files with 47 additions and 54 deletions
|
|
@ -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
|
Stand: 13.07.2026. Kontext: Boost-Add-on ist seit 10.07. Ende-zu-Ende live.
|
||||||
(Kauf-Modal mit Pflicht-Schalter + Verlängerungs-Hinweis, Ausspielung auf Start-
|
Die zwei offenen Punkte von Montag sind entschieden und umgesetzt.
|
||||||
und Branchenseite mit Badge „Top-Platzierung", sofortige Cache-Invalidierung,
|
|
||||||
Hinweis in der Kunden-PM-Liste). Zwei Dinge sind bewusst noch ungelöst.
|
|
||||||
|
|
||||||
## 1. Hero „Im Fokus" als Slider
|
## Entscheidung (User, 13.07.2026)
|
||||||
|
|
||||||
**Angedacht (User, 10.07.):** Das große Hero-Fenster der Startseite soll die
|
1. **Harte Slot-Grenzen:** max. **5** gleichzeitige Boosts auf der Startseite,
|
||||||
Top-Meldungen als Slider durchlaufen — insbesondere, wenn mehrere geboostete
|
max. **3** je Branchenseite (Kategorieseite) — die Grenzen entsprechen genau
|
||||||
PMs gleichzeitig aktiv sind.
|
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
|
## Umsetzung (13.07.2026, Suite: 1222 grün)
|
||||||
geboostete rutschen in die Seitenleiste „Was sonst zählt"
|
|
||||||
(`HomePageData` → `focus-hero.blade.php`). Branchenseite analog (Lead + 2 Top-Slots).
|
|
||||||
|
|
||||||
**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):**
|
**Hinweis [EXTERN]:** Die aktualisierte Boost-Note der Preise-Seite
|
||||||
`HomePageData` liefert statt einem `leadRelease` eine kleine Lead-Liste
|
(Leistungsbeschreibung, „was Sie bekommen und was nicht") sollte mit in die
|
||||||
(alle aktiven Boosts + jüngste Meldung als Abschluss-Slide). `focus-hero`
|
anwaltliche Freigabe des Rechtstexte-Pakets.
|
||||||
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.
|
|
||||||
|
|
|
||||||
|
|
@ -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.**
|
**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:**
|
**Wiedereinstieg / naechste Schritte:**
|
||||||
1. ~~Klaerungsliste Rechtstexte~~ **erledigt 06.07.**; ~~R3.1-Restbacklog~~ **erledigt 06.07.** (siehe oben).
|
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.)
|
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.
|
**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.
|
**Bewusst nachgelagert (nicht Teil dieses Release):** Sentry/APM · User-Panel-Vollflow · Newsletter-DOI · EN-Rechtstexte · T11-DSA-Queue-Ausbau.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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.
|
- [ ] **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).
|
- [ ] **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.
|
- [ ] **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.
|
- [ ] **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)
|
## D. Billing & Stripe (Staging mit Stripe-Testmode)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue