Recurring pricing models
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:
Model good-better-best on Stripe
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:
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
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 projects | Price per tier |
---|---|
1-5 | 7 USD |
6-10 | 6.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 period | Total cost |
---|---|
1 | 5 USD |
5 | 25 USD |
6 | 30 USD |
20 | 100 USD |
25 | 125 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:
Tier | Amount (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 haverecurring.usage_type = licensed
. - At the end of the billing period if the
Price
objects haverecurring.usage_type = metered
.
With tiered billing, you:
- Set the
tiers_mode
to eithervolume
orgraduated
. - 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
:
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 period | Total for volume tiered pricing |
---|---|
1 | 5 USD |
5 | 25 USD |
6 | 24 USD |
20 | 40 USD |
25 | 25 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
:
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 period | Total for graduated tiered pricing |
---|---|
1 | 5 USD |
5 | 25 USD |
6 | 29 USD |
20 | 70 USD |
25 | 75 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:
Tier | Amount (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:
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:
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:
- Create the
Fundraising dinner
product.
- 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 aminimum
andmaximum
bound for the price.
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.
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.
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:
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.
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:
And a yearly 220 USD option:
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.