Skip to main content

Voraussetzungen

Bevor Sie beginnen, benötigen Sie:
  • Ein Händlerkonto bei Dodo Payments
  • Einen API-Schlüssel aus Developer → API Keys im Dashboard, gespeichert in DODO_PAYMENTS_API_KEY
  • Ein Webhook-Secret aus Developer → Webhooks, gespeichert in DODO_PAYMENTS_WEBHOOK_KEY
  • Mindestens ein unter Products erstelltes Abonnementprodukt
Weitere Informationen finden Sie unter Voraussetzungen für die Integration.

API-Integration

Checkout Sessions

Erstellen Sie ein Abonnement, indem Sie eine Checkout Session mit Ihrem Abonnementprodukt erstellen. Der Kunde autorisiert eine Zahlungsmethode, und das Abonnement wird aktiviert, sobald er den Checkout abschließt.
Sie können Abonnementprodukte und einmalige Produkte in derselben Checkout Session kombinieren. Dadurch werden Einrichtungsgebühren, Hardware-Bundles mit SaaS und ähnliche Anwendungsfälle ermöglicht. Beispiele finden Sie unter Checkout Sessions.

API-Antwort

Die Antwort enthält eine checkout_url:
Leiten Sie den Kunden an diese URL weiter. Er autorisiert die Zahlungsmethode, und das Abonnement wird aktiviert.

Webhooks

Webhooks benachrichtigen Ihren Server, wenn Abonnementereignisse auftreten. Richten Sie Ihren Endpunkt unter Developer → Webhooks im Dashboard ein. Informationen zum Einrichten Ihres Webhook-Endpunkts finden Sie unter Webhooks.

Abonnementereignistypen

Verfolgen Sie diese Ereignisse, um den Lebenszyklus des Abonnements zu verwalten:
  1. subscription.active — Das Abonnement wurde aktiviert
  2. subscription.updated — Ein Feld des Abonnements wurde geändert
  3. subscription.on_hold — Eine Belastung für eine Verlängerung oder Planänderung ist fehlgeschlagen
  4. subscription.failed — Die Erstellung des Abonnements ist fehlgeschlagen (endgültig; der Kunde muss sich erneut abonnieren)
  5. subscription.renewed — Eine wiederkehrende Belastung war erfolgreich
  6. subscription.past_due — Eine Verlängerung ist fehlgeschlagen und die Kulanzfrist wurde gestartet; der Kunde behält den Zugriff bis past_due_ends_at
  7. subscription.plan_changed — Der Plan wurde hoch- oder heruntergestuft oder geändert
  8. subscription.cancelled — Das Abonnement wurde gekündigt
  9. subscription.expired — Das Abonnement hat das Ende seiner Laufzeit erreicht
Dies sind die wichtigsten Ereignisse. Die vollständige Liste, einschließlich paused, unpaused und update_payment_method, finden Sie unter Subscription Webhooks.
Verwenden Sie subscription.updated, um Echtzeitbenachrichtigungen über Änderungen an Abonnements zu erhalten und den Zustand Ihrer Anwendung ohne regelmäßige API-Abfragen synchron zu halten.

Zahlungsszenarien

Erfolgreicher Zahlungsverlauf Die Reihenfolge der Webhooks hängt davon ab, ob das Abonnement eine Testphase hat. Sofortige Abrechnung (0 Testtage):
  1. subscription.active: Das Mandat wird autorisiert und das Abonnement aktiviert.
  2. payment.succeeded: Bestätigt die erste Belastung. Dieses Ereignis wird innerhalb von 2–10 Minuten nach dem Checkout erwartet.
Mit einer Testphase:
  1. Zu Beginn der Testphase (Checkout): subscription.active wird ausgelöst, sobald die Zahlungsmethode autorisiert wurde. Noch keine wiederkehrende Belastung. Die erste tatsächliche Belastung wird bis zum Ende der Testphase aufgeschoben.
  2. Am Ende der Testphase: Der wiederkehrende Betrag wird belastet, und Sie erhalten payment.succeeded zusammen mit subscription.renewed.
