Skip to content
Sign in
An image of the Stripe logo
/
Create account
Sign in
Home
Payments
Finance automation
Banking as a service
Developer tools
No-code
All products
Home
Payments
Finance automation
Home
Payments
Finance automation
Banking as a service
Developer tools
Overview
Billing
    Overview
    Subscriptions
      How subscriptions work
      Quickstart
      Build a subscriptions integration
      Embed a pricing table
      Design an integration
      Migrate subscriptions to Stripe
      Recurring pricing models
        Usage-based billing
        Use trial periods
        Subscriptions with multiple products
        Set subscription quantities
      Manage subscription cycles
      Subscription schedules
      Tax
      Subscription webhooks
    Invoicing
    Quotes
    Collection methods
    Revenue recovery
    Manage recurring revenue
    Products and prices
    Customer management
    About the Billing APIs
    Test your integration
    Strong Customer Authentication (SCA)
    Invoices API updates
Tax
Reporting
Data
Startup incorporation
HomeFinance automationBillingSubscriptions

Recurring pricing models

Learn about common pricing models and how to create them.

Pricing models are patterns that represent your business on Stripe. With Product and Price objects, you can model what you sell and how you charge for it.

Flat rate: Good-better-best

Many SaaS businesses offer their customers a choice of escalating service options. This flat-rate pricing model is called good-better-best. Customers choose a service tier (good, better, or best) and pay a flat rate for it.

Imagine a business called Togethere that sells a collaboration platform. They offer three different service levels: basic, starter, and enterprise. For each service level, they offer a monthly and yearly price. Togethere operates in several countries, so they have prices in multiple currencies.

In this example, Togethere has three products: Basic, Starter, Enterprise. Each product has several different prices. The basic level has prices for 10 USD per month and 100 USD per year. Both prices are for the same Basic product, so they share the same product description on the customer’s receipt and invoice.

Here’s what that model looks like on Stripe:

Flat rate: Good-better-best pricing model

Model good-better-best on Stripe

Note

You can type “product.new” into the address bar of any browser to jump straight to the Product Editor.

To create a good-better-best model on Stripe through the Dashboard follow the steps below.

First, create the Basic product. To learn about all the options for creating a product, see the prices guide.

  1. Go to Product catalog.
  2. Click + Add product.
  3. Enter the Name of your product.
  4. (Optional) Add a Description. The description appears at checkout, on the customer portal, and in quotes.

Next, create the monthly price for the Basic product:

  1. Select Standard pricing for the Pricing model, then select Recurring.
  2. Enter the price amount-in this case, 10.00.
  3. Select Monthly for the Billing period.

Then, create the yearly price for the Basic product:

  1. Click + Add another price.
  2. Select Standard pricing for the Pricing model, then select Recurring.
  3. Enter the price amount-in this case, 100.00.
  4. Select Yearly for the Billing period.
  5. Click Save product to save the product and price. You can edit the product and price later.

The subscription integration guide explains how to fit pricing models into a full integration.

  • If you’re using Stripe Checkout, the next step is to create a Checkout session for your site. Make sure to set up Stripe.
  • If you’re using Stripe Elements, the next step is to create a Customer. Make sure you set up Stripe and the sample application.

Per-seat

Togethere, our example collaboration platform company, also wants to offer a per-seat plan. Per-seat pricing is another common offering for SaaS businesses. Togethere’s customers pick how many seats they’ll use, and Togethere charges based on that amount.

To model this scenario, Togethere creates a product and price structure where each unit represents a user. When Togethere creates a subscription for a customer, the customer specifies the number of users for that subscription.

Here’s what that model looks like on Stripe:

Per-seat pricing model

See the advanced pricing model section for examples of other models. Flat rate and per-seat pricing, where you charge a customer a flat monthly fee in addition to a per-seat rate, is another common model for SaaS businesses.

Model per-seat pricing on Stripe

To create a per-seat model on Stripe through the Dashboard follow the steps below.

