resend.emails.send durch einen Aufruf an SendGrid, Postmark, Amazon SES oder dein eigenes SMTP-Relay.- 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_lowverarbeiten, um Kunden zu warnen, bevor ihr Guthaben null erreicht.
What We’re Building
MailKit verkauft zwei Produkte:- 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.
The Credits tab under Products lists all your credit entitlements.
Open the Credits Section
- Melde dich im Dodo Payments Dashboard an.
- Klicke in der Seitenleiste auf Products.
- Wähle den Tab Credits aus.
- Klicke auf Create Credit.
Configure the Credit Unit
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.Leave the Other Defaults
Save and Copy the Credit ID
cde_ beginnt. Das Backend verwendet sie zum Auslesen des Guthabens und für Ledger-Einträge.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 BerechtigungEmail 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.
MailKit Plan ($19/Monat, 5.000 E-Mails)
Create the Subscription
- Gehe zu Products und klicke auf Add Product.
- Gib die Produktdetails ein:
MailKit PlanDescription: 5,000 transactional emails per month.- Wähle unter Pricing Type die Option Subscription aus.
- Lege den wiederkehrenden Preis fest:
19.00Repeat payment every: 1 MonatCurrency: USDAttach the Email Credit Entitlement
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.Top-Up Pack ($9 einmalig, 5.000 E-Mails)
Create a One-Time Product
- Gehe zu Products und klicke auf Add Product.
- Gib die Produktdetails ein:
Email Top-Up PackDescription: Add 5,000 emails to your MailKit balance.- Wähle unter Pricing Type die Option One Time aus.
- Lege den Preis fest:
9.00Currency: USDAttach the Credit Grant
- Select credits:
Email Credits - No of credits issued:
5000
Schritt 3: Backend einrichten
Erstelle den Express-Server, der Checkouts erstellt, E-Mails sendet, Guthaben ausliest und Webhooks empfängt.Initialize the Project
package.json ein Dev-Script hinzu:Configure Environment Variables
.env mit einem API-Schlüssel für den Testmodus aus Developer → API Keys sowie den IDs aus den Schritten 1 und 2: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.Build the Server
server.ts im Projektstammverzeichnis. Der Server stellt fünf Routen bereit: Subscribe-Checkout, Top-Up-Checkout, Guthabenabfrage, Versand und den Webhook-Empfänger.Add a Demo UI
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 Ereigniscredit.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.
Expose Your Local Server
https://1234abcd.ngrok-free.app.Register the Endpoint in Dodo Payments
- Gehe zu Developer → Webhooks und klicke auf Add endpoint.
- Gib die URL
https://1234abcd.ngrok-free.app/webhooks/dodoein und verwende dabei deinen eigenen Tunnel-Host. - Wähle die Ereignisse
credit.added,credit.balance_lowundcredit.rolled_overaus. - Klicke auf Create endpoint.
- Kopiere das Signaturgeheimnis aus dem Tab Overview des Endpunkts in
.envalsDODO_PAYMENTS_WEBHOOK_KEY. - Starte den Server neu.
Schritt 5: Den vollständigen Ablauf testen
Start the Server
MailKit running on http://localhost:3000. Öffne diese URL in deinem Browser.Subscribe a Test Customer
- Gib in Abschnitt 1 eine Test-E-Mail-Adresse und einen Namen ein und klicke anschließend auf Get checkout link.
- Öffne den Link und schließe den Checkout mit einer Testkarte ab.
- Gehe im Dashboard zu Customers und kopiere die ID des neuen Kunden, die mit
cus_beginnt.
Send an Email
- Füge die Kunden-ID in Abschnitt 3 ein.
- Lass To auf
delivered@resend.deveingestellt, einer Resend-Testadresse, die jede Nachricht akzeptiert. - Klicke auf Send.
Trigger the Low-Balance Webhook
- Öffne den Kunden unter Customers, wähle den Tab Credits und anschließend Email Credits aus.
- Klicke auf Apply Credit/Debit, wähle Debit aus und gib
4000ein. Das Guthaben beträgt nun genau 1.000 und liegt damit noch nicht unter dem Schwellenwert. - Sende eine weitere E-Mail aus der Demo. Das Guthaben sinkt auf 999.
Buy a Top-Up Pack
- Füge die Kunden-ID in Abschnitt 4 ein.
- Klicke auf Buy 5,000 emails und schließe den Test-Checkout ab.
- Aktualisiere das Guthaben. Es steigt um 5.000.
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.Test the Hard Stop
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
Webhook signature verification fails (401)
Webhook signature verification fails (401)
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.Balance is 0, customer not found, or credits don't deduct
Balance is 0, customer not found, or credits don't deduct
- Der Kunde hat den Checkout abgeschlossen. Guthaben wird ausgegeben, wenn die Zahlung erfolgreich ist, nicht wenn die Checkout-Sitzung erstellt wird.
CREDIT_ENTITLEMENT_IDin.envstimmt 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.customer_id, das du übergibst, ist die Dodo Payments Kunden-ID (sie beginnt mitcus_) und keine ID aus deiner eigenen Datenbank.
Resend rejects the recipient
Resend rejects the recipient
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
Top-Up Pack
Direct Ledger Debits
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.