Jede nachfolgende Verlängerung:
  • subscription.renewed: Wird bei jedem Abrechnungszyklus ausgelöst, wenn die Zahlung für die Verlängerung eingezogen wird, immer zusammen mit payment.succeeded. Das Ereignis enthält außerdem die aktualisierte next_billing_date.
Immer wenn Geld für ein Abonnementprodukt tatsächlich eingezogen wird, erhalten Sie subscription.renewed und payment.succeeded. Verwenden Sie subscription.renewed (statt ausschließlich payment.succeeded) als Signal, den Zugriff für den nächsten Zyklus zu verlängern.
Szenarien bei fehlgeschlagenen Zahlungen
  1. Fehler beim Abonnement
  • subscription.failed – Die Erstellung des Abonnements ist fehlgeschlagen, weil kein Mandat erstellt werden konnte.
  • payment.failed – Zeigt eine fehlgeschlagene Zahlung an.
  1. Abonnement pausiert
  • subscription.on_hold – Das Abonnement wird aufgrund einer fehlgeschlagenen Verlängerungszahlung oder einer fehlgeschlagenen Belastung für eine Planänderung pausiert. Wenn Ihr Unternehmen eine Kulanzfrist hat, wechselt eine fehlgeschlagene Verlängerung zunächst zu past_due (subscription.past_due) und erst nach Ablauf der Kulanzfrist zu on_hold (oder cancelled, abhängig von Ihren Einstellungen für die Kulanzfrist). Siehe Abonnementstatus.
  • Wenn ein Abonnement pausiert wird, verlängert es sich nicht automatisch, bis die Zahlungsmethode aktualisiert wurde.
Best Practice: Um die Implementierung zu vereinfachen, empfehlen wir, zur Verwaltung des Lebenszyklus eines Abonnements hauptsächlich die Abonnementereignisse zu verfolgen.
Eine vollständige Anleitung zum Lesen von error_code/error_message, zur Entscheidung, wann ein erneuter Versuch erfolgen soll, und zur Anzeige von Fehlern für Kunden finden Sie unter Fehlgeschlagene Zahlungen verarbeiten.

subscription.failed vs. subscription.on_hold

Diese beiden Ereignisse können leicht verwechselt werden, erfordern jedoch eine sehr unterschiedliche Behandlung:
subscription.failed ist endgültig. Das Abonnement kann nicht reaktiviert werden. Der Kunde muss ein neues Abonnement erstellen. Gewähren Sie niemals Berechtigungen, wenn dieses Ereignis ausgelöst wird.

Umgang mit pausierten Abonnements

Wenn ein Abonnement in den Status on_hold wechselt, müssen Sie die Zahlungsmethode aktualisieren, um es zu reaktivieren. In diesem Abschnitt wird erklärt, wann Abonnements pausiert werden und wie Sie damit umgehen.

Wann Abonnements pausiert werden

Ein Abonnement wird pausiert, wenn:
  • Eine Verlängerungszahlung fehlschlägt: Die automatische Belastung für die Verlängerung schlägt aufgrund unzureichender Deckung, einer abgelaufenen Karte oder einer Ablehnung durch die Bank fehl
  • Die Belastung für eine Planänderung fehlschlägt: Eine sofortige Belastung bei einer Hoch- oder Herabstufung des Plans schlägt fehl
  • Die Autorisierung der Zahlungsmethode fehlschlägt: Die Zahlungsmethode kann für wiederkehrende Belastungen nicht autorisiert werden
Abonnements im Status on_hold werden nicht automatisch verlängert. Sie müssen die Zahlungsmethode aktualisieren, um das Abonnement zu reaktivieren.

Abonnements aus dem pausierten Status reaktivieren

Um ein Abonnement aus dem Status on_hold zu reaktivieren, verwenden Sie die Update Payment Method API. Dadurch wird automatisch:
  1. Eine Belastung für ausstehende Beträge erstellt
  2. Eine Rechnung für die Belastung erstellt
  3. Die Zahlung mit der neuen Zahlungsmethode verarbeitet
  4. Das Abonnement nach erfolgreicher Zahlung in den Status active reaktiviert
1

Handle subscription.on_hold webhook

Wenn Sie einen subscription.on_hold-Webhook erhalten, aktualisieren Sie den Status Ihrer Anwendung und benachrichtigen Sie den Kunden:
2

