Communitygithub.com

Stripe Connect & Abonnement-Abrechnung

Agent-Fähigkeit zur Erstellung von Stripe Connect Marktplatz-Abrechnungen und Plattform-Abonnement-Abrechnung – getrennte Zahlungen und Überweisungen, Connected-Account-Onboarding, Treuhand- und Rollreserven, idempotente Webhooks, Wiederholung und Rückbuchung von Überweisungen, Dunning bei Off-Session-Zahlungen und Kontenabstimmung – in Next.js App Router.

Was ist Stripe Connect & Abonnement-Abrechnung?

Diese Fähigkeit implementiert eine vollständige Stripe-Connect-Marktplatz-Abrechnung und Plattform-Abonnement-Abrechnung in einer Next.js App Router-Anwendung. Sie unterstützt zwei getrennte Geldflüsse: eine Marktplatz-Zahlung, die den Käufer einmal belastet und die Erlöse auf mehrere Verkäufer verteilt (Connect, getrennte Zahlungen und Überweisungen), und eine Plattform-Abonnement-Abrechnung, die den Verkäufern eine wiederkehrende Gebühr per Off-Session-Zahlung berechnet. Sie behandelt kritische Edge Cases wie unabhängig fehlschlagende Überweisungen, fehlgeschlagene Zahlungen von Käufern, idempotente Webhook-Verarbeitung, Treuhand- und Rollreserven, Wiederholung fehlgeschlagener Überweisungen, Dunning für ausstehende Abonnements und Kontenabstimmung. Die Fähigkeit ist strikt serverseitig – sie bringt keine UI-Komponenten mit, sondern stellt klare Schnittstellen (Contracts) zur Verfügung, die der Host (die Anwendung) mit eigener Benutzerverwaltung, Authentifizierung, Datenbank und Scheduler implementieren muss. Sie setzt auf die Connect-Architektur mit getrennten Zahlungen und Überweisungen (separate charges and transfers), nicht auf Destination Charges, und verwendet `transfer_group` und `source_transaction`, um Zahlungen und Auszahlungen korrekt zuzuordnen.

Funktioniert mit~Claude Code~Codex CLI~Cursor
npx skills add timerise-ai/stripe-connect-subscriptions

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Was macht Stripe Connect & Abonnement-Abrechnung?

Zwei Geldflüsse auf einem Stripe-Konto. Ein Marktplatz belastet den Käufer einmal und verteilt die Erlöse an mehrere Verkäufer (Connect, getrennte Zahlungen und Überweisungen). Ein Plattform-Abonnement belastet diese Verkäufer mit einer wiederkehrenden Gebühr off-session (Billing). Sie teilen sich einen Client, ein Webhook-Paar und einen Geldtyp.

Die Erkenntnis, die alles prägt: Die Zahlung des Käufers und die Auszahlungen an die Verkäufer schlagen unabhängig voneinander fehl. Bis die Abrechnung ausgeführt wird, ist das Geld bereits bewegt; daher darf eine abgelehnte Überweisung niemals die Zahlung oder den Webhook zum Scheitern bringen und muss später erneut ausführbar sein, ohne jemanden doppelt zu bezahlen.

Wann verwendet werden

  • Eine Zahlung wird auf mehrere Verkäufer aufgeteilt, wobei die Plattform eine Provision erhält.
  • Verkäufer onboarden zu Connect und werden verzögert ausgezahlt (Treuhand, Reserven, KYC).
  • Die Plattform berechnet ihren eigenen Verkäufern eine wiederkehrende Gebühr von einer gespeicherten Karte.
  • Ein Connected Account sieht gesund aus, hat aber noch nie Geld erhalten.

Wann NICHT verwenden

Nicht diesStattdessen verwenden
Einzel-Verkäufer-Checkout, ohne AufteilungStripe Checkout / Payment Element direkt
PayPal Marketplace Onboarding + AuszahlungenEine PayPal-Fähigkeit; nur die Nahtstellen sind gemeinsam
Karten-UI, Payment Element StylingIhr Designsystem; diese Fähigkeit ist serverseitig

Architektur

kunde ──zahlung (plattform-konto, transfer_group = orderId)──▶ plattform-guthaben
                │  abrechnung-fan-out (webhook ODER read-path-sync; belegter claim)
   ┌────────────┴──┬────────────────────────┬────────────────┐
   ▼               ▼                        ▼                ▼
überweisung:verkäufer  überweisung:partner    treuhand-reserve    rollende-reserve
(source_transaction = die zahlung)      (release_at)    (% einbehalten)
   │                                        │  release-treuhand-cron
   ▼                                        ▼
connected guthaben ◀── wiederholen-überweisungen  auszahlbar-guthaben ──▶ auszahlung (KYC/risiko-beschränkt)
                      (nicht finanzierte beine)

plattform ──off_session PaymentIntent (kunde + gespeicherte zahlungsmethode)──▶ abonnement-rechnung
             dunning: 3 versuche, 3 tage abstand, dann sperren

