Glossary
Stripe Subscription Schedule
A Stripe subscription schedule is an object that automates changes to a subscription over time, holding an ordered list of phases that each set the price, quantity and billing configuration the subscription switches to when that phase begins.
Also called: subscription_schedule, schedule phases, phased subscription, scheduled subscription change
Definition
A subscription tells you what a customer is being billed today. A subscription schedule tells you what they will be billed later, and it already exists.
Stripe puts the purpose in one line: use subscription schedules "to automate changes to subscriptions over time." The changes live in the `phases` attribute, an ordered list where each entry says when something changes and what it changes to. A six month promotional rate followed by the standard rate is two phases. A one month print plan that adds a digital plan afterwards is two phases. An installment plan is one phase with a fixed number of iterations and an instruction to cancel at the end.
The distinction that matters, and the one people get wrong, is that a schedule is not a subscription. It manages one. Stripe describes the object as holding the "ID of the subscription managed by the subscription schedule," and you can either create the subscription through the schedule or attach a schedule to a subscription that already exists.
For anyone reconciling revenue, the useful property is that a schedule is committed future billing that has produced nothing yet. The price change six months out is recorded in Stripe today. It has no invoice, no balance transaction and no entry in your accounting system until the phase carrying it actually starts and bills. Anyone forecasting from invoices alone cannot see it, and anyone auditing an unexplained price change on an old invoice will not find the reason on the invoice.
Key points
- +Phases are sequential and only one can be active at a time, with a limit of 10 current or future phases.
- +When a phase becomes active, the attributes set on that phase are also set on the underlying subscription.
- +end_behavior decides what happens at the end: release keeps the subscription running, cancel ends it.
- +Releasing removes the schedule and leaves the subscription in place; canceling the schedule cancels the subscription too.
- +Each phase has its own proration_behavior, separate from the schedule-level one.
- +A schedule produces no accounting record until a phase transition generates an invoice.
Phases are the whole object
Everything a schedule does, it does through phases. Stripe: "use the phases attribute to define when changes occur and what properties of the subscription to change."
Two rules constrain the shape. "Phases must be sequential, meaning only one phase can be active at a given time," and "You can have up to 10 phases." That second limit is on current and future phases only: "Past phases don't count against this limit," so a long-running schedule does not run out of room as it ages.
Length is set either by a duration or by explicit dates, and Stripe has a clear preference. The `duration` parameter accepts `week`, `month` or `year`, and Stripe notes that "Using duration automatically sets the start_date and end_date properly." You can set the dates yourself, but the constraint is unforgiving: "The end_date of one phase has to be the start_date for the next phase." Stripe recommends duration instead, "Because manually setting the start and end dates is prone to errors."
Transitions need no intervention. "Phase transitions happen automatically after the end_date on a phase is reached. When a phase starts, Stripe updates the subscription based on the attributes of the next phase."
What a phase does to the subscription underneath it
This is the mechanism worth internalising, because it explains why a subscription can change without anybody touching it.
Stripe: "When a phase becomes active, all attributes set on the phase are also set on the subscription. After the phase ends, attributes remain the same unless the next phase modifies them, or if the schedule has no default setting."
So a phase is not a description of the subscription. It is a set of instructions written onto it. Attributes are sticky: a coupon applied in phase one persists into phase two unless phase two explicitly removes it, which is why Stripe's own promotional example includes a second phase whose job is to take the discount away.
Some attributes can be set in two places, on the schedule's `default_settings` and on individual phases, including collection method, invoice settings, default payment method and billing thresholds. The precedence is simple: a schedule attribute becomes the default for all phases, and where both are set, the phase wins.
One consequence catches integrations. If a subscription has a schedule attached, Stripe advises using the Subscription Schedule API to modify it "instead of the Subscriptions API," because "any modifications you make directly to the subscription might be overwritten by the subscription schedule when the next phase is entered." A quantity you changed by hand in March can silently revert in April.
Editing a subscription can create a phase you did not ask for
A subtler version of the same problem, and one that produces schedules nobody deliberately built.
Stripe lists attributes that, when changed directly on a subscription with a schedule attached, "might automatically create a new subscription schedule phase." They include `discounts`, `tax_rates`, `items`, `trial_end`, `application_fee_percent`, `add_invoice_items` and `automatic_tax`.
The worked example is a subscription with two items and a single phase mirroring its current state. Delete one item through the API and the attached schedule splits into two phases: "The phase that just ended and had two subscription items" and "The new phase that has just one item on the subscription."
When that split happens, Stripe copies a specific set of properties from the current phase to the new one: `proration_behavior`, `billing_cycle_anchor`, `cancel_at_period_end`, `description`, `metadata` and `pause_collection`. That last one is the surprise. A pause set on the subscription travels into a phase that was created as a side effect of an unrelated edit.
Proration has two separate settings, and they are easy to confuse
Stripe is explicit that "There are two different proration behavior settings that control how Stripe handles billing adjustments during subscription schedule changes," and mixing them up produces the wrong invoice at the wrong moment.
The **schedule-level** `proration_behavior` "controls how to handle prorations when updating a subscription schedule in a way that affects the current phase's billing configuration (such as changing prices or quantities)." It fires when you edit the schedule.
The **phase-level** `proration_behavior` "controls how Stripe handles prorations when transitioning to that phase." It fires when time passes and the phase begins. Stripe: "This setting applies specifically to prorations generated during phase transitions and is saved as a field on the phase."
Both take the same three values, and the third one is the one with accounting consequences: `create_prorations` (the default) generates pending invoice items, `none` creates no prorations, and `always_invoice` will "Generate prorations and immediately create an invoice when entering this phase." An `always_invoice` phase transition is therefore a billing event on a date chosen months ago, not on a billing cycle boundary.
Stripe adds a practical note for anyone fixing this before it bites: "If you need to change how a future phase transition handles prorations, update the proration_behavior setting on the future phase before it becomes active." How prorations themselves are calculated and recorded is covered in the Stripe proration entry.
The five statuses, and the two ways a schedule ends
Stripe defines `status` as "The present status of the subscription schedule," with five values: `not_started`, `active`, `completed`, `released` and `canceled`.
The first two are self-explanatory. `completed` is the ordinary ending: "Subscription schedules end after the last phase is complete." The last two are things you do on purpose, and they are not interchangeable.
**Releasing** detaches the schedule and leaves the billing alone. Stripe: "Releasing a subscription leaves it in place but removes the schedule and any remaining phases." The schedule records what it used to manage in `released_subscription`, documented as the "ID of the subscription once managed by the subscription schedule (if it is released)."
**Canceling** takes the subscription with it. Stripe: "Canceling a subscription schedule cancels the subscription as well." Both operations have the same precondition, which is that the status is `not_started` or `active`.
The same fork exists as an automatic setting for the natural ending. `end_behavior` is documented as the "Behavior of the subscription schedule and underlying subscription when it ends," with `release` the default: "release will end the subscription schedule and keep the underlying subscription running. cancel will end the subscription schedule and cancel the underlying subscription."
Installment plans are the clearest case for `cancel`. Stripe's own example charges a fixed number of iterations and sets `end_behavior` to cancel because "In an installment plan, the subscription isn't needed anymore." One detail for anyone watching for the cancellation date: the subscription's `cancel_at` "isn't set until the subscription transitions into the final phase," so it will not appear on the subscription in advance.
The first invoice does not behave the way a new subscription does
This is a small difference with a real effect on when revenue appears, and it applies specifically to schedules.
Creating a subscription directly finalizes its first invoice immediately. Creating one through a schedule does not. Stripe: "Unlike when you create a subscription directly, the first invoice of a subscription schedule with collection_method set to charge_automatically behaves like a recurring invoice and isn't immediately finalized at the time the schedule's subscription is created. The invoice begins in a draft status and is finalized by Stripe approximately 1 hour after creation."
Stripe frames the hour as an editing window: "You have 1 hour to edit the invoice. Later, the invoice auto-advances to open or paid status, depending on the outcome of the asynchronous payment attempt at finalization time."
For bookkeeping, the practical reading is that a schedule started at 4:55pm produces its first finalized invoice at around 5:55pm, which can be the following day in your reporting timezone. It is a one hour gap, not a behaviour change, but it is enough to move an invoice across a period boundary at month end.
How to find a schedule you did not create
Schedules appear without being asked for, and knowing where they come from saves a lot of confusion.
Stripe creates them automatically in at least one common flow: a customer scheduling a downgrade through the Customer Portal produces a schedule, and Stripe recommends capturing the ID from the `subscription_schedule.created` webhook "when Stripe creates it automatically." The phase-splitting behaviour above is another source.
You can also attach one deliberately to an existing subscription by passing `from_subscription`. Stripe: "Passing the subscription IDs in this way creates a schedule with one phase that's based on the current billing period of the subscription."
Stripe's advice on the lifecycle is worth following if you store these IDs: keep the schedule ID alongside the subscription ID for future updates, and "Discard the subscription schedule IDs when a subscription schedule is released," which the `subscription_schedule.released` webhook tells you about.
One restriction is worth knowing in advance, because it turns a schedule into a blocker. A subscription with an attached schedule cannot be paused with Stripe's pause subscription feature. Stripe's own remedy in that case is to release the schedule first.
What a schedule means for your QuickBooks records
Acodei's product documentation has no page on subscription schedules, and nothing in it describes reading a schedule, its phases, its status or its future prices. There is no documented behaviour to describe there, and this entry does not invent one.
What is documented is the trigger. Acodei's Invoice Sync works from invoice events: a QuickBooks invoice is created when a Stripe invoice is finalized, reproducing every line item, and tax lines, as your mapping settings allow, and a payment record follows when the invoice is paid. Each line uses the product returned by Multiple Product Mapping if you have it enabled, and the default product otherwise.
The consequence is worth stating plainly. A phase transition is not itself an accounting event. A schedule can change price, quantity, coupon and tax rate on a date chosen months earlier, and none of it reaches QuickBooks until that change produces an invoice. What lands in your books is the invoice, in the shape the invoice takes. If a customer's invoice amount changes for no reason you can see on the Stripe or QuickBooks record, the schedule is the place to look, and a phase whose proration behaviour is set to always invoice is the case that produces an extra invoice on a date no billing cycle explains.
Want to see this on your own Stripe data?
Start a free trialFrequently asked questions
What is the difference between a Stripe subscription and a subscription schedule?
A subscription is the current billing arrangement. A schedule is an ordered plan of changes to it, held as phases, that Stripe applies automatically as each phase begins. The schedule manages the subscription rather than replacing it, and it carries the ID of the subscription it manages. You can create a subscription through a schedule or attach a schedule to one that already exists.
What happens when I release a subscription schedule?
Stripe describes it as leaving the subscription in place "but removes the schedule and any remaining phases." The subscription carries on billing exactly as it is at that moment, and any future price changes or coupon removals that were queued in later phases simply do not happen. You can release a schedule only while its status is not_started or active.
Does canceling a subscription schedule cancel the subscription?
Yes. Stripe states that "Canceling a subscription schedule cancels the subscription as well." If you want to remove the schedule and keep billing the customer, release it instead. The same choice exists as an automatic setting through end_behavior, where release is the default and cancel ends the subscription when the last phase completes.
How many phases can a subscription schedule have?
Up to 10 current or future phases at a time. Past phases do not count against the limit, so a schedule that has already run through several phases still has room for 10 ahead of it. Phases are sequential and only one can be active at a time.
Why did my subscription change on its own?
Most likely a phase transition. Stripe applies the next phase automatically once the current phase reaches its end_date, and every attribute set on the phase is also set on the subscription. A related cause is a direct edit being overwritten: Stripe warns that modifications made straight to a subscription that has a schedule attached "might be overwritten by the subscription schedule when the next phase is entered."
Does a subscription schedule create anything in QuickBooks?
Not on its own. Acodei's documented trigger for creating a QuickBooks invoice is finalization of a Stripe invoice, so a schedule sitting with future phases produces no accounting record at all. The records appear when a phase actually bills, and what lands is the resulting invoice reproduced according to your mapping settings, not the schedule behind it.
Why did an extra invoice appear on a date that is not a billing date?
Check the phase that just started. Each phase carries its own proration_behavior, and one of its values, always_invoice, will "Generate prorations and immediately create an invoice when entering this phase." That produces a real invoice on the phase transition date rather than waiting for the next cycle, and once it finalizes it syncs like any other invoice.
Where do subscription schedules come from if I never made one?
Two common sources. Stripe creates a schedule automatically when a customer schedules a downgrade through the Customer Portal, notifying you through the subscription_schedule.created webhook. Stripe also splits an existing schedule into a new phase when you change certain subscription attributes directly, including items, discounts, tax rates and trial end.
What customers say about running Stripe through Acodei

