# Subscription Upgrades and Downgrades: The Proration Math No One Explains

> How proration actually works in subscription billing. Real math, billing modes, edge cases, and what happens when customers upgrade, downgrade, or change cycles mid-period.
- **Author**: Ayush Agarwal
- **Published**: 2026-05-02
- **Category**: Billing, Subscriptions, SaaS
- **URL**: https://dodopayments.com/blogs/subscription-upgrade-downgrade-proration

---

Proration is the part of subscription billing that nobody explains until your finance team starts asking why the MRR numbers do not reconcile.

A customer upgrades from a $29/month plan to a $99/month plan ten days into a billing cycle. What do they pay? What does your MRR look like? When does the new billing cycle anchor? What happens to their existing card on file? These are not edge cases. Every SaaS company hits them, often within the first few hundred customers.

This guide walks through the actual math of subscription upgrades and downgrades, the three billing modes you can choose between, and the edge cases that consistently break naive implementations.

## What Proration Actually Means

Proration is the practice of calculating partial-period charges or credits when a subscription changes mid-cycle. The principle: customers should pay (or be credited) for exactly the days they had access to a given plan tier.

The application gets complex because subscriptions have multiple dimensions. Base price changes. Seat counts change. Add-ons activate or deactivate. Usage allowances reset on different schedules. Each dimension can be prorated independently or in bundle.

> Proration is the rule of thumb that becomes a 200-line edge case file. Once you have multiple billing dimensions, mid-cycle changes, and customers in different time zones, you stop trusting hand-calculated proration and rely on the billing platform's primitives.
>
> - Ayush Agarwal, Co-founder & CPTO at Dodo Payments

## The Three Proration Modes

Modern billing platforms support three modes. Each makes a different trade-off between customer experience and revenue protection.

```mermaid
flowchart LR
    A[Mid-Cycle Plan Change] --> B{Proration Mode}
    B -->|Prorated Immediately| C[Charge or credit now
at the actual day count]
    B -->|Prorated Next Cycle| D[Apply on next invoice
customer not charged today]
    B -->|Full Immediate| E[Charge full new plan
no credit for old]
    C --> F[Best customer experience]
    D --> G[Cleanest accounting]
    E --> H[Most revenue protection]
```

### Mode 1: Prorated Immediately

The customer is charged (or credited) immediately for the difference between the old plan and the new plan, prorated to the day.

**Example:** Customer on $29/month plan upgrades to $99/month plan with 20 days remaining in their cycle.

```
Days remaining in cycle    = 20
Days in cycle              = 30
Pro-rated portion          = 20 / 30 = 0.667

Old plan unused           = $29 x 0.667 = $19.33
New plan for remaining    = $99 x 0.667 = $66.00
Net charge today          = $66.00 - $19.33 = $46.67
```

The customer is charged $46.67 today. Their next renewal is on the original cycle anchor at $99.

This mode works well for upgrades. It can be awkward for downgrades because the customer expects to lose access immediately to the higher plan and not be charged.

### Mode 2: Prorated at Next Cycle

The plan change happens immediately for service purposes, but the proration calculation lands on the next invoice. The customer is not charged anything today.

**Example:** Same scenario as above. Customer upgrades from $29 to $99 with 20 days remaining.

```
This invoice (no change)  = $0
Next invoice = New plan ($99) - 
              Credit for unused old plan portion already paid
            = $99 - $19.33 (unused $29 plan)
            = $79.67 if cycle anchor stays the same

Or with cycle reset       = $99 + proration credit applied
```

This mode is cleaner accounting. Less ideal for customer perception because the next invoice is non-standard.

### Mode 3: Full Immediate (No Proration)

Customer is charged the full new plan price immediately. No credit for unused portion of old plan. New billing cycle starts today.

**Example:** Customer upgrades from $29 to $99.

```
Charge today              = $99 (full new plan)
Old plan paid this cycle  = Lost (no credit)
New cycle anchor          = Today
```

