Create account
Sign in
Home
Payments
Business operations
Financial services
Developer tools
Security
All products
Home
Payments
Business operations
Home
Payments
Business operations
Financial services
Developer tools
Support
Overview
Overview
Customers
Products and Prices
Tax Rates
Customer portal
Quotes
Start with a use case
Subscriptions with Checkout
Fixed-price subscriptions with Elements
Metered billing with Elements
Per-seat billing with Elements
Manage subscriptions
How subscriptions work
Subscription webhooks
Change subscriptions
Strong Customer Authentication (SCA)
Improved tax support
Invoices API updates
Migrating to Prices
Additional features
Testing
Add payment methods
Bacs Direct Debit in the UK
BECS Direct Debit in Australia
SEPA Direct Debit in the EU
Invoice customers
How invoices work
Create an invoice
Customize invoices
Hosted invoice page
Additional features
Revenue recognition
Overview
Reports
Methodology
Examples
Overrides
Testing
billing
·
HomePaymentsSubscriptions and invoices

Tax Rates

Learn how to collect and report taxes with Tax Rates.

Use Tax Rate objects to apply taxes to invoices and subscriptions and to report the tax amounts you’ve collected. When applying tax rates, Stripe calculates the total tax amount per tax rate, summarizing it in a table of the collected tax rates and amounts, and ultimately, into exported tax summary reports.

Creating tax rates

If you’re working with a small number of tax rates, it’s often simpler to use the Dashboard to create and manage them. After creating tax rates, you can apply them to invoices, subscriptions, and one-time payments or subscriptions created through Stripe Checkout.

You should create a catalog of tax rates that meet the requirements for the jurisdictions that you do business in. For instance, if you operate in Europe, you might want to create a catalog of tax rates for MOSS VAT.

Creating tax rates through the API

The following example demonstrates how you can create a tax rate through the API.

