Club Billing Runbook¶
Stand: 2026-03-22
Gilt für:beta.targetshot.app,staging, Club-Plus-Billing mit Stripe + Keygen
Dieses Runbook beschreibt den normalen Club-Billing-Lifecycle und die wichtigsten Recovery-Fälle für Admins und Support.
Normaler Ablauf¶
- Im Bereich
Club Billingdie primäre AktionClub Plus kaufenstarten. - Stripe öffnet den Checkout und leitet danach mit
stripe=successzurück auf/club-billing. - Das Backend versucht zuerst
finalize-sessionund fällt bei Bedarf aufreconcilezurück. - Die Club-Lizenz wird auf denselben Club gebucht und danach nach Keygen synchronisiert.
- Sobald
billingProvider = stripeplusbillingCustomerIdoderbillingSubscriptionIdvorhanden sind, wechselt die UI aufBilling verwalten. - Wenn ein Admin aus TargetShot heraus
Abo kündigenstartet, setzt TargetShotcancel_at_period_end = truedirekt über die Backend-API bei Stripe und gleicht die Vereinslizenz anschließend sofort neu ab. - Wenn eine vorgemerkte Kündigung wieder zurückgenommen werden soll, nutzt der Admin in TargetShot die Aktion
Kündigung zurücknehmen. Diese setztcancel_at_period_end = falsedirekt über Stripe und gleicht die Vereinslizenz anschließend sofort neu ab. - Zusätzlich läuft serverseitig ein periodischer Stripe-Reconcile-Pass, der Stripe-Status, Club-Lizenz und Keygen regelmäßig still gegeneinander abgleicht.
Sichtbare Admin-Zustände¶
-
Bereit für neuen CheckoutBedeutung: Es gibt noch keinen aktiven Stripe-Lifecycle für diesen Club. Aktion:Club Plus kaufen -
Checkout oder Recovery offenBedeutung: Es existiert bereits ein Checkout- oder Recovery-Fall, aber Stripe und Club-Lizenz sind noch nicht vollständig synchron. Aktion:Stripe synchronisieren -
Stripe verwaltet BillingBedeutung: Stripe-Referenzen sind vollständig vorhanden und das Billing-Portal kann genutzt werden. Aktion:Billing verwalten -
Kündigung vorgemerktBedeutung: Die Kündigung ist in Stripe bereits zum Laufzeitende hinterlegt, Club Plus bleibt bisvalidUntilaktiv. Aktion:Kündigung zurücknehmenoderBilling verwalten -
Synchronisierung läuftBedeutung: Der Return-Flow oder ein manueller Recovery-Lauf ist noch in Arbeit. Aktion: warten, danach Status neu laden
Recovery-Fälle¶
1. Rückkehr von Stripe, aber Lizenz bleibt unvollständig¶
- Im Club-Billing bleibt die Hauptaktion auf
Stripe synchronisieren. - Diese Aktion prüft, ob ein offener Checkout fortgesetzt werden muss oder ob Stripe bereits abgeschlossen wurde und nur noch in die Club-Lizenz zurückgeschrieben werden muss.
- Zusätzlich sollte der serverseitige Reconcile-Pass denselben Drift später automatisch wieder einfangen, auch wenn ein Webhook verspätet war.
2. Alter Checkout ist abgelaufen¶
Stripe synchronisierengibt den Zustandstripe_checkout_expiredzurück.- Danach kann ein neuer Checkout gestartet werden.
3. Stripe ist gebucht, Keygen aber fehlgeschlagen¶
billingProviderist bereitsstripe, aberprovisioningState = failed.- In diesem Fall nicht noch einmal kaufen.
- Stattdessen im Keygen-Bereich
Keygen erneut synchronisierenverwenden.
4. Billing-Portal öffnet nicht¶
- Das Portal steht nur bereit, wenn
billingCustomerIdvorhanden ist. - Wenn die UI statt
Billing verwaltenwiederStripe synchronisierenzeigt, zuerst den Recovery-Lauf durchziehen.
5. Kündigung wurde in Stripe bestätigt, aber der Status bleibt unverändert¶
- Bevorzugt die In-App-Aktion
Abo kündigenverwenden. Sie setzt die Kündigung direkt in Stripe und liefert die neu reconciled Vereinslizenz zurück, ohne Portal-Redirect. - Wenn die Kündigung stattdessen im generischen Billing-Portal vorgenommen wurde und der Status danach unverändert bleibt,
Stripe synchronisierenmanuell starten. - Danach prüfen, ob
accessState = cancel_scheduledund eine Restlaufzeit sichtbar sind.
6. Kündigung wurde zurückgenommen, aber TargetShot zeigt weiter Kündigung vorgemerkt¶
- Bevorzugt direkt die In-App-Aktion
Kündigung zurücknehmenverwenden. Sie aktualisiert Stripe und reconciled die Vereinslizenz sofort im selben Flow. - Wenn die Rücknahme außerhalb von TargetShot im generischen Billing-Portal erfolgt ist, ist
return_urldort nur ein Rück-Link. Danach in TargetShotStripe synchronisierenoderNeu ladenausführen. - Danach prüfen, ob
accessState = activeodertrialist undcancelAtPeriodEndnicht mehr gesetzt ist.
7. Checkout/Subscription an falschen Club gebunden¶
- Fehlerbilder wie
stripe_checkout_attached_to_other_cluboderstripe_checkout_conflicts_with_existing_club_billingnicht lokal überschreiben. - Stripe-Referenzen und Club-Zuordnung auf Backend-/Stripe-Seite prüfen, bevor weitergeschrieben wird.
Staging-Smoke¶
- Auf
stagingmit einem Club-Admin einen Checkout starten. - Stripe erfolgreich abschließen.
- Nach Return prüfen:
- Hauptaktion wechselt von
Club Plus kaufenaufBilling verwaltenoder kurzzeitigStripe synchronisieren billingProvider = stripebillingCustomerIdoderbillingSubscriptionIdsind gesetztprovisioningStateistprovisionedoder zeigt klar einen Recovery-BedarfStripe synchronisiereneinmal manuell ausführen und sicherstellen, dass kein zweiter Checkout erzeugt wird.Billing verwaltenöffnen und verifizieren, dass das Portal für denselben Club aufgeht.Abo kündigenaus TargetShot starten und verifizieren:- es erscheint nur die In-App-Bestätigung, kein Stripe-Redirect
- der Status zeigt
Kündigung vorgemerktbzw.Endet zum Laufzeitende - Club Plus bleibt bis
validUntilweiter aktiv - Danach in TargetShot
Kündigung zurücknehmenverwenden und verifizieren: - der Status springt wieder auf
Aktiv Kündigung vorgemerktverschwindet- Club Plus bleibt ohne neuen Checkout nutzbar
- Falls Keygen absichtlich gestört wurde,
Keygen erneut synchronisierentesten.
Nicht über dieses Runbook lösen¶
- Produktbegriff-/Plan-Mapping (
Free,Pro,Club Plus) - allgemeine Notification-Probleme
- mobile Push-/Inbox-Themen
Diese Themen liegen in separaten Sprint-Tasks.