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.
Du kannst ein Subscription-Produkt mit Einmalprodukten in derselben Checkout Session kombinieren. So lassen sich Einrichtungsgebühren, Hardware-Bundles mit SaaS und ähnliche Anwendungsfälle umsetzen. Beispiele findest du unter Checkout Sessions.Du kannst außerdem zwei oder mehr Subscription-Produkte in einem Checkout verkaufen. Der Kunde zahlt einmal und erhält für jedes Produkt eine unabhängige Subscription mit eigenem Abrechnungszyklus. Ein solcher Warenkorb kann keine Einmalprodukte enthalten. Siehe Multi-Subscription Cart.

API Response

Die Response enthält ein checkout_url:
Leite den Kunden an diese URL weiter. Er autorisiert die Zahlungsmethode, und die Subscription wird aktiviert.

Webhooks

Webhooks benachrichtigen deinen Server, wenn Subscription-Ereignisse auftreten. Richte deinen Endpoint im Dashboard unter Developer → Webhooks ein. Informationen zum Einrichten deines Webhook-Endpoints findest du unter Webhooks.

Subscription Event Types

Verfolge diese Ereignisse, um den Subscription-Lifecycle zu verwalten:
  1. subscription.active — Subscription ist aktiviert
  2. subscription.updated — Ein Feld der Subscription wurde geändert
  3. subscription.on_hold — Eine Zahlung für eine Verlängerung oder Planänderung ist fehlgeschlagen
  4. subscription.failed — Subscription-Erstellung ist fehlgeschlagen (endgültig; der Kunde muss sich erneut anmelden)
  5. subscription.renewed — Eine wiederkehrende Zahlung 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 herabgestuft oder geändert
  8. subscription.cancelled — Die Subscription wurde gekündigt
  9. subscription.expired — Die Subscription hat das Ende ihrer Laufzeit erreicht
Dies sind die wichtigsten Ereignisse. Die vollständige Liste, einschließlich paused, unpaused und update_payment_method, findest du unter Subscription Webhooks.
Verwende subscription.updated, um Echtzeitbenachrichtigungen über alle Änderungen an einer Subscription zu erhalten und den Status deiner Anwendung ohne Polling der API synchron zu halten.

Zahlungsszenarien

Erfolgreicher Zahlungsverlauf Die Reihenfolge der Webhooks hängt davon ab, ob die Subscription eine Testphase hat. Sofortige Abrechnung (0 Testtage):
  1. subscription.active: Das Mandat wird autorisiert und die Subscription aktiviert.
  2. payment.succeeded: Bestätigt die erste Zahlung. Du solltest dieses Ereignis innerhalb von 2–10 Minuten nach dem Checkout erhalten.
Mit einer Testphase:
  1. Zu Beginn der Testphase (Checkout): subscription.active wird ausgelöst, sobald die Zahlungsmethode autorisiert wurde. Es wird noch keine wiederkehrende Zahlung eingezogen. Die erste tatsächliche Zahlung wird bis zum Ende der Testphase aufgeschoben.
  2. Am Ende der Testphase: Der wiederkehrende Betrag wird eingezogen, und du erhältst 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 next_billing_date in aktualisierter Form.
Immer wenn Geld für ein Subscription-Produkt tatsächlich eingezogen wird, erhältst du subscription.renewed und payment.succeeded. Verwende subscription.renewed (nicht allein payment.succeeded) als Signal, um den Zugriff für den nächsten Zyklus zu verlängern.
Szenarien für fehlgeschlagene Zahlungen
  1. Fehler bei der Subscription
  • subscription.failed - Die Subscription-Erstellung ist fehlgeschlagen, weil kein Mandat erstellt werden konnte.
  • payment.failed - Zeigt eine fehlgeschlagene Zahlung an.
  1. Subscription pausiert
  • subscription.on_hold - Die Subscription wird aufgrund einer fehlgeschlagenen Zahlung für eine Verlängerung oder einer fehlgeschlagenen Zahlung für eine Planänderung pausiert. Wenn dein Unternehmen eine Kulanzfrist hat, wird 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 deinen Einstellungen für die Kulanzfrist). Siehe Subscription States.
  • Wenn eine Subscription pausiert wird, verlängert sie sich nicht automatisch, bis die Zahlungsmethode aktualisiert wurde.