Update payment method

Wenn der Kunde bereit ist, seine Zahlungsmethode zu aktualisieren, rufen Sie die Update Payment Method API auf:
Sie können auch eine vorhandene ID einer Zahlungsmethode verwenden, wenn der Kunde Zahlungsmethoden gespeichert hat:
3

Monitor webhook events

Überwachen Sie nach der Aktualisierung der Zahlungsmethode diese Webhook-Ereignisse:
  1. payment.succeeded – Die Belastung für ausstehende Beträge war erfolgreich
  2. subscription.active – Das Abonnement wurde reaktiviert

Beispiel einer Nutzlast für ein Abonnementereignis


Abonnementpläne ändern

Sie können einen Abonnementplan über den API-Endpunkt zum Ändern des Plans hoch- oder herabstufen. Dadurch können Sie das Produkt, die Menge und die Proration des Abonnements ändern.

Change Plan API Reference

Ausführliche Informationen zum Ändern von Abonnementplänen finden Sie in unserer Dokumentation zur Change Plan API.

Proration-Optionen

Beim Ändern von Abonnementplänen stehen Ihnen vier Optionen für die sofortige Belastung zur Verfügung:

1. prorated_immediately

  • Schreibt den ungenutzten Anteil des aktuellen Abrechnungszyklus gut, anteilig nach der verbleibenden Zeit. Das Guthaben umfasst den Basisplan, die Menge und alle Add-ons
  • Belastet anschließend einen vollständigen Zyklus zum neuen Plan, zur neuen Menge und zu den neuen Add-ons. Die Belastung selbst wird nie anteilig berechnet
  • Netto-Sofortbelastung = (vollständiger neuer Zyklus) minus (verbleibender Anteil x vollständiger alter Zyklus). Ist das Guthaben höher, wird die Differenz als abonnementbezogenes Guthaben für künftige Verlängerungen zurückgehalten
  • Während einer Testphase wird der Benutzer sofort auf den neuen Plan umgestellt und der Kunde direkt belastet

2. full_immediately

  • Belastet dem Kunden den vollständigen Abonnementbetrag für den neuen Plan, ohne eine Gutschrift für den vorherigen Zyklus
  • Sowohl bei einer Hoch- als auch bei einer Herabstufung zahlt der Kunde den vollständigen Preis des neuen Plans von Anfang an
  • Nützlich, wenn Sie unabhängig von der verbleibenden Zeit des alten Plans den vollständigen Betrag berechnen möchten

3. difference_immediately

  • Der Kunde zahlt nur die Differenz zwischen dem Preis des alten und des neuen Plans
  • Der Betrag hängt nicht davon ab, wann im Zyklus die Änderung vorgenommen wird. Dasselbe Upgrade kostet am ersten und am 29. Tag gleich viel
  • Bei einer Hochstufung wird dem Kunden die Differenz sofort berechnet. Beispiel: $30/Monat → $80/Monat = sofort berechnete $50
  • Bei einer Herabstufung wird die Preisdifferenz als abonnementbezogenes Guthaben gespeichert und automatisch auf künftige Verlängerungen angerechnet. Beispiel: $50/Monat → $20/Monat = $30 als Guthaben gespeichert

4. do_not_bill

  • Wendet die Planänderung sofort an, ohne zum Zeitpunkt der Änderung eine Belastung vorzunehmen. Der neue Plan, die neue Menge und die neuen Add-ons können sofort genutzt werden
  • Da jetzt nichts belastet wird, erhält der Kunde bei einer Hochstufung den höherwertigen Plan für den Rest des aktuellen Zyklus kostenlos. Eine Herabstufung tritt sofort in Kraft, ohne Gutschrift für den ungenutzten Anteil des bereits bezahlten Zyklus
  • Über do_not_bill gewährte Add-ons werden bei einer späteren Planänderung nicht gutgeschrieben, da sie nie berechnet wurden. Bei einer nachfolgenden Änderung wird die neue Add-on-Menge vollständig berechnet
  • Der aktualisierte Plan (sowie Menge/Add-ons) wird bei der nächsten geplanten Verlängerung berechnet, und das ursprüngliche Abrechnungsdatum bleibt erhalten
