Tax Rates

    Learn how to collect and report taxes with Tax Rates.

    Use Tax Rate objects to apply tax to invoices, and report on the amounts of tax you’ve collected.

    When applied to Invoices—either on a per-line-item or invoice basis—Stripe calculates the total tax amount per tax rate, summarizing 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 and subscriptions.

    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 via the API.

    curl https://api.stripe.com/v1/tax_rates \
      -u sk_test_4eC39HqLyjWDarjtT1zdp7dc: \
      -d display_name="Sales Tax" \
      -d description="SF Sales Tax" \
      -d jurisdiction="CA - SF" \
      -d percentage="8.5" \
      -d inclusive=false
    
    # Set your secret key: remember to change this 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',
      description: 'SF Sales Tax',
      jurisdiction: 'CA - SF',
      percentage: 8.5,
      inclusive: false,
    })
    
    # Set your secret key: remember to change this 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',
      description='SF Sales Tax',
      jurisdiction='CA - SF',
      percentage=8.5,
      inclusive=false,
    )
    
    // Set your secret key: remember to change this 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',
      'description' => 'SF Sales Tax',
      'jurisdiction' => 'CA - SF',
      'percentage' => 8.5,
      'inclusive' => false,
    ]);
    
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    Stripe.apiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc";
    
    Map<String, Object> params = new HashMap<String, Object>();
    params.put("display_name", "Sales Tax");
    params.put("description", "SF Sales Tax");
    params.put("jurisdiction", "CA - SF");
    params.put("percentage", 8.5);
    params.put("inclusive", false);
    TaxRate tax_rate = TaxRate.create(params);
    
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    const stripe = require('stripe')('sk_test_4eC39HqLyjWDarjtT1zdp7dc');
    
    stripe.taxRates.create({
      display_name: 'Sales Tax',
      description: 'SF Sales Tax',
      jurisdiction: 'CA - SF',
      percentage: 8.5,
      inclusive: false,
    }, function(err, taxRate) {
      // asynchronously called
    });
    
    // Set your secret key: remember to change this 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"),
      Description: stripe.String("SF Sales Tax"),
      Jurisdiction: stripe.String("CA - SF"),
      Percentage: stripe.Float64(8.5),
      Inclusive: stripe.Bool(false),
    }
    tr, err := taxRate.New(params)
    
    // Set your secret key: remember to change this 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",
      Description = "SF Sales Tax",
      Jurisdiction = "CA - SF",
      Percentage = 8.5,
      Inclusive = false,
    };
    var service = new TaxRateService();
    var taxRate = service.Create(options);
    

    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 percentage is a number (up to 4 decimal places) that represents the tax percentage to be collected.

    The inclusive property determines whether the tax percent is either added to, or included in, the overall amount.

    Stripe allows you to store additional details such as description and jurisdiction. Use these fields to differentiate between tax rates of the same percent. They are not exposed to your customers.

    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”.

    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

    Inclusive tax discount example

    When tax rates are inclusive, discounts are applied to the pre-tax value. 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 * TaxRate Amount - Discount$ Amount - Amount / (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

    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 * TaxRate% Amount - Discount$ Amount - Amount / (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

    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:

    • 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 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 export.

    Was this page helpful? Yes No

    Send

    Thank you for helping improve Stripe's documentation. If you need help or have any questions, please consider contacting support.

    Questions?

    We're always happy to help with code or other questions you might have. Search our documentation, contact support, or connect with our sales team. You can also chat live with other developers in #stripe on freenode.

    On this page