Skip to main content
Damit dein Coding-Agent die Integration schreibt, installiere das Dodo Agent Plugin. Es fügt Claude Code, Codex CLI, Cursor, VS Code / GitHub Copilot, Kiro und OpenCode die Dodo Payments Skills und MCP-Server hinzu.
Du erstellst MailKit, einen transaktionalen E-Mail-Dienst, bei dem Kunden E-Mail-Guthaben im Voraus bezahlen. Ein monatlicher Plan gewährt 5.000 E-Mails pro Abrechnungszeitraum. Wenn das Guthaben eines Kunden knapp wird, kauft er ein Aufladepaket, statt auf den nächsten Zeitraum zu warten. Jeder Versand zieht ein Guthaben ab.
Dieses Tutorial verwendet Resend als E-Mail-Anbieter. Dessen kostenloses Kontingent (3.000 E-Mails pro Monat) reicht aus, um den gesamten Ablauf zu erstellen und zu testen. Das Abrechnungsmuster funktioniert mit jedem Anbieter: Ersetze resend.emails.send durch einen Aufruf an SendGrid, Postmark, Amazon SES oder dein eigenes SMTP-Relay.
Am Ende weißt du, wie du Folgendes erledigst:
  • Eine benutzerdefinierte Guthabenberechtigung für E-Mails im Dashboard erstellen.
  • Guthaben an einen Abonnementplan und ein einmaliges Aufladeprodukt anhängen.
  • E-Mails über Resend senden und pro Versand ein Guthaben mit einem Ledger-Eintrag abbuchen.
  • Das aktuelle Guthaben eines Kunden im Frontend auslesen.
  • Dodo Payments Webhooks verifizieren und credit.balance_low verarbeiten, um Kunden zu warnen, bevor ihr Guthaben null erreicht.

What We’re Building

MailKit verkauft zwei Produkte: Die Einheit ist eine E-Mail = ein Guthaben. Kunden müssen sich nicht mit Tokens, Batches oder gewichteten Einheiten befassen. Sie sehen „4.231 E-Mails diesen Monat übrig“. Vor dem Start benötigst du:
  • Ein Dodo Payments Konto. Erstelle alles im Testmodus.
  • Ein kostenloses Resend Konto und einen API-Schlüssel.
  • Node.js 22 oder höher sowie praktische Kenntnisse in TypeScript.

Schritt 1: Deine E-Mail-Guthabenberechtigung erstellen

Die Guthabenberechtigung definiert die Einheit, die MailKit verkauft: einen E-Mail-Versand.
Credits tab under Products, listing the business's credit entitlements

The Credits tab under Products lists all your credit entitlements.

1

Open the Credits Section

  1. Melde dich im Dodo Payments Dashboard an.
  2. Klicke in der Seitenleiste auf Products.
  3. Wähle den Tab Credits aus.
  4. Klicke auf Create Credit.
2

Configure the Credit Unit

Gib diese Werte ein:Credit Name: Email CreditsCredit Type: Custom UnitUnit Name: emailDefine Precision: 0. Eine E-Mail ist eine ganze Einheit, daher benötigt das Guthaben niemals Dezimalstellen.Credit Expiry: 30 days. Nicht verwendetes Guthaben verfällt 30 Tage nach der Ausgabe.
Die Genauigkeit kann nach dem Erstellen des Guthabens nicht mehr geändert werden. Verwende für diskrete Einheiten wie E-Mails, Nachrichten oder Sitzungen 0.
3

Leave the Other Defaults

Dieses Tutorial lässt Übertragungen und Mehrverbrauch deaktiviert, damit der Guthabenablauf möglichst einfach bleibt. Du kannst sie später aktivieren, entweder für das Guthaben oder für den Guthabenanhang jedes Produkts.
4

Save and Copy the Credit ID

Klicke auf Create Credit. Öffne das Guthaben und kopiere seine ID, die mit cde_ beginnt. Das Backend verwendet sie zum Auslesen des Guthabens und für Ledger-Einträge.
Die Berechtigung Email Credits ist bereit. Als Nächstes erstellst du die Produkte, die sie Kunden gewähren.