First, create the Per-seat product. To learn about all the options for creating a product, see the prices guide.

  1. Go to Product catalog.
  2. Click +Add product.
  3. Enter the Name of the product: Per-seat, in this case.
  4. (Optional) Add a Description. The description appears at checkout, on the customer portal, and in quotes.

Next, create the monthly price for the Per-seat product:

  1. Select Standard pricing for the Pricing model, then select Recurring.
  2. Enter the price amount-in this case, 80.00.
  3. Select Monthly for the Billing period.

To create a subscription using that price:

  1. Go to the Payments > Subscriptions page.
  2. Click + Create subscription.
  3. Find or add a customer.
  4. Search for the Per-seat product you created and select the price you want to use.
  5. (Optional) Select Collect tax automatically to use Stripe Tax.
  6. Click Start subscription to start it immmediately or Schedule subscription to start it on another schedule.

Read the docs to learn all the options for creating a subscription.

The subscription integration guide explains how to fit pricing models into a full integration.

  • If you’re using Stripe Checkout, the next step is to create a Checkout session for your site. Make sure you set up Stripe.
  • If you’re using Stripe Elements, the next step is to create a Customer. Make sure you set up Stripe and the sample application.

For other versions of per-seat pricing, see the advanced models section.

Usage-based pricing

To see what an end-to-end integration based on the usage-based pricing model looks like, read the usage-based pricing models guide.

Tiered pricing

Prices can represent tiers, allowing the unit cost to change with quantity or usage. Togethere might, for example, want to offer lower rates for customers who use more projects per month. The following examples show two different ways to adjust pricing as usage increases: volume-based pricing and graduated pricing. To demonstrate these approaches to tiered pricing, we’ll use the following tiers:

Number of projectsPrice per tier
1-57 USD
6-106.50 USD
11+6 USD

Use tiers if you need non-linear pricing when quantity or usage changes. You can also combine tiered pricing with base fees to create more complex pricing models.

When you create a price with billing_scheme=per_unit, the unit_amount is the same regardless of how many units a customer buys. Stripe multiplies this amount by the quantity to determine the total cost. For example, a unit_amount of 5 USD creates this billing structure:

Quantity/Usage at end of periodTotal cost
15 USD
525 USD
630 USD
20100 USD
25125 USD

When you create a price with billing_scheme=tiered, the unit cost varies depending on how many units your customer buys. Here’s an example tier structure:

TierAmount (unit cost)
1-5 (up_to=5)5 USD (unit_amount=500)
6-10 (up_to=10)4 USD (unit_amount=400)
10-15 (up_to=15)3 USD (unit_amount=300)
15-20 (up_to=20)2 USD (unit_amount=200)
20+ (up_to=inf)1 USD (unit_amount=100)

Multiplication happens:

  • At the start of the billing period if the Price objects have recurring.usage_type = licensed.
  • At the end of the billing period if the Price objects have recurring.usage_type = metered.

With tiered billing, you:

  • Set the tiers_mode to either volume or graduated.
  • Create a tiers array to represent the tiers structure.

See also the volume-based and graduated pricing examples.

Volume-based pricing

With volume-based pricing, the subscription item is billed at the tier corresponding to the amount of usage at the end of the period. To implement volume-based billing tiers, set volume as the value of tiers_mode:

Command Line
curl https://api.stripe.com/v1/prices \ -u "
sk_test_4eC39HqLyjWDarjtT1zdp7dc
:"
\ -d nickname="Project Volume Pricing" \ -d "tiers[0][unit_amount]"=700 \ -d "tiers[0][up_to]"=5 \ -d "tiers[1][unit_amount]"=650 \ -d "tiers[1][up_to]"=10 \ -d "tiers[2][unit_amount]"=600 \ -d "tiers[2][up_to]"=inf \ -d currency=usd \ -d "recurring[interval]"=month \ -d "recurring[usage_type]"=metered \ -d product=
{{PRODUCT_ID}}
\ -d tiers_mode=volume \ -d billing_scheme=tiered \ -d "expand[0]"=tiers

Under volume-based pricing, a customer with 5 projects is charged 35 USD at the end of the period: 7 USD for each of the 5 projects. However, if they accumulate 6 projects the following month, then all projects are billed at the 6-10 rate. That month, they’re charged 39 USD (6.50 × 6).