curl Ruby Python PHP Java Node Go .NET
curl https://api.stripe.com/v1/tax_rates \ -u sk_test_4eC39HqLyjWDarjtT1zdp7dc: \ -d display_name="Sales Tax" \ -d inclusive=false \ -d percentage="7.25" \ -d country=US \ -d state=CA \ -d jurisdiction="US - CA" \ -d description="CA Sales Tax"
curl https://api.stripe.com/v1/tax_rates \ -u sk_test_4eC39HqLyjWDarjtT1zdp7dc: \ -d display_name="Sales Tax" \ -d inclusive=false \ -d percentage="7.25" \ -d country=US \ -d state=CA \ -d jurisdiction="US - CA" \ -d description="CA Sales Tax"
# Set your secret key. Remember to switch to your live secret key in production! # See your keys here: https://dashboard.stripe.com/account/apikeys Stripe.api_key = 'sk_test_4eC39HqLyjWDarjtT1zdp7dc' tax_rate = Stripe::TaxRate.create({ display_name: 'Sales Tax', inclusive: false, percentage: 7.25, country: 'US', state: 'CA', jurisdiction: 'US - CA', description: 'CA Sales Tax', })
# Set your secret key. Remember to switch to your live secret key in production! # See your keys here: https://dashboard.stripe.com/account/apikeys Stripe.api_key = 'sk_test_4eC39HqLyjWDarjtT1zdp7dc' tax_rate = Stripe::TaxRate.create({ display_name: 'Sales Tax', inclusive: false, percentage: 7.25, country: 'US', state: 'CA', jurisdiction: 'US - CA', description: 'CA Sales Tax', })
# Set your secret key. Remember to switch to your live secret key in production! # See your keys here: https://dashboard.stripe.com/account/apikeys stripe.api_key = 'sk_test_4eC39HqLyjWDarjtT1zdp7dc' tax_rate = stripe.TaxRate.create( display_name='Sales Tax', inclusive=False, percentage=7.25, country='US', state='CA', jurisdiction='US - CA', description='CA Sales Tax', )
# Set your secret key. Remember to switch to your live secret key in production! # See your keys here: https://dashboard.stripe.com/account/apikeys stripe.api_key = 'sk_test_4eC39HqLyjWDarjtT1zdp7dc' tax_rate = stripe.TaxRate.create( display_name='Sales Tax', inclusive=False, percentage=7.25, country='US', state='CA', jurisdiction='US - CA', description='CA Sales Tax', )
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys \Stripe\Stripe::setApiKey('sk_test_4eC39HqLyjWDarjtT1zdp7dc'); $tax_rate = \Stripe\TaxRate::create([ 'display_name' => 'Sales Tax', 'inclusive' => false, 'percentage' => 7.25, 'country' => 'US', 'state' => 'CA', 'jurisdiction' => 'US - CA', 'description' => 'CA Sales Tax', ]);
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys \Stripe\Stripe::setApiKey('sk_test_4eC39HqLyjWDarjtT1zdp7dc'); $tax_rate = \Stripe\TaxRate::create([ 'display_name' => 'Sales Tax', 'inclusive' => false, 'percentage' => 7.25, 'country' => 'US', 'state' => 'CA', 'jurisdiction' => 'US - CA', 'description' => 'CA Sales Tax', ]);
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys Stripe.apiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"; TaxRateCreateParams params = TaxRateCreateParams.builder() .setDisplayName("Sales Tax") .setInclusive(false) .setPercentage(new BigDecimal("7.25")) .setCountry("US") .setState("CA") .setJurisdiction("US - CA") .setDescription("CA Sales Tax") .build(); TaxRate taxRate = TaxRate.create(params);
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys Stripe.apiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"; TaxRateCreateParams params = TaxRateCreateParams.builder() .setDisplayName("Sales Tax") .setInclusive(false) .setPercentage(new BigDecimal("7.25")) .setCountry("US") .setState("CA") .setJurisdiction("US - CA") .setDescription("CA Sales Tax") .build(); TaxRate taxRate = TaxRate.create(params);
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys const Stripe = require('stripe'); const stripe = Stripe('sk_test_4eC39HqLyjWDarjtT1zdp7dc'); const taxRates = await stripe.taxRates.create({ display_name: 'Sales Tax', inclusive: false, percentage: 7.25, country: 'US', state: 'CA', jurisdiction: 'US - CA', description: 'CA Sales Tax', });
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys const Stripe = require('stripe'); const stripe = Stripe('sk_test_4eC39HqLyjWDarjtT1zdp7dc'); const taxRates = await stripe.taxRates.create({ display_name: 'Sales Tax', inclusive: false, percentage: 7.25, country: 'US', state: 'CA', jurisdiction: 'US - CA', description: 'CA Sales Tax', });
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys stripe.Key = "sk_test_4eC39HqLyjWDarjtT1zdp7dc" params := &stripe.TaxRateParams{ DisplayName: stripe.String("Sales Tax"), Inclusive: stripe.Bool(false), Percentage: stripe.Float64(7.25), Country: stripe.String("US"), State: stripe.String("CA"), Jurisdiction: stripe.String("US - CA"), Description: stripe.String("CA Sales Tax"), } tr, _ := taxrate.New(params)
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys stripe.Key = "sk_test_4eC39HqLyjWDarjtT1zdp7dc" params := &stripe.TaxRateParams{ DisplayName: stripe.String("Sales Tax"), Inclusive: stripe.Bool(false), Percentage: stripe.Float64(7.25), Country: stripe.String("US"), State: stripe.String("CA"), Jurisdiction: stripe.String("US - CA"), Description: stripe.String("CA Sales Tax"), } tr, _ := taxrate.New(params)
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys StripeConfiguration.ApiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"; var options = new TaxRateOptions { DisplayName = "Sales Tax", Inclusive = false, Percentage = 7.25m, Country = "US", State = "CA", Jurisdiction = "US - CA", Description = "CA Sales Tax", }; var service = new TaxRateService(); var taxRate = service.Create(options);
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys StripeConfiguration.ApiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"; var options = new TaxRateOptions { DisplayName = "Sales Tax", Inclusive = false, Percentage = 7.25m, Country = "US", State = "CA", Jurisdiction = "US - CA", Description = "CA Sales Tax", }; var service = new TaxRateService(); var taxRate = service.Create(options);

