# 订阅升级与降级：没人解释的预付比例计算

> 了解订阅计费中的预付比例计算是如何运作的。真实计算示例、计费模式、边缘情况，以及客户升级、降级或在周期中途更改计费周期时会发生什么。
- **Author**: Ayush Agarwal
- **Published**: 2026-05-02
- **Category**: Billing, Subscriptions, SaaS
- **URL**: https://dodopayments.com/blogs/zh/subscription-upgrade-downgrade-proration

---

预付比例计费是订阅计费中，通常没人会解释的部分，直到你的财务团队开始追问：为什么 MRR 数字对不上。

客户在一个计费周期开始十天后，从每月 29 美元的套餐升级到每月 99 美元的套餐。他们需要支付多少？你的 MRR 会变成什么样？新的计费周期从什么时候开始计算？客户现有的银行卡信息会怎样？这些都不是边缘情况。每家 SaaS 公司都会遇到，通常在前几百名客户中就会出现。

本指南将详细介绍订阅升级和降级的实际计算方式、三种可选的计费模式，以及那些总会让简单实现出问题的边缘情况。

## 预付比例计费到底是什么意思

预付比例计费，是指当订阅在周期中途发生变化时，按比例计算部分周期的费用或预付余额。其原则是：客户应当准确支付（或获得预付余额），对应他们实际使用某个套餐层级的天数。

实现之所以复杂，是因为订阅包含多个维度。基础价格会变化，席位数量会变化，附加项会启用或停用，使用额度也可能按不同的时间表重置。每个维度都可以单独按比例计算，也可以打包计算。

> 预付比例计费是一条简单的经验法则，最终却可能变成一个包含 200 行边缘情况的文件。一旦你拥有多个计费维度、周期中途的变更，以及身处不同时区的客户，就不会再相信手工计算的预付比例计费，而会依赖计费平台提供的基础能力。
>
> - Ayush Agarwal，Dodo Payments 联合创始人兼 CPTO

## 三种预付比例计费模式

现代计费平台支持三种模式。每种模式都在客户体验和收入保护之间做出了不同取舍。

```mermaid
flowchart LR
    A[周期中途更改套餐] --> B{预付比例计费模式}
    B -->|立即按比例计算| C[立即收取或抵扣
按实际天数计算]
    B -->|下个周期按比例计算| D[在下一张发票中应用
客户今天无需支付]
    B -->|立即全额计费| E[收取新套餐全额费用
旧套餐不提供抵扣]
    C --> F[最佳客户体验]
    D --> G[最清晰的会计处理]
    E --> H[最强的收入保护]
```

### 模式 1：立即按比例计算

客户会立即根据新旧套餐之间的差额，按剩余天数比例支付费用（或获得预付余额）。

**示例：**客户使用每月 29 美元的套餐，在计费周期还剩 20 天时升级到每月 99 美元的套餐。

```text
计费周期剩余天数          = 20
计费周期天数              = 30
按比例计算的部分          = 20 / 30 = 0.667

旧套餐未使用部分          = $29 x 0.667 = $19.33
剩余时间的新套餐费用      = $99 x 0.667 = $66.00
今天应收取的净费用        = $66.00 - $19.33 = $46.67
```

客户今天需要支付 46.67 美元。下一次续费仍按原计费周期锚点进行，金额为 99 美元。

这种模式很适合升级。对于降级，它可能会让情况变得尴尬，因为客户通常希望立即失去高级套餐的权限，同时又不希望继续被收费。

### 模式 2：下个周期按比例计算

出于服务提供的目的，套餐会立即变更，但预付比例计算会在下一张发票中体现。客户今天无需支付任何费用。

**示例：**与上面的情况相同。客户从 29 美元升级到 99 美元，当前周期还剩 20 天。

```text
本张发票（无变化）      = $0
下一张发票 = 新套餐（$99）-
            已支付的旧套餐未使用部分的预付余额
          = $99 - $19.33（未使用的 $29 套餐部分）
          = $79.67，前提是周期锚点保持不变

或者重置周期            = $99 + 应用预付比例余额
```

这种模式的会计处理更清晰。但从客户感知来看不太理想，因为下一张发票的金额会与平常不同。

### 模式 3：立即全额计费（不按比例计算）

客户会立即支付新套餐的全额价格。旧套餐未使用部分不提供预付余额。新的计费周期从今天开始。

**示例：**客户从 29 美元升级到 99 美元。

```text
今天收取的费用            = $99（新套餐全额费用）
本周期已支付的旧套餐费用  = 损失（不提供抵扣）
新的周期锚点              = 今天
```