With tiers_mode=volume, the entire quantity is multiplied by the unit cost of the tier.

Quantity/Usage at end of periodTotal for volume tiered pricing
15 USD
525 USD
624 USD
2040 USD
2525 USD

Because the tier price applies to the entire quantity or usage, the total can decrease when calculating the final cost.

Graduated pricing

While similar to volume pricing, graduated pricing charges for the usage in each tier instead of applying a single price to all usage. To use graduated tiers, set the value of tiers_mode to graduated:

Command Line
curl https://api.stripe.com/v1/prices \ -u "
sk_test_4eC39HqLyjWDarjtT1zdp7dc
:"
\ -d nickname="Per-minute pricing" \ -d "tiers[0][unit_amount]"=500 \ -d "tiers[0][up_to]"=5 \ -d "tiers[1][unit_amount]"=400 \ -d "tiers[1][up_to]"=10 \ -d "tiers[2][unit_amount]"=100 \ -d "tiers[2][up_to]"=inf \ -d currency=usd \ -d "recurring[interval]"=month \ -d "recurring[usage_type]"=metered \ -d product=
{{PRODUCT_ID}}
\ -d tiers_mode=graduated \ -d billing_scheme=tiered \ -d "expand[0]"=tiers

With graduated pricing, 5 projects result in the same charge as volume-based pricing—35 USD total at 7 USD per project. This changes as usage breaks out of the first tier. A customer with more than 5 projects is charged 7 USD per project for the first 5 projects, then 6.50 USD for projects 6 through 10, and finally 6 USD per project thereafter. A customer with 6 projects would be charged 41.50 USD, 35 USD for the first 5 projects and 6.50 USD for the 6th project.

With tiers_mode=graduated, the quantity is multiplied by the amount that falls into that tier. Then, the total is summed. For example, the total cost for an amount of 6 is 29 USD: 25 USD for the 5 quantity that falls into the 1–5 tier, plus 4 USD for the single quantity that falls into the 6–10 tier.

Quantity and usage at end of the periodTotal for graduated tiered pricing
15 USD
525 USD
629 USD
2070 USD
2575 USD

Adding flat fees

You can specify a flat fee (flat_amount) to add to the invoice. This works for both tiers_mode=volume and tiers_mode=graduated. For example, you can have a flat fee that increases when certain usage thresholds are met:

TierAmount (unit cost)Flat fee
1-5 (up_to=5)5 USD (unit_amount=500)10 USD (flat_amount=1000)
6-10 (up_to=10)4 USD (unit_amount=400)20 USD (flat_amount=2000)
10-15 (up_to=15)3 USD (unit_amount=300)30 USD (flat_amount=3000)
15-20 (up_to=20)2 USD (unit_amount=200)40 USD (flat_amount=4000)
20+ (up_to=inf)1 USD (unit_amount=100)50 USD (flat_amount=5000)

In this example, if quantity is 12 and tiers_mode=volume, the total amount to be billed is 12 * 3 USD + 30 USD = 66 USD.

If quantity is 12 and tiers_mode=graduated, the total amount is 5 * 5 USD + 10 USD + 5 * 4 USD + 20 USD + 2 * 3 USD + 30 USD = 111 USD. A tier can have either a unit_amount or a flat_amount, or both, but it must have at least one of the two.

If quantity is 0, the total amount is 10 USD regardless of tiers_mode. We always bill the first flat fee tier when quantity=0. To bill 0 when there’s no usage, set up an up_to=1 tier with an unit_amount equal to the flat fee and omit the flat_amount.

Variable pricing

There are two types of variable pricing models:

  • Inline pricing: You define the price for your customer when you create a subscription, invoice, or Checkout Session.
  • Pay-what-you-want pricing: You let the customer define the price when they select a product or service. You can let customers define their own price for when you use Checkout or Payment Links. To learn more, see Let customers decide what to pay.

Inline pricing

In some cases, you might want to use a custom price that hasn’t been preconfigured. For example, you might want to use inline prices when you manage your product catalog outside of Stripe.