Alle drei Modi mit „sofortiger Belastung“ setzen den Abrechnungszyklus zurück. prorated_immediately, difference_immediately und full_immediately verschieben die next_billing_date des Abonnements auf das Änderungsdatum. Nur do_not_bill behält das ursprüngliche Verlängerungsdatum bei, führt jedoch zu keiner sofortigen Belastung.

Verhalten

  • Wenn Sie diese API aufrufen, leitet Dodo Payments sofort eine Belastung auf Grundlage der ausgewählten Proration-Option ein
  • Bei prorated_immediately wird bei jeder Änderung, sowohl bei einer Hoch- als auch bei einer Herabstufung, eine Gutschrift für den ungenutzten Anteil des aktuellen Zyklus berechnet. Übersteigt diese Gutschrift die Belastung für den neuen Zyklus, wird der Rest dem Guthaben des Abonnements hinzugefügt. Diese Gutschriften gelten nur für dieses Abonnement und werden ausschließlich zum Ausgleich künftiger wiederkehrender Zahlungen desselben Abonnements verwendet
  • Bei difference_immediately entspricht der Nettobetrag immer exakt der Preisdifferenz. Bei Herabstufungen wird der Überschuss als abonnementbezogenes Guthaben gespeichert, ebenso wie bei prorated_immediately
  • Die Option full_immediately überspringt die Guthabenberechnung und berechnet den vollständigen Betrag des neuen Plans
  • Die Option do_not_bill wendet die Änderung sofort an, verschiebt die Abrechnung jedoch auf das nächste Verlängerungsdatum, das beibehalten wird
Auswahl eines Proration-Modus:
  • difference_immediately — Der Kunde zahlt die Preisdifferenz. Die vorhersehbarste Option; die Belastung ist unabhängig davon, wann im Zyklus die Änderung vorgenommen wird, immer gleich.
  • prorated_immediately — Dem Kunden wird nur die ungenutzte Zeit des aktuellen Zyklus gutgeschrieben. Die Belastung variiert abhängig davon, wann im Zyklus die Änderung erfolgt.
  • full_immediately — Der Kunde zahlt den vollständigen Betrag des neuen Plans. Keine Gutschrift für den vorherigen Zyklus.
  • do_not_bill — Keine sofortige Belastung. Der neue Plan wird bei der nächsten Verlängerung berechnet. Der einzige Modus, der das ursprüngliche Abrechnungsdatum beibehält.

Verarbeitung der Belastung

  • Die bei einer Planänderung eingeleitete sofortige Belastung wird normalerweise in weniger als 2 Minuten verarbeitet
  • Wenn diese sofortige Belastung aus irgendeinem Grund fehlschlägt, wird das Abonnement automatisch pausiert, bis das Problem behoben ist

On-Demand-Abonnements

Mit On-Demand-Abonnements können Sie Kunden flexibel belasten, nicht nur nach einem festen Zeitplan. Diese Funktion ist für alle Konten verfügbar.
So erstellen Sie ein On-Demand-Abonnement: Verwenden Sie zum Erstellen eines On-Demand-Abonnements den API-Endpunkt POST /checkouts und fügen Sie das Feld subscription_data.on_demand in den Request-Body ein. Dadurch können Sie eine Zahlungsmethode ohne sofortige Belastung autorisieren oder einen benutzerdefinierten Anfangspreis festlegen.
POST /subscriptions ist veraltet. Es funktioniert weiterhin für bestehende Integrationen, neue Integrationen sollten On-Demand-Abonnements jedoch über eine Checkout Session (POST /checkouts) mit subscription_data.on_demand erstellen. Den aktuellen Ablauf finden Sie im Leitfaden zu On-Demand-Abonnements.
So belasten Sie ein On-Demand-Abonnement: Verwenden Sie für nachfolgende Belastungen den Endpunkt POST /subscriptions//charge und geben Sie den Betrag an, der dem Kunden für diese Transaktion berechnet werden soll.
Eine vollständige Schritt-für-Schritt-Anleitung (einschließlich Request-/Response-Beispielen, sicheren Richtlinien für erneute Versuche und der Verarbeitung von Webhooks) finden Sie im Leitfaden zu On-Demand-Abonnements.

Wichtige Informationen zur Abonnementabrechnung

