Skip to main content
コーディングエージェントに統合を作成させるには、Dodo Agent Pluginをインストールします。これにより、Claude Code、Codex CLI、Cursor、VS Code / GitHub Copilot、Kiro、OpenCodeにDodo PaymentsのスキルとMCPサーバーが追加されます。
MailKitという、顧客がメールクレジットを前払いするトランザクションメールサービスを構築します。月額プランでは、1請求サイクルごとに5,000通のメールが付与されます。残高が少なくなった顧客は、次のサイクルを待つ代わりに追加購入パックを購入します。メールを1通送信するごとに、クレジットを1つデビットします。
このチュートリアルでは、メールプロバイダーとしてResendを使用します。無料プラン(月3,000通)は、フロー全体の構築とテストに十分です。この課金パターンはどのプロバイダーでも利用できます。resend.emails.sendを、SendGrid、Postmark、Amazon SES、または独自のSMTPリレーへの呼び出しに置き換えてください。
完了すると、次の方法が分かります。
  • ダッシュボードでメール用のカスタムクレジットentitlementを作成する。
  • サブスクリプションプランと一回限りの追加購入プロダクトにクレジットを関連付ける。
  • Resend経由でメールを送信し、送信ごとに1クレジットをデビットしてledgerエントリを作成する。
  • フロントエンドから顧客の現在のクレジット残高を読み取る。
  • Dodo Paymentsのwebhookを検証し、残高がゼロになる前に顧客へ警告するcredit.balance_lowを処理する。

構築するもの

MailKitでは2つのプロダクトを販売します。 単位はメール1通 = クレジット1つです。顧客がトークン、バッチ、重み付き単位について考える必要はありません。「今月あと4,231通送信できます」と表示されます。 開始する前に、次のものが必要です。
  • Dodo Paymentsアカウント。すべてテストモードで構築します。
  • 無料のResendアカウントとAPIキー。
  • Node.js 22以降、およびTypeScriptの基本的な知識。

Step 1: メールクレジットentitlementを作成する

クレジットentitlementでは、MailKitが販売する単位、つまりメール1通の送信を定義します。
ビジネスのクレジットentitlementを一覧表示するProducts内のCreditsタブ

The Credits tab under Products lists all your credit entitlements.

1

Open the Credits Section

  1. Dodo Paymentsダッシュボードにログインします。
  2. サイドバーでProductsをクリックします。
  3. Creditsタブを選択します。
  4. Create Creditをクリックします。
2

Configure the Credit Unit

次の値を入力します。Credit Name: Email CreditsCredit Type: Custom UnitUnit Name: emailDefine Precision: 0。メールは整数単位なので、残高に小数は必要ありません。Credit Expiry: 30 days。未使用のクレジットは発行から30日後に期限切れになります。
クレジットの作成後にPrecisionを変更することはできません。メール、メッセージ、セッションなどの離散的な単位には、0を使用します。
3

Leave the Other Defaults

クレジットのフローを簡潔に保つため、このチュートリアルではロールオーバーと超過使用を無効にします。後から、クレジット自体または各プロダクトのクレジット関連付けで有効にできます。
4

Save and Copy the Credit ID

Create Creditをクリックします。クレジットを開き、cde_で始まるIDをコピーします。バックエンドでは、残高の読み取りとledgerエントリにこのIDを使用します。
Email Credits entitlementの準備ができました。次に、顧客へ付与するプロダクトを作成します。

Step 2: プランと追加購入パックを作成する

同じEmail Credits entitlementを関連付けた2つのプロダクトを作成します。1請求サイクルごとに5,000通を付与するSubscriptionプランと、必要に応じてさらに5,000通を追加するOne Timeの追加購入プロダクトです。
このチュートリアルでは、usage meterではなくledgerエントリでクレジットをデビットします。ledgerデビットはAPI呼び出しが返った時点で適用され、meterの設定は不要です。1つのユーザー操作が正確に1クレジットを消費するケースに適しています。トークンや処理済みメガバイトのような重み付き単位に適した、取り込んだusageイベントからクレジットを自動的に差し引く方法については、Credit-Based BillingガイドのUsage Billing with Creditsを参照してください。

MailKit Plan ($19/月、5,000通)

1

Create the Subscription

  1. Productsに移動し、Add Productをクリックします。
  2. プロダクトの詳細を入力します。
Product Name: MailKit PlanDescription: 5,000 transactional emails per month.
  1. Pricing TypeでSubscriptionを選択します。
  2. 継続価格を設定します。