Required properties:

  • The display_name appears on your customer’s invoice, and is usually a short-name that describes the specific type of tax, such as Sales, VAT, or GST.
  • The inclusive property determines whether the tax percentage is either added to, or included in, the overall amount.
  • The percentage is a number (up to 4 decimal places) that represents the tax percentage to be collected.

Optional properties:

  • The optional country property is a valid two-letter ISO country code. Some countries (e.g., United States) require an additional two-letter state property. Use these properties to apply dynamic tax rates based on your customer’s billing or shipping address in Checkout Sessions.

  • The optional jurisdiction property represents the tax jurisdiction of the tax rate and can be used to differentiate between tax rates of the same percentage. jurisdiction appears on your customer’s invoice. In the Dashboard, jurisdiction appears as the tax rate’s Region label.
  • You can also store additional details in the description. This property is not exposed to your customers.

The percentage, country, and state properties are immutable and can only be set when you create the tax rate. This is to ensure existing subscriptions and invoices using tax rates are not affected. If you need to update these properties, create a new tax rate and archive the old object.

Inclusive vs exclusive Tax

Tax rates can either be exclusive or inclusive. An exclusive tax is not included in the invoice subtotal, whereas an inclusive tax is.

The following table illustrates a 25% tax rate modifying the total amount due, depending on whether it’s exclusive or inclusive.

Tax Subtotal Tax due Total
25% Exclusive $5.00 $1.25 $6.25 ($5.00 + $1.25)
25% Inclusive $5.00 $1.00 (already included in the total) $5.00 ($4.00 + $1.00)

Tax Exempt and Reverse Charge

A Customer’s exemption status can be set to either exempt or reverse.

In both cases, no tax will be calculated on the invoice.

In the case where the customer is liable for the tax (i.e. under the reverse-charge procedure within EU VAT), set the exemption status to reverse. The invoice and receipt PDF includes the text “Reverse charge”.

If a one time payment is performed via Checkout, the exemption status will instead be captured as customer_details in the Checkout Session object.

Using multiple tax rates

Tax rates can be applied to line items, or set as a default for all line items within an invoice. Up to five tax rates can be set per line item. When tax rates are set on both a line item and the invoice, the invoice’s rates do not apply to that line item.

For example, this invoice has two overall tax rate of 9.975% and 5%:

Invoice Item tax rate Overall invoice tax rate Item tax rate (Effective)
Line item 1 (none) 9.975% and 5% 9.975% and 5%
Line item 2 10% 9.975% and 5% 10%
Line item 3 1% and 2% 9.975% and 5% 1% and 2%

Tax amounts

When tax rates are applied to an invoice, they are aggregated into the total_tax_amounts attribute. This attribute represents the sum of all tax amounts, per tax rate, over the entire invoice.

For example, here is an invoice where two line items have two different rates:

Invoice Amount Tax Rate Tax Amount Totals
Line item 1 $5.00 5% (excl) $0.25  
Line item 2 $10.00 10% (excl) $1.00  
Total Tax Amount     $1.25  
Total $15.00     $16.25

Rounding

When determining tax amounts, Stripe rounds at the invoice item level to the smallest currency unit before summing across the entire invoice.

Name Amount Tax Rate Tax Amount
(before rounding)
Tax Amount
(after rounding)
Totals
Line Item 1 $0.43 15% $0.0645 $0.06  
Line Item 2 $4.84 15% $0.7265 $0.73  
Total Tax Amounts       $0.79  
Subtotal $5.27        
Total         $6.06

Discounts

Discounts are usually applied before tax. However, this is occasionally not the case.

