Skip to content
Create account
or
Sign in
The Stripe Docs logo
/
Ask AI
Create account
Sign in
Get started
Payments
Finance automation
Platforms and marketplaces
Money management
Developer tools
Get started
Payments
Finance automation
Get started
Payments
Finance automation
Platforms and marketplaces
Money management

Mixed interval subscriptionsPrivate preview

Learn how to add items with different intervals to your subscriptions.

Copy page

You can bill for multiple recurring prices with different intervals on a single subscription using mixed interval subscription. This allows you to combine different pricing structures within a single subscription.

For example, if a customer subscribes to a service with an annual flat fee of 500 USD and a monthly usage-based fee, you can include both prices as items on the same subscription. Stripe generates combined invoices when item-level billing cycles align and generates separate invoices when only one item is due.

Mixed interval subscription private preview

The mixed interval subscription is currently in private preview and might change in functionality and integration path before it becomes generally available. We recommend testing your integration with non-production traffic.

Get started with mixed interval subscriptions

Billing mode public preview

billing_mode is currently in public preview. Learn more about public preview limitations.

To enable mixed interval subscriptions, you must set billing_mode=flexible on the following API endpoints and upgrade your API version to 2025-04-30.preview or later.

  • Create a subscription
  • Create a preview invoice
  • Create a Checkout Session

Create a subscription with mixed intervals

Create a subscription using prices of different recurring interval values to invoice for subscription items renewing at disjoint times.

For the example of a 100 USD per quarter and a 15 USD per month subscription starting on 1 January 2024, create the following subscription:

Command Line
cURL
curl https://api.stripe.com/v1/subscriptions \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -d customer=
{{CUSTOMER_ID}}
\ -d "items[0][price_data][currency]"=usd \ -d "items[0][price_data][product]"=
{{PRODUCT_ID}}
\ -d "items[0][price_data][recurring][interval]"=month \ -d "items[0][price_data][recurring][interval_count]"=1 \ -d "items[0][price_data][unit_amount]"=1500 \ -d "items[0][quantity]"=1 \ -d "items[1][price_data][currency]"=usd \ -d "items[1][price_data][product]"=
{{PRODUCT_ID}}
\ -d "items[1][price_data][recurring][interval]"=month \ -d "items[1][price_data][recurring][interval_count]"=3 \ -d "items[1][price_data][unit_amount]"=10000 \ -d "items[1][quantity]"=1 \ -d collection_method=send_invoice \ -d days_until_due=5 \ -d proration_behavior=none \ -d billing_mode=flexible \ -d "expand[0]"=latest_invoice

The response includes a subscription with both items and bills for them on the first invoice (latest_invoice):

