Skip to main content
Untuk meminta coding agent Anda menulis integrasi, instal Dodo Agent Plugin. Plugin ini menambahkan skills dan MCP servers Dodo Payments ke Claude Code, Codex CLI, Cursor, VS Code / GitHub Copilot, Kiro, dan OpenCode.
Anda akan membangun MailKit, layanan email transaksional tempat pelanggan membayar kredit email di muka. Paket bulanan memberikan 5.000 email per billing cycle. Pelanggan yang hampir kehabisan kredit dapat membeli paket top-up tanpa harus menunggu cycle berikutnya. Setiap pengiriman mengurangi satu kredit.
Tutorial ini menggunakan Resend sebagai penyedia email. Free tier-nya (3.000 email per bulan) cukup untuk membangun dan menguji seluruh flow. Pola billing ini dapat digunakan dengan provider apa pun: ganti resend.emails.send dengan pemanggilan ke SendGrid, Postmark, Amazon SES, atau SMTP relay Anda sendiri.
Setelah selesai, Anda akan mengetahui cara:
  • Membuat custom credit entitlement untuk email di dashboard.
  • Menambahkan credits ke subscription plan dan produk top-up one-time.
  • Mengirim email melalui Resend dan mengurangi satu kredit per pengiriman dengan ledger entry.
  • Membaca live credit balance pelanggan dari frontend.
  • Memverifikasi webhook Dodo Payments dan menangani credit.balance_low untuk memperingatkan pelanggan sebelum saldo mereka mencapai nol.

What We’re Building

MailKit menjual dua produk: Unitnya adalah satu email = satu kredit. Pelanggan tidak perlu memahami token, batch, atau unit berbobot. Mereka melihat “tersisa 4.231 email bulan ini.” Sebelum memulai, Anda memerlukan:
  • Akun Dodo Payments. Bangun semuanya dalam test mode.
  • Akun Resend gratis dan API key.
  • Node.js 22 atau yang lebih baru, serta pemahaman tentang TypeScript.

Langkah 1: Buat Email Credit Entitlement Anda

Credit entitlement mendefinisikan unit yang dijual MailKit: satu pengiriman email.
Tab Credits di bawah Products, yang mencantumkan credit entitlements bisnis

The Credits tab under Products lists all your credit entitlements.

1

Open the Credits Section

  1. Masuk ke dashboard Dodo Payments.
  2. Klik Products di sidebar.
  3. Pilih tab Credits.
  4. Klik Create Credit.
2

Configure the Credit Unit

Masukkan nilai berikut:Credit Name: Email CreditsCredit Type: Custom UnitUnit Name: emailDefine Precision: 0. Email adalah unit utuh, jadi saldo tidak memerlukan angka desimal.Credit Expiry: 30 days. Kredit yang tidak digunakan akan kedaluwarsa 30 hari setelah diterbitkan.
Precision tidak dapat diubah setelah credit dibuat. Untuk unit diskret seperti email, pesan, atau session, gunakan 0.
3

Leave the Other Defaults

Tutorial ini menonaktifkan rollover dan overage agar credit flow tetap sederhana. Anda dapat mengaktifkannya nanti, baik pada credit maupun pada credit attachment setiap produk.
4

Save and Copy the Credit ID

Klik Create Credit. Buka credit tersebut dan salin ID-nya, yang dimulai dengan cde_. Backend menggunakannya untuk membaca saldo dan membuat ledger entry.
Entitlement Email Credits siap digunakan. Selanjutnya, buat produk yang memberikannya kepada pelanggan.

Langkah 2: Buat Plan dan Top-Up Pack

Buat dua produk yang menambahkan entitlement Email Credits yang sama: plan Subscription yang memberikan 5.000 email setiap billing cycle, dan top-up One Time yang menambahkan 5.000 email sesuai kebutuhan.
Tutorial ini mengurangi credits dengan ledger entries, bukan usage meters. Ledger debit diterapkan saat API call selesai, tidak memerlukan meter setup, dan cocok untuk kasus ketika satu tindakan pengguna memerlukan tepat satu kredit. Untuk mengurangi credits secara otomatis dari usage events yang diterima, yang cocok untuk unit berbobot seperti token atau megabyte yang diproses, lihat Usage Billing with Credits dalam panduan Credit-Based Billing.

MailKit Plan ($19/bulan, 5.000 Email)

1

Create the Subscription

  1. Buka Products dan klik Add Product.
  2. Masukkan detail produk:
Product Name: MailKit PlanDescription: 5,000 transactional emails per month.
  1. Pada Pricing Type, pilih Subscription.
  2. Tetapkan harga berulang:
