Short answer
To bulk update Stripe subscription prices, create the new price, list every active subscription on the old price, and update each subscription item to the new price with proration_behavior=none. Run a small test batch first and keep a per-subscription log. You can script it against the API or use a Stripe App that runs the whole job from the Dashboard.
Or skip writing the script: the Change Subscription Price App, built by former Stripe Billing product managers and engineers, runs this whole runbook from your Stripe Dashboard with no code.
Change Subscription Price App — by FinriteUpdate a price across all your Stripe subscriptions from the dashboard, in bulk. Built by former Stripe Billing product managers and engineers.
View on Stripe MarketplaceMost bulk price changes that go wrong don't fail at the API call. They fail on everything around it: a legacy discount nobody remembered, a few customers billed in EUR, subscriptions on a schedule that quietly reverts the change a month later. This runbook is built around those edge cases.
Step 1: Scope what you're actually changing
Export your active subscriptions (Dashboard → Subscriptions → Export, or via the API) and answer these questions before creating anything:
- How many prices are in play? One product often has monthly and annual prices, sometimes in several currencies. Each needs its own replacement price.
- Who has a discount? Coupons stay attached through a price swap. Decide whether they keep it.
- Who is on a subscription schedule? Those need a schedule update, not a direct subscription update, or the next phase will revert them.
- Which statuses count? Usually
activeandtrialing. Decide deliberately aboutpast_due. - Who created these subscriptions? Subscriptions created by a platform like Substack, beehiiv or Ghost come with extra considerations.
Step 2: Create the replacement prices
Add each new price to the same product as the old one. Revenue reports that group by product stay continuous, and you can tell at a glance who has migrated. Match the interval and currency exactly. Changing the interval at the same time forces a billing-cycle reset and an immediate invoice.
Once everyone has moved, archive the old price so it can't be picked for new subscriptions by mistake. Archiving has no effect on existing subscriptions. Exception: if Substack, beehiiv or Ghost created the price, leave it alone. Create new prices in the platform, not in Stripe, and don't archive the platform's old ones.
Step 3: Run a test batch
Pick five to ten real subscriptions, ideally including one with a coupon and one in each currency, and migrate only those. Then open each one's upcoming invoice and confirm three things: the new amount, the same renewal date, and no proration line items. It takes ten minutes and catches almost every configuration mistake.
You can also rehearse the whole job in test mode. Stripe test clocks let you fast-forward to renewal and see the actual invoice.
Step 4: Run the full migration
Two ways to do it:
With a script
Page through GET /v1/subscriptions?price=price_old, then call POST /v1/subscriptions/:id for each result with the existing item ID and the new price. Throttle requests, back off on 429 responses, send an idempotency key, and write every result to a file. Our script guide has a complete example.
With a Stripe App
The Change Subscription Price App runs the same loop from inside the Dashboard. Pick the subscriptions, set the new price, then choose run now or a scheduled date. Updates apply without prorations, so each customer pays the new price from their next billing cycle. Test mode is capped at 100 updates per job, which is enough to rehearse.
Why teams run bulk changes with the Change Subscription Price App
- No code, no engineer. Anyone with Dashboard access can run it.
- No duplicate items or reset quantities. It swaps the price on each subscription's existing item and keeps its quantity.
- No surprise prorations. Every update uses no-proration, so the new price starts at each renewal.
- No half-finished runs. Updates are batched for you, so you don't have to handle rate limits or retries.
- Safe to rehearse. Test mode (up to 100 updates per job) and “run now” on a small batch let you check before the real thing.
- Easy to audit. Every job ends with a CSV of each subscription and whether it updated.
Change Subscription Price App — by FinriteUpdate a price across all your Stripe subscriptions from the dashboard, in bulk. Built by former Stripe Billing product managers and engineers.
View on Stripe MarketplaceStep 5: Audit what actually changed
"Job completed" isn't the same as "every subscription updated." A card can be mid-dispute, a subscription can be locked by a schedule, a request can time out. Reconcile the per-subscription result log against your Step 1 export, and re-run only the failures. The Finrite app gives you this as a CSV for every completed job. Check it before you announce the migration is done.
Common bulk-update mistakes
- Leaving the default proration setting on, which puts a small mid-cycle charge on every customer's next invoice.
- Adding the new price as a second item instead of replacing the old one, so customers get billed twice.
- Forgetting annual subscribers, who won't see the new price for up to 12 months.
- Skipping customer notice. Stripe won't announce the change for you.
Frequently asked questions
Is there a bulk edit for subscriptions in the Stripe Dashboard?
The Dashboard's subscription editor works on one subscription at a time. To move many subscriptions, run a script against the API or install a Stripe App built for bulk price changes, such as the Change Subscription Price App.
How many subscriptions can I update at once?
Stripe's API is rate-limited per account, so a script has to throttle itself and retry on 429 errors. Finrite's Change Subscription Price App handles batching for you. For jobs of more than 5,000 subscriptions, email contact@finrite.co first so we can plan capacity.
Can I bulk update only some customers on a price?
Yes. Filter by customer metadata, currency, status or creation date. In the Finrite app, filters are evaluated when the job looks up subscriptions, so data added after that lookup needs a new job.
What happens if a bulk update fails halfway?
Each subscription update is independent, so a partial failure leaves some subscriptions on the new price and some on the old one. That's why a per-subscription result log matters: re-run only the failures instead of the whole batch.
Related guides
Bulk price changes, run from your Stripe Dashboard
Select subscriptions, set the new price, and run it now or on a scheduled date. Every job produces a CSV report of what changed, so nothing fails silently.
Install from the Stripe App MarketplaceRead the app user guide first · Questions? contact@finrite.co