在本教程中,您将构建 MailKit,这是一个交易邮件平台,客户可以预先购买一组电子邮件信用。该计划提供每月的电子邮件额度;当客户余额不足时,他们可以购买充值包,而不是等待下一个周期。每次发送会自动扣除一个信用。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.emails.send。- 在您的仪表板中创建自定义信用权利(电子邮件)
- 将信用附加到订阅计划和一次性充值产品上
- 通过 Resend 发送真实电子邮件,并通过账本条目每发送一次扣减一个信用
- 从您的前端查询实时信用余额
- 正确验证 Dodo webhooks,并在客户接近零之前处理
credit.balance_low发出信号
我们正在构建的内容
以下是 MailKit 的定价模型:| 产品 | 价格 | 电子邮件数 |
|---|---|---|
| MailKit 计划 | $19/月 | 5,000 封邮件/周期 |
| 充值包 | $9 一次性 | +5,000 封邮件 |
在开始之前,请确保您有:
- 一个 Dodo Payments 账户(测试模式即可)
- 一个免费的 Resend 账户和 API 密钥
- Node.js 18+ 和基本的 TypeScript 知识
第 1 步:创建您的电子邮件信用权利
信用权利定义了您的平台出售的单位:在这种情况下为一次电子邮件发送。
Configure the credit unit
填写信用详情:信用名称:
Email Credits信用类型: 选择 Custom Unit单位名称: email精度: 0(电子邮件始终为整单位;您无法发送半封邮件)信用过期: 30 days(每个周期的额度重置)第 2 步:创建计划和充值包
您将创建两个产品:一个定期的 订阅 计划和一个 一次性付款 充值。该计划授予每个周期 5,000 封电子邮件;充值可按需增加 5,000 封。两者都附加相同的Email Credits 权利。
MailKit 计划 ($19/月,5,000 封邮件)
Create the subscription
- 进入 产品 → 创建产品
- 填写产品详情:
MailKit Plan描述: 5,000 transactional emails per month.- 选择 订阅 作为产品类型
- 设置经常性价格:
19.00计费周期: Monthly货币: USD充值包 ($9 一次性,5,000 封邮件)
Create a one-time product
- 进入 产品 → 创建产品
- 填写产品详情:
Email Top-Up Pack描述: Add 5,000 emails to your MailKit balance instantly.- 选择 一次性付款 作为产品类型
- 设置价格:
9.00货币: USD第 3 步:设置后端
现在构建处理结账、发送、余额查询和 webhooks 的 Express 服务器。Configure environment variables
第 4 步:连接 Webhook 端点
credit.balance_low 事件是让您在客户用完之前提示他们的重要事件。没有它,他们第一次注意到问题是在发送邮件失败时。
Expose your local server
第 5 步:测试完整流程
Subscribe a test customer
- 在第 1 节中输入测试电子邮件和名称,点击 获取结账链接
- 打开链接,用测试卡完成结账
- 付款后,在仪表板下的 客户 中找到
customer_id
客户现在应该在其余额中有 5,000 封电子邮件。检查 客户 → [客户] → 信用。
Send a real email
- 将
customer_id粘贴到第 3 节 - 保持
to设置为delivered@resend.dev(Resend 的沙盒邮箱,接受所有内容) - 点击 发送
Trigger the low-balance webhook
阈值为 20%(5,000 封邮件额度的 1,000 封)。要触发它而无需发送 4,000 封真实邮件,手动从仪表板扣减余额:
- 进入 客户 → [客户] → 信用 → 邮件信用
- 点击 调整余额 并扣减
4000 - 再通过演示发送一封邮件
您的服务器已接收到并验证了 webhook。在生产中,这就是您向客户发送电子邮件或显示应用内横幅的地方。
Buy a top-up pack
- 将
customer_id粘贴到第 4 节 - 点击 购买 5,000 封邮件,完成测试结账
- 刷新余额,它会跳增 5,000
当
grant_source: one_time 触发 credit.added 事件。充值叠加在订阅信用之上;两个池按 FIFO 消耗(最早的未过期供给首先使用)。故障排除
Webhook signature verification fails (401)
Webhook signature verification fails (401)
签名是通过原始 HTTP 消息体计算的。
express.json() 解析并重新序列化有效负载,这会打破 HMAC。确保 /webhooks/dodo 使用 express.raw({ type: 'application/json' }) 在 app.use(express.json()) 行上注册,并且 DODO_WEBHOOK_KEY 匹配端点详情页面上显示的签名密钥。Balance is 0, customer not found, or credits don't deduct
Balance is 0, customer not found, or credits don't deduct
需要验证的三件事,按以下顺序:
- 客户 完成结账(信用在成功付款时发放,而不是在会话创建时)
CREDIT_ENTITLEMENT_ID在您的.env中与产品附加的信用匹配(不匹配的 ID 会静默写入错误的信用)- 您传递的
customer_id来自 Dodo(仪表板中的customers表),而不是您自己的数据库
Resend rejects the recipient
Resend rejects the recipient
沙盒发件人
onboarding@resend.dev 仅传递到您 Resend 账户上的电子邮件或 delivered@resend.dev。要发送给其他人,验证一个域名 并使用其上的 from 地址。您构建了什么
One reusable credit unit
Email Credits,一次定义并附加到订阅计划和充值包上。Subscription with prepaid allowance
$19/月授予每个周期 5,000 封邮件。客户知道他们的支出,您知道您的最坏成本。
Top-up pack
一个一次性产品,授予 5,000 封邮件。无需更改计划即可叠加订阅信用。
Instant ledger debits
每次发送后的一个简单
createLedgerEntry 调用。没有计量器,没有聚合滞后,通过 Resend 的消息 ID 在重试时具备幂等性。Credit-Based Billing Reference
阅读完整的 CBB 文档,了解滚动、超量模式、账本管理和完整的 API 资源。