Price: 19.00Repeat payment every: 1 bulanCurrency: USD
2

Attach the Email Credit Entitlement

Di bagian Entitlements, klik Attach di sebelah Credits dan konfigurasikan:Select credits: Email CreditsCredits issued per billing cycle: 5000Low Balance Threshold (%): 20. Dodo Payments mengirim credit.balance_low ketika saldo turun di bawah 20% dari credits yang diterbitkan per cycle, yaitu 1.000 email.Import Default Credit Settings: aktif, sehingga produk menggunakan expiry 30 hari dari Langkah 1.Tambahkan credit ke produk, lalu simpan produk tersebut. Salin product ID, yang dimulai dengan pdt_.
Plan: $19/bulan, dengan 5.000 email diterbitkan setiap billing cycle.

Top-Up Pack ($9 One-Time, 5.000 Email)

1

Create a One-Time Product

  1. Buka Products dan klik Add Product.
  2. Masukkan detail produk:
Product Name: Email Top-Up PackDescription: Add 5,000 emails to your MailKit balance.
  1. Pada Pricing Type, pilih One Time.
  2. Tetapkan harga:
Price: 9.00Currency: USD
2

Attach the Credit Grant

Di bagian Entitlements, klik Attach di sebelah Credits dan konfigurasikan:
  • Select credits: Email Credits
  • No of credits issued: 5000
Produk one-time memberikan credit dengan expiry-nya sendiri: 30 hari sejak pembelian, berdasarkan default yang Anda tetapkan di Langkah 1. Kredit top-up ditambahkan ke kredit subscription. Kredit tersebut tidak menggantikannya.
Simpan produk dan salin ID-nya.
Top-Up Pack: $9 untuk 5.000 email, ditambahkan ke saldo setelah pembayaran berhasil.

Langkah 3: Siapkan Backend

Bangun Express server yang membuat checkout, mengirim email, membaca saldo, dan menerima webhook.
1

Initialize the Project

Tambahkan dev script ke package.json:
tsx menjalankan TypeScript secara langsung, tanpa build step atau tsconfig.json. Untuk production, tambahkan tsconfig.json dan script build.
2

Configure Environment Variables

Buat .env menggunakan API key test mode dari Developer → API Keys dan ID dari Langkah 1 dan 2:
.env
Anda akan mengisi DODO_PAYMENTS_WEBHOOK_KEY pada Langkah 4, setelah membuat webhook endpoint. Buat API key Resend di resend.com/api-keys.
Tambahkan .env ke .gitignore sebelum commit pertama Anda. Jangan pernah commit API key.
3

Build the Server

Buat server.ts di root project. Server ini menyediakan lima route: subscribe checkout, top-up checkout, balance read, send, dan webhook receiver.
Webhook route harus menerima raw request body. express.json() mengganti body dengan parsed object, sedangkan signature verification memerlukan byte persis yang ditandatangani Dodo Payments. Pertahankan route /webhooks/dodo, dengan express.raw(), di atas baris app.use(express.json()).
Backend siap: subscribe, top-up, balance, send, dan webhook handler.
4

Add a Demo UI

Buat public/index.html. File ini memanggil setiap route dari form sederhana, sehingga Anda dapat menguji flow di browser:

Langkah 4: Hubungkan Webhook Endpoint

Event credit.balance_low memungkinkan Anda memperingatkan pelanggan sebelum kredit mereka habis. Tanpanya, pelanggan baru menyadari masalah ketika email gagal dikirim.
1

Expose Your Local Server

Webhook memerlukan URL publik. Selama development, gunakan ngrok atau tunnel lainnya:
Salin HTTPS forwarding URL, misalnya https://1234abcd.ngrok-free.app.
2

Register the Endpoint in Dodo Payments

  1. Buka Developer → Webhooks dan klik Add endpoint.
  2. Masukkan URL https://1234abcd.ngrok-free.app/webhooks/dodo, menggunakan tunnel host Anda sendiri.
  3. Pilih event credit.added, credit.balance_low, dan credit.rolled_over.
  4. Klik Create endpoint.
  5. Salin signing secret dari tab Overview endpoint ke .env sebagai DODO_PAYMENTS_WEBHOOK_KEY.
  6. Restart server.

Langkah 5: Uji Full Flow

1

Start the Server

Server mencatat MailKit running on http://localhost:3000. Buka URL tersebut di browser.
2

Subscribe a Test Customer

  1. Di bagian 1, masukkan alamat email dan nama untuk pengujian, lalu klik Get checkout link.
  2. Buka link tersebut dan selesaikan checkout dengan test card.
  3. Di dashboard, buka Customers dan salin ID pelanggan baru, yang dimulai dengan cus_.
