Skip to main content
Om du vill att din kodagent ska skriva integrationen installerar du Dodo Agent Plugin. Det lägger till Dodo Payments-färdigheterna och MCP-servrarna i Claude Code, Codex CLI, Cursor, VS Code / GitHub Copilot, Kiro och OpenCode.
Du ska bygga MailKit, en transaktionell e-posttjänst där kunder förskottsbetalar för e-postkrediter. En månadsplan ger 5 000 e-postmeddelanden per faktureringscykel. En kund som börjar få slut på krediter köper i stället ett påfyllnadspaket i väntan på nästa cykel. Varje utskick debiterar en kredit.
Den här självstudien använder Resend som e-postleverantör. Dess kostnadsfria nivå (3 000 e-postmeddelanden per månad) räcker för att bygga och testa hela flödet. Faktureringsmönstret fungerar med alla leverantörer: ersätt resend.emails.send med ett anrop till SendGrid, Postmark, Amazon SES eller din egen SMTP-reläserver.
När du är klar vet du hur man:
  • 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_low för att varna kunder innan balansen når noll.

What We’re Building

MailKit säljer två produkter: Enheten är ett e-postmeddelande = en kredit. Kunderna behöver inte fundera på tokens, batchar eller viktade enheter. De ser ”4 231 e-postmeddelanden kvar den här månaden.” Innan du börjar behöver du:
  • 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.
Fliken Credits under Products, med företagets kreditförmåner listade

The Credits tab under Products lists all your credit entitlements.

1

Open the Credits Section

  1. Logga in på Dodo Payments-instrumentpanelen.
  2. Klicka på Products i sidofältet.
  3. Välj fliken Credits.
  4. Klicka på Create Credit.
2

Configure the Credit Unit

Ange följande värden:Credit Name: 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.
Precisionen kan inte ändras efter att du har skapat krediten. För diskreta enheter som e-postmeddelanden, meddelanden eller sessioner använder du 0.
3

Leave the Other Defaults

Den här självstudien lämnar överföring och överutnyttjande avstängda för att hålla kreditflödet minimalt. Du kan aktivera dem senare, antingen för krediten eller för varje produkts kreditkoppling.
4

Save and Copy the Credit ID

Klicka på Create Credit. Öppna krediten och kopiera dess ID, som börjar med cde_. Backend använder det för balansavläsningar och poster i liggaren.
Förmånen Email Credits är klar. Nu skapar du produkterna som ger kunderna den.

Steg 2: Skapa planen och påfyllnadspaketet

Skapa två produkter som kopplar samma Email 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.
Den här självstudien debiterar krediter med poster i liggaren i stället för användningsmätare. En debitering i liggaren tillämpas när API-anropet returnerar, kräver ingen mätarkonfiguration och passar fall där en användaråtgärd kostar exakt en kredit. Om du vill dra av krediter automatiskt från inlästa användningshändelser, vilket passar viktade enheter som tokens eller bearbetade megabyte, läser du Usage Billing with Credits i guiden Credit-Based Billing.

MailKit Plan ($19/månad, 5 000 e-postmeddelanden)

1

Create the Subscription

  1. Gå till Products och klicka på Add Product.
  2. Ange produktinformationen:
Product Name: MailKit PlanDescription: 5,000 transactional emails per month.
  1. Välj Subscription under Pricing Type.
  2. Ange det återkommande priset:
Price: 19.00Repeat payment every: 1 månadCurrency: USD
2

Attach the Email Credit Entitlement

I avsnittet Entitlements klickar du på Attach bredvid Credits och konfigurerar följande:Select credits: 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_.
Plan: $19/månad, med 5 000 e-postmeddelanden utfärdade per faktureringscykel.

Top-Up Pack ($9 som engångsbelopp, 5 000 e-postmeddelanden)

1

Create a One-Time Product

  1. Gå till Products och klicka på Add Product.
  2. Ange produktinformationen:
Product Name: Email Top-Up PackDescription: Add 5,000 emails to your MailKit balance.
  1. Välj One Time under Pricing Type.
  2. Ange priset:
Price: 9.00Currency: USD
2

Attach the Credit Grant

I avsnittet Entitlements klickar du på Attach bredvid Credits och konfigurerar följande:
  • Select credits: Email Credits
  • No of credits issued: 5000
En engångsprodukt ger krediter med en egen utgångstid: 30 dagar från köpet, enligt standardinställningen du angav i steg 1. Påfyllnadskrediter läggs till prenumerationskrediterna. De ersätter dem inte.
Spara produkten och kopiera dess ID.
Top-Up Pack: $9 för 5 000 e-postmeddelanden, som läggs till i balansen när betalningen har genomförts.

Steg 3: Konfigurera backend

Bygg Express-servern som skapar checkouts, skickar e-post, läser balanser och tar emot webhooks.
1

Initialize the Project

Lägg till ett dev-skript i package.json:
tsx kör TypeScript direkt, utan ett build-steg eller en tsconfig.json. För produktion lägger du till en tsconfig.json och ett build-skript.
2

Configure Environment Variables