Reading each line left-to-right, noting the formula applied (in the table header), you can trace the values as they’re applied to the final, total amount.

Exclusive tax discount example

Stripe always applies discounts before exclusive tax.

This example shows how discounts are applied to an exclusive tax rate.

Invoice Item Amount Discount % Discount $ Post Discount Tax Rate Tax $ Total
Formula — — Amount * Discount Amount - Discount$ — PostDiscount * TaxRate PostDiscount + Tax$
Line item 1 $5.00 10% $0.50 $4.50 5% exl. $0.23 $4.73
Line item 2 $10.00 10% $1.00 $9.00 5% exl. $0.45 $9.45
Total $15.00   $1.50 $13.50   $0.68 (@ 5% exl.) $14.18

Inclusive tax discount example

When tax rates are inclusive, discounts are applied to the original amount first. Then, taxes are calculated based on the remaining amount. This reduction has the side effect of reducing the tax amount due.

Invoice Item Amount Discount % Discount $ Post Discount Tax Rate Tax $ (Included) Total
Formula — — Amount * Discount% Amount - Discount$ — PostDiscount - PostDiscount / (1 + TaxRate) PostDiscount
Line item 1 $5.00 10% $0.50 $4.50 5% incl. $0.21 $4.50
Line item 2 $10.00 10% $1.00 $9.00 5% incl. $0.43 $9.00
Total $15.00 — $1.50 $13.50 — $0.64 (@ 5% incl.) $13.50

Both inclusive and exclusive tax with discount example

In the case where you have both inclusive and exclusive tax, the two rules apply together in the following steps for every line item:

  1. The inclusive tax amount is calculated based off the post-discounted amount by multiplying by the inclusive tax rate.
  2. The exclusive tax amount is calculated by multiplying the exclusive tax rate by the post-discounted amount less the inclusive tax amount.
  3. The total amount due is calculated by summing the post-discounted amount and the exclusive tax amount (calculated in step 2).
Invoice Item Amount Discount % Discount $ Post Discount Inclusive Tax Rate Inclusive Tax $ Post Discount, Less Incl. Tax Exclusive Tax Rate Exclusive Tax $ Total
Formula — — Amount * Discount% Amount - Discount$ — PostDiscount - PostDiscount / (1 + TaxRate) PostDiscount - InclusiveTax$ — PostDiscLessIncTax * TaxRate PostDiscount + ExclTax$
Line item 1 $5.00 10% $0.50 $4.50 5% incl. $0.21 $4.29 7% excl. $0.30 $4.80
Line item 2 $10.00 10% $1.00 $9.00 5% incl. $0.43 $8.57 7% excl. $0.60 $9.60
Total $15.00 — $1.50 $13.50 — $0.64 (@ 5% incl.) $12.86 — $0.90 (@ 7% excl.) $14.40

Tax reporting and remittance

Any business collecting taxes will ultimately need to remit tax to the appropriate government.

You can use Stripe’s data exports to populate the periodic reports that you are required to make to taxation authorities.

Data exports

From the Dashboard’s Tax Rates list page, you can export data files required for tax reporting calculations.

Stripe Billing provides two different levels of tax report export files:

  • Invoice line item tax export — A lower-level export, this includes details down to the line item level, including per-line-item tax rates, inclusive/exclusive, amounts, etc.
  • Invoice totals export — Shows the aggregate tax collected on the invoice as a whole, including adjustments for any refunds.

For remittance reporting, use the line-item tax export to sum all amounts paid for all tax rates used. To factor in any refunds you will also need to pivot against the Invoice totals export.

Was this page helpful?
Questions? Contact us.
Developer tutorials on YouTube.
You can unsubscribe at any time. Read our privacy policy.
On this page
Creating tax rates
Inclusive vs exclusive Tax
Tax Exempt and Reverse Charge
Using multiple tax rates
Tax amounts
Rounding
Discounts
Tax reporting and remittance