这种模式对收入的保护最强，但升级时的客户体验也最差。只有在有明确产品原因时才使用（例如，出于税务处理原因，你不对年度套餐按比例计算）。

## 何时使用不同模式

| 场景                 | 推荐模式                         | 原因                                 |
| -------------------- | -------------------------------- | ------------------------------------ |
| 同一产品系列内的升级 | 立即按比例计算                   | 符合客户预期                         |
| 降级                 | 下个周期按比例计算               | 让客户继续使用已支付费用对应的服务   |
| 从年度切换到月度     | 下个周期按比例计算或立即全额计费 | 清晰的会计边界                       |
| 周期中途启用附加项   | 立即按比例计算                   | 符合客户通常预期                     |
| 停用附加项           | 下个周期按比例计算               | 让客户继续使用已支付费用对应的附加项 |
| 试用期内更改套餐     | 立即全额计费                     | 此时尚未产生实际收入变化             |

## 席位变更与预付比例计费

按席位定价会让预付比例计费变得复杂，因为每个席位都是独立的订阅行项目。周期中途增加 5 个席位时，需要分别对每个新增席位按比例计算。周期中途移除 3 个席位时会产生预付余额，大多数平台会在下一张发票中应用这笔余额。

**示例：**团队套餐基础费用为每月 99 美元，另加每个席位 15 美元。客户拥有包含在套餐内的 3 个席位，外加 5 个付费席位（共 8 个）。在一个 30 天周期还剩 15 天时，客户又增加 4 个席位。

```text
按比例计算的部分        = 15 / 30 = 0.5
4 个新增席位的费用      = 4 x $15 x 0.5 = 今天收取 $30
下一次续费              = $99 + (8+4-3 = 9 个付费席位 x $15) = $234
```

如果客户在一个周期内多次增加和移除席位，计算会变得更加困难。最清晰的实现方式，是在每次变更时都以周期锚点为基准重新计算预付比例，而不是以上一次变更为基准。

