Reference

Stripe proration_behavior and create_prorations, explained

What each setting does, and how to change a price without a surprise charge · July 2026

The short version: proration_behavior is the parameter you set when you change a subscription's price. create_prorations is its default value, and it's the one that generates those surprise "why was I charged?" invoices. If you're doing a plain price change and don't want anyone billed mid-cycle, set proration_behavior: none and the subscription just bills the new amount at its next renewal.

proration_behavior vs create_prorations: they're not two things

People search for both like they're separate settings, so to be clear: proration_behavior is the parameter, and create_prorations is one of its values. You pass proration_behavior on a subscription update, and it accepts one of three values:

  • create_prorations is the default. Stripe credits the unused time on the old price and charges for the new one, producing proration line items that land on the next invoice.
  • none creates no credits or charges. The subscription price changes, but nobody is billed until the normal renewal, when it bills the new amount.
  • always_invoice behaves like create_prorations, but it invoices the proration immediately instead of waiting for the next cycle.

What create_prorations actually charges

Say a customer is halfway through a month on a $20 plan and you move them to $30. With create_prorations, Stripe credits the roughly $10 of unused time on the old price and charges a prorated amount for the rest of the period on the new price. Those show up as line items on the next invoice, so the customer sees an extra charge they didn't expect. That's correct behavior for a mid-cycle upgrade someone asked for. It's the wrong behavior for an across-the-board price increase, where you almost never want to touch the current period at all.

The setting that causes surprise charges

Here's the trap: if you call the update and leave proration_behavior off entirely, Stripe uses create_prorations anyway, because it's the default. So "I didn't set proration" is the same as "I turned proration on." For a routine price change, be explicit and pass none.

How to set it (the API call)

You change a subscription's price by updating its subscription item to point at the new price, and you set proration_behavior on the same call. To change the amount with no mid-cycle charge:

stripe.subscriptions.update("sub_123", {
  items: [{ id: "si_123", price: "price_newAmount" }],
  proration_behavior: "none",
});

A few things worth knowing before you run this across your customer base:

  • You can't edit a price's amount directly, a Price object is immutable. You create a new price on the same product and point subscriptions at it. Full walkthrough here.
  • If you'd rather the change land at each customer's renewal instead of flipping now, use a subscription schedule. How to schedule a price increase.
  • If a subscription already has a schedule attached, a plain update can clobber it, so those need to be handled separately.

Doing it for a lot of subscriptions, without the script

Setting proration_behavior on one subscription is easy. Doing it correctly across hundreds, with the right batching, retries on rate limits, and a way to undo it, is a script you have to write, test, and babysit. If you'd rather skip that, PricePilot Migrate Pro does it from the browser: connect with a restricted Stripe key, preview exactly which subscriptions change and the MRR impact for free, choose your timing (next cycle, immediate with no proration, or prorate on purpose), and run it in safe batches with a one-click reverse. You pick the proration behavior in plain language, no API calls. It works on any native Stripe subscriptions, including ones created by Paid Memberships Pro and MemberPress.

Change your Stripe prices without touching the API

Preview the impact for free, choose whether anyone gets prorated, and run it in safe batches. Test mode is free end to end.

Open Migrate Pro →

Frequently asked questions

What is the default proration_behavior?

create_prorations. If you update a price and don't set proration_behavior, Stripe prorates anyway. Pass none to avoid it.

What's the difference between create_prorations and proration_behavior?

proration_behavior is the parameter; create_prorations is one of its values (alongside none and always_invoice).

How do I turn off proration in Stripe?

Set proration_behavior: none on the subscription update. No credits or charges are created, and it bills the new amount at the next renewal.

Related guides