Plan-Upgrade & All-Inclusive
PilotWie der Kunde im Self-Service-Portal von Trial auf Subscription oder auf das All-Inclusive-Bundle upgraded, und welche Stripe-Events dabei getriggert werden.
Phase 2 · 1st-Level-Hilfe
Welche Upgrade-Pfade gibt es?
| Von | Nach | Ausloeser |
|---|---|---|
| Trial | Subscription (Single-Plugin) | Stripe-Checkout → konkrete Plugin-Price-ID |
| Trial | All-Inclusive-Bundle | Stripe-Checkout → PriceIdAllInclusive |
| Subscription (Single) | All-Inclusive | Stripe-Checkout → PriceIdAllInclusive (Downgrade alter Sub in Stripe) |
| Grace Period | Subscription (re-aktiv) | Stripe-Checkout → gewuenschte Price-ID, alte Subscription vorher storniert |
| Suspended | Subscription (re-aktiv) | Erfolgreicher Stripe-Checkout reaktiviert das Konto automatisch (vgl. SubscriptionUpdatedHandler) |
Wie der Kunde upgraded (Schritt-fuer-Schritt)
Plugin-Detail-Seite im Portal
Kunde oeffnet https://portal.sellx.dev/plugins/{slug} und klickt „Upgrade to {Plan}“.
Stripe-Checkout startet
Portal ruft POST /api/v2/checkout/create (CheckoutController) auf. sellx_central erzeugt eine Stripe-Checkout-Session mit mode: subscription, success_url und cancel_url.
Kunde bezahlt im Stripe-Widget
Kunde wird zu Stripe-Checkout weitergeleitet, gibt Zahlungsdaten ein, stimmt zu. Bei Erfolg: Redirect auf success_url = portal.sellx.dev/checkout/success.
Webhook verarbeitet Subscription
Stripe sendet checkout.session.completed + customer.subscription.created + invoice.payment_succeeded an /api/v2/webhooks/stripe. HMAC-validiert, idempotent.
Lizenz-Activation (oder Bundle-Sync)
SubscriptionCreatedHandler prueft die priceId:
- Bei
PriceIdAllInclusive→IAllInclusiveService.ActivateAllInclusiveAsync - Sonst →
LicenseService.CreateLicenseAsyncmitlicense_model = subscription
Hub aktiviert nach naechstem Heartbeat
Der Hub sieht die neue Lizenz im naechsten Heartbeat (max. 60s), laedt .sql.enc herunter, entschluesselt, Plugin ist sofort nutzbar.
Was beim Upgrade von Trial auf Subscription passiert
Beim ersten erfolgreichen invoice.payment_succeeded waehrend aktiver Trial-Phase triggert der SubscriptionUpdatedHandler den Auto-Convert:
// Pseudo: handler-Logik
if (customer.subscription_status == "trialing"
&& invoice.status == "paid")
{
await db.Licenses
.Where(l => l.CustomerId == customer.Id
&& l.LicenseModel == LicenseModel.Trial)
.ExecuteUpdateAsync(setters => setters
.SetProperty(l => l.LicenseModel, LicenseModel.Subscription)
.SetProperty(l => l.ExpiresAt, subscription.CurrentPeriodEnd)
);
auditLog.Info("license.auto_converted", customer.Id);
}Kunde sieht im Portal sofort „Subscription aktiv“statt „Trial aktiv“. Trial-Resttage verfallen — es zaehlt nur noch die Stripe-Subscription-Periode.
Was beim Wechsel auf All-Inclusive passiert
All-Inclusive ist additiv — bestehende Single-Plugin-Lizenzen bleiben erhalten, der Kunde bekommt zusaetzlich alle aktuellen + kuenftigen Plugins.
- 1. Stripe-Subscription mit PriceIdAllinclusive wird angelegt (parallel zur bestehenden Single-Plugin-Sub, falls vorhanden).
- 2. Atomic-Activation ueber
IAllInclusiveServicefuegt pro aktuellem Plugin eineall_inclusive_inclusions-Zeile ein. - 3. AuditLog
all_inclusive.activationmit Plugin-Liste als Target. - 4. SyncNewPluginAsync (Background-Job) sorgt dafuer, dass auch neue Plugins aus sellx_distribution automatisch inkludiert werden.
FAQ
Was kostet der Wechsel von Subscription auf All-Inclusive?
Stripe rechnet automatisch ab: alte Subscription wird sofort storniert (keine Rueckerstattung fuer ungenutzte Tage), All-Inclusive startet mit neuer Periode.
Wann sehe ich das Plugin im Hub nach dem Upgrade?
Nach naechstem Hub-Heartbeat — bis zu 60 Sekunden. Der Hub holt die Lizenz automatisch und entschluesselt die .sql.enc-Files ohne Neustart.
Kann ich jederzeit zurueck von All-Inclusive auf Single-Plugin?
Ja — Stripe-Checkout auf Single-Plugin-Price-ID startet. Beim Periodenwechsel deaktiviert sellx_central automatisch die All-Inclusive-Inklusionen fuer Plugins ohne Single-Lizenz.
Funktioniert Upgrade auch ohne Kreditkarte (im Trial)?
Nein — Upgrade erfordert Stripe-Checkout mit gueltigem Zahlungsmittel. SEPA (Mollie) folgt in Phase 3, aktuell nur Kreditkarte.