Best Practice: Um die Implementierung zu vereinfachen, empfehlen wir, hauptsächlich Subscription-Ereignisse zur Verwaltung des Subscription-Lifecycles zu verfolgen.
Eine vollständige Anleitung zum Auslesen von error_code/error_message, zur Entscheidung, wann ein erneuter Versuch sinnvoll ist, und zur Anzeige von Fehlern für Kunden findest du unter Handle Payment Failures.

subscription.failed vs. subscription.on_hold

Diese beiden Ereignisse lassen sich leicht verwechseln, erfordern aber eine völlig unterschiedliche Behandlung:
subscription.failed ist endgültig. Die Subscription kann nicht reaktiviert werden. Der Kunde muss eine neue Subscription erstellen. Gewähre niemals Berechtigungen, wenn dieses Ereignis ausgelöst wird.

Umgang mit pausierten Subscriptions

Wenn eine Subscription den Status on_hold erreicht, musst du die Zahlungsmethode aktualisieren, um sie zu reaktivieren. In diesem Abschnitt wird erklärt, wann Subscriptions pausiert werden und wie du damit umgehst.

Wann Subscriptions pausiert werden

Eine Subscription wird pausiert, wenn:
  • Zahlung für eine Verlängerung fehlschlägt: Die automatische Zahlung für die Verlängerung schlägt aufgrund unzureichender Deckung, einer abgelaufenen Karte oder einer Ablehnung durch die Bank fehl
  • Zahlung für eine Planänderung fehlschlägt: Eine sofortige Zahlung während eines Upgrades oder Downgrades schlägt fehl
  • Autorisierung der Zahlungsmethode fehlschlägt: Die Zahlungsmethode kann für wiederkehrende Zahlungen nicht autorisiert werden
Subscriptions im Status on_hold werden nicht automatisch verlängert. Du musst die Zahlungsmethode aktualisieren, um die Subscription zu reaktivieren.

Reaktivieren pausierter Subscriptions

Um eine Subscription aus dem Status on_hold zu reaktivieren, verwende die Update Payment Method API. Dadurch werden automatisch folgende Aktionen ausgeführt:
  1. Eine Zahlung für ausstehende Beträge wird erstellt
  2. Eine Rechnung für die Zahlung wird generiert
  3. Die Zahlung wird mit der neuen Zahlungsmethode verarbeitet
  4. Die Subscription wird nach erfolgreicher Zahlung in den Status active reaktiviert
1

Handle subscription.on_hold webhook

Wenn du einen subscription.on_hold-Webhook erhältst, aktualisiere den Status deiner Anwendung und benachrichtige den Kunden:
2

Update payment method

Wenn der Kunde bereit ist, seine Zahlungsmethode zu aktualisieren, rufe die Update Payment Method API auf:
Du kannst auch eine bestehende Payment-Method-ID verwenden, wenn der Kunde Zahlungsmethoden gespeichert hat:
3

Monitor webhook events

Überwache nach der Aktualisierung der Zahlungsmethode die folgenden Webhook-Ereignisse:
  1. payment.succeeded - Die Zahlung für ausstehende Beträge war erfolgreich
  2. subscription.active - Die Subscription wurde reaktiviert

Beispiel für einen Subscription Event Payload


Subscription-Pläne ändern

Du kannst einen Subscription-Plan über den Change Plan API-Endpoint hoch- oder herabstufen. Dadurch kannst du das Produkt, die Menge und die Proration der Subscription ändern.

Change Plan API Reference

Ausführliche Informationen zum Ändern von Subscription-Plänen findest du in unserer Change Plan API-Dokumentation.

Proration-Optionen

Beim Ändern von Subscription-Plänen stehen dir vier Optionen für die sofortige Zahlung zur Verfügung:

1. prorated_immediately

  • Der ungenutzte Anteil des aktuellen Abrechnungszyklus wird zeitanteilig gutgeschrieben. Die Gutschrift umfasst den Basisplan, die Menge und alle Add-ons
  • Anschließend wird ein vollständiger Zyklus für den neuen Plan, die Menge und die Add-ons berechnet. Die Zahlung selbst wird niemals zeitanteilig berechnet
  • Sofortige Nettobelastung = (vollständiger neuer Zyklus) minus (verbleibender Anteil x vollständiger alter Zyklus). Ist die Gutschrift höher, wird die Differenz als Subscription-spezifisches Guthaben für zukünftige Verlängerungen gespeichert
  • Während einer Testphase wird der Nutzer sofort auf den neuen Plan umgestellt und der Kunde unmittelbar belastet

