Abos & Zahlungen · 3 Min. Lesezeit
Abos über Stripe und In-App-Käufe kombinieren
Wer Abos im Web und in der iOS-App verkauft, hat zwei Kassen: Stripe und Apples In-App-Kauf. Kunden erwarten trotzdem ein Konto. Bei LeasePilot landet deshalb jeder Kauf als Abo mit Kanal, Tarif, Status und Ablaufdatum im Backend, und den gültigen Tarif berechnet das Backend, nicht die App.

8. Oktober 2026 · AutorTassilo
Wer in der App nichts verkauft, braucht keinen In-App-Kauf
Schaltet eine iOS-App Funktionen gegen Bezahlung frei, muss sie Apples In-App-Kauf nutzen (Richtlinie 3.1.1). Eine kostenlose Begleit-App zu einem bezahlten Web-Dienst kommt dagegen ohne ihn aus, solange sie weder selbst verkauft noch auf einen Kauf außerhalb hinweist (Richtlinie 3.1.3(f)).
Diesen einfacheren Weg gehen BKF Manager und Tactio. Er passt, wenn Kunden ohnehin im Browser buchen, was bei Software für Unternehmen oft der Fall ist. Wer Privatkunden direkt in der App gewinnen will, braucht in der Regel den In-App-Kauf.
LeasePilot hat beides: Die Tarife Plus und Pro gibt es im Web über Stripe und in der iPhone-App über den App Store. Abos aus dem Web darf die App freischalten, weil es sie auch als In-App-Kauf gibt (Richtlinie 3.1.3(b)). Zwei Kassen also, aber ein Konto.
Ein Konto, zwei Bezahlwege
Im Backend hat jedes Abo einen Kanal (App Store oder Stripe), einen Tarif (Plus oder Pro), einen Status und ein Ablaufdatum. Nach jedem Kauf, jeder Verlängerung und jedem Ablauf berechnet das Backend den Tarif des Kontos neu: Es zählt das höchste gültige Abo, egal aus welchem Kanal.
Gültig bleibt ein Abo auch, solange Stripe eine fehlgeschlagene Zahlung (invoice.) erneut versucht. Limits wie die Zahl der Fahrzeuge prüft die API gegen die Datenbank, nicht gegen das Login-Token. Ein neuer Tarif gilt deshalb sofort, ohne neue Anmeldung.
Die App kauft, das Backend entscheidet
Mit StoreKit 2 ist jede Transaktion von Apple signiert. Die App schickt sie ans Backend, das die Signatur prüft und den Kauf dem Konto zuordnet. Abgeschlossen wird erst danach:
func buy(_ product: Product) async throws {
guard case .success(let result) = try await product.purchase(),
case .verified(let transaction) = result else { return }
try await backend.confirm(signedTransaction: result.jwsRepresentation)
await transaction.finish() // erst nach der Bestätigung durch das Backend
}Bis dahin liefert StoreKit die offene Transaktion beim nächsten Start erneut, laut Apple nur einmal, gleich nach dem Start. Der Listener auf Transaction. gehört deshalb an den App-Start.
Von Verlängerungen und Kündigungen erfährt das Backend direkt, über App Store Server Notifications (Version 2) und Stripe-Webhooks. Einen Status setzt es erst, wenn die Signatur stimmt. Apples Benachrichtigungen findet es über die originalTransactionId, deshalb meldet die angemeldete App den Erstkauf, und ein Kauf gehört genau einem Konto. Im Web übernimmt die Konto-ID in den Metadaten von Stripe Checkout diese Rolle.
Auf die Bezahlseite gehören Links, keine Web-Preise
Bei Abos prüft Apple vor allem, ob Kunden vor dem Abschluss wissen, was sie bekommen. Eine LeasePilot-Version fiel genau da durch: Auf der Bezahlseite fehlte der Link zu den Nutzungsbedingungen (Richtlinie 3.1.2(c)). Seitdem verlinkt sie AGB und Datenschutz.
Die Preise dürfen abweichen, und von Käufen im Store behält Apple eine Provision ein. LeasePilot schreibt deshalb auf die Preisseite: „Preise im Apple App Store können abweichen.“ In der App stehen nur die Preise aus StoreKit.
Auf günstigere Web-Preise hinweisen darf eine App nur im US-Store und in der EU unter Apples gesonderten Bedingungen, auch dort mit Provision. Unsere Apps verzichten darauf.
Was wir mitnehmen
Freigeschaltet wird im Backend. Die App kauft und meldet, das Backend rechnet. Google Play Billing wäre dort ein weiterer Kanal nach demselben Muster.
Den einfacheren Weg zuerst prüfen. Verkauft die App selbst nichts, entfällt der In-App-Kauf samt zweiter Kasse. Was Apple bei unseren Einreichungen sonst beanstandet hat, steht in Eine App in App Store und Google Play bringen.
Quellen
- Apple: App Review Guidelines (Abschnitt 3.1, Zahlungen) (öffnet in neuem Tab)
- Apple: StoreKit – Transaction (öffnet in neuem Tab)
- Apple: App Store Server Notifications (öffnet in neuem Tab)
- Apple: Apps im EU-Store (Digital Markets Act) (öffnet in neuem Tab)
- Stripe: Webhooks für Abonnements (öffnet in neuem Tab)

Über den Autor
Tassilo
Gründer & Geschäftsführer bei ayonto, verantwortlich für die Entwicklung sowie Vertrieb und Kundenkontakt.
Aus der Praxis
- LeasePilot – Leasing-Kilometerstand immer im Blick — Prognose mit Ampel bis Vertragsende, automatischer km-Stand für Tesla und Abo-Abrechnung über App Store oder Stripe.
- BKF Manager – Digitale Komplettlösung für Modul 95 & BGQ — von Online-Buchung und QR-Check-In über Lernportal und Rechnungswesen bis zum KBA-konformen XML-Export.
- Tactio – Multi-Tenant-SaaS für taktische Simulation-Events — Airsoft, Paintball und MilSim mit Live-Lagebild, eigenen Vektorkarten, Scoring-Engine und Verifikation vor Ort.
FAQ
Kurz beantwortet
Kurz beantwortet zu „Abos über Stripe und In-App-Käufe kombinieren“.
Muss meine iOS-App In-App-Käufe anbieten?
Wenn sie Funktionen gegen Bezahlung freischaltet, ja (Richtlinie 3.1.1). Ausnahme sind kostenlose Begleit-Apps zu einem bezahlten Web-Dienst, die weder selbst verkaufen noch auf einen Kauf außerhalb hinweisen (Richtlinie 3.1.3(f)).
Kann ein Kunde in App und Web gleichzeitig ein Abo haben?
Technisch ja, jeder Kanal rechnet für sich ab. Bei LeasePilot gilt dann das höhere der beiden Abos.
Ratgeber
Weiter lesen
- Apps & StoresEine App in App Store und Google Play bringen
- Karten & BetriebEigener Kartenserver: wann er sich lohnt und wann nicht
- Texterkennung & KameraFQN-Karte per Kamera auslesen statt abtippen


Fragen zu Ihrem Projekt?
Erzählen Sie uns, was Sie vorhaben – Tassilo und Ricardo melden sich persönlich bei Ihnen.
ayonto · Berlin-Lichtenberg