Price: 19.00Repeat payment every: 1 monthCurrency: USD
2

Attach the Email Credit Entitlement

Entitlementsセクションで、Creditsの横にあるAttachをクリックして、次のように設定します。Select credits: Email CreditsCredits issued per billing cycle: 5000Low Balance Threshold (%): 20。残高が1請求サイクルあたりに発行されたクレジットの20%未満、つまり1,000通未満になると、Dodo Paymentsはcredit.balance_lowを送信します。Import Default Credit Settings: オン。これにより、プロダクトではStep 1で設定した30日間の有効期限が使用されます。クレジットをプロダクトに追加してから、プロダクトを保存します。pdt_で始まるプロダクトIDをコピーします。
プラン: $19/月、1請求サイクルごとに5,000通を発行。

Top-Up Pack ($9、一回限り、5,000通)

1

Create a One-Time Product

  1. Productsに移動し、Add Productをクリックします。
  2. プロダクトの詳細を入力します。
Product Name: Email Top-Up PackDescription: Add 5,000 emails to your MailKit balance.
  1. Pricing TypeでOne Timeを選択します。
  2. 価格を設定します。
Price: 9.00Currency: USD
2

Attach the Credit Grant

Entitlementsセクションで、Creditsの横にあるAttachをクリックして、次のように設定します。
  • Select credits: Email Credits
  • No of credits issued: 5000
一回限りのプロダクトでは、独自の有効期限を持つクレジットが付与されます。これはStep 1で設定したデフォルトに基づき、購入から30日後です。追加購入クレジットはサブスクリプションクレジットに加算され、置き換えられることはありません。
プロダクトを保存し、そのIDをコピーします。
Top-Up Pack: $9で5,000通。支払いが成功した後、残高に追加されます。

Step 3: バックエンドを設定する

チェックアウトの作成、メール送信、残高の読み取り、webhookの受信を行うExpressサーバーを構築します。
1

Initialize the Project

package.jsonにdevスクリプトを追加します。
tsxは、ビルドステップやtsconfig.jsonなしでTypeScriptを直接実行します。本番環境では、tsconfig.jsonとbuildスクリプトを追加します。
2

Configure Environment Variables

Developer → API Keysから取得したテストモードのAPIキーと、Steps 1および2で取得したIDを使って、.envを作成します。
.env
webhook endpointを作成した後、Step 4でDODO_PAYMENTS_WEBHOOK_KEYを入力します。Resend APIキーはresend.com/api-keysで作成します。
最初のコミット前に、.envを.gitignoreに追加します。APIキーは絶対にコミットしないでください。
3

Build the Server

プロジェクトのルートにserver.tsを作成します。サーバーでは、サブスクライブチェックアウト、追加購入チェックアウト、残高の読み取り、送信、webhook受信の5つのrouteを公開します。
webhook routeではraw request bodyを受信する必要があります。express.json()はbodyを解析済みオブジェクトに置き換えますが、signature verificationにはDodo Paymentsが署名した正確なバイト列が必要です。/webhooks/dodo routeをexpress.raw()とともに、app.use(express.json())行より上に置きます。
バックエンドの準備ができました。サブスクライブ、追加購入、残高、送信、webhook handlerに対応しています。
4

Add a Demo UI

public/index.htmlを作成します。各routeを簡単なフォームから呼び出すため、ブラウザでフローをテストできます。

Step 4: Webhook endpointを接続する

credit.balance_lowイベントを使うと、顧客のクレジットがなくなる前に警告できます。これがない場合、顧客が問題に気付くのは、メール送信に失敗してからです。
1

Expose Your Local Server

Webhookにはpublic URLが必要です。開発中は、ngrokまたは別のtunnelを使用します。
HTTPS forwarding URLをコピーします。例: https://1234abcd.ngrok-free.app。
2

Register the Endpoint in Dodo Payments

  1. Developer → Webhooksに移動し、Add endpointをクリックします。
  2. 自分のtunnel hostを使って、URL https://1234abcd.ngrok-free.app/webhooks/dodoを入力します。
  3. credit.added、credit.balance_low、credit.rolled_overイベントを選択します。
  4. Create endpointをクリックします。
  5. endpointのOverviewタブからsigning secretをコピーし、.envのDODO_PAYMENTS_WEBHOOK_KEYとして入力します。
  6. サーバーを再起動します。

Step 5: フロー全体をテストする

1

Start the Server

サーバーにMailKit running on http://localhost:3000が記録されます。そのURLをブラウザで開きます。
2