如需了解更多按席位定价模式，请参阅我们的 [B2B 按席位付费计费指南](https://dodopayments.com/blogs/pay-per-seat-billing-b2b)。

## 用量与混合套餐的预付比例计费

混合套餐（订阅费用加用量费用）会对订阅部分按比例计算，但不会对用量部分按比例计算。用量会在计费周期结束时，根据实际使用量计算。

**示例：**客户使用每月 49 美元的基础套餐，每次 API 调用收费 0.005 美元（包含 10,000 次调用）。客户升级到每月 99 美元的套餐时，已经使用了 5,000 次 API 调用，且当前周期还剩 15 天。

```text
按比例计算的订阅差额    = ($99 - $49) x 0.5 = 今天收取 $25
截至目前的用量          = 5,000 次调用（尚未产生超额费用）
周期继续                = 使用新套餐，包含的调用次数按照套餐规则重置
```

混合套餐的关键问题是：包含的用量额度应在升级时重置，还是延续到当前周期结束？大多数平台都支持这两种模式；选择符合客户预期的方式即可。

如需了解更多混合计费模式，请参阅我们的 [混合计费模式指南](https://dodopayments.com/blogs/hybrid-billing-models-saas) 和 [混合计费功能文档](https://docs.dodopayments.com/features/hybrid-billing)。

## 从年度切换到月度（以及反向切换）

在年度和月度计费之间切换是一个特殊情况，常见有两种模式：

### 周期中途从年度切换到月度

客户已经预付了 12 个月的费用，现在想切换到月度计费。可选方案如下：

1. **退还未使用的年度部分，今天开始按月计费。**客户体验最佳，但会带来最大的会计处理负担。
2. **让年度套餐运行至到期，在年度续费时切换。**会计处理最清晰，也能让客户自然地在续费时降级。
3. **将剩余的年度使用时间转换为月度预付余额。**折中方案：客户获得的余额会应用到后续月度发票中，直到等值金额用完。

模式 2 最常见。模式 3 最灵活。

### 周期中途从月度切换到年度

这种情况更简单。客户预付年度价格，并获得剩余未使用月度部分的预付余额。

**示例：**客户使用每月 49 美元的套餐，在一个 30 天周期还剩 18 天时升级到每年 499 美元的套餐。

```text
年度价格                  = $499
未使用月度部分的余额      = $49 x (18/30) = $29.40
今天应收取的净费用        = $499 - $29.40 = $469.60
```

## 预付比例计费的税务影响

预付比例计费会影响税费计算。在大多数司法管辖区，每笔按比例计算的费用都属于应税事项，税费根据按比例计算后的金额确定。如果客户的税务管辖区自上一张发票以来发生变化（虽然罕见，但确实可能发生），则适用新的税率。

对于适用 VAT 的销售，按比例计算的发票必须包含与原始发票相同的合规字段。大多数计费平台会自动处理这一点。

如需了解更广泛的背景信息，请参阅我们的配套指南：[SaaS 的欧盟 VAT](https://dodopayments.com/blogs/eu-vat-saas-guide-2026) 和 [AI SaaS 的全球 VAT 与 GST](https://dodopayments.com/blogs/global-vat-gst-ai-saas)。

## 处理套餐变更期间的支付失败

这是一个令人头疼的边缘情况：客户升级后，按比例收取的费用支付失败，客户因此陷入不一致的状态。

最佳实践：

1. **先尝试收取按比例计算的费用。**
2. **如果成功，再更改套餐。**
3. **如果失败，不要更改套餐。**向客户展示错误信息。
4. **不要在未通知客户的情况下自动重试。**套餐变更是客户主动执行的操作。

相反，如果先乐观地更改套餐，再尝试稍后收费，就会出现客户已经获得升级后的套餐却没有支付费用的情况。与其之后追回这笔收入，不如让客户更新银行卡信息后重新尝试，后者容易得多。

如需了解更多信息，请参阅我们关于 [SaaS 收入追回](https://dodopayments.com/blogs/revenue-recovery-saas) 的分析。

## 客户希望看到什么

对大多数客户来说，预付比例计算并不透明。请确保面向客户的沟通清晰明了：

- **变更前。**向客户展示今天会看到的确切扣款金额，以及下一次续费的金额和日期。
- **变更后。**发送确认邮件，说明预付比例计算的明细。
- **在客户门户中。**展示客户的套餐历史，包括变更日期和按比例计算的费用。

套餐变更相关退款请求的最大来源，就是客户不理解一笔看起来出乎意料的扣款。提前保持透明，可以将这类请求减少 80%。

## 套餐变更的 MRR 会计处理

套餐变更会以不明显的方式影响 MRR 会计处理。最清晰的方法是：

- **升级。**移除旧套餐的 MRR，加入新套餐的 MRR。净变化为正。
- **降级。**移除旧套餐的 MRR，加入新套餐的 MRR。净变化为负（计为收缩）。
- **附加项变更。**视为订阅内的行项目变更，而不是完整的套餐变更。
- **席位变更。**每个席位都计入 MRR 单位，净变化反映席位数量差异。
- **用量激增。**不计入 MRR，而是作为可变收入核算。

大多数计费平台都会在 MRR 报告中展示这些拆分数据。请使用平台提供的数字；除非你的财务团队有专门的流程，否则不要尝试根据原始发票数据重建 MRR。

如需进一步了解 MRR 和 SaaS 指标，请参阅我们的指南：[SaaS 指标与 KPI](https://dodopayments.com/blogs/saas-metrics-kpi)、[年度经常性收入](https://dodopayments.com/blogs/what-is-arr-annual-recurring-revenue) 和 [SaaS 单位经济模型](https://dodopayments.com/blogs/saas-unit-economics)。

## 常见的预付比例计费错误

以下模式会带来客户支持工单和会计处理难题：

- **相差一天的计算错误。**在旧套餐和新套餐的计算中重复计入变更当天。确定一种计算规则并始终遵循。
- **周期天数错误。**2 月有 28 天或 29 天，而不是 30 天。不过，有些套餐无论实际月份如何都使用 30 天周期。务必明确规则。
- **时区混淆。**客户在自己的时区晚上 11 点更改套餐，你的服务器使用 UTC，而会计师使用太平洋时间。将变更时间锁定到一个统一的标准时区。
- **将按比例计算的金额退还到错误的银行卡。**如果客户在原始扣款和产生预付余额之间更换了银行卡，退款会退回到新卡。有些支付处理商会自动处理；其他处理商则需要你自行处理这种情况。
- **跳过税费重新计算。**每个按比例计算的事件都是独立的应税事项。
- **快速变更套餐时出现竞态条件。**客户先升级，然后立即降级。简单的实现可能会重复收费或少计预付余额。

> 我在生产环境的计费系统中见过最难处理的 bug，是一个竞态条件：客户在 30 秒内完成了升级和降级。Webhook 按错误的顺序到达。最终客户处于错误的套餐中，还被收取了一笔意料之外的费用。请为每个套餐变更端点构建幂等性。
>
> - Rishabh Goel，Dodo Payments 联合创始人兼 CEO

## 实现：使用 Dodo Payments 进行预付比例计费

Dodo Payments 订阅 API 通过一个参数支持全部三种预付比例计费模式：

```javascript
import DodoPayments from "dodopayments";

const client = new DodoPayments({
  bearerToken: process.env["DODO_PAYMENTS_API_KEY"],
});

// 立即按比例升级（现在收取/抵扣按比例计算的差额）
await client.subscriptions.changePlan("sub_abc123", {
  product_id: "prod_pro_plan",
  quantity: 1,
  proration_billing_mode: "prorated_immediately",
});

// 降级----立即收取价格差额，预付余额应用于未来续费
await client.subscriptions.changePlan("sub_abc123", {
  product_id: "prod_starter_plan",
  quantity: 1,
  proration_billing_mode: "difference_immediately",
});

// 更改套餐并收取新套餐全额费用，不为旧套餐提供预付余额
await client.subscriptions.changePlan("sub_abc123", {
  product_id: "prod_pro_plan",
  quantity: 1,
  proration_billing_mode: "full_immediately",
});
```

如需查看完整参考，请参阅[订阅升级和降级文档](https://docs.dodopayments.com/developer-resources/subscription-upgrade-downgrade)和[订阅功能页面](https://docs.dodopayments.com/features/subscription)。

## Dodo Payments 如何处理预付比例计费

预付比例计费已内置于核心订阅引擎：

- 通过一个 API 参数支持全部三种预付比例计费模式（立即、下个周期、立即全额）
- 按维度分别计算预付比例：订阅、席位、附加项和用量额度独立计算
- 每次按比例计费事件都会重新计算税费（覆盖 220 多个国家的完整 MoR（名义商户）服务）
- 每次套餐变更都会触发 Webhook 事件，并提供费用和预付余额的详细明细
- 客户门户会在套餐变更时清晰展示变更前后的价格
- 防竞态条件：套餐变更 API 支持幂等
- 透明定价：每笔交易收取 4% 外加 40 美分

如需查看实现流程，请参阅[集成指南](https://docs.dodopayments.com/developer-resources/integration-guide)。

## 常见问题

### 订阅计费中的预付比例计费是什么意思？

预付比例计费，是指客户在周期中途更改订阅时，按比例计算部分周期的费用或预付余额。如果客户在一个 30 天周期开始 10 天后升级，系统会按新套餐剩余 20 天的使用时间收费，并为旧套餐未使用的 20 天提供预付余额。

### 三种预付比例计费模式是什么？

三种模式分别是：立即按比例计算（今天就根据差额向客户收费或提供预付余额）、下个周期按比例计算（在下一张常规发票中应用计算结果，今天不收费），以及立即全额计费（立即收取新套餐全额价格，不为旧套餐提供预付余额）。每种模式都在客户体验和收入保护之间做出了不同取舍。

### 按席位计费的套餐如何进行预付比例计算？

每个席位都会被视为独立的计费行项目。周期中途增加席位时，分别对每个新增席位按比例计算。移除席位会产生预付余额，并在下个周期应用。最清晰的实现方式，是在每次变更时都以原始周期锚点为基准重新计算预付比例，而不是以上一次变更为基准。

### 我应该对降级进行预付比例计算吗？

大多数 SaaS 公司会对降级使用"下个周期按比例计算"，让客户在周期结束前继续使用已经付费的高级套餐。这样可以避免客户支付了某个套餐，却无法使用该套餐的尴尬体验。对于升级，立即按比例计算是行业通常预期。

### 预付比例计费会如何影响 MRR？

套餐变更会移除旧套餐的贡献，并加入新套餐的贡献。升级会增加 MRR（扩张），降级会减少 MRR（收缩）。大多数计费平台都会在 MRR 报告中展示这些拆分数据。在不了解平台如何表示这些事件之前，不要尝试根据原始发票数据重建 MRR。

## 总结

预付比例计费在理论上很简单，在实践中却非常棘手。计算本身只是简单的除法，复杂性来自边缘情况：时区、竞态条件、税费重新计算、变更期间的支付失败，以及与客户的沟通。

选择符合客户预期的预付比例计费模式。使用平台提供的基础能力，而不是自行重新实现。确保面向客户的沟通清晰，避免套餐变更引发退款请求。

如果你正在评估支持原生预付比例计费的计费平台，[Dodo Payments](https://dodopayments.com) 原生支持全部三种模式，并覆盖订阅、席位、附加项和用量维度。查看[定价页面](https://dodopayments.com/pricing)和[订阅升级与降级文档](https://docs.dodopayments.com/developer-resources/subscription-upgrade-downgrade)，立即开始使用。
---
- [More Billing articles](https://dodopayments.com/blogs/category/billing)
- [All articles](https://dodopayments.com/blogs)