Zum Hauptinhalt springen

Prerequisites

To integrate the Dodo Payments API, you’ll need:
  • A Dodo Payments merchant account
  • API credentials (API key and webhook secret key) from the dashboard
For a more detailed guide on the prerequisites, check this section.

API Integration

Checkout Sessions

Use Checkout Sessions to sell subscription products with a secure, hosted checkout. Pass your subscription product in product_cart and redirect customers to the returned checkout_url.
Mixed Checkout: You can combine subscription products with one-time products in the same checkout session. This enables use cases like setup fees with subscriptions, hardware bundles with SaaS, and more. See the Checkout Sessions guide for examples.
import DodoPayments from 'dodopayments';

const client = new DodoPayments({
  bearerToken: process.env.DODO_PAYMENTS_API_KEY,
  environment: 'test_mode', // defaults to 'live_mode'
});

async function main() {
  const session = await client.checkoutSessions.create({
    product_cart: [
      { product_id: 'prod_subscription_monthly', quantity: 1 }
    ],
    // Optional: configure trials for subscription products
    subscription_data: { trial_period_days: 14 },
    customer: {
      email: 'subscriber@example.com',
      name: 'Jane Doe',
    },
    return_url: 'https://example.com/success',
  });

  console.log(session.checkout_url);
}

main();

API Response

The following is an example of the response:
{
  "session_id": "cks_Gi6KGJ2zFJo9rq9Ukifwa",
  "checkout_url": "https://test.checkout.dodopayments.com/session/cks_Gi6KGJ2zFJo9rq9Ukifwa"
}
Redirect the customer to checkout_url.

Webhooks

When integrating subscriptions, you’ll receive webhooks to track the subscription lifecycle. These webhooks help you manage subscription states and payment scenarios effectively. To set up your webhook endpoint, please follow our Detailed Integration Guide.

Subscription Event Types

The following webhook events track subscription status changes:
  1. subscription.active - Subscription is successfully activated.
  2. subscription.updated - Subscription object was updated (fires on any field change).
  3. subscription.on_hold - Subscription is put on hold due to failed renewal.
  4. subscription.failed - Subscription creation failed during mandate creation.
  5. subscription.renewed - Subscription is renewed for the next billing period.
For reliable subscription lifecycle management, we recommend tracking these subscription events.
Use subscription.updated to get real-time notifications about any subscription changes, keeping your application state in sync without polling the API.

Payment Scenarios

Successful Payment Flow When a payment succeeds, you’ll receive the following webhooks:
  1. subscription.active - Indicates subscription activation
  2. payment.succeeded - Confirms the initial payment:
    • For immediate billing (0 trial days): Expect within 2-10 minutes
    • For trial days: whenever that ends
  3. subscription.renewed - Indicates payment deduction and renewal for next cycle. (Basically, whenever payment gets deducted for subscription products, you will get subscription.renewed webhook along with payment.succeeded)
Payment Failure Scenarios
  1. Subscription Failure
  • subscription.failed - Subscription creation failed due to failure to create a mandate.
  • payment.failed - Indicates failed payment.
  1. Subscription On Hold
  • subscription.on_hold - Subscription is put on hold due to failed renewal payment or failed plan change charge.
  • When a subscription goes on hold, it will not renew automatically until the payment method is updated.
Best Practice: To simplify implementation, we recommend primarily tracking subscription events for managing the subscription lifecycle.
Für eine vollständige Anleitung zum Lesen von error_code/error_message, zur Entscheidung, wann ein erneuter Versuch unternommen wird, und zur Offenlegung von Fehlern gegenüber Kunden, siehe Behandeln von Zahlungsfehlern.

subscription.failed vs. subscription.on_hold

Diese beiden Ereignisse sind leicht zu verwechseln, erfordern jedoch sehr unterschiedliche Handhabung:
EreignisWann es ausgelöst wirdStatusWiederherstellbar?Was zu tun ist
subscription.failedDas initiale Mandat konnte bei der Erstellung des Abonnements nicht erstellt werdenfailedNein — terminalKein Zugriff gewähren. Bitten Sie den Kunden, ein neues Abonnement mit einer anderen Zahlungsmethode zu starten.
subscription.on_holdEine Erneuerungszahlung (oder Tarifänderungsgebühr) ist bei einem bereits aktiven Abonnement fehlgeschlagenon_holdJaWiederherstellen durch Aktualisieren der Zahlungsmethode; siehe Behandlung von Abonnements im Wartezustand unten.
subscription.failed ist terminal – das Abonnement kann nicht reaktiviert werden. Der Kunde muss ein neues Abonnement erstellen. Niemals Berechtigungen gewähren, wenn dieses Ereignis ausgelöst wird.

Behandlung von Abonnements im Wartezustand