“If you're testing out all the different Stripe/QuickBooks integration apps right now, let me save you some time. This one is the best one by far.”
“Works well and is really helpful for massive transactions. The support is really fast and helpful. 100% recommended.”
Related reading
- Stripe proration
- Stripe invoice line item
- Stripe invoice status
- Stripe quotes and the invoice they produce
More glossary terms
- Undeposited Funds
- Stripe Balance Transaction
- Available vs Pending Balance
- Stripe Dispute
- Stripe Fee
- Stripe Balance Adjustment
- QuickBooks Credit Memo
- Stripe Tax
- QuickBooks Tax Code
- Stripe Reserve
- Stripe Tax Rate
- Stripe Fee Credit
- Stripe Credit Note
- QuickBooks Product/Service Item
- Stripe Payout
- QuickBooks Sales Receipt
- QuickBooks Bank Deposit
- QuickBooks Transfer
- Stripe Authorization Hold
- QuickBooks Refund Receipt
- QuickBooks Payment
- QuickBooks Expense
- QuickBooks Journal Entry
- Stripe Financial Account
- Holding Account
- Accounts Receivable
- Bank Feed
- Deferred Revenue
- Stripe PaymentIntent
- Stripe Checkout Session
- Stripe SetupIntent
- Stripe PaymentMethod
- Stripe Charge
- Stripe Refund
- QuickBooks Invoice
- QuickBooks Class Tracking
- QuickBooks Location Tracking
- QuickBooks Project
- QuickBooks Closing Date
- Stripe Invoice Line Item
- Stripe Proration
- Stripe Invoice Status
- Stripe Shipping Rate
- Stripe Transfer
- Stripe Mandate
- Stripe on_behalf_of
- Stripe Invoice Item
- QuickBooks Estimate
- Stripe Invoice Payment
- Stripe Invoice Payment Settings
- Stripe Billing Meter
- Stripe Invoice Template
- Stripe Price
Ready to try Acodei?
Connect Stripe to QuickBooks Online in minutes and let the fees, refunds, and payouts land where your accountant expects them.