Kritische Fakten

  1. Getrennte Zahlungen und Überweisungen, niemals Destination Charges. Eine Zahlung hat genau ein destination; ein Multi-Verkäufer-Warenkorb benötigt N Überweisungen unter einer transfer_group, daher ist application_fee_amount nicht nutzbar.
  2. Eine Überweisung ohne source_transaction bezieht sich auf das verfügbare Guthaben und wird abgelehnt, während die Zahlung noch abgerechnet wird; bei einem jungen Plattform-Konto ist das jede Überweisung. Dieses eine Flag ermöglicht es, eine Aufteilung zu finanzieren, während die Zahlung noch abgerechnet wird.
  3. Stripe-Überweisungen sind grenzüberschreitend nur innerhalb US/CA/UK/EEA/CH möglich. Eine Plattform außerhalb dieser Regionen zahlt nur an Connected Accounts im eigenen Land. Stripe erzwingt dies zum Zeitpunkt der Überweisung, nicht beim Onboarding; daher wenden die Vorlagen die Regionsregel beim Onboarding an.
  4. Connect-Events haben ein anderes Signing-Secret als Plattform-Events. Zwei Endpunkte, zwei Secrets, eine URL – gegen beide verifizieren.
  5. Das Land eines Connected Accounts ist unveränderlich – falsches Land bedeutet erneutes Onboarding, keine Korrektur.
  6. Geld ist niemals ein Float – numeric(19,4)-Strings durchgängig, bigint-Mathematik, Minor-Units nur an der SDK-Grenze.

Harte Regeln

Lassen Sie niemals zu, dass eine fehlgeschlagene Überweisung die Abrechnung zum Scheitern bringt. Erfassen Sie das Bein als nicht finanziert und fahren Sie fort. Die Zahlung war bereits erfolgreich, daher muss auch der Webhook erfolgreich sein; der Wiederholungs-Cron finanziert das Bein später.

Behandeln Sie niemals einen doppelten Webhook-Insert als "bereits bearbeitet". Der Insert ist ein Claim; die Wiederholung nach einem Absturz während der Verarbeitung führt die Handler erneut aus, sodass jedes Event genau einmal vollständig ausgeführt wird.

Senden Sie niemals eine Überweisung erneut, ohne Stripe zu fragen, ob sie bereits existiert. Ein als nicht finanziert erfasstes Bein, weil die Antwort verloren ging, wird doppelt bezahlt, sobald das 24-Stunden-Idempotenz-Fenster von Stripe verstrichen ist.

Leiten Sie die Exklusivität der Abrechnung niemals von einem Status-Flag ab, das am Ende geschrieben wird. Zwei Aufrufer erreichen die Abrechnung routinemäßig; ein atomarer, belegter Claim stellt sicher, dass Bestand und Überweisungen einmalig stattfinden.

Buchen Sie niemals mehr zurück als den verbleibenden Spielraum einer Überweisung. Gestapelte Rückbuchungen (Gateway-Gebühr, dann eine Rückerstattung) werden nach dem ursprünglichen Betrag abgelehnt.

Schnellstart

  1. Modellieren Sie das Geld – money.md, data-model.md, store.md.
  2. Client, duale Webhook-Secrets, Umgebung – stripe-adapter.md.
  3. Onboarding von Accounts; zuerst die Regionsregel prüfen – connect-accounts.md.
  4. Empfangen von Events idempotent – webhooks.md.
  5. Abrechnung: Claim, Fan-Out, Treuhand, Reserve – settlement.md.
  6. Konvergenz: Beine wiederholen, Gebühren abgleichen – reconciliation.md.
  7. Abrechnung der Mieter – subscriptions.md; ausführen mit operations.md.

Passen Sie es an Ihre App an mit adaptation.md; der Prüfpfad ist in provenance.md dokumentiert.

Anpassungsvertrag

NahtstelleDie Fähigkeit liefertDer Host liefert
Domain-EntitätenTenant (Verkäufer-Org), Order, VendorOrder, PartnerEigene Vokabeln
Tenant-BereichEine serverseitig abgeleitete tenantIdOrg / Workspace / Verkäufer
Auth-GuardEine Adapter-Signatur pro RouteClerk, NextAuth, Supabase, benutzerdefiniert
DatenzugriffEin PaymentsStore-Contract + SQLEigenes ORM / SDK
Audit + BenachrichtigungenAufrufstellen, Event-Namen, Payload-FormenEigene Audit-Tabelle / Outbox
HintergrundarbeitVier Crons und ihr RhythmusEigener Scheduler
ValidierungEin Schema-Formular pro Route-Bodyzod / valibot / yup
UINichts – diese Fähigkeit ist serverseitigAlles

Referenzverzeichnis

SzenarioTrigger-SchlüsselwörterReferenz
Warum dieses Geldmodellseparate charges and transfers, destination charge, application_fee_amount, transfer_group, ledgerarchitecture.md
Tabellen, Spalten, RLSschema, migration, payment_intents, transfers, escrow_holds, webhook_eventsdata-model.md
Der Datenzugriffsvertragstore, repository, atomic claim, conditional update, ORMstore.md
Beträge und Rundungnumeric, bigint, minor units, distribute, largest remainder, centsmoney.md
Client- und Adapter-CodestripeClient, apiVersion, constructEvent, whsec_, PaymentIntent, refund, payoutstripe-adapter.md
Onboarding, Account-ZustandExpress, Accounts v2, account.updated, charges_enabled, acct_, country, regionconnect-accounts.md
Sicheres Empfangen von Eventsidempotency, duplicate, replay, raw body, signature, invalid_signaturewebhooks.md
Aufteilen einer bezahlten Bestellungsettlement, fan-out, source_transaction, escrow, reserve, single-flightsettlement.md
Beheben von nicht gelandeten Zahlungenretry, unfunded, backoff, adopt, gateway fee, clawback, reversal, headroomreconciliation.md
Wiederkehrende PlattformgebührenSetupIntent, off_session, saved card, dunning, invoice, past_due, suspendsubscriptions.md
Einrichtung, Umgebung, Crons, DebuggingSTRIPE_SECRET_KEY, webhook endpoint, stripe listen, cron, "merchant never paid"operations.md
Anpassung an diese Appadapt, host probe, rename, ORM, auth guard, portadaptation.md
Der Prüfpfadprovenance, deviation, kept, added, unverifiedprovenance.md

Verwandte Skills