Schritt 2: Plan und Top-Up Pack erstellen

Erstelle zwei Produkte, die dieselbe Berechtigung Email Credits anhängen: einen Subscription-Plan, der pro Abrechnungszeitraum 5.000 E-Mails gewährt, und ein einmaliges One Time-Aufladeprodukt, das bei Bedarf weitere 5.000 hinzufügt.
Dieses Tutorial bucht Guthaben mit Ledger-Einträgen statt mit Usage Meters ab. Eine Ledger-Abbuchung wird angewendet, sobald der API-Aufruf zurückkehrt, benötigt keine Meter-Konfiguration und eignet sich für Fälle, in denen eine Benutzeraktion genau ein Guthaben kostet. Um Guthaben automatisch anhand eingehender Nutzungsereignisse abzuziehen, was sich für gewichtete Einheiten wie Tokens oder verarbeitete Megabytes eignet, siehe Usage Billing with Credits im Leitfaden zu Credit-Based Billing.

MailKit Plan ($19/Monat, 5.000 E-Mails)

1

Create the Subscription

  1. Gehe zu Products und klicke auf Add Product.
  2. Gib die Produktdetails ein:
Product Name: MailKit PlanDescription: 5,000 transactional emails per month.
  1. Wähle unter Pricing Type die Option Subscription aus.
  2. Lege den wiederkehrenden Preis fest:
Price: 19.00Repeat payment every: 1 MonatCurrency: USD
2

Attach the Email Credit Entitlement

Klicke im Abschnitt Entitlements neben Credits auf Attach und konfiguriere Folgendes:Select credits: Email CreditsCredits issued per billing cycle: 5000Low Balance Threshold (%): 20. Dodo Payments sendet credit.balance_low, wenn das Guthaben unter 20 % der pro Zyklus ausgegebenen Guthaben fällt, also unter 1.000 E-Mails.Import Default Credit Settings: aktiviert, damit das Produkt den Ablauf von 30 Tagen aus Schritt 1 verwendet.Füge das Guthaben zum Produkt hinzu und speichere das Produkt. Kopiere die Produkt-ID, die mit pdt_ beginnt.
Plan: $19/Monat mit 5.000 E-Mails, die pro Abrechnungszeitraum ausgegeben werden.

Top-Up Pack ($9 einmalig, 5.000 E-Mails)

1

Create a One-Time Product

  1. Gehe zu Products und klicke auf Add Product.
  2. Gib die Produktdetails ein:
Product Name: Email Top-Up PackDescription: Add 5,000 emails to your MailKit balance.
  1. Wähle unter Pricing Type die Option One Time aus.
  2. Lege den Preis fest:
Price: 9.00Currency: USD
2

Attach the Credit Grant

Klicke im Abschnitt Entitlements neben Credits auf Attach und konfiguriere Folgendes:
  • Select credits: Email Credits
  • No of credits issued: 5000
Ein einmaliges Produkt gewährt Guthaben mit einem eigenen Ablaufdatum: 30 Tage ab dem Kauf, entsprechend dem Standardwert aus Schritt 1. Aufladeguthaben wird zum Abonnementguthaben hinzugefügt. Es ersetzt dieses nicht.
Speichere das Produkt und kopiere seine ID.
Top-Up Pack: $9 für 5.000 E-Mails, die nach erfolgreicher Zahlung dem Guthaben hinzugefügt werden.

Schritt 3: Backend einrichten

Erstelle den Express-Server, der Checkouts erstellt, E-Mails sendet, Guthaben ausliest und Webhooks empfängt.
1

Initialize the Project

Füge in package.json ein Dev-Script hinzu:
tsx führt TypeScript direkt aus, ohne Build-Schritt oder tsconfig.json. Für die Produktion füge ein tsconfig.json und ein build-Script hinzu.
2

Configure Environment Variables

Erstelle .env mit einem API-Schlüssel für den Testmodus aus Developer → API Keys sowie den IDs aus den Schritten 1 und 2:
.env
DODO_PAYMENTS_WEBHOOK_KEY füllst du in Schritt 4 aus, nachdem du den Webhook-Endpunkt erstellt hast. Erstelle den Resend API-Schlüssel unter resend.com/api-keys.
Füge .env vor deinem ersten Commit zu .gitignore hinzu. Committe niemals API-Schlüssel.
3

