resend.emails.send med ett anrop till SendGrid, Postmark, Amazon SES eller din egen SMTP-reläserver.- Skapar en anpassad kreditförmån för e-postmeddelanden i instrumentpanelen.
- Kopplar krediter till en prenumerationsplan och en engångsprodukt för påfyllnad.
- Skickar e-post via Resend och debiterar en kredit per utskick med en post i liggaren.
- Läser en kunds aktuella kreditbalans från frontend.
- Verifierar Dodo Payments-webhooks och hanterar
credit.balance_lowför att varna kunder innan balansen når noll.
What We’re Building
MailKit säljer två produkter:- Ett Dodo Payments-konto. Bygg allt i testläge.
- Ett kostnadsfritt Resend-konto och en API key.
- Node.js 22 eller senare samt kunskaper i TypeScript.
Steg 1: Skapa din kreditförmån för e-post
Kreditförmånen definierar den enhet som MailKit säljer: ett e-postutskick.
The Credits tab under Products lists all your credit entitlements.
Open the Credits Section
- Logga in på Dodo Payments-instrumentpanelen.
- Klicka på Products i sidofältet.
- Välj fliken Credits.
- Klicka på Create Credit.
Configure the Credit Unit
Email CreditsCredit Type: Custom UnitUnit Name: emailDefine Precision: 0. Ett e-postmeddelande är en hel enhet, så balansen behöver aldrig decimaler.Credit Expiry: 30 days. Oanvända krediter löper ut 30 dagar efter att de utfärdats.Leave the Other Defaults
Save and Copy the Credit ID
cde_. Backend använder det för balansavläsningar och poster i liggaren.Email Credits är klar. Nu skapar du produkterna som ger kunderna den.Steg 2: Skapa planen och påfyllnadspaketet
Skapa två produkter som kopplar sammaEmail Credits-förmån: en Subscription-plan som ger 5 000 e-postmeddelanden per faktureringscykel och en One Time-påfyllnad som lägger till ytterligare 5 000 vid behov.
MailKit Plan ($19/månad, 5 000 e-postmeddelanden)
Create the Subscription
- Gå till Products och klicka på Add Product.
- Ange produktinformationen:
MailKit PlanDescription: 5,000 transactional emails per month.- Välj Subscription under Pricing Type.
- Ange det återkommande priset:
19.00Repeat payment every: 1 månadCurrency: USDAttach the Email Credit Entitlement
Email CreditsCredits issued per billing cycle: 5000Low Balance Threshold (%): 20. Dodo Payments skickar credit.balance_low när balansen sjunker under 20 % av krediterna som utfärdas per cykel, vilket motsvarar 1 000 e-postmeddelanden.Import Default Credit Settings: på, så att produkten använder utgångstiden på 30 dagar från steg 1.Lägg till krediten i produkten och spara sedan produkten. Kopiera produkt-ID:t, som börjar med pdt_.Top-Up Pack ($9 som engångsbelopp, 5 000 e-postmeddelanden)
Create a One-Time Product
- Gå till Products och klicka på Add Product.
- Ange produktinformationen:
Email Top-Up PackDescription: Add 5,000 emails to your MailKit balance.- Välj One Time under Pricing Type.
- Ange priset:
9.00Currency: USDAttach the Credit Grant
- Select credits:
Email Credits - No of credits issued:
5000
Steg 3: Konfigurera backend
Bygg Express-servern som skapar checkouts, skickar e-post, läser balanser och tar emot webhooks.Initialize the Project
package.json:Configure Environment Variables
.env med en API key i testläge från Developer → API Keys och ID:erna från steg 1 och 2:DODO_PAYMENTS_WEBHOOK_KEY i steg 4, efter att du har skapat webhook-endpointen. Skapa Resend API key på resend.com/api-keys.Build the Server
server.ts i projektroten. Servern exponerar fem routes: checkout för prenumeration, checkout för påfyllnad, balansavläsning, utskick och webhook-mottagare.Add a Demo UI
public/index.html. Den anropar varje route från ett enkelt formulär, så att du kan testa flödet i en webbläsare:Steg 4: Koppla in webhook-endpointen
Händelsencredit.balance_low gör att du kan varna kunder innan krediterna tar slut. Utan den upptäcker kunden problemet först när ett e-postmeddelande inte kan skickas.
Expose Your Local Server
https://1234abcd.ngrok-free.app.Register the Endpoint in Dodo Payments
- Gå till Developer → Webhooks och klicka på Add endpoint.
- Ange URL:en
https://1234abcd.ngrok-free.app/webhooks/dodooch använd din egen tunnelvärd. - Välj händelserna
credit.added,credit.balance_lowochcredit.rolled_over. - Klicka på Create endpoint.
- Kopiera signeringshemligheten från endpointens flik Overview till
.envsomDODO_PAYMENTS_WEBHOOK_KEY. - Starta om servern.
Steg 5: Testa hela flödet
Start the Server
MailKit running on http://localhost:3000. Öppna URL:en i webbläsaren.Subscribe a Test Customer
- I avsnitt 1 anger du en test-e-postadress och ett namn och klickar sedan på Get checkout link.
- Öppna länken och slutför checkout med ett testkort.
- Gå till Customers i instrumentpanelen och kopiera ID:t för den nya kunden, som börjar med
cus_.
Send an Email
- Klistra in kund-ID:t i avsnitt 3.
- Låt To vara
delivered@resend.dev, en Resend-testadress som accepterar alla meddelanden. - Klicka på Send.
Trigger the Low-Balance Webhook
- Öppna kunden i Customers, välj fliken Credits och välj Email Credits.
- Klicka på Apply Credit/Debit, välj Debit och ange
4000. Balansen är nu exakt 1 000, vilket ännu inte ligger under tröskeln. - Skicka ytterligare ett e-postmeddelande från demon. Balansen sjunker till 999.
Buy a Top-Up Pack
- Klistra in kund-ID:t i avsnitt 4.
- Klicka på Buy 5,000 emails och slutför test-checkouten.
- Uppdatera balansen. Den ökar med 5 000.
credit.added-händelse med transaction_type: "credit_added". Förmånen bakom den har source_type: one_time, som du kan läsa tillbaka med API:t List Customer Grants. Påfyllnadskrediter läggs till prenumerationskrediterna. Debiteringar dras från den förmån som löper ut först och från den äldsta förmånen när två löper ut samtidigt.Test the Hard Stop
402:402 är din applikations kontroll. Betrakta Dodo Payments balance API som sanningskälla och cacha inte balansen på klienten.Felsökning
Webhook signature verification fails (401)
Webhook signature verification fails (401)
express.json() ersätter body:n med ett tolkat objekt, så verifieringen misslyckas. Registrera /webhooks/dodo med express.raw({ type: 'application/json' }) ovanför raden app.use(express.json()). Kontrollera sedan att DODO_PAYMENTS_WEBHOOK_KEY matchar signeringshemligheten på endpointens flik Overview.Balance is 0, customer not found, or credits don't deduct
Balance is 0, customer not found, or credits don't deduct
- Kunden slutförde checkout. Krediter utfärdas när betalningen genomförs, inte när checkout-sessionen skapas.
CREDIT_ENTITLEMENT_IDi.envmatchar krediten som är kopplad till produkten. Balans- och liggaranropen använder detta ID, så en felaktighet innebär att en annan kredit läses eller debiteras.customer_idsom du skickar är Dodo Payments-kundens ID (det börjar medcus_), inte ett ID från din egen databas.
Resend rejects the recipient
Resend rejects the recipient
onboarding@resend.dev levererar endast till e-postadressen på ditt Resend-konto eller till delivered@resend.dev. Om du vill skicka till någon annan måste du verifiera en domän och använda en from-adress på den domänen.Det här byggde du
One Reusable Credit Unit
Email Credits, definierad en gång och kopplad till både prenumerationsplanen och påfyllnadspaketet.Subscription with Prepaid Allowance
Top-Up Pack
Direct Ledger Debits
createLedgerEntry-anrop efter varje utskick, utan mätare eller aggregeringsfördröjning. Resend-meddelande-ID:t som idempotency key förhindrar en andra debitering för samma utskick.