Stripe subscription proration logic: what customers actually get charged

A cell phone sitting on top of a laptop computer

The newsletter for newsletter operators

Daily field notes on deliverability, AI tools, hosting, and monetisation. No "top 10 plugins" filler — real tools, real numbers, real failures.

Stripe subscription proration logic: what customers actually get charged
Photo by Julio Lopez on Unsplash

If you sell subscriptions—courses, membership sites, premium newsletters—you’ve probably set up Stripe and assumed the billing “just works.” It does, mostly. But the moment a customer upgrades mid-cycle, downgrades two weeks before renewal, or switches plans on day 28 of a 30-day billing period, Stripe’s proration logic kicks in. And unless you’ve tested it yourself, the charge your customer sees may surprise both of you.

How Stripe calculates proration by default

Stripe prorates subscription changes based on unused time. When a customer upgrades from a $10/month plan to a $50/month plan halfway through their billing cycle, Stripe:

  • Calculates the unused value on the old plan ($5 remaining)
  • Credits that amount toward the new plan
  • Charges the difference immediately ($50 – $5 = $45)
  • Resets the billing cycle to start today

That last point matters. The customer’s renewal date shifts. If they subscribed on the 1st and upgraded on the 15th, their next charge is now on the 15th of every month—not the 1st.

For downgrades, Stripe credits the unused portion and applies it to the next invoice. The customer pays nothing immediately, but their next bill is reduced. The billing cycle does not reset unless you configure it to.

When proration breaks customer expectations

Most confusion happens when customers upgrade near the end of their billing period. Imagine someone on a $20/month plan upgrades to $100/month on day 28 of 30. Stripe credits roughly $1.33 of unused time and charges $98.67 immediately. Two days later, the customer gets charged the full $100 again.

From Stripe’s perspective, this is correct: the customer upgraded, got credited for two unused days, then hit their new monthly renewal. From the customer’s perspective, they just paid ~$199 in 48 hours.

You can prevent this by disabling proration on upgrades and always charging the full amount immediately, or by using billing cycle anchoring to keep everyone on the same renewal date. The latter is common for SaaS products with tiered plans; the former works better for one-person operations where simplicity beats precision.

Proration settings you can control

Stripe gives you three levers:

  • Proration behavior: create_prorations (default), none, or always_invoice
  • Billing cycle anchor: Set a fixed day (e.g., 1st of the month) so all subscribers renew together, regardless of when they joined
  • Proration date: Override when Stripe calculates the proration from (useful if you’re backdating a plan change)

If you’re running a paid newsletter and using a tool like Memberful or Substack, these settings are abstracted—you won’t see them. But if you’re building on Stripe directly (via API or a WordPress membership plugin), you control all three.

For most solo operators, the simplest setup is:

  • Prorate upgrades (charge immediately, reset cycle)
  • Don’t prorate downgrades (apply credit at next renewal, keep cycle intact)
  • Skip billing cycle anchoring unless you have a strong ops reason (like batched fulfillment)

One non-obvious tip: test with $0.50 test subscriptions

Stripe’s test mode is helpful, but it doesn’t show you what the email receipt looks like or how your payment page renders the proration line item. Before you go live, create a live-mode product priced at $0.50/month and another at $2/month. Subscribe yourself, wait a few days, then upgrade. You’ll see:

  • Exactly what Stripe emails your customer
  • How the invoice PDF formats proration credits
  • Whether your customer portal (if you’ve enabled one) explains the charge clearly

This costs you a few dollars in Stripe fees, but it’s worth it. The default invoice description—”Unused time on [plan name] after [date]”—makes sense to you. It may not make sense to someone who just saw $47 leave their account.

If you’re using Stripe for subscriptions and haven’t touched proration settings, open your dashboard and click into a subscription product. Scroll to “Proration” under advanced settings. If it says “Automatic,” you’re using Stripe’s defaults. That’s fine for most cases—but now you know what happens when a customer clicks “upgrade” on day 29.

Running a subscription business? Reply and tell us which billing edge case surprised you most. We’ll cover it in a future piece.

The newsletter for newsletter operators

Daily field notes on deliverability, AI tools, hosting, and monetisation. No "top 10 plugins" filler — real tools, real numbers, real failures.

Other newsletters you might like

Love Paris

Love Paris — in your inbox Iconic landmarks, hidden gems and the best places to visit in Paris. One short email, every day.

Subscribe

Scottish Rugby Fans

The best Scottish rugby updates, straight to your inbox — Six Nations, the Nations Championship, Glasgow and Edinburgh. Only when there's something worth reading.

Subscribe

Love London

A newsletter for Londoners who want to rediscover their own city. Travellers planning their first or fifth visit. Anglophiles who fell in love with London through literature, film, or a rainy afternoon on the South Bank.

Subscribe

One Two Three AI

One Two Three AI — in your inbox AI news, practical tips and how-to guides. One useful idea a day.

Subscribe

Newsletters via the One Two Three Send network.  ·  Want your newsletter featured here? Click here