Build the Server

Erstelle server.ts im Projektstammverzeichnis. Der Server stellt fünf Routen bereit: Subscribe-Checkout, Top-Up-Checkout, Guthabenabfrage, Versand und den Webhook-Empfänger.
Die Webhook-Route muss den unveränderten Request-Body empfangen. express.json() ersetzt den Body durch ein geparstes Objekt, während die Signaturprüfung exakt die Bytes benötigt, die Dodo Payments signiert hat. Behalte die Route /webhooks/dodo mit express.raw() oberhalb der Zeile app.use(express.json()).
Das Backend ist bereit: Subscribe, Top-Up, Guthaben, Versand und der Webhook-Handler.
4

Add a Demo UI

Erstelle public/index.html. Es ruft jede Route über ein einfaches Formular auf, damit du den Ablauf im Browser testen kannst:

Schritt 4: Webhook-Endpunkt verbinden

Das Ereignis credit.balance_low ermöglicht es dir, Kunden zu warnen, bevor ihr Guthaben aufgebraucht ist. Ohne dieses Ereignis bemerkt ein Kunde das Problem erst, wenn eine E-Mail nicht gesendet werden kann.
1

Expose Your Local Server

Webhooks benötigen eine öffentliche URL. Verwende während der Entwicklung ngrok oder einen anderen Tunnel:
Kopiere die HTTPS-Weiterleitungs-URL, zum Beispiel https://1234abcd.ngrok-free.app.
2

Register the Endpoint in Dodo Payments

  1. Gehe zu Developer → Webhooks und klicke auf Add endpoint.
  2. Gib die URL https://1234abcd.ngrok-free.app/webhooks/dodo ein und verwende dabei deinen eigenen Tunnel-Host.
  3. Wähle die Ereignisse credit.added, credit.balance_low und credit.rolled_over aus.
  4. Klicke auf Create endpoint.
  5. Kopiere das Signaturgeheimnis aus dem Tab Overview des Endpunkts in .env als DODO_PAYMENTS_WEBHOOK_KEY.
  6. Starte den Server neu.

Schritt 5: Den vollständigen Ablauf testen

1

Start the Server

Der Server protokolliert MailKit running on http://localhost:3000. Öffne diese URL in deinem Browser.
2

Subscribe a Test Customer

  1. Gib in Abschnitt 1 eine Test-E-Mail-Adresse und einen Namen ein und klicke anschließend auf Get checkout link.
  2. Öffne den Link und schließe den Checkout mit einer Testkarte ab.
  3. Gehe im Dashboard zu Customers und kopiere die ID des neuen Kunden, die mit cus_ beginnt.
Der Kunde hat 5.000 E-Mails in seinem Guthaben. Öffne zur Bestätigung den Kunden unter Customers und wähle den Tab Credits aus.
3

Send an Email

  1. Füge die Kunden-ID in Abschnitt 3 ein.
  2. Lass To auf delivered@resend.dev eingestellt, einer Resend-Testadresse, die jede Nachricht akzeptiert.
  3. Klicke auf Send.
Die Seite zeigt die Resend-Nachrichten-ID an. Aktualisiere das Guthaben in Abschnitt 2: Es beträgt 4.999. Eine Ledger-Abbuchung ist Bestandteil des Guthabens, sobald der API-Aufruf zurückkehrt.
4

Trigger the Low-Balance Webhook

Der Schwellenwert liegt bei 20 %, also bei 1.000 der 5.000 pro Zyklus ausgegebenen E-Mails. Um ihn zu erreichen, ohne 4.000 E-Mails zu senden, buche das Guthaben manuell im Dashboard ab:
  1. Öffne den Kunden unter Customers, wähle den Tab Credits und anschließend Email Credits aus.
  2. Klicke auf Apply Credit/Debit, wähle Debit aus und gib 4000 ein. Das Guthaben beträgt nun genau 1.000 und liegt damit noch nicht unter dem Schwellenwert.
  3. Sende eine weitere E-Mail aus der Demo. Das Guthaben sinkt auf 999.