Note

You can only create inline prices through the API. Inline prices aren’t compatible with Payment Links.

To create an inline price use case, pass in price_data instead of a price.id when you create a subscription. For example, to subscribe a customer to a monthly subscription with an inline price:

Command Line
curl https://api.stripe.com/v1/subscriptions \ -u "
sk_test_4eC39HqLyjWDarjtT1zdp7dc
:"
\ -d customer=
{{CUSTOMER_ID}}
\ -d "items[0][price_data][unit_amount]"=5000 \ -d "items[0][price_data][currency]"=usd \ -d "items[0][price_data][product]"=
{{PRODUCT_ID}}
\ -d "items[0][price_data][recurring][interval]"=month

This creates a monthly recurring price of 50 USD for the basic service offering. By default, prices created with price_data are effectively archived (they’re marked as active=false) so that they you can’t reuse them for other customers or subscriptions. You can’t update or reuse inline prices after you create them. You can also use price_data with these APIs:

  • Checkout
  • Invoice Items
  • Subscription Schedules

Pay-what-you-want pricing

You can use this feature to collect a tip for a service provided, accept donations for a cause, or give your customers the option to pay what they want for your product or service. Go to Stripe Support to learn more about Stripe’s requirements for accepting tips or donations.

Pay-what-you-want payments have the following limitations:

  • You can’t add any other line items and the quantity can only be 1.
  • You can’t use promotion codes or discounts with them.
  • They don’t support recurring payments or cross-sells.

Create a product catalog

To create a pay-what-you-want pricing model on Stripe through the Products and Prices APIs:

  1. Create the Fundraising dinner product.
Command Line
curl https://api.stripe.com/v1/products \ -u "
sk_test_4eC39HqLyjWDarjtT1zdp7dc
:"
\ -d name="Fundraising dinner"
  1. Create a price for the customer input. You can optionally specify a preset price, which is the initial amount on the payment page that your customer can update. You can also set a minimum and maximum bound for the price.
Command Line
curl https://api.stripe.com/v1/prices \ -u "
sk_test_4eC39HqLyjWDarjtT1zdp7dc
:"
\ -d currency=usd \ -d "custom_unit_amount[enabled]"=true \ -d product=
{{PRODUCT_ID}}

Create a Checkout Session

To enable customers to change the amount on the payment page, use the price ID when you create a Checkout Session. If you select Customer chooses price as your pricing model, you can’t add any other line items and the quantity can only be 1.

Command Line
curl https://api.stripe.com/v1/checkout/sessions \ -u "
sk_test_4eC39HqLyjWDarjtT1zdp7dc
:"
\ --data-urlencode cancel_url="https://example.com" \ -d "line_items[0][price]"=
{{PRICE_ID}}
\ -d "line_items[0][quantity]"=1 \ -d mode=payment \ --data-urlencode success_url="https://example.com"

Multi-currency prices

A single Price can support multiple currencies. This helps you manage localized pricing when selling internationally.

Create multi-currency Prices

You can create multi-currency Prices in the API or the Dashboard.

From the Product details page for a product in your Dashboard, click on + Add another price to create a new price. The first currency on your Price will be the default currency. Make sure all your Prices have the same default currency. After selecting the default currency, click on + Add more currencies to add currency options to your Price.

You can search and select from supported currencies. Stripe suggests an exchange rate based on currency values at 12:00 PM EST, but you can pick your own. For currencies that are subject to larger fluctuations, we recommend adding more of a buffer.

After you’re done filling in the details, click Add price to save it.

Coupons, Promotion Codes, and Shipping Rates also support multi-currency in a similar way to Prices.

Render multi-currency Prices

To show your customer the price in their currency, you can retrieve the multi-currency Price and view its currency_options.<currency>.unit_amount field. The API response won’t include currency_options by default. To include it in the response, expand the currency_options field:

Command Line
curl -G https://api.stripe.com/v1/prices/{{PRICE_ID}} \ -u "
sk_test_4eC39HqLyjWDarjtT1zdp7dc
:"
\ -d "expand[]"=currency_options

