Skip to main content

How do I map Stripe subscription schedules to deferred revenue?

Stripe subscription schedules break a subscription into sequential phases — each with its own price, quantity, and duration — which is what Loopfour's createSubscriptionSchedule action uses to represent a planned upgrade, downgrade, or trial. Stripe's own Revenue Recognition product then treats each invoice line item as a separate performance obligation and amortizes it over that phase's period.

Zuny FesterBy Zuny Fester, Head of Operations and Marketing
Reviewed by Zuny Fester
Published Last reviewed Editorial policy

Part of the finance integrations guide.

What a schedule representsSequential phases (up to 10), each with its own price, quantity, and duration
Loopfour actionscreateSubscriptionSchedule, updateSubscriptionSchedule
How Stripe Revenue Recognition reads itEach invoice line item is treated as its own performance obligation, amortized evenly over its period
What's not automaticA line item needs a period set, or Revenue Recognition recognizes the full amount at finalization instead of deferring it

What a phase actually changes

A subscription schedule's phases attribute defines when changes happen and what properties of the subscription change at each point — price, quantity, coupons, tax rates. Phases must be sequential (only one active at a time), and Stripe supports up to 10. When a phase becomes active, Stripe updates the underlying subscription to match it automatically; you don't have to separately call an update on the subscription itself once the schedule is in place.

How Stripe's own Revenue Recognition reads a schedule

Subscriptions create invoices on each cycle, with each subscription item corresponding to an invoice line item, and the period of that line item populated automatically from the subscription item's period. Stripe's Revenue Recognition product treats each invoice line item as its own performance obligation: when the invoice finalizes, it defers the total recognizable amount and amortizes it evenly across the line item's period. If a line item has no period set, Revenue Recognition recognizes the full amount immediately at finalization instead — which is the detail that matters most when mapping a schedule's phases to deferred revenue correctly.

Setting one up

The mechanics are the same whether the change is an upgrade or a downgrade — only the price and quantity in each phase differ. What matters for revenue recognition is that each phase's items carry a real price associated with a recurring interval, so the resulting invoice line items get a period Stripe can amortize over, rather than reading as one-off charges.

Next step

Map the finance workflow with the most exposure and prove the automation path.

Bring the invoice, contract, payment reconciliation, or customer finance workflow you have to defend at audit. Loopfour can map the trigger, controls, integrations, and approval loop.

Book a workflow review

Worked example

A $50/mo plan scheduled to upgrade to $150/mo after 2 months

A customer signs up for a $50/mo plan with a schedule that upgrades them to $150/mo after 2 months, for a 12-month total commitment. The schedule has two phases: phase 0 (2 months, $50/mo) and phase 1 (10 months, $150/mo). Each month, the active phase generates an invoice with one line item, and that line item's period (one calendar month) is what Stripe Revenue Recognition amortizes the recognizable amount over — so each $50 invoice defers and recognizes $50 across its own month, and once phase 1 activates in month 3, each $150 invoice does the same at the new price. Nothing about the deferral logic changes at the phase boundary; only the price does.

Frequently Asked Questions

No — the mechanism is identical; only the price and quantity set on each phase differ. Stripe applies the phase change automatically either way.

Revenue Recognition recognizes the full amount immediately when the invoice finalizes, instead of deferring and amortizing it — which defeats the point of using a schedule for a multi-phase change.

Yes, for phases that haven't started yet — you can only update the current and future phases, and you have to pass in all of them (not just the one changing) on the update call.

Sources

Related