Files
fotospiel-app/docs/ops/howto-tenant-package-not-active.md
Codex Agent 10c99de1e2
Some checks failed
linter / quality (push) Has been cancelled
tests / ci (push) Has been cancelled
tests / ui (push) Has been cancelled
Migrate billing from Paddle to Lemon Squeezy
2026-02-03 10:59:54 +01:00

4.6 KiB
Raw Blame History

id, title, sidebar_label
id title sidebar_label
howto-tenant-package-not-active How-to Zahlung erfolgreich, Paket nicht aktiv Zahlung ok, Paket nicht aktiv

Dieses Howto beschreibt, wie du vorgehst, wenn ein Tenant meldet: „Zahlung war erfolgreich, aber mein Paket ist nicht aktiv / Galerie bleibt limitiert.“

1. Informationen vom Tenant einsammeln

Bevor du nachschaust:

  • TenantID oder TenantSlug.
  • Betroffenes Paket (Name oder Beschreibung, z.B. „ProPaket 79 €“).
  • Zeitpunkt der Zahlung (Datum/Uhrzeit, ggf. Screenshot).
  • Ggf. Auszug aus der Lemon SqueezyBestätigung (ohne vollständige Kartendaten!).

Diese Infos erlauben dir, die korrekte Transaktion sowohl in Lemon Squeezy als auch im Backend zu finden.

2. Lemon Squeezy-Status prüfen

  1. Im Lemon SqueezyDashboard:
    • Suche nach EMail, TenantName oder der vom Tenant genannten OrderID.
    • Stelle sicher, dass die Zahlung dort als „paid“/„completed“ markiert ist.
  2. Notiere:
    • Lemon SqueezyOrderID und ggf. CheckoutID.
    • Status (paid/processing/failed/cancelled).

Wenn Lemon Squeezy die Zahlung nicht als erfolgreich zeigt, ist dies primär ein Finance/CustomerTopic ggf. mit Customer Support klären, ob eine neue Zahlung oder Klärung mit dem Kunden notwendig ist.

3. Backend-Status prüfen

Mit bestätigter Zahlung in Lemon Squeezy:

  1. checkout_sessions:
    • Suche nach Sessions des Tenants (tenant_id) mit dem betroffenen package_id:
    • Achte auf status (erwartet completed) und provider = lemonsqueezy.
    • Prüfe provider_metadata auf lemonsqueezy_last_event, lemonsqueezy_status, lemonsqueezy_checkout_id, lemonsqueezy_order_id.
    • Wenn du die Session über Lemon SqueezyMetadaten finden möchtest:
      • lemonsqueezy_checkout_id oder lemonsqueezy_order_id verwenden.
  2. package_purchases:
    • Prüfe, ob ein Eintrag für (tenant_id, package_id) mit passender ProviderReferenz existiert:
      • z.B. provider = 'lemonsqueezy', provider_id = OrderID.
  3. tenant_packages:
    • Prüfe, ob es einen aktiven Eintrag für (tenant_id, package_id) gibt:
      • active = 1, expires_at in der Zukunft.

4. Webhook-/Verarbeitungsstatus untersuchen

Wenn checkout_sessions noch nicht auf completed steht oder tenant_packages nicht aktualisiert wurden:

  1. Logs prüfen:
    • storage/logs/laravel.log und ggf. billingChannel.
    • Suche nach Einträgen von LemonSqueezyWebhookController / CheckoutWebhookService rund um den Zahlungszeitpunkt.
  2. Typische Ursachen:
    • Webhook nicht zugestellt (Netzwerk/SSL).
    • Webhook konnte die Session nicht auflösen ([CheckoutWebhook] Lemon Squeezy session not resolved).
    • IdempotenzLock (Lemon Squeezy lock busy) hat dazu geführt, dass Event nur teilweise verarbeitet wurde.

5. Korrektur-Schritte

5.1 Automatischer Replay (empfohlen)

  1. Im Lemon SqueezyDashboard:
    • Den betreffenden order_*Event finden.
    • WebhookReplay auslösen.
  2. In den Logs beobachten:
    • Ob CheckoutWebhookService::handleLemonSqueezyEvent() diesmal die Session findet und CheckoutAssignmentService::finalise() ausführt.
  3. Nochmal checkout_sessions und tenant_packages prüfen:
    • Session sollte auf completed stehen, Paket aktiv sein.

5.2 Manuelle Korrektur (Notfall)

Nur anwenden, wenn klare Freigabe vorliegt und Lemon Squeezy die Zahlung eindeutig als erfolgreich listet.

  1. tenant_packages aktualisieren:
    • Entweder neuen Eintrag anlegen oder bestehenden für (tenant_id, package_id) so setzen, dass:
    • active = 1,
    • purchased_at und expires_at zu Lemon SqueezyDaten passen.
  2. package_purchases ergänzen:
    • Sicherstellen, dass die Zahlung als Zeile mit provider = 'lemonsqueezy', provider_id = OrderID und passender price existiert (für spätere Audits).
  3. Konsistenz prüfen:
    • Admin UI für Tenant öffnen und prüfen, ob Limits/Paketstatus jetzt korrekt angezeigt werden.
  4. Dokumentation:
    • Den Vorgang im Ticket oder als bd-Issue (falls wiederkehrend) dokumentieren.

6. Kommunikation mit dem Tenant

  • Sobald der BackendStatus korrigiert ist:
    • Kurz bestätigen, dass das Paket aktiv ist und welche Auswirkungen das hat (z.B. neue Limits, verlängerte Galerie).
  • Falls Lemon Squeezy die Zahlung nicht als erfolgreich führt:
    • Ehrlich kommunizieren, dass laut Zahlungsprovider noch keine endgültige Zahlung vorliegt und welche Optionen es gibt (z.B. neue Zahlung, Klärung mit Bank/Kreditkarte).

Dieses Howto sollte dem Support/OnCall helfen, den gängigsten BillingFehlerfall strukturiert abzuarbeiten. Für tiefere Ursachenanalysen siehe docs/ops/billing-ops.md.