このチュートリアルでは、顧客がメールクレジットのプールを前払いするトランザクションメールプラットフォームであるMailKitを構築します。このプランは毎月のメール許容量を提供し、顧客が残量不足になった際は次のサイクルを待たずに追加パックを購入できます。送信ごとにクレジットが自動で1つ差し引かれます。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を使用します。無料プラン(3,000メール/月)は、有料アカウントなしで全フローを構築・テストするのに十分です。このパターンは他のプロバイダーでも機能します。SendGrid、Postmark、SES、または独自のSMTPリレーに置き換えてください。
- ダッシュボードでカスタムクレジット権利(メール)を作成する
- クレジットをサブスクリプションプランと一回限りのトップアップ製品に添付する
- Resend経由で実際のメールを送信し、台帳エントリ経由で1送信ごとにクレジットを差し引く
- フロントエンドからライブクレジット残高を照会する
- Dodo Webhookを正しく確認し、残高がゼロに達する前に顧客に通知する
構築するもの
MailKitの料金モデルは以下の通りです:| 製品 | 価格 | メール数 |
|---|---|---|
| MailKitプラン | $19/月 | 5,000 メール/サイクル |
| トップアップパック | $9 一回限り | +5,000 メール |
始める前に、以下を確認してください:
- Dodo Paymentsのアカウント(テストモードで構いません)
- 無料のResendアカウントおよびAPIキー
- Node.js 18+と基本的なTypeScriptの知識
ステップ1: メールクレジット権利の作成
クレジット権利はプラットフォームが販売する単位を定義します: この場合、1回のメール送信です。
- Dodo Paymentsのダッシュボードにログインしてください 2. 左側のサイドバーでProductsをクリック 3. Creditsタブを選択 4. Create Creditをクリック
Email Credits
クレジットタイプ: Custom Unitを選択
ユニット名: email
精度: 0(メールは常に全体の単位です;半分のメールを送信することはできません)
クレジット有効期限: 30 days(各サイクルの許容量はリセットされます)
精度は作成後に変更できません。メール、メッセージ、セッションなどの個別単位の場合、0が正しいです。
このクックブックではロールオーバーや超過を有効にしません; 目標は可能な限り簡単なCBBフローです。クレジットアタッチメントについては後で再訪できます。
Create Creditをクリックしてください。クレジットを開き、そのIDをコピーしてください。バックエンドの残高照会で必要になります。これは cent_xxxxxxxxxxxx のように見えます。
あなたのEmail Creditsエンタイトルメントが準備できました。次は顧客にクレジットを与える製品です。
ステップ2: プランとトップアップパックの作成
2つの製品を作成します: 定期的なサブスクリプションプランと一回限りの支払いトップアップ。プランは各サイクルに5,000メールを提供し、トップアップは要求に応じて追加の5,000を追加します。両方とも同じEmail Creditsエンタイトルメントを添付します。
このクックブックでは、使用量に基づくメーターではなく、直接の台帳項目でクレジットを差し引きます。台帳エントリは即時(残高はミリ秒で更新されます)で、追加設定が不要で、1つのユーザーアクションが正確に1クレジットに相当する場合に適しています。インジェストされた使用量イベントからの自動差し引きを好む場合(「トークン」や「MB処理済み」などの重み付け単位に便利です)、メーターベースのパターンについてはCredit-Based Billing → Usage Billing with Creditsをご覧ください。
MailKitプラン ($19/月, 5,000メール)
- Products → Create Productに移動 2. 製品の詳細を入力:
MailKit Plan
説明: 5,000 transactional emails per month.
- 製品タイプとしてサブスクリプションを選択 4. 定期価格を設定:
19.00
請求サイクル: Monthly
通貨: USD
スクロールしてEntitlements → Credits → Attachを設定:
クレジットエンタイトルメント: Email Credits
請求サイクルごとに発行されるクレジット: 5000
低残高閾値: 20(パーセント; 残高がサイクル許容量の20%未満になるとcredit.balance_lowが発動します。例: 1,000メール)
デフォルトクレジット設定をインポート: 有効(ステップ1からの30日間の有効期限を使用)
Add to Productをクリックし、製品を保存してください。製品IDをコピーしてください(pdt_xxxxxxxxxxxx)。
プラン: $19/月 → 各サイクルで5,000メールが更新されます。
トップアップパック ($9 一回限り, 5,000メール)
- Products → Create Productに移動 2. 製品の詳細を入力:
Email Top-Up Pack
説明: Add 5,000 emails to your MailKit balance instantly.
- 製品タイプとして一回限りの支払いを選択 4. 価格設定を行う:
9.00
通貨: USD
Entitlements → Credits → Attachで:
- クレジットエンタイトルメント:
Email Credits - 発行されるクレジット:
5000
ステップ3: バックエンドを設定
チェックアウト、送信、残高のクエリ、Webhookを処理するExpressサーバーを構築します。package.jsonに追加してください:
tsx は、ビルドステップやtsconfig.jsonなしでTypeScriptを直接実行します。チュートリアルに最適です。本番環境向けにはtsconfig.jsonとbuildスクリプトを追加してください。
.envを作成:
.env
DODO_WEBHOOK_KEYを埋めます。Resend APIキーはresend.com/api-keysから取得します。
.envをすぐに.gitignoreに追加してください。APIキーを決してコミットしないでください。
プロジェクトルートでserver.tsを作成:
server.ts
express.json()はボディを解析して再シリアル化し、署名検証を破壊します。/webhooks/dodoをapp.use(express.json())行の前に定義します。
バックエンド準備完了:サブスクライブ、トップアップ、残高、送信、Webhookハンドラがすべて接続されます。
public/index.htmlを作成:
public/index.html
ステップ4: Webhookエンドポイントを接続
credit.balance_lowイベントは、顧客がなくなる前に促すものです。これなしでは、メール送信が失敗したときに初めて問題に気づきます。
Webhooksは公開URLが必要です。ngrok(または任意のトンネル)を使用して開発中に:
https://1234abcd.ngrok-free.app)。
- Developers → Webhooks → Add Endpointに移動
2. URL:
https://1234abcd.ngrok-free.app/webhooks/dodo3. イベント:credit.added、credit.balance_low、credit.rolled_overに登録 4. 保存し、署名キーを.envにDODO_WEBHOOK_KEYとしてコピー 5. サーバーを再起動
ステップ5: フルフローをテスト
MailKit running on http://localhost:3000が見えるはずです。ブラウザで開いてください。
- セクション1でテストメールと名前を入力し、Get checkout linkをクリック
2. リンクを開き、テストカードでチェックアウトを完了
3. 支払い後、ダッシュボードでCustomersにて
customer_idを見つけてください
- セクション3に
customer_idをペースト 2.toをdelivered@resend.dev(Resendのすべて受け入れるサンドボックスインボックス)に設定したまま 3. Sendをクリック
- Customers → [Customer] → Credits → Email Creditsに移動
2. 残高を調整をクリックし、
4000を引き落とし 3. デモを通じてもう一通のメールを送信
- セクション4に
customer_idをペースト 2. Buy 5,000 emailsをクリックし、テストチェックアウトを完了 3. 残高を更新すると5,000増加します
credit.addedイベントがgrant_source: one_timeで発火します。トップアップはサブスクリプションクレジットに積み重なり、プラン変更なしで両方のプールがFIFO(最古の未失効グラントから順に)で消費されます。
残高をゼロに手動で引き落とし、その後もう一通のメールを送信してください。以下が表示されます:
トラブルシューティング
署名は生のHTTPボディを用いて計算されます。express.json()はペイロードを解析しシリアル化し直します、HMACを破壊します。/webhooks/dodoをapp.use(express.json())行の上に登録し、DODO_WEBHOOK_KEYがエンドポイント詳細ページに表示される署名キーと一致するようにしてください。
まず確認すべき3点:
- 顧客がチェックアウトを完了したか(クレジットは支払い成功時に発行され、セッション作成時ではありません)
2.
CREDIT_ENTITLEMENT_IDが.envで製品に添付されたクレジットと一致するか(IDの不一致は、間違ったクレジットに書き込まれます) 3. 渡すcustomer_idがDodoから来たものか(ダッシュボードのcustomersテーブル)、あなたのデータベースではないか
onboarding@resend.devは、Resendアカウントのメールまたはdelivered@resend.devにのみ配信します。誰にでも送信するには、ドメインを確認し、そこにあるfromアドレスを使用してください。
あなたが構築したもの
Email Credits、1回定義してサブスクリプションプランとトップアップパックに添付。
$19/月は1サイクルごとに5,000メールを提供します。顧客は何に支払っているかを知り、あなたは最悪の場合のコストを把握します。
一回限りの製品で5,000メールを提供。サブスクリプションクレジットに追加積みされ、プラン変更は不要。
各送信後の単一のcreateLedgerEntry呼び出し。メーター不要、集約遅延なし、ResendのメッセージIDを介してリトライ時に冪等性。
ロールオーバー、超過モード、台帳管理、完全なAPIサーフェスについてはCBBドキュメント全体をお読みください。
ヘルプが必要ですか?