Wenn ein Abonnement den Zustand on_hold erreicht, müssen Sie die Zahlungsmethode aktualisieren, um es zu reaktivieren. Dieser Abschnitt erklärt, wann Abonnements in den Wartezustand versetzt werden und wie man damit umgeht.

Wann Abonnements in den Wartezustand versetzt werden

Ein Abonnement wird in den Wartezustand versetzt, wenn:
  • Erneuerungszahlung fehlschlägt: Die automatische Erneuerungsgebühr schlägt aufgrund unzureichender Mittel, abgelaufener Karte oder Bankenabweisung fehl
  • Tarifänderungsgebühr fehlschlägt: Eine sofortige Gebühr während eines Upgrades/Downgrades des Tarifplans schlägt fehl
  • Autorisierung der Zahlungsmethode fehlschlägt: Die Zahlungsmethode kann nicht für wiederkehrende Belastungen autorisiert werden
Abonnements im Zustand on_hold werden nicht automatisch erneuert. Sie müssen die Zahlungsmethode aktualisieren, um das Abonnement zu reaktivieren.

Reaktivierung von Abonnements im Wartezustand

Um ein Abonnement aus dem Zustand on_hold zu reaktivieren, verwenden Sie die Aktualisieren der Zahlungsmethode API. Dies erstellt automatisch:
  1. Eine Gebühr für ausstehende Beträge
  2. Eine Rechnung für die Gebühr
  3. Verarbeitet die Zahlung mit der neuen Zahlungsmethode
  4. Reaktiviert das Abonnement in den Zustand active nach erfolgreicher Zahlung
1

Handle subscription.on_hold webhook

Wenn Sie einen subscription.on_hold Webhook erhalten, aktualisieren Sie den Anwendungszustand und benachrichtigen Sie den Kunden:
// Webhook handler
app.post('/webhooks/dodo', async (req, res) => {
  const event = req.body;
  
  if (event.type === 'subscription.on_hold') {
    const subscription = event.data;
    
    // Update subscription status in your database
    await updateSubscriptionStatus(subscription.subscription_id, 'on_hold');
    
    // Notify customer to update payment method
    await sendEmailToCustomer(subscription.customer_id, {
      subject: 'Payment Required - Subscription On Hold',
      message: 'Your subscription is on hold. Please update your payment method to continue service.'
    });
  }
  
  res.json({ received: true });
});
2

Update payment method

Wenn der Kunde bereit ist, seine Zahlungsmethode zu aktualisieren, rufen Sie die Update Payment Method API auf:
// Update with new payment method
const response = await client.subscriptions.updatePaymentMethod(subscriptionId, {
  type: 'new',
  return_url: 'https://example.com/return'
});

// For on_hold subscriptions, a charge is automatically created
if (response.payment_id) {
  console.log('Charge created for remaining dues:', response.payment_id);
  // Redirect customer to response.payment_link to complete payment
}
Sie können auch eine vorhandene Zahlungsmethoden-ID verwenden, wenn der Kunde gespeicherte Zahlungsmethoden hat:
await client.subscriptions.updatePaymentMethod(subscriptionId, {
  type: 'existing',
  payment_method_id: 'pm_abc123'
});
3

Monitor webhook events

Nach der Aktualisierung der Zahlungsmethode überwachen Sie diese Webhook-Ereignisse:
  1. payment.succeeded - Die Gebühr für ausstehende Beträge war erfolgreich
  2. subscription.active - Das Abonnement wurde reaktiviert
if (event.type === 'payment.succeeded') {
  const payment = event.data;
  
  // Check if this payment is for an on_hold subscription
  if (payment.subscription_id) {
    // Wait for subscription.active webhook to confirm reactivation
  }
}

if (event.type === 'subscription.active') {
  const subscription = event.data;
  
  // Update subscription status in your database
  await updateSubscriptionStatus(subscription.subscription_id, 'active');
  
  // Restore customer access
  await restoreCustomerAccess(subscription.customer_id);
  
  // Notify customer of successful reactivation
  await sendEmailToCustomer(subscription.customer_id, {
    subject: 'Subscription Reactivated',
    message: 'Your subscription has been reactivated successfully.'
  });
}

Beispiel-Event-Payload für Abonnements


EigenschaftTypErforderlichBeschreibung
business_idstringJaDie eindeutige Kennung für das Unternehmen
timestampstringJaDer Zeitstempel, wann das Ereignis aufgetreten ist (nicht unbedingt derselbe wie bei der Zustellung)
typestringJaDer Ereignistyp. Siehe Ereignistypen
dataobjectJaDie Hauptdaten-Payload. Siehe Datenobjekt

Ändern von Abonnementsplänen

Sie können einen Abonnementplan mit dem API-Endpunkt zur Planänderung upgraden oder downgraden. Damit können Sie das Produkt des Abonnements, die Menge und die Handhabung der anteiligen Verrechnung ändern.

Change Plan API Reference