Wenn der Webhook eintrifft, protokolliert der Server:
Der Server hat den Webhook empfangen und verifiziert. In der Produktion würdest du hier dem Kunden eine E-Mail senden oder ein In-App-Banner anzeigen.
5

Buy a Top-Up Pack

  1. Füge die Kunden-ID in Abschnitt 4 ein.
  2. Klicke auf Buy 5,000 emails und schließe den Test-Checkout ab.
  3. Aktualisiere das Guthaben. Es steigt um 5.000.
Dodo Payments sendet ein Ereignis credit.added mit transaction_type: "credit_added". Die zugrunde liegende Gewährung hat source_type: one_time, die du mit der API List Customer Grants auslesen kannst. Aufladeguthaben wird zum Abonnementguthaben hinzugefügt. Abbuchungen werden zuerst von der Gewährung abgezogen, die zuerst abläuft, und bei gleichzeitigem Ablauf von der ältesten Gewährung.
6

Test the Hard Stop

Buche das Guthaben im Dashboard auf null ab und versuche anschließend, eine weitere E-Mail zu senden. Der Server antwortet mit 402:
402 ist die Durchsetzung deiner Anwendung. Betrachte die Dodo Payments Balance API als maßgebliche Quelle und cache das Guthaben nicht auf dem Client.

Fehlerbehebung

Die Signatur umfasst den unveränderten HTTP-Body. express.json() ersetzt den Body durch ein geparstes Objekt, weshalb die Verifizierung fehlschlägt. Registriere /webhooks/dodo mit express.raw({ type: 'application/json' }) oberhalb der Zeile app.use(express.json()). Prüfe anschließend, dass DODO_PAYMENTS_WEBHOOK_KEY mit dem Signaturgeheimnis im Tab Overview des Endpunkts übereinstimmt.
Prüfe diese drei Punkte in dieser Reihenfolge:
  1. Der Kunde hat den Checkout abgeschlossen. Guthaben wird ausgegeben, wenn die Zahlung erfolgreich ist, nicht wenn die Checkout-Sitzung erstellt wird.
  2. CREDIT_ENTITLEMENT_ID in .env stimmt mit dem am Produkt angehängten Guthaben überein. Die Balance- und Ledger-Aufrufe verwenden diese ID. Bei einer Abweichung wird ein anderes Guthaben ausgelesen oder belastet.
  3. customer_id, das du übergibst, ist die Dodo Payments Kunden-ID (sie beginnt mit cus_) und keine ID aus deiner eigenen Datenbank.
Der Test-Absender onboarding@resend.dev stellt nur an die E-Mail-Adresse deines Resend Kontos oder an delivered@resend.dev zu. Um an andere Empfänger zu senden, verifiziere eine Domain und verwende eine from-Adresse dieser Domain.

Was du erstellt hast

One Reusable Credit Unit

Email Credits, einmal definiert und sowohl an den Abonnementplan als auch an das Top-Up Pack angehängt.

Subscription with Prepaid Allowance

$19/Monat gewähren 5.000 E-Mails pro Abrechnungszeitraum. Kunden wissen, wofür sie bezahlen, und du kennst deine maximalen Kosten.

Top-Up Pack

Ein einmaliges Produkt, das zusätzlich zum Abonnementguthaben 5.000 E-Mails gewährt, ohne den Plan zu ändern.

Direct Ledger Debits

Ein Aufruf von createLedgerEntry nach jedem Versand, ohne Meter und ohne Aggregationsverzögerung. Die Resend-Nachrichten-ID als Idempotenzschlüssel verhindert eine zweite Abbuchung für denselben Versand.

Credit-Based Billing Reference

Übertragungen, Mehrverbrauchsmodi, Ledger-Verwaltung und die vollständige Credit API.
Wenn du Hilfe benötigst, frage in der Discord Community oder schreibe eine E-Mail an support@dodopayments.com.
Zuletzt geändert am 26. September 2026