Subscribe a Test Customer

  1. セクション1でテスト用メールアドレスと名前を入力し、Get checkout linkをクリックします。
  2. リンクを開き、test cardでチェックアウトを完了します。
  3. ダッシュボードでCustomersに移動し、cus_で始まる新しい顧客のIDをコピーします。
顧客の残高には5,000通のメールがあります。確認するには、Customersで顧客を開き、Creditsタブを選択します。
3

Send an Email

  1. セクション3に顧客IDを貼り付けます。
  2. Toはdelivered@resend.devのままにします。これはすべてのメッセージを受け付けるResendのテストアドレスです。
  3. Sendをクリックします。
ページにResend message IDが表示されます。セクション2で残高を更新すると、4,999になっています。API呼び出しが返ると同時に、ledgerデビットが残高に反映されます。
4

Trigger the Low-Balance Webhook

しきい値は20%、つまり1サイクルあたりに発行された5,000通のうち1,000通です。4,000通送信せずにこの値に到達するには、ダッシュボードで残高を手動でデビットします。
  1. Customersで顧客を開き、Creditsタブを選択して、Email Creditsを選びます。
  2. Apply Credit/Debitをクリックし、Debitを選択して、4000を入力します。残高はちょうど1,000になりますが、まだしきい値未満ではありません。
  3. デモからもう1通メールを送信します。残高は999になります。
webhookが届くと、サーバーに次のように記録されます。
サーバーがwebhookを受信し、検証しました。本番環境では、ここで顧客にメールを送信するか、アプリ内バナーを表示します。
5

Buy a Top-Up Pack

  1. セクション4に顧客IDを貼り付けます。
  2. Buy 5,000 emailsをクリックし、テストチェックアウトを完了します。
  3. 残高を更新します。5,000増加しています。
Dodo Paymentsはtransaction_type: "credit_added"を含むcredit.addedイベントを送信します。その背後にあるgrantにはsource_type: one_timeがあります。これはList Customer Grants APIで読み取れます。追加購入クレジットはサブスクリプションクレジットに加算されます。デビットは最初に期限切れになるgrantから、同時に期限切れになる場合は最も古いgrantから消費されます。
6

Test the Hard Stop

ダッシュボードで残高をゼロまでデビットし、もう1通メールを送信してみます。サーバーは402を返します。
この402は、アプリケーションによる制御です。Dodo Paymentsの残高APIをsource of truthとして扱い、クライアント側で残高をキャッシュしないでください。

トラブルシューティング

署名はraw HTTP bodyを対象とします。express.json()はbodyを解析済みオブジェクトに置き換えるため、検証に失敗します。/webhooks/dodoをexpress.raw({ type: 'application/json' })とともに、app.use(express.json())行より上で登録します。次に、DODO_PAYMENTS_WEBHOOK_KEYがendpointのOverviewタブにあるsigning secretと一致することを確認します。
次の3点を順番に確認します。
  1. 顧客がcheckoutを完了していること。クレジットはcheckout sessionの作成時ではなく、支払いが成功したときに発行されます。
  2. .env内のCREDIT_ENTITLEMENT_IDが、プロダクトに関連付けられたクレジットと一致していること。残高とledgerの呼び出しではこのIDを使用するため、一致しないと別のクレジットを読み取ったりデビットしたりします。
  3. 渡しているcustomer_idがDodo Paymentsの顧客IDであること。cus_で始まるIDであり、自分のデータベースのIDではありません。
テストsender onboarding@resend.devは、Resendアカウントのメールアドレス、またはdelivered@resend.devにのみ配信します。他の宛先に送信するには、ドメインを検証し、そのドメインのfromアドレスを使用します。

構築したもの

One Reusable Credit Unit

Email Creditsを1回定義し、サブスクリプションプランと追加購入パックの両方に関連付けました。

Subscription with Prepaid Allowance

$19/月で、1請求サイクルあたり5,000通を付与します。顧客は何に支払っているかを把握でき、あなたは最大コストを把握できます。

Top-Up Pack

サブスクリプションクレジットに加えて5,000通を付与する一回限りのプロダクトです。プランを変更する必要はありません。

Direct Ledger Debits

送信ごとにcreateLedgerEntryを1回呼び出します。meterも集計の遅延もありません。Resend message IDをidempotency keyとして使用することで、同じ送信に対する2回目のデビットを防止します。

Credit-Based Billing Reference

ロールオーバー、超過使用モード、ledger管理、完全なクレジットAPI。
サポートが必要な場合は、Discord Communityで質問するか、support@dodopayments.comまでメールしてください。
最終更新日 2026年9月26日