docs: Bienenpatenschaft mit SEPA-Schutz, Stripe-Einrichtung und Abo-Stufen je Monat
Docker Image bauen und veroeffentlichen / lint (push) Canceled after 0s
Docker Image bauen und veroeffentlichen / typecheck (push) Canceled after 0s
Docker Image bauen und veroeffentlichen / test (push) Canceled after 0s
Docker Image bauen und veroeffentlichen / build-and-push (push) Canceled after 0s

Abo-Stufen 1 bis 24 je bezahltem Monat, danach VIP. SEPA fuer Abos mit
Neukunden-Frist, Verzug und Sperre nach Rueckbuchung. Stripe-Einrichtung
erst im Testmodus per Skript, Livemodus nur nach Freigabe.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
This commit is contained in:
Nick SzaunigandClaude Opus 5.5 committed 2026-10-16 10:04:27 +02:00
1 parent 4bcf90a8d9
commit 86f2145115
1 file changed
+70 -20
@@ -318,11 +318,10 @@ Das betrifft nur die digitale Darstellung, nicht den Druck.
### 3. Abo-Stufen und VIP (Teilprojekt 5) ### 3. Abo-Stufen und VIP (Teilprojekt 5)
- Grundlage: ununterbrochen bezahlte Abo-Dauer. - Grundlage: ununterbrochen bezahlte Abo-Monate.
- Vorgabe des Inhabers: Stufen bis 24, danach eine Stufe ohne Zahl, „VIP“, - Vorgabe: Stufe 1 bis 24, je bezahltem Monat eine Stufe, danach eine Stufe
als Zeichen besonders hoher Wertschätzung. Ob die 24 Jahre oder Monate ohne Zahl, „VIP“, als Zeichen besonders hoher Wertschätzung. Die Schwellen
meint, ist offen (siehe „Offene Fragen“). Die Schwellen sind im Admin sind im Admin pflegbar und lassen sich ohne Codeänderung anpassen.
pflegbar, damit sich das ohne Codeänderung anpassen lässt.
- VIP bekommt eine eigene Medaille und eine VIP-Kennzeichnung im Konto. Weitere - VIP bekommt eine eigene Medaille und eine VIP-Kennzeichnung im Konto. Weitere
Vorteile (Rabatt, Versand) gehören nicht zum Umfang und lassen sich später Vorteile (Rabatt, Versand) gehören nicht zum Umfang und lassen sich später
über die bestehenden Rabattcodes ergänzen. über die bestehenden Rabattcodes ergänzen.
@@ -453,10 +452,8 @@ hat:
- Nach der Ernte: Der Inhaber legt im Admin die Erntefenster fest. Geliefert - Nach der Ernte: Der Inhaber legt im Admin die Erntefenster fest. Geliefert
wird im nächsten Fenster, sobald seit der letzten Lieferung mindestens sechs wird im nächsten Fenster, sobald seit der letzten Lieferung mindestens sechs
Monate bezahlt sind. Monate bezahlt sind.
- Bezahlt heißt: Stripe meldet die Rechnung als bezahlt. Bei SEPA-Lastschrift - Bezahlt heißt: Stripe meldet die Rechnung als bezahlt, bei SEPA zusätzlich
ist eine Rückbuchung bis acht Wochen möglich. Empfehlung: Abos zuerst nur mit die Regeln unter „SEPA-Lastschrift und Rückbuchungen“.
Karte und Wallets (Apple Pay, Google Pay) anbieten. SEPA ist eine
Entscheidung des Inhabers.
- Fehlgeschlagene Zahlung: Stripe versucht es automatisch erneut. Solange das - Fehlgeschlagene Zahlung: Stripe versucht es automatisch erneut. Solange das
Abo im Verzug ist, entsteht keine Lieferung. Scheitern alle Versuche, endet Abo im Verzug ist, entsteht keine Lieferung. Scheitern alle Versuche, endet
das Abo wie bei einer Kündigung. das Abo wie bei einer Kündigung.
@@ -466,6 +463,59 @@ hat:
- Widerruf innerhalb von 14 Tagen: Bis dahin ist kein Honig verschickt, es - Widerruf innerhalb von 14 Tagen: Bis dahin ist kein Honig verschickt, es
entsteht kein Warenverlust. entsteht kein Warenverlust.
### SEPA-Lastschrift und Rückbuchungen
Abos lassen sich mit Karte, Apple Pay, Google Pay und SEPA-Lastschrift
bezahlen.
Grenze, die keine Einstellung aufhebt: Bei einer SEPA-Lastschrift kann der
Kunde acht Wochen lang ohne Angabe von Gründen bei seiner Bank die Erstattung
verlangen, bei einer nicht autorisierten Lastschrift 13 Monate lang. Das ist
Bankrecht. Stripe kann es nicht verhindern und solche Rückbuchungen nicht
anfechten. Stripe berechnet dafür außerdem eine Gebühr. Der Schutz liegt
deshalb in der Lieferlogik von Wabenhain:
1. Lieferung nur gegen bezahlte Monate (siehe oben). Eine Rückbuchung kann
höchstens Honig betreffen, der schon bezahlt erschien.
2. Neukunden-Frist: Bei SEPA zählt die erste Abo-Zahlung eines Kontos erst
nach einer Frist für den Lieferanspruch. Vorgabe 56 Tage, also die
Acht-Wochen-Frist. Die erste Lieferung kommt dadurch bei SEPA etwas später,
alle weiteren normal. Die Frist ist im Admin einstellbar (0 schaltet sie
ab). Die Verkaufsseite nennt sie bei der Zahlart.
3. Rückbuchung erkannt (`charge.dispute.created`, im Webhook schon
abonniert): Das Abo geht sofort auf `IM_VERZUG`, offene Lieferungen werden
gestoppt und ihre Reservierung freigegeben, die Abo-Stufe ruht. Der Kunde
bekommt eine Mail mit der Bitte, den Betrag zu begleichen. Der Fall
erscheint in der Aufmerksamkeitsliste.
4. Wird der Betrag nicht binnen 14 Tagen bezahlt, endet das Abo wie bei einer
Kündigung. Der Anspruch auf den Betrag bleibt bestehen. Ob er eingefordert
wird, entscheidet der Inhaber.
5. Ein Konto mit einer Rückbuchung kann neue Abos nur noch mit Karte oder
Wallet abschließen. Der Admin kann diese Sperre aufheben.
### Stripe-Einrichtung
Die Einrichtung erfolgt in Teilprojekt 4, zuerst im Testmodus, dann
identisch im Livemodus. Was per API geht, legt ein Einrichtungsskript im Repo
an (wiederholbar, ohne Geheimnisse im Code). Was nur im Dashboard geht,
steht als Checkliste in `docs/EINRICHTUNG.md`.
- Zahlarten für Abo-Checkout: Karte, Apple Pay, Google Pay, SEPA-Lastschrift
(Mandat wird im Checkout erteilt).
- Billing: Smart Retries für fehlgeschlagene Zahlungen, nach dem letzten
Versuch Abo kündigen. Stripe-eigene Kundenmails zu Rechnungen aus, weil
Wabenhain eigene Rechnungen und Mails schickt.
- Kundenportal: nur Zahlungsart ändern. Kündigung und Tarifwechsel im Portal
aus, weil die Kündigung über den eigenen Kündigungsbutton läuft.
- Webhook-Endpunkt: bestehende Ereignisse plus
`customer.subscription.created`, `customer.subscription.updated`,
`customer.subscription.deleted`, `invoice.paid`,
`invoice.payment_failed`, `charge.dispute.closed`.
- Produkte und Preise der Abo-Angebote legt der Admin über Wabenhain an,
nicht von Hand im Stripe-Dashboard.
- Tests mit Stripe Test Clocks (Abo über mehrere Monate) und
SEPA-Testkonten, darunter eines, das eine Rückbuchung auslöst.
### Lieferaufträge ### Lieferaufträge
Ein täglicher Lauf im CronJob `wabenhain-certificates` prüft fällige Ein täglicher Lauf im CronJob `wabenhain-certificates` prüft fällige
@@ -585,14 +635,16 @@ vorherigen Revision. Medaillen sind ebenso versioniert.
(eindeutig), Status (`AKTIV`, `IM_VERZUG`, `GEKUENDIGT`, `BEENDET`), (eindeutig), Status (`AKTIV`, `IM_VERZUG`, `GEKUENDIGT`, `BEENDET`),
Beginn, Kündigung wirksam zum, Ende Beginn, Kündigung wirksam zum, Ende
- `SubscriptionPayment`: Abo, `stripeInvoiceId` (eindeutig), bezahlt am, - `SubscriptionPayment`: Abo, `stripeInvoiceId` (eindeutig), bezahlt am,
Betrag, Wabenhain-Rechnung, zählt für Lieferung (ja/nein) Betrag, Zahlart, zählt für Lieferung ab (Datum, bei SEPA-Neukunden nach
der Frist), zurückgebucht am, Wabenhain-Rechnung
- `SubscriptionDelivery`: Abo, fällig am, Gläser, Status, erzeugte Bestellung - `SubscriptionDelivery`: Abo, fällig am, Gläser, Status, erzeugte Bestellung
- `HarvestWindow`: Zeitraum, geplante Abo-Gläser je Angebot - `HarvestWindow`: Zeitraum, geplante Abo-Gläser je Angebot
- `SponsorshipTransfer`: Patenschaft, Token-Hash, gültig bis, erstellt von, - `SponsorshipTransfer`: Patenschaft, Token-Hash, gültig bis, erstellt von,
eingelöst von, eingelöst am, widerrufen am eingelöst von, eingelöst am, widerrufen am
- `LoyaltyLevel`: Art (`STAMMKUNDE`, `ABO`), Schwelle, Name, Medaillendesign; - `LoyaltyLevel`: Art (`STAMMKUNDE`, `ABO`), Schwelle, Name, Medaillendesign;
VIP als Stufe ohne Zahl VIP als Stufe ohne Zahl
- `Customer.stripeCustomerId` - `Customer.stripeCustomerId`, `Customer.sepaBlockedAt` (gesetzt nach einer
Rückbuchung)
Statuswerte der Patenschaft: `AUSSTEHEND`, `FEHLER`, `BEREIT`, `GEDRUCKT`. Statuswerte der Patenschaft: `AUSSTEHEND`, `FEHLER`, `BEREIT`, `GEDRUCKT`.
Aktiv, abgelaufen und gekündigt werden aus Daten berechnet. Aktiv, abgelaufen und gekündigt werden aus Daten berechnet.
@@ -762,6 +814,9 @@ Originalgröße. 3D-Ansicht auf Desktop, 390 px mobil, mit
- Bestand: Einzelverkauf kann reservierte Abo-Gläser nicht kaufen; - Bestand: Einzelverkauf kann reservierte Abo-Gläser nicht kaufen;
Kontingent voll stoppt neue Abos Kontingent voll stoppt neue Abos
- doppelte Stripe-Abo-Ereignisse: eine Rechnung, eine Zahlung - doppelte Stripe-Abo-Ereignisse: eine Rechnung, eine Zahlung
- SEPA: erste Zahlung zählt erst nach der Neukunden-Frist; Rückbuchung
stoppt Lieferungen, setzt das Abo in Verzug, sperrt SEPA für das Konto;
ohne Ausgleich endet das Abo nach 14 Tagen
- Treuestufen: Erstattung senkt die Stammkunden-Stufe - Treuestufen: Erstattung senkt die Stammkunden-Stufe
- E2E (Playwright): Einmalkauf mit Stripe-Testkarte bis zur 3D-Ansicht im - E2E (Playwright): Einmalkauf mit Stripe-Testkarte bis zur 3D-Ansicht im
Konto; Abo-Abschluss mit Stripe-Testuhr (Test Clock) über drei Monate Konto; Abo-Abschluss mit Stripe-Testuhr (Test Clock) über drei Monate
@@ -783,13 +838,6 @@ Kontrolle und einer Vorführung. Gesamtabnahme:
8. Druck- und Korrekturablauf im Admin 8. Druck- und Korrekturablauf im Admin
9. offene geschäftliche Konfiguration (Liste unten) 9. offene geschäftliche Konfiguration (Liste unten)
## Offene Fragen an den Inhaber
1. Abo-Stufen „bis 24“: Jahre oder Monate? Die Schwellen sind pflegbar, die
Antwort bestimmt nur die Vorgabe.
2. SEPA-Lastschrift für Abos anbieten (Rückbuchungsrisiko bis acht Wochen)
oder zuerst nur Karte und Wallets?
## Geschäftliche Konfiguration vor Veröffentlichung ## Geschäftliche Konfiguration vor Veröffentlichung
1. Preise kaufmännisch prüfen: Einmalpakete und Abo-Monatspreise mit Honig, 1. Preise kaufmännisch prüfen: Einmalpakete und Abo-Monatspreise mit Honig,
@@ -802,8 +850,10 @@ Kontrolle und einer Vorführung. Gesamtabnahme:
„nach bezahlten Monaten“, Übertragung auf eigene Verantwortung. Rechtlich „nach bezahlten Monaten“, Übertragung auf eigene Verantwortung. Rechtlich
prüfen lassen. prüfen lassen.
5. Datenschutzerklärung: Namen Dritter, Speicherdauer, Stripe Billing. 5. Datenschutzerklärung: Namen Dritter, Speicherdauer, Stripe Billing.
6. Stripe: Billing aktivieren, Kundenportal nur für Zahlungsart einrichten, 6. Stripe-Livemodus freigeben: Die Einrichtung (siehe „Stripe-Einrichtung“)
Webhook-Ereignisse ergänzen. läuft erst im Testmodus. Den Livemodus stellt das Skript erst nach
ausdrücklicher Freigabe des Inhabers um. Neukunden-Frist für SEPA
bestätigen (Vorgabe 56 Tage).
7. Versandstaffel für Patenschaftspakete anlegen. 7. Versandstaffel für Patenschaftspakete anlegen.
8. Logo als SVG oder PNG mit mindestens 300 dpi hochladen. 8. Logo als SVG oder PNG mit mindestens 300 dpi hochladen.
9. Material bevorraten: Urkundenpapier (200–250 g/m², matt, naturweiß), 9. Material bevorraten: Urkundenpapier (200–250 g/m², matt, naturweiß),