Legen Sie den Abonnementzeitraum länger als die Zahlungshäufigkeit fest. Wenn der Abonnementzeitraum der Zahlungshäufigkeit entspricht (z. B. Zeitraum = 1 Monat, Häufigkeit = 1 Monat), ist das Abonnement für einen einzigen Zyklus gültig und wechselt anschließend zu expired, anstatt verlängert zu werden. Legen Sie für einen fortlaufenden monatlichen Plan einen langen Abonnementzeitraum (z. B. 20 Jahre) mit monatlicher Zahlungshäufigkeit fest.
Die Währung wird bei der ersten erfolgreichen Belastung festgelegt. Übergeben Sie billing_currency und billing_address.country beim Erstellen des Checkouts immer explizit. Wenn sie nicht angegeben werden, werden sie anhand der IP-Adresse des Kunden ermittelt (Adaptive Currency). Sobald das Abonnement erstmals belastet wird, ist die Währung für seine gesamte Laufzeit festgelegt. Ein Kunde kann sie später nicht ändern, wenn er reist.
Bei Testphasen wird eine Autorisierung über $0 und keine Belastung vorgenommen. Wenn ein Abonnement eine Testphase hat, wird zu deren Beginn eine Mandatsautorisierung über $0 erstellt, um die Karte zu speichern; die erste tatsächliche Belastung erfolgt am Ende der Testphase. In der Zahlungsliste wird bei einem Abonnement mit kostenloser Testphase genau eine Zahlung mit total_amount von 0 angezeigt. Bei einer kostenpflichtigen Testphase wird stattdessen trial_amount im Voraus berechnet.
Lebenszyklus des Abonnements: past_due = Eine Verlängerung ist fehlgeschlagen und die Kulanzfrist läuft (der Kunde behält den Zugriff). on_hold = Eine Verlängerung ist fehlgeschlagen (wiederherstellbar: Fordern Sie den Kunden auf, seine Zahlungsmethode zu aktualisieren; Dunning-Wiederholungen werden angewendet). expired = Die Laufzeit ist ohne Verlängerung abgelaufen und das Abonnement kann nicht reaktiviert werden. Der Kunde muss sich erneut abonnieren. cancelled = Vom Kunden oder Händler beendet. Die meisten Fehler bei Verlängerungen sind Ablehnungen auf Seiten des Kartenherausgebers (unzureichende Deckung, Karte abgelehnt) und kein Fehler von Dodo.
Indische Karten verwenden ein RBI-E-Mandat. Off-Session-Belastungen (Verlängerungen und Belastungen für Planänderungen) können bis zu etwa 48 Stunden für die Abwicklung benötigen, und wiederkehrende automatische Abbuchungen über ₹15.000 erfordern eine erneute Kundenauthentifizierung (daher kann ein Upgrade, das dieses Limit überschreitet, nicht das bestehende Mandat verwenden). Solange eine Belastung noch den Status processing hat, schlägt eine zweite Belastung desselben Abonnements mit “Cannot create new charge as previous payment is not successful yet.” fehl. Nicht-indische Karten werden nahezu sofort bestätigt.
Für Abonnementbelastungen gilt ein Mindestbetrag von $1 (oder der entsprechende Betrag in der jeweiligen Währung). Beträge von $0.01–$0.99 werden mit product_price: value out of range abgelehnt. Ein Abonnementprodukt mit einem Preis von genau $0 ist zulässig; siehe Karte optional bei einem Preis von null. Um eine Karte ohne Belastung zu autorisieren, verwenden Sie eine On-Demand-Setup mandate_only.

Zugehörige API-Referenz

Create Subscription (Deprecated)

Veraltete API zum direkten Erstellen eines Abonnements. Verwenden Sie für neue Integrationen Checkout Sessions

Change Subscription Plan

API-Referenz zum Hoch- oder Herabstufen sowie Ändern von Abonnementplänen mit Proration-Optionen

Update Payment Method

API-Referenz zum Aktualisieren von Zahlungsmethoden und Reaktivieren pausierter Abonnements

Patch Subscription

API-Referenz zum Aktualisieren von Abonnementdetails und der Konfiguration
Zuletzt geändert am 26. September 2026