In diesem Tutorial erstellen Sie MailKit, eine transaktionale E-Mail-Plattform, auf der Kunden im Voraus für ein Pool von E-Mail-Guthaben zahlen. Der Plan gewährt ein monatliches E-Mail-Kontingent; wenn Kunden knapp werden, können sie anstelle des Wartens auf den nächsten Zyklus ein Aufladungspaket kaufen. Jeder Versand zieht automatisch ein Guthaben ab.Documentation Index
Fetch the complete documentation index at: https://docs.dodopayments.com/llms.txt
Use this file to discover all available pages before exploring further.
resend.emails.send für SendGrid, Postmark, SES oder Ihr eigenes SMTP-Relay aus.- Ein benutzerdefiniertes Guthabenrecht (E-Mails) in Ihrem Dashboard erstellt
- Guthaben an einen Abonnementplan und ein einmaliges Aufladeprodukt anhängt
- Echte E-Mails über Resend sendet und ein Guthaben pro Sendung über einen Hauptbucheintrag abbucht
- Einen Live-Guthabenstand von Ihrem Frontend abfragt
- Dodo-Webhooks korrekt verifiziert und
credit.balance_lowverwendet, um Kunden zu bitten, bevor sie Null erreichen
Was wir bauen
Hier ist das Preismodell für MailKit:| Produkt | Preis | E-Mails |
|---|---|---|
| MailKit-Plan | $19/Monat | 5.000 E-Mails/Zyklus |
| Aufladepaket | $9 einmalig | +5.000 E-Mails |
- Ein Dodo Payments-Konto (Testmodus ist in Ordnung)
- Ein kostenloses Resend-Konto und API-Schlüssel
- Node.js 18+ und grundlegende Kenntnisse in TypeScript
Schritt 1: Erstellen Sie Ihr E-Mail-Guthabenrecht
Das Guthabenrecht definiert die Einheit, die Ihre Plattform verkauft: in diesem Fall eine E-Mail-Sendung.
Open the Credits section
- Melden Sie sich in Ihrem Dodo Payments-Dashboard an
- Klicken Sie auf Produkte in der linken Seitenleiste
- Wählen Sie die Registerkarte Guthaben
- Klicken Sie auf Guthaben erstellen
Configure the credit unit
Email CreditsGuthabentyp: Wählen Sie Benutzerdefinierte EinheitEinheitenname: emailPräzision: 0 (eine E-Mail ist immer eine ganze Einheit; Sie können keine halbe E-Mail senden)Guthabenablauf: 30 days (das Kontingent jedes Zyklus wird zurückgesetzt)Leave the other defaults as-is
Save and copy the credit ID
cent_xxxxxxxxxxxx.Email Credits-Guthabenrecht ist bereit. Als nächstes: die Produkte, die Kunden Guthaben gewähren.Schritt 2: Erstellen Sie den Plan und das Aufladepaket
Sie werden zwei Produkte erstellen: einen wiederkehrenden Abonnement-Plan und ein einmaliges Aufladeprodukt. Der Plan gewährt 5.000 E-Mails pro Zyklus; das Aufladen fügt auf Anforderung weitere 5.000 hinzu. Beide hängen dasselbeEmail Credits-Guthabenrecht an.
MailKit-Plan ($19/Monat, 5.000 E-Mails)
Create the subscription
- Gehen Sie zu Produkte → Produkt erstellen
- Füllen Sie die Produktdetails aus:
MailKit PlanBeschreibung: 5,000 transactional emails per month.- Wählen Sie Abonnement als Produkttyp
- Setzen Sie den wiederkehrenden Preis:
19.00Abrechnungszyklus: MonthlyWährung: USDAttach the email credit entitlement
Email CreditsGutgeschriebene Guthaben pro Abrechnungszyklus: 5000Niedriges Guthabenschwellenwert: 20 (Prozent; feuert credit.balance_low ab, wenn das Guthaben unter 20 % des Zyklus-Kontingents fällt, d.h. 1.000 E-Mails)Standard-Guthabeneinstellungen importieren: aktiviert (verwendet den 30-Tage-Ablauf aus Schritt 1)Klicken Sie auf Zum Produkt hinzufügen, dann Speichern des Produkts. Kopieren Sie die Produkt-ID (pdt_xxxxxxxxxxxx).Aufladepaket ($9 einmalig, 5.000 E-Mails)
Create a one-time product
- Gehen Sie zu Produkte → Produkt erstellen
- Füllen Sie die Produktdetails aus:
Email Top-Up PackBeschreibung: Add 5,000 emails to your MailKit balance instantly.- Wählen Sie Einmalzahlung als Produkttyp
- Setzen Sie den Preis:
9.00Währung: USDAttach the credit grant
- Guthabenanspruch:
Email Credits - Gutgeschriebene Guthaben:
5000
Schritt 3: Richten Sie das Backend ein
Erstellen Sie nun den Express-Server, der Checkout, Senden, Guthabenabfragen und Webhooks bearbeitet.Configure environment variables
.env:DODO_WEBHOOK_KEY in Schritt 4 ausfüllen, nachdem Sie den Endpunkt erstellt haben. Der Resend API-Schlüssel stammt von resend.com/api-keys.Build the server
server.ts im Projektstamm:Schritt 4: Verkabeln Sie den Webhook-Endpunkt
Dascredit.balance_low Ereignis ermöglicht es Ihnen, Kunden vor dem Auslaufen zu benachrichtigen. Ohne es bemerken sie das Problem das erste Mal, wenn eine E-Mail nicht gesendet werden kann.
Expose your local server
https://1234abcd.ngrok-free.app).Register the endpoint in Dodo
- Gehen Sie zu Entwickler → Webhooks → Endpunkt hinzufügen
- URL:
https://1234abcd.ngrok-free.app/webhooks/dodo - Ereignisse: Abonnieren Sie
credit.added,credit.balance_lowundcredit.rolled_over - Speichern und kopieren Sie dann den Signierschlüssel in Ihre
.envalsDODO_WEBHOOK_KEY - Starten Sie Ihren Server neu
Schritt 5: Testen Sie den vollständigen Ablauf
Start the server
MailKit running on http://localhost:3000 sehen. Öffnen Sie es in Ihrem Browser.Subscribe a test customer
- Geben Sie in Abschnitt 1 eine Test-E-Mail und einen Namen ein, klicken Sie auf Checkout-Link abrufen
- Öffnen Sie den Link, schließen Sie den Checkout mit einer Testkarte ab
- Nach der Zahlung finden Sie die
customer_idin Ihrem Dashboard unter Kunden
Send a real email
- Fügen Sie die
customer_idin Abschnitt 3 ein - Lassen Sie
toaufdelivered@resend.devgesetzt (Resend’s Sandbox-Posteingang, der alles akzeptiert) - Klicken Sie auf Senden
Trigger the low-balance webhook
- Gehen Sie zu Kunden → [Kunde] → Guthaben → E-Mail-Guthaben
- Klicken Sie auf Guthaben anpassen und belasten Sie
4000 - Senden Sie eine weitere E-Mail über die Demo
Buy a top-up pack
- Fügen Sie die
customer_idin Abschnitt 4 ein - Klicken Sie auf 5.000 E-Mails kaufen, schließen Sie den Test-Checkout ab
- Aktualisieren Sie das Guthaben, und es springt um 5.000 nach oben
credit.added-Event wird mit grant_source: one_time ausgelöst. Die Aufladung stapelt sich auf die Abonnementguthaben; beide Pools werden FIFO verbraucht (ältester nicht abgelaufener Anspruch zuerst).Fehlerbehebung
Webhook signature verification fails (401)
Webhook signature verification fails (401)
express.json() interpretiert und serialisiert die Nutzlast erneut, was den HMAC bricht. Stellen Sie sicher, dass /webhooks/dodo mit express.raw({ type: 'application/json' }) über der app.use(express.json())-Zeile registriert wird und dass DODO_WEBHOOK_KEY mit dem auf der Endpunkt-Detailseite angezeigten Signierschlüssel ü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 werden bei erfolgreicher Zahlung und nicht bei Sitzungsbeginn gewährt)
CREDIT_ENTITLEMENT_IDin Ihrer.envstimmt mit dem an das Produkt angehängten Guthaben überein (falsch zugeordnete IDs schreiben stillschweigend zum falschen Guthaben)- Die
customer_id, die Sie übergeben, stammt von Dodo (diecustomers-Tabelle im Dashboard), nicht aus Ihrer eigenen Datenbank
Resend rejects the recipient
Resend rejects the recipient
onboarding@resend.dev liefert nur an die E-Mail auf Ihrem Resend-Konto oder an delivered@resend.dev. Um an andere zu senden, verifizieren Sie eine Domain und verwenden Sie eine from-Adresse darauf.Was Sie gebaut haben
One reusable credit unit
Email Credits, einmal definiert und sowohl am Abonnementplan als auch am Aufladepaket angehängt.Subscription with prepaid allowance
Top-up pack
Instant ledger debits
createLedgerEntry-Aufruf nach jedem Senden. Kein Zähler, keine Aggregationsverzögerung, idempotent bei wiederholtem Versand über Resend-Nachrichten-ID.