{ "object": "subscription", "id":
'{{SUBSCRIPTION_ID}}'
, "current_period_start": 1704067200, // Jan 1 2024 "current_period_end": 1706745600, // Feb 1 2024 "items": { "data": [ { "id": "si_A", "price": "price_id_monthly",

On 1 February and 1 March, the subscription renews and generates a new invoice for the monthly price. On 1 April, the subscription renewal creates an invoice for both the monthly and quarterly price.

Cancel a subscription

  • When you cancel a mixed interval subscription or schedule, Stripe cancels all the subscription items, regardless of their interval.
  • Subscriptions have a single behaviour for dunning, even if an invoice only bills for one of the items on the subscription. If all retries for a payment fail, Stripe cancels the entire subscription and marks it as unpaid or overdue, depending on your configured dunning settings.

Billing periods for mixed interval subscriptions

Each subscription item has its own current_period_start and current_period_end.

Stripe sets the subscription’s current period based off the subscription item’s billing periods, where:

  • current_period_start is the maximum of the item’s current_period_start dates.
  • current_period_end is the minimum of the item’s current_period_end dates.

The subscription.current_period_end always indicates the next date that an item will cycle.

For example, a subscription created on 1 January with a monthly, bimonthly, and quarterly item has the following periods:

current_period_startcurrent_period_end
Monthly item1 January1 February
Bi-monthly item1 January1 March
Quarterly item1 January1 April
Subscription1 January1 February

After renewal on February 1 (subscription.current_period_end), the subscription’s current period adjusts to match the latest current_period_start and earliest current_period_end of all the items:

current_period_startcurrent_period_end
Monthly item1 February1 March
Bi-monthly item1 January1 March
Quarterly item1 January1 April
Subscription1 February1 March

After cycling a third time:

current_period_startcurrent_period_end
Monthly item1 March1 April
Bi-monthly item1 March1st May
Quarterly item1 January1 April
Subscription1 March1 April

Deprecated subscription parameters

The subscription-level parameters subscription.current_period_start and subscription.current_period_end are deprecated. Define period values at the subscription item level instead.

Adjustments to billing periods

Free trial

The item-level billing period dates are affected by free trial end dates, similar to regular subscriptions. When the subscription has a future-dated trial_end, all the current_period_end dates (subscription and items) are set to the trial_end date.

Pause at trial end and resume

A mixed interval subscription can be configured to pause at trial end when the payment method is missing through the trial_settings.end_behavior.missing_payment_method parameter as with regular subscriptions. Paused subscriptions can be resumed using stripe.subscription.resume, as with regular subscriptions. Currently, only proration_behavior: none and billing_cycle_anchor parameters are supported.

Note

When resuming a mixed interval subscription with billing_cycle_anchor: unchanged and proration_behavior: none, the debit proration for the partial period between the date of resumption and the end of the current billing period for each of the items aren’t generated or billed. See an example below:

For a mixed interval subscription with a monthly and a bimonthly item with

  • billing_cycle_anchor = 1 January
  • trial_end = 1 February
  • trial_settings.end_behavior.missing_payment_method = “pause”

This example assumes this subscription is paused on 1 February because of a missing payment method, and the subscription resumes on 15 February with proration_behavior: none:

billing_cycle_anchor: unchangedbilling_cycle_anchor: now
Monthly itemItem current period: 1 February to 1 March
  • Not billing for this period, so no new invoice is created
  • Monthly item is next billed on 1 March for the period 1 March to 1 April
Item current period: 15 February to 15 March
  • New invoice generated and billing for monthly item from 15 February to 15 March
Bimonthly itemItem current period: 1 February to 1 April
  • Not billing for this period, so no new invoice is created
  • Bimonthly item is next billed on 1 April for the period 1 April to 1 June
Item current period: 15 February to 15 April
  • New invoice generated and billing for monthly item from 15 February to 15 April
Subscription
  • billing_cycle_anchor: 1 February
  • Subscription transitions to active immediately
  • Generate a subscription pending update for billing_cycle_anchor: 15 February (applied when resumed invoice is paid)
  • Subscription remains paused until resumption invoice is paid

Mixed interval considerations

There are several restrictions introduced with the mixed interval feature.

Cycle alignment

The price cycle of every subscription item must be a multiple of the shortest price cycle present on the subscription. A price’s interval is a combination of the price.recurring.interval and price.recurring.interval_count fields.

  • Examples of supported interval combinations:

    Equivalent intervals

    When validating that the intervals on your subscription align, Stripe considers the following intervals as equivalent:

    • 1 week and 7 days
    • 12 months and 1 year
    • 1 month, 3 months
    • 1 month, 1 year
    • 1 day, 1 week
    • 1 day, 3 months
    • 1 day, 2 years
    • 2 weeks, 4 weeks
    • 2 months, 4 months, 6 months
  • Examples of unsupported interval combinations:

    Non-equivalent intervals

    There are no equivalences between the following price interval types:

    • Week and month
    • Week and year
    • Day and month
    • Day and year
    • 2 months, 3 months
    • 4 months, 6 months
    • 1 week, 1 month
    • 2 days, 1 week
    • 5 months, 1 year

Limitations

While in private preview, mixed interval subscriptions are subject to the following limitations that might change during development:

  • All subscription item prices must specify recurring.usage_type: licensed and billing_scheme: per_unit. We don’t support metered pricing.
  • Mixed interval subscriptions are currently available in the Stripe API only, and not the customer portal.
  • You can’t use cancel_at_period_end on a mixed interval subscription because it’s unclear which subscription item’s current_period_end to use to determine the cancellation date.
Was this page helpful?
YesNo
Need help? Contact Support.
Join our early access programme.
Check out our changelog.
Questions? Contact Sales.
LLM? Read llms.txt.
Powered by Markdoc