This mode protects revenue most aggressively. It is also the worst customer experience for upgrades. Use only if you have a clear product reason (e.g., you do not pro-rate annual plans for tax-treatment reasons).

## When to Use Each Mode

| Scenario | Recommended Mode | Why |
|---|---|---|
| Upgrades within the same product family | Prorated Immediately | Customer expectation |
| Downgrades | Prorated at Next Cycle | Lets customer use what they paid for |
| Annual to monthly switch | Prorated at Next Cycle or Full Immediate | Clean accounting boundary |
| Add-on activation mid-cycle | Prorated Immediately | Standard customer expectation |
| Add-on deactivation | Prorated at Next Cycle | Keeps customer on the add-on for what they paid |
| Plan changes within trial | Full Immediate | No actual revenue change yet |

## Seat Changes and Proration

Per-seat pricing complicates proration because each seat is its own subscription line item. Adding 5 seats mid-cycle proates each new seat individually. Removing 3 seats mid-cycle creates a credit, which most platforms apply on the next invoice.

**Example:** Team plan at $99/month base plus $15/seat. Customer has 3 seats included plus 5 paid seats (8 total). Adds 4 more seats with 15 days remaining in a 30-day cycle.

```
Pro-rated portion         = 15 / 30 = 0.5
Charge for 4 new seats    = 4 x $15 x 0.5 = $30 today
Next renewal              = $99 + (8+4-3 = 9 paid seats x $15) = $234
```

The math gets harder when customers add and remove seats multiple times in one cycle. The clean implementation is to recalculate proration on every change against the cycle anchor, not against the last change.

