Feature

Rabatt-Codes: Kategorie- & Plan-Beschränkungen + Backstop-Cron

2. Juni 2026 // Highlight

Discount-Codes lassen sich jetzt strukturiert beschränken — kein rohes JSON mehr, sondern Checkboxen.

Im Admin → Einstellungen → Rabattaktionen findest du beim Anlegen eines Codes neue Checkbox-Gruppen:

  • Print-Kategorien (Photograph-Codes): Fotobücher, Wandbilder, Kalender, Kissen, Phone-Cases, Tassen, Postkarten. Anhaken = Code gilt nur für diese Auswahl. Leer = Code gilt für alle Print-Bestellungen.
  • Plan-Tiers (Platform-Codes, nur Kevin sichtbar): Trial, Core, Founding Core, Pro. Anhaken = Code nur einlösbar wenn Photograph zu einem dieser Plans wechselt. Leer = gilt für alle Plan-Wechsel.

Bestehende Codes ohne Restrictions verhalten sich unverändert — kein Migrations-Aufwand für deine laufenden Aktionen.

Versucht ein Kunde einen Code auf eine nicht-erlaubte Kategorie anzuwenden, bekommt er eine klare Meldung („Code gilt nicht für diese Produkt-Kategorie") statt einer kryptischen Stripe-Fehlermeldung erst nach dem Submit.

Backstop-Cron gegen verlorene Reservierungen. Wenn ein Kunde im Checkout den Tab schließt und Stripe weder das completed- noch das expired-Event sendet (z. B. Webhook-Endpoint kurz down, Quota-Drop), blieb bisher der Code-Slot bis in alle Ewigkeit reserviert. Ein Code mit max_uses=10 und 10 abgebrochenen Checkouts wäre faktisch ausgeschöpft, obwohl niemand bezahlt hat.

Frames trackt ab jetzt jede Reservation in einer eigenen Tabelle und ein nightly Cron-Job (api/cron/discount-cleanup) released alle Reservierungen, die nach 24 Stunden weder committed noch released wurden. Damit „heilen" sich Code-Slots automatisch — egal wie launisch das Stripe-Webhook-Wetter gerade ist.