Skapa .env med en API key i testläge från Developer → API Keys och ID:erna från steg 1 och 2:
.env
Du fyller i DODO_PAYMENTS_WEBHOOK_KEY i steg 4, efter att du har skapat webhook-endpointen. Skapa Resend API key på resend.com/api-keys.
Lägg till .env i .gitignore före din första commit. Lägg aldrig API keys i versionshanteringen.
3

Build the Server

Skapa server.ts i projektroten. Servern exponerar fem routes: checkout för prenumeration, checkout för påfyllnad, balansavläsning, utskick och webhook-mottagare.
Webhook-routen måste ta emot den råa request body. express.json() ersätter body med ett tolkat objekt, och signaturverifiering kräver exakt de bytes som Dodo Payments signerade. Behåll /webhooks/dodo-routen, med express.raw(), ovanför raden app.use(express.json()).
Backend är klar: prenumeration, påfyllnad, balans, utskick och webhook-hanterare.
4

Add a Demo UI

Skapa 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ändelsen credit.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.
1

Expose Your Local Server

Webhooks behöver en offentlig URL. Använd ngrok eller en annan tunnel under utvecklingen:
Kopiera HTTPS-vidarebefordrings-URL:en, till exempel https://1234abcd.ngrok-free.app.
2

Register the Endpoint in Dodo Payments

  1. Gå till Developer → Webhooks och klicka på Add endpoint.
  2. Ange URL:en https://1234abcd.ngrok-free.app/webhooks/dodo och använd din egen tunnelvärd.
  3. Välj händelserna credit.added, credit.balance_low och credit.rolled_over.
  4. Klicka på Create endpoint.
  5. Kopiera signeringshemligheten från endpointens flik Overview till .env som DODO_PAYMENTS_WEBHOOK_KEY.
  6. Starta om servern.

Steg 5: Testa hela flödet

1

Start the Server

Servern loggar MailKit running on http://localhost:3000. Öppna URL:en i webbläsaren.
2

Subscribe a Test Customer

  1. I avsnitt 1 anger du en test-e-postadress och ett namn och klickar sedan på Get checkout link.
  2. Öppna länken och slutför checkout med ett testkort.
  3. Gå till Customers i instrumentpanelen och kopiera ID:t för den nya kunden, som börjar med cus_.
Kunden har 5 000 e-postmeddelanden i sin balans. Bekräfta genom att öppna kunden i Customers och välja fliken Credits.
3

Send an Email

  1. Klistra in kund-ID:t i avsnitt 3.
  2. Låt To vara delivered@resend.dev, en Resend-testadress som accepterar alla meddelanden.
  3. Klicka på Send.
Sidan visar Resend-meddelande-ID:t. Uppdatera balansen i avsnitt 2: den visar 4 999. En debitering i liggaren ingår i balansen så snart API-anropet returnerar.
4

Trigger the Low-Balance Webhook

Tröskeln är 20 %, eller 1 000 av de 5 000 e-postmeddelanden som utfärdas per cykel. För att nå den utan att skicka 4 000 e-postmeddelanden debiterar du balansen manuellt i instrumentpanelen:
  1. Öppna kunden i Customers, välj fliken Credits och välj Email Credits.
  2. Klicka på Apply Credit/Debit, välj Debit och ange 4000. Balansen är nu exakt 1 000, vilket ännu inte ligger under tröskeln.
  3. Skicka ytterligare ett e-postmeddelande från demon. Balansen sjunker till 999.
När webhooken anländer loggar servern:
Servern tog emot och verifierade webhooken. I produktion är det här du skickar e-post till kunden eller visar en banner i appen.
5

Buy a Top-Up Pack

  1. Klistra in kund-ID:t i avsnitt 4.
  2. Klicka på Buy 5,000 emails och slutför test-checkouten.
  3. Uppdatera balansen. Den ökar med 5 000.
Dodo Payments skickar en 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.
6

Test the Hard Stop

Debiterar balansen till noll i instrumentpanelen och försök sedan skicka ytterligare ett e-postmeddelande. Servern svarar med 402:
402 är din applikations kontroll. Betrakta Dodo Payments balance API som sanningskälla och cacha inte balansen på klienten.

Felsökning

Signaturen omfattar den råa HTTP-body:n. 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.
Kontrollera dessa tre saker i ordning:
  1. Kunden slutförde checkout. Krediter utfärdas när betalningen genomförs, inte när checkout-sessionen skapas.
  2. CREDIT_ENTITLEMENT_ID i .env matchar 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.
  3. customer_id som du skickar är Dodo Payments-kundens ID (det börjar med cus_), inte ett ID från din egen databas.
Testavsändaren 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

$19/månad ger 5 000 e-postmeddelanden per faktureringscykel. Kunderna vet vad de betalar för och du vet din maximala kostnad.

Top-Up Pack

En engångsprodukt som ger 5 000 e-postmeddelanden utöver prenumerationskrediterna, utan att planen ändras.

Direct Ledger Debits

Ett 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.

Credit-Based Billing Reference

Överföring, lägen för överutnyttjande, liggarhantering och hela credit API.
Om du behöver hjälp kan du fråga i Discord Community eller skicka e-post till support@dodopayments.com.
Senast ändrad 26 september 2026