新功能
1. 产品级分析
每个产品现在都拥有自己的专属分析仪表板。前往**产品 > [选择一个产品]**即可查看该产品的详细指标,分布在五个标签页中:
| 标签页 | 可获得内容 |
|---|
| 概览 | 总收入、成功支付次数、30天收入趋势图(每日或累计)以及可筛选的交易表 |
| 客户 | 按支出排名的前3名客户(领奖台视图)以及完整的客户细分表 |
| 留存 | 客户流失率、收入流失率以及双线趋势图以发现模式 |
| 订阅者 | 显示该产品的全部订阅,包含状态、开始日期、下次计费日期和金额 |
| MRR | 月经常性收入堆叠柱状图,包含新增MRR、扩展MRR、流失MRR 与净新增MRR 拆分 |
所有选项卡都支持日期过滤器(默认为全部时间),便于深入分析任意时间段。
使用留存标签页可及早识别高流失产品,使用MRR标签页可跟踪扩展收入是否每月超过流失收入。
了解更多:产品级分析
2. Dodo Payments 上的 Verifi RDR 支持
Dodo Payments 现在支持由 Verifi 提供的 Visa Rapid Dispute Resolution (RDR) —— 一种自动争议预防工具,可在合格的 Visa 争议成为正式拒付前将其解决。当持卡人发起争议时,RDR 会拦截并在交易金额低于您设置的美元阈值时自动发起退款。
重要性
| 收益 | 影响 |
|---|
| 更低的争议率 | RDR 解决的争议不会计入 Visa 0.9% 门槛 |
| 免争议费用 | 避免每笔争议 15−25 的不可退还费用 |
| 零运营负担 | 无需收集证据或应对回复截止 |
| 更佳客户体验 | 持卡人可即时获得退款 |
| 账户保护 | 远离 Visa 的争议监控计划 (VDMP) |
超过 Visa 的 0.9% 争议率或每月 100 起争议会触发 VDMP,并逐级罚款至每月 5 万美元以上。RDR 可帮助您远低于这些阈值。
工作原理
- 持卡人向其银行发起争议
- RDR 在争议成为正式拒付前进行拦截
- 若交易金额在您的阈值及以下,系统会自动退款
- 争议即时解决,且不计入您的争议率
通过 RDR 自动退款的交易会在 Dodo Payments 仪表板中显示为丢失的争议。这是预期之内——系统自动退款以防止正式拒付。
如需在您的账户启用 Verifi RDR,请联系 support@dodopayments.com 配置阈值。
了解更多:Visa RDR 文档
3. DodoPayments CLI
推出全新 DodoPayments CLI (dodopayments-cli) —— 可直接在终端管理整套 Dodo Payments 工作流。为偏好命令行的开发者打造,CLI 让您在不离开编辑器的情况下管理产品、支付、客户、折扣、许可证、附加项、退款,甚至创建结账会话。
安装
npm install -g dodopayments-cli
主要命令
| 命令 | 描述 |
|---|
dodo login | 使用 API 密钥认证(会打开浏览器) |
dodo products list | 列出所有产品 |
dodo payments list | 列出所有支付 |
dodo customers create | 创建新客户 |
dodo checkout new | 创建结账会话并获取 URL |
dodo wh listen | 通过 WebSocket 将实时测试 webhook 转发到本地服务器 |
dodo wh trigger | 向任意端点发送模拟 webhook payload |
Webhook 测试
CLI 包含两个强大的开发工具:
dodo wh listen — 打开 WebSocket 连接,将实时测试 webhook 转发到本地服务器,并保留原始头以便签名验证测试
dodo wh trigger — 交互式发送模拟 webhook payload,支持订阅、支付、退款、争议及许可证的全部 22 种事件类型
Webhook 侦听器仅与测试模式 API 密钥配合使用。使用 dodo wh listen 前,请确保已使用测试模式密钥登录。
了解更多:CLI 文档
4. 客户门户 UI 全新改版
客户门户已全面重新设计,采用干净统一的界面。改版后的门户拥有左侧边栏导航和条理清晰的板块,为客户提供更直观的自助体验。
新增内容
| 版块 | 功能 |
|---|
| 活跃订阅 | 查看所有活跃订阅及计划详情、计费周期和下次付款日期 |
| 支付方式 | 管理已保存的支付方式、添加新卡并更新支付信息 |
| 计费历史 | 查看既往发票并下载 PDF 收据 |
| 账单信息 | 编辑姓名、邮箱、电话号码和账单地址 |
| 订阅详情 | 查看详细订阅信息并可选择取消或更改方案 |
| 方案变更 | 通过产品集合直接在门户中升级或降级 |
客户还可以在改版后的门户中为活跃订阅更新支付方式,或重新激活因付款失败而挂起的订阅。
改版门户在实时模式下可通过 https://customer.dodopayments.com/login/{business_id} 访问,在测试模式下可通过 https://test.customer.dodopayments.com/login/{business_id} 访问。
了解更多:客户门户
5. 内嵌结账中的支付方式更新
inline checkout 现支持订阅的支付方式更新。当客户需要更新支付方式(针对活跃订阅或重新激活挂起订阅)时,可直接在您页面布局内通过内嵌结账呈现更新支付方式流程,提供无缝嵌入体验。
工作原理
- 调用更新支付方式 API 以获取
payment_link:
const response = await client.subscriptions.updatePaymentMethod('sub_123', {
type: 'new',
return_url: 'https://example.com/return'
});
- 在内嵌结账中将返回的
payment_link 用作 checkoutUrl:
DodoPayments.Checkout.open({
checkoutUrl: response.payment_link,
elementId: "dodo-inline-checkout"
});
该内嵌框架仅渲染支付方式收集表单,允许客户在不离开您页面的情况下输入新卡信息或选择已保存的支付方式。
对于挂起订阅,更新支付方式流程会自动为剩余欠款生成扣款。请监控 payment.succeeded 和 subscription.active webhook 以确认重新激活。
了解更多:内嵌结账 | 订阅支付方式更新
6. 结账会话支持预填税号
现在您可在创建结账会话时通过 tax_id 参数预填税号(如增值税号、GST 号)。这非常适合您已知客户税号的 B2B 交易。预填税号时,该字段会在结账表单中预先填写且锁定。
const session = await client.checkoutSessions.create({
product_cart: [{ product_id: 'prod_123', quantity: 1 }],
customer: { customer_id: 'cus_123' },
billing_address: { country: 'DE' },
tax_id: 'DE999999999',
return_url: 'https://yoursite.com/return'
});
tax_id 参数需要一个至少包含 country 字段的 billing_address。税务资格将实时验证,符合条件的 B2B 交易会自动套用反向收费规则。
使用 allow_customer_editing_tax_id 功能标志控制客户是否可以修改预填税号,并使用 allow_tax_id 来开关结账中的税号可见性。
了解更多:结账会话 - 税号 | B2B 支付
7. 返回 URL 重定向中新增许可证密钥与邮箱
客户完成结账后,Dodo Payments 现在会在您 return_url 重定向中追加 license_key 和 email 作为查询参数,同时保留现有的 payment_id/subscription_id 及 status 参数。
追加的查询参数
| 参数 | 类型 | 条件 |
|---|
payment_id | string | 一次性支付始终包含 |
subscription_id | string | 订阅支付始终包含 |
status | string | 始终包含 |
license_key | string | 如果产品启用了许可证密钥则包含(多个时以逗号分隔) |
email | string | 如果客户有记录邮箱则包含 |
示例重定向 URL:
# One-time payment with license key
https://yoursite.com/return?payment_id=pay_xxx&status=succeeded&license_key=LK-001&email=customer%40example.com
# Subscription with multiple license keys
https://yoursite.com/return?subscription_id=sub_xxx&status=active&license_key=LK-001,LK-002&email=customer%40example.com
使用这些查询参数可在返回页面立即展示许可证密钥或发送确认邮件,无需额外的 API 调用。
了解更多:结账会话 - 返回 URL | 返回 URL 中的许可证密钥
8. 客户邮箱更新 API
PATCH /customers/{customer_id} 端点现在支持通过编程方式更新客户邮箱。可在单次 API 调用中同时更新邮箱、姓名、电话号码和元数据。
await client.customers.update('cus_123', {
email: 'newemail@example.com',
name: 'Updated Name'
});
可更新字段
| 字段 | 类型 | 说明 |
|---|
email | string | null | 客户邮箱地址 |
name | string | null | 客户显示名称 |
phone_number | string | null | 国际格式电话号码 |
metadata | object | null | 自定义键值对 |
客户邮箱更新也可通过客户门户(自助)、仪表板以及通过 dodo customers update 的 CLI 实现。
了解更多:客户更新 API | 客户管理
9. Bun 适配器发布
推出 @dodopayments/bun —— 这是为 Bun 原生服务器 (Bun.serve()) 提供的专用框架适配器。只需几行代码即可在 Bun 中集成结账、客户门户和 webhooks。
安装
bun add @dodopayments/bun
快速设置
import { Checkout, CustomerPortal, Webhooks } from "@dodopayments/bun";
Bun.serve({
routes: {
"/api/checkout": Checkout({
bearerToken: process.env.DODO_PAYMENTS_API_KEY!,
returnUrl: process.env.DODO_PAYMENTS_RETURN_URL!,
environment: process.env.DODO_PAYMENTS_ENVIRONMENT!,
}),
"/api/customer-portal": CustomerPortal({
bearerToken: process.env.DODO_PAYMENTS_API_KEY!,
environment: process.env.DODO_PAYMENTS_ENVIRONMENT!,
}),
"/api/webhooks": Webhooks({
webhookKey: process.env.DODO_PAYMENTS_WEBHOOK_KEY!,
onPaymentSucceeded: async (payload) => {
console.log("Payment succeeded:", payload.data.payment_id);
},
onSubscriptionActive: async (payload) => {
console.log("Subscription active:", payload.data.subscription_id);
},
}),
},
});
Bun 适配器支持三种结账流程(静态、动态和基于会话)、客户门户会话生成,以及具备签名验证和 Zod 校验、涵盖 22 种事件类型的安全 webhook 处理。
Bun 适配器加入我们已有的 11 个框架适配器家族,包括 Next.js、Nuxt、Express、Fastify、Hono、Astro、SvelteKit、Remix、TanStack Start、Better Auth 和 Convex。
了解更多:Bun 适配器文档 | 框架适配器概览