Für detaillierte Informationen zur Änderung von Abonnementplänen lesen Sie bitte unsere Dokumentation zur Planänderung API.

Optionen zur Verrechnung

Beim Ändern von Abonnementsplänen haben Sie zwei Optionen zur Handhabung der sofortigen Gebühr:

1. prorated_immediately

  • Berechnet den anteiligen Betrag basierend auf der verbleibenden Zeit im aktuellen Abrechnungszyklus
  • Belastet den Kunden nur für den Unterschied zwischen dem alten und dem neuen Plan
  • Während eines Testzeitraums wird der Benutzer sofort auf den neuen Plan umgestellt und der Kunde sofort belastet

2. full_immediately

  • Belastet den Kunden den vollen Abonnementbetrag für den neuen Plan
  • Ignoriert verbleibende Zeit oder Guthaben aus dem vorherigen Plan
  • Nützlich, wenn Sie den Abrechnungszyklus zurücksetzen oder den vollen Betrag unabhängig von der Verrechnung berechnen möchten

3. difference_immediately

  • Beim Upgrade wird der Kunde sofort mit dem Unterschied zwischen den beiden Plänen belastet.
  • Beispiel: Wenn der aktuelle Plan 30 Dollar kostet und der Kunde zu einem 80-Dollar-Plan wechselt, werden ihm sofort 50 Dollar berechnet.
  • Beim Downgrade wird der nicht genutzte Betrag des aktuellen Plans als internes Guthaben hinzugefügt und automatisch auf zukünftige Abonnementverlängerungen angerechnet.
  • Beispiel: Wenn der aktuelle Plan 50 Dollar kostet und der Kunde zu einem 20-Dollar-Plan wechselt, werden die verbleibenden 30 Dollar gutgeschrieben und für den nächsten Abrechnungszyklus verwendet.

Verhalten

  • Wenn Sie diese API aufrufen, initiiert Dodo Payments sofort eine Gebühr basierend auf Ihrer gewählten Verrechnungsoption
  • Wenn die Planänderung ein Downgrade ist und Sie prorated_immediately verwenden, werden Credits automatisch berechnet und dem Guthabensaldo des Abonnements hinzugefügt. Diese Guthaben sind spezifisch für dieses Abonnement und werden nur zur Verrechnung zukünftiger wiederkehrender Zahlungen desselben Abonnements verwendet
  • Die Option full_immediately umgeht die Guthabenberechnung und berechnet den vollen neuen Planbetrag
Wählen Sie Ihre Verrechnungsoption sorgfältig aus: Verwenden Sie prorated_immediately für faire Abrechnung, die ungenutzte Zeit berücksichtigt, oder full_immediately, wenn Sie den vollständigen neuen Planbetrag unabhängig vom aktuellen Abrechnungszyklus berechnen möchten.

Gebührenbearbeitung

  • Die sofortige Gebühr, die bei der Planänderung initiiert wird, wird in der Regel in weniger als 2 Minuten bearbeitet
  • Wenn diese sofortige Gebühr aus irgendeinem Grund fehlschlägt, wird das Abonnement automatisch in den Wartezustand versetzt, bis das Problem gelöst ist

On-Demand-Abonnements

On-Demand-Abonnements ermöglichen es Ihnen, Kunden flexibel zu belasten, nicht nur nach einem festen Zeitplan. Diese Funktion ist für alle Konten verfügbar.
So erstellen Sie ein On-Demand-Abonnement: Um ein On-Demand-Abonnement zu erstellen, verwenden Sie den POST /subscriptions API-Endpunkt und fügen Sie das Feld on_demand in Ihren Anfragekörper ein. Dadurch können Sie eine Zahlungsmethode ohne sofortige Belastung autorisieren oder einen benutzerdefinierten Startpreis festlegen. So berechnen Sie ein On-Demand-Abonnement: Für nachfolgende Belastungen verwenden Sie den POST /subscriptions//charge Endpunkt und geben Sie den Betrag an, den Sie dem Kunden für diese Transaktion berechnen möchten.
Für eine vollständige Schritt-für-Schritt-Anleitung — einschließlich Anforderungs-/Antwortbeispiele, sicherer Wiederholungsrichtlinien und Webhook-Verarbeitung — siehe den On-Demand-Abonnements-Leitfaden.

Verwandte API-Referenz

Create Subscription

API-Referenz zur Erstellung von Abonnementprodukten und Verwaltung des Abonnementlebenszyklus

Change Subscription Plan

API-Referenz zum Upgrade, Downgrade oder zur Änderung von Abonnementplänen mit Verrechnungsoptionen

Update Payment Method

API-Referenz zur Aktualisierung von Zahlungsmethoden und zur Reaktivierung von Abonnements im Wartezustand

Patch Subscription

API-Referenz zur Aktualisierung von Abonnementdetails und Konfiguration
Zuletzt geändert am 18. Juni 2026