2. full_immediately

  • Dem Kunden wird der vollständige Subscription-Betrag für den neuen Plan ohne Gutschrift für den vorherigen Zyklus berechnet
  • Sowohl bei einem Upgrade als auch bei einem Downgrade zahlt der Kunde den gesamten Preis des neuen Plans von Anfang an
  • Sinnvoll, wenn du unabhängig von der verbleibenden Zeit des alten Plans den vollständigen Betrag berechnen möchtest

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 an Tag 1 und an Tag 29 gleich viel
  • Bei einem Upgrade wird dem Kunden die Differenz sofort berechnet. Beispiel: $30/Monat → $80/Monat = sofort berechnete $50
  • Bei einem Downgrade wird die Preisdifferenz als Subscription-spezifisches Guthaben gespeichert und automatisch auf zukünftige Verlängerungen angerechnet. Beispiel: $50/Monat → $20/Monat = $30 Guthaben

4. do_not_bill

  • Die Planänderung wird sofort angewendet, aber zum Zeitpunkt der Änderung nichts berechnet. Der neue Plan, die Menge und die Add-ons können sofort genutzt werden
  • Da jetzt nichts berechnet wird, erhält der Kunde bei einem Upgrade den höherwertigen Plan für den Rest des aktuellen Zyklus kostenlos. Ein Downgrade tritt sofort in Kraft, ohne Gutschrift für den ungenutzten Teil des bereits bezahlten Zyklus
  • Add-ons, die über do_not_bill gewährt wurden, 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 Zahlung“ setzen den Abrechnungszyklus zurück. prorated_immediately, difference_immediately und full_immediately verschieben next_billing_date der Subscription auf das Änderungsdatum. Nur do_not_bill behält das ursprüngliche Verlängerungsdatum bei, berechnet aber keine sofortige Zahlung.

Verhalten

  • Beim Aufruf dieser API leitet Dodo Payments sofort eine Zahlung basierend auf der ausgewählten Proration-Option ein
  • Bei prorated_immediately wird der ungenutzte Anteil des aktuellen Zyklus bei jeder Änderung, unabhängig von Upgrade oder Downgrade, als Gutschrift berechnet. Übersteigt diese Gutschrift die Zahlung für den neuen Zyklus, wird der Rest zum Guthaben der Subscription hinzugefügt. Diese Gutschriften gelten nur für diese Subscription und werden ausschließlich zur Verrechnung zukünftiger wiederkehrender Zahlungen derselben Subscription verwendet
  • Bei difference_immediately entspricht der Nettobetrag immer exakt der Preisdifferenz. Bei Downgrades wird der überschüssige Betrag als Subscription-spezifisches Guthaben gespeichert, ebenso wie bei prorated_immediately
  • Die Option full_immediately umgeht Gutschriftenberechnungen 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 erhalten bleibt
Auswahl eines Proration-Modus:
  • difference_immediately — Der Kunde zahlt die Preisdifferenz. Die vorhersehbarste Option; die Zahlung ist unabhängig davon, wann im Zyklus die Änderung vorgenommen wird, immer gleich hoch.
  • prorated_immediately — Der Kunde erhält nur für die ungenutzte Zeit des aktuellen Zyklus eine Gutschrift. Die Zahlung 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 — Jetzt keine Zahlung. Der neue Plan wird bei der nächsten Verlängerung berechnet. Der einzige Modus, der das ursprüngliche Abrechnungsdatum beibehält.

Zahlungsabwicklung

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

On-Demand Subscriptions

Mit On-Demand Subscriptions kannst du Kunden flexibel und nicht nur nach einem festen Zeitplan belasten. Diese Funktion ist für alle Konten verfügbar.
So erstellst du eine On-Demand Subscription: Um eine On-Demand Subscription zu erstellen, verwende den API-Endpoint POST /checkouts und füge das Feld subscription_data.on_demand in den Request Body ein. So kannst du eine Zahlungsmethode ohne sofortige Zahlung autorisieren oder einen benutzerdefinierten Anfangspreis festlegen.
POST /subscriptions ist veraltet. Für bestehende Integrationen funktioniert es weiterhin, neue Integrationen sollten On-Demand Subscriptions jedoch über eine Checkout Session (POST /checkouts) mit subscription_data.on_demand erstellen. Den aktuellen Ablauf findest du im On-Demand Subscriptions Guide.
So berechnest du eine On-Demand Subscription: Verwende für nachfolgende Zahlungen den Endpoint POST /subscriptions//charge und gib 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 Retry-Richtlinien und Webhook-Verarbeitung) findest du im On-Demand Subscriptions Guide.