Note

To improve latency and avoid problems with rate-limiting, cache the Price instead of re-fetching it every time a customer visits your site.

Use multi-currency Prices

Each purchase uses one of the multi-currency Price’s supported currencies, depending on how you use the Price in your integration.

Checkout automatically determines the customer’s local currency from their IP address, as long as the Price supports that currency. If the customer’s local currency isn’t supported, Checkout uses the Price’s default currency.

If a Checkout Session uses multiple Prices, Coupons, Promotion Codes, or Shipping Rates, then they must all support the customer’s local currency, or else Checkout uses the default currency. They must all have the same default currency, or else Stripe returns an error when you create the Checkout Session.

Alternatively, you can use the currency parameter to explicitly tell Checkout which currency to use.

Learn more about defining multi-currency prices in Checkout.

Migrate from single-currency Prices to multi-currency

If you have an existing single-currency Price, you can retroactively add multiple currencies to it in the Dashboard.

Note

Only the Stripe Dashboard can retroactively add multiple currencies to an existing Price. The Stripe API doesn’t support retroactively adding multiple currencies. If you’re using the API, create a new multi-currency Price from scratch.

After you add a new currency to a Price, the only way to change it is to archive the existing Price and create a new one. Learn more about managing existing prices.

If you use Checkout or Payment Links, then multi-currency Prices take effect automatically. If Stripe detects that the customer’s local currency is supported by the Price, then it automatically uses that currency. If you use multiple Prices, Coupons, Promotion Codes, or Shipping Rates in a single purchase, then they must all support the customer’s local currency, and they must all have the same default currency.

If you’re creating Subscriptions directly, the multi-currency Price(s) won’t take effect until you start passing the currency parameter. If you don’t pass the currency parameter, the Subscription always uses the Price(s)’ default currency.

Multiple prices

Products can use multiple prices to define different pricing options. The product description is shared between prices and appears the same on the customer’s receipt and invoice—only the pricing differs.

As Togethere’s product matures, they begin offering the same product at different price points. Specifically, certain customers are willing to pay for discounted up-front quarterly and yearly subscriptions. Togethere creates a quarterly 57 USD option:

Command Line
curl https://api.stripe.com/v1/prices \ -u "
sk_test_4eC39HqLyjWDarjtT1zdp7dc
:"
\ -d nickname="Standard Quarterly" \ -d product={{PRODUCT_ID}} \ -d unit_amount=5700 \ -d currency=usd \ -d "recurring[interval]"=month \ -d "recurring[interval_count]"=3 \ -d "recurring[usage_type]"=licensed

And a yearly 220 USD option:

Command Line
curl https://api.stripe.com/v1/prices \ -u "
sk_test_4eC39HqLyjWDarjtT1zdp7dc
:"
\ -d nickname="Standard Yearly" \ -d product={{PRODUCT_ID}} \ -d unit_amount=22000 \ -d currency=usd \ -d "recurring[interval]"=year \ -d "recurring[usage_type]"=licensed

Display pricing information

After creating your pricing structures, you can embed a pricing table on your website to display pricing information to your customers. When customers choose a subscription option, they’re taken directly to checkout. Configure, customize, and update directly in the Dashboard without writing any code.

Was this page helpful?
Need help? Contact Support.
Watch our developer tutorials.
Check out our product changelog.
Questions? Contact Sales.
Powered by Markdoc
You can unsubscribe at any time. Read our privacy policy.
On this page
Flat rate: Good-better-best
Per-seat
Usage-based pricing
Tiered pricing
Variable pricing
Multi-currency prices
Multiple prices
Display pricing information
Stripe Shell
Test mode
Welcome to the Stripe Shell! Stripe Shell is a browser-based shell with the Stripe CLI pre-installed. Log in to your Stripe account and press Control + Backtick (`) on your keyboard to start managing your Stripe resources in test mode. - View supported Stripe commands: - Find webhook events: - Listen for webhook events: - Call Stripe APIs: stripe [api resource] [operation] (e.g., )
The Stripe Shell is best experienced on desktop.
$