For more on per-seat pricing patterns, see our [pay-per-seat billing for B2B guide](https://dodopayments.com/blogs/pay-per-seat-billing-b2b).

## Usage and Hybrid Plan Proration

Hybrid plans (subscription plus usage) prorate the subscription portion but not the usage portion. Usage is calculated at billing-period close based on actual consumption.

**Example:** Customer on $49/month base plus $0.005 per API call (10,000 included) upgrades to $99/month plan with 5,000 API calls already consumed and 15 days remaining.

```
Pro-rated subscription delta = ($99 - $49) x 0.5 = $25 charged today
Usage to date                = 5,000 calls (no overage yet)
Cycle continues              = New plan, included calls reset based on plan rules
```

The big question for hybrid plans is whether the included usage allowance resets at the upgrade, or carries through the cycle. Most platforms support both modes; pick the one that matches customer expectations.

For more on hybrid billing patterns, see our [hybrid billing models guide](https://dodopayments.com/blogs/hybrid-billing-models-saas) and the [hybrid billing feature documentation](https://docs.dodopayments.com/features/hybrid-billing).

## Annual to Monthly (and Back)

Switching between annual and monthly billing is a special case. Two patterns:

### Annual -> Monthly Mid-Cycle

The customer paid for 12 months upfront. They now want to switch to monthly. Options:

1. **Refund the unused annual portion, start monthly today.** Best customer experience, biggest accounting headache.
2. **Let the annual run out, switch on annual renewal.** Cleanest accounting, lets the customer downgrade at renewal naturally.
3. **Convert remaining annual time to monthly credits.** Compromise: customer gets credit applied to monthly invoices until the equivalent value is consumed.

Pattern 2 is the most common. Pattern 3 is the most flexible.

### Monthly -> Annual Mid-Cycle

Easier. Customer pays the annual price upfront, with a credit for the remaining unused monthly portion.

**Example:** Customer on $49/month upgrades to $499/year with 18 days remaining in a 30-day cycle.

```
Annual price                 = $499
Credit for unused monthly    = $49 x (18/30) = $29.40
Net charge today             = $499 - $29.40 = $469.60
```

## Tax Implications of Proration

Proration affects tax calculation. Each prorated charge is a taxable event in most jurisdictions, with tax calculated on the prorated amount. If the customer's tax jurisdiction has changed since the last invoice (rare but possible), the new rate applies.

For VAT-jurisdictional sales, the prorated invoice must include the same compliance fields as the original invoice. Most billing platforms handle this automatically.

For broader context, see our companion guides on [EU VAT for SaaS](https://dodopayments.com/blogs/eu-vat-saas-guide-2026) and [global VAT and GST for AI SaaS](https://dodopayments.com/blogs/global-vat-gst-ai-saas).

## Handling Failed Payments During Plan Change

A nightmarish edge case: customer upgrades, the prorated charge fails, and now the customer is stuck in an inconsistent state.

Best practice:

1. **Attempt the prorated charge first.**
2. **If it succeeds, change the plan.**
3. **If it fails, do not change the plan.** Surface the error to the customer.
4. **Do not auto-retry without notifying the customer.** Plan changes are intentional actions.

The opposite (changing the plan optimistically and trying to charge later) creates customers who got the upgraded plan without paying. Recovering that revenue is much harder than asking the customer to update their card and try again.

For more on this, see our breakdown on [revenue recovery for SaaS](https://dodopayments.com/blogs/revenue-recovery-saas).

## What Customers Expect to See

Proration math is opaque to most customers. Make the customer-facing communication clear:

- **Before the change.** Show the customer the exact charge they will see today, and the next renewal amount and date.
- **After the change.** Send a confirmation email with the proration breakdown.
- **In the customer portal.** Show their plan history, including the change date and the prorated charge.

The single biggest source of refund requests around plan changes is customer confusion about a charge that looked unexpected. Pre-emptive transparency reduces these by 80 percent.

## MRR Accounting for Plan Changes

Plan changes affect MRR accounting in non-obvious ways. The cleanest approach:

- **Upgrades.** Old plan MRR removed, new plan MRR added. Net change = positive.
- **Downgrades.** Old plan MRR removed, new plan MRR added. Net change = negative (counted as contraction).
- **Add-on changes.** Treated as line-item changes within the subscription, not full plan changes.
- **Seat changes.** Each seat counts as MRR units; net change reflects the difference.
- **Usage spikes.** Not counted in MRR; accounted as variable revenue.

Most billing platforms surface these splits in their MRR reporting. Use the platform's numbers; do not try to reconstruct MRR from raw invoice data unless your finance team is specifically structured for it.

For more on MRR and SaaS metrics, see our guides on [SaaS metrics and KPIs](https://dodopayments.com/blogs/saas-metrics-kpi), [annual recurring revenue](https://dodopayments.com/blogs/what-is-arr-annual-recurring-revenue), and [SaaS unit economics](https://dodopayments.com/blogs/saas-unit-economics).

## Common Proration Mistakes

Patterns that create customer support tickets and accounting headaches:

- **Off-by-one day calculations.** Including the change day in both old and new plan calculations. Pick a convention and stick to it.
- **Wrong day count for the cycle.** February has 28 or 29 days, not 30. Some plans use 30-day cycles regardless. Be explicit.
- **Time zone confusion.** Customer in Asia changes plan at 11pm their time, your server uses UTC, your accountant uses Pacific. Lock the change time to one canonical time zone.
- **Refunding the prorated portion to the wrong card.** If the customer changed cards between the original charge and the credit, the refund goes to the new card. Some processors handle this automatically; others require you to handle the case.
- **Skipping tax recalculation.** Each prorated event is its own taxable event.
- **Race conditions on rapid plan changes.** Customer upgrades, then immediately downgrades. Naive implementations double-charge or under-credit.

> The hardest bug I have seen in production billing was a race condition where a customer upgraded and downgraded within 30 seconds. The webhooks arrived out of order. The customer ended up on the wrong plan with a charge they didn't expect. Build idempotency into every plan-change endpoint.
>
> - Rishabh Goel, Co-founder & CEO at Dodo Payments

## Implementation: Proration With Dodo Payments

The Dodo Payments subscription API supports all three proration modes through a single parameter:

```javascript
import DodoPayments from 'dodopayments';

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

// Upgrade with immediate proration
await client.subscriptions.changePlan('sub_abc123', {
  product_id: 'prod_pro_plan',
  quantity: 1,
  proration_billing_mode: 'prorated_immediately',
});

// Downgrade with proration applied at next cycle
await client.subscriptions.changePlan('sub_abc123', {
  product_id: 'prod_starter_plan',
  quantity: 1,
  proration_billing_mode: 'prorated_next_cycle',
});

// Plan change with no proration
await client.subscriptions.changePlan('sub_abc123', {
  product_id: 'prod_pro_plan',
  quantity: 1,
  proration_billing_mode: 'full_immediate',
});
```

For the full reference, see [subscription upgrade and downgrade documentation](https://docs.dodopayments.com/developer-resources/subscription-upgrade-downgrade) and the [subscription feature page](https://docs.dodopayments.com/features/subscription).

## How Dodo Payments Handles Proration

Proration is built into the core subscription engine:

- All three proration modes (immediate, next-cycle, full immediate) supported via a single API parameter
- Per-dimension proration: subscription, seats, add-ons, usage allowances calculated independently
- Tax recalculation on every prorated event (full Merchant of Record coverage across 220+ countries)
- Webhook events for every plan change with detailed breakdown of charges and credits
- Customer portal that shows clear before-and-after pricing on plan changes
- Race-condition-safe: idempotent plan-change API
- Transparent pricing at 4% plus 40 cents per transaction

For implementation walkthroughs, see the [integration guide](https://docs.dodopayments.com/developer-resources/integration-guide).

## FAQ

### What does proration mean in subscription billing?

Proration is the practice of calculating partial-period charges or credits when a customer changes their subscription mid-cycle. If a customer upgrades 10 days into a 30-day cycle, proration charges them for the new plan only for the remaining 20 days, with a credit for the unused 20 days of the old plan.

### What are the three proration modes?

The three modes are: prorated immediately (charge or credit the customer today for the difference), prorated at next cycle (apply the calculation on the next regular invoice with no charge today), and full immediate (charge the full new plan price immediately with no credit for the old plan). Each makes a different trade-off between customer experience and revenue protection.

### How does proration work for seat-based plans?

Each seat is treated as a separate billing line item. Adding seats mid-cycle prorates each new seat individually. Removing seats creates a credit applied at the next cycle. The cleanest implementation recalculates proration on every change against the original cycle anchor, not against the last change.

### Should I prorate downgrades?

Most SaaS companies use "prorated at next cycle" for downgrades, which lets the customer keep using the higher plan they paid for until the cycle ends. This avoids the awkward customer experience of paying for a plan they cannot use. For upgrades, immediate proration is the standard expectation.

### How does proration affect MRR?

Plan changes affect MRR by removing the old plan's contribution and adding the new plan's contribution. Upgrades increase MRR (expansion), downgrades decrease it (contraction). Most billing platforms surface these splits in their MRR reporting. Do not try to reconstruct MRR from raw invoice data without first understanding how your platform represents these events.

## The Takeaway

Proration is straightforward in theory and brutal in practice. The math itself is simple division. The complexity comes from edge cases: time zones, race conditions, tax recalculation, failed payments mid-change, and customer communication.

Pick a proration mode that matches your customer expectations. Use the platform's primitives instead of reimplementing them. Make the customer-facing communication clear so plan changes do not generate refund requests.

If you are evaluating billing platforms with native proration support, [Dodo Payments](https://dodopayments.com) handles all three proration modes natively across subscription, seat, add-on, and usage dimensions. See the [pricing page](https://dodopayments.com/pricing) and [subscription upgrade and downgrade documentation](https://docs.dodopayments.com/developer-resources/subscription-upgrade-downgrade) to get started.
---
- [More Billing articles](https://dodopayments.com/blogs/category/billing)
- [All articles](https://dodopayments.com/blogs)