Pelanggan tersebut memiliki 5.000 email di saldonya. Untuk mengonfirmasi, buka pelanggan di Customers dan pilih tab Credits.
3

Send an Email

  1. Tempelkan customer ID ke bagian 3.
  2. Biarkan To tetap delivered@resend.dev, alamat pengujian Resend yang menerima setiap pesan.
  3. Klik Send.
Halaman menampilkan message ID Resend. Refresh balance di bagian 2: nilainya menjadi 4.999. Ledger debit menjadi bagian dari saldo segera setelah API call selesai.
4

Trigger the Low-Balance Webhook

Threshold-nya adalah 20%, atau 1.000 dari 5.000 email yang diterbitkan per cycle. Untuk mencapainya tanpa mengirim 4.000 email, lakukan debit saldo secara manual di dashboard:
  1. Buka pelanggan di Customers, pilih tab Credits, lalu pilih Email Credits.
  2. Klik Apply Credit/Debit, pilih Debit, dan masukkan 4000. Saldo kini tepat 1.000, yang belum berada di bawah threshold.
  3. Kirim satu email lagi dari demo. Saldo turun menjadi 999.
Saat webhook tiba, server mencatat:
Server menerima dan memverifikasi webhook. Dalam production, di sinilah Anda mengirim email kepada pelanggan atau menampilkan banner dalam aplikasi.
5

Buy a Top-Up Pack

  1. Tempelkan customer ID ke bagian 4.
  2. Klik Buy 5,000 emails dan selesaikan test checkout.
  3. Refresh balance. Saldo bertambah 5.000.
Dodo Payments mengirim event credit.added dengan transaction_type: "credit_added". Grant di baliknya memiliki source_type: one_time, yang dapat Anda baca kembali menggunakan API List Customer Grants. Kredit top-up ditambahkan ke kredit subscription. Debit diambil dari grant yang kedaluwarsa lebih dahulu, dan dari grant paling lama jika dua grant kedaluwarsa pada waktu yang sama.
6

Test the Hard Stop

Kurangi saldo hingga nol di dashboard, lalu coba kirim satu email lagi. Server merespons dengan 402:
402 tersebut adalah enforcement aplikasi Anda. Perlakukan balance API Dodo Payments sebagai source of truth, dan jangan menyimpan saldo dalam cache di client.

Troubleshooting

Signature mencakup raw HTTP body. express.json() mengganti body dengan parsed object, sehingga verification gagal. Daftarkan /webhooks/dodo dengan express.raw({ type: 'application/json' }) di atas baris app.use(express.json()). Lalu periksa bahwa DODO_PAYMENTS_WEBHOOK_KEY cocok dengan signing secret pada tab Overview endpoint.
Periksa tiga hal berikut, secara berurutan:
  1. Pelanggan menyelesaikan checkout. Credit diterbitkan saat pembayaran berhasil, bukan saat checkout session dibuat.
  2. CREDIT_ENTITLEMENT_ID di .env cocok dengan credit yang ditambahkan ke produk. Panggilan balance dan ledger menggunakan ID ini, sehingga ketidakcocokan akan membaca atau mengurangi credit yang berbeda.
  3. customer_id yang Anda teruskan adalah customer ID Dodo Payments (dimulai dengan cus_), bukan ID dari database Anda sendiri.
Test sender onboarding@resend.dev hanya mengirim ke alamat email pada akun Resend Anda, atau ke delivered@resend.dev. Untuk mengirim ke pihak lain, verifikasi domain dan gunakan alamat from pada domain tersebut.

Yang Anda Bangun

One Reusable Credit Unit

Email Credits, yang didefinisikan sekali dan ditambahkan ke subscription plan serta top-up pack.

Subscription with Prepaid Allowance

$19/bulan memberikan 5.000 email per billing cycle. Pelanggan mengetahui apa yang mereka bayar, dan Anda mengetahui biaya maksimum Anda.

Top-Up Pack

Produk one-time yang memberikan 5.000 email di atas kredit subscription, tanpa mengubah plan.

Direct Ledger Debits

Satu panggilan createLedgerEntry setelah setiap pengiriman, tanpa meter dan tanpa aggregation delay. Resend message ID sebagai idempotency key mencegah debit kedua untuk pengiriman yang sama.

Credit-Based Billing Reference

Rollover, mode overage, ledger management, dan credit API lengkap.
Untuk bantuan, tanyakan di Discord Community atau kirim email ke support@dodopayments.com.
Terakhir diubah pada 26 September 2026