Wichtige Informationen zur Subscription-Abrechnung

Lege den Subscription-Zeitraum länger als die Zahlungsfrequenz fest. Wenn der Subscription-Zeitraum der Zahlungsfrequenz entspricht (z. B. Zeitraum = 1 Monat, Frequenz = 1 Monat), ist die Subscription für einen einzigen Zyklus gültig und wechselt anschließend zu expired, anstatt verlängert zu werden. Für einen fortlaufenden Monatsplan legst du einen langen Subscription-Zeitraum (z. B. 20 Jahre) mit monatlicher Zahlungsfrequenz fest.
Die Währung wird bei der ersten erfolgreichen Zahlung festgelegt. Übergebe billing_currency und billing_address.country beim Erstellen des Checkouts immer explizit. Wenn sie weggelassen werden, werden sie anhand der IP-Adresse des Kunden ermittelt (Adaptive Currency). Sobald die Subscription ihre erste Zahlung erhält, ist die Währung für ihre gesamte Laufzeit festgelegt. Ein Kunde kann sie später nicht ändern, wenn er verreist.
Bei Testphasen wird eine Autorisierung über $0 und keine Zahlung vorgenommen. Wenn eine Subscription eine Testphase hat, wird zu deren Beginn eine Mandatsautorisierung über $0 erstellt, um die Karte zu speichern; die erste tatsächliche Zahlung erfolgt am Ende der Testphase. In der Zahlungsliste wird eine Subscription in einer kostenlosen Testphase mit genau einer Zahlung mit total_amount von 0 angezeigt. Bei einer kostenpflichtigen Testphase wird stattdessen trial_amount im Voraus berechnet.
Subscription-Lifecycle: 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: Fordere den Kunden auf, seine Zahlungsmethode zu aktualisieren; Dunning-Retries werden angewendet). expired = Die Laufzeit endete ohne Verlängerung und kann nicht reaktiviert werden. Der Kunde muss sich erneut anmelden. cancelled = Vom Kunden oder Händler beendet. Die meisten Fehler bei Verlängerungen sind Ablehnungen seitens des Kartenherausgebers (unzureichende Deckung, abgelehnte Karte), kein Dodo-Fehler.
Indische Karten verwenden ein RBI-E-Mandat. Off-Session-Zahlungen (Verlängerungen und Zahlungen 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 (ein Upgrade, das diese Grenze überschreitet, kann daher nicht über das bestehende Mandat abgewickelt werden). Solange eine Zahlung noch den Status processing hat, schlägt eine zweite Zahlung für dieselbe Subscription mit “Cannot create new charge as previous payment is not successful yet.” fehl. Nicht-indische Karten werden nahezu sofort bestätigt.
Subscriptions haben ein USD-Mindestbetrag von $1.00. Der Checkout lehnt einen niedrigeren Gesamtbetrag mit TOTAL_PAYMENT_AMOUNT_BELOW_MINIMUM_AMOUNT ab. Auch Währungen außerhalb von USD, EUR und GBP müssen mindestens $1.00 wert sein; siehe Minimum Amounts. Eine On-Demand-Zahlung product_price unter 100 in der kleinsten Währungseinheit wird mit product_price: value out of range abgelehnt. Ein Subscription-Produkt mit einem Preis von genau $0 ist zulässig; siehe Card-Optional at Zero Price. Um eine Karte ohne Belastung zu autorisieren, verwende ein On-Demand-Setup mandate_only.

Zugehörige API-Referenz

Create Subscription (Deprecated)

Legacy API zum direkten Erstellen einer Subscription. Verwende Checkout Sessions für neue Integrationen

Change Subscription Plan

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

Update Payment Method

API-Referenz zum Aktualisieren von Zahlungsmethoden und Reaktivieren pausierter Subscriptions

Patch Subscription

API-Referenz zum Aktualisieren von Subscription-Details und -Konfiguration
Zuletzt geändert am 8. Oktober 2026