Adaptive Pricing and Stripe Tax
Learn how tax is calculated and reported when using Adaptive Pricing.
When you use Adaptive Pricing, all tax calculation, tax reporting, and invoicing remain in your integration currency before any currency conversion. Your customer can pay in their local currency, but this doesn’t change your reporting.
Note
This guide explains how Stripe Tax handles indirect taxes (such as VAT and sales tax) with Adaptive Pricing. It doesn’t explain 1099-K reporting.
How tax is calculated with Adaptive Pricing
Adaptive Pricing converts your product prices into your customer’s local currency at checkout. Stripe Tax calculates tax on the original price you set, not the converted amount. Here’s the flow:
- You create a product with a price in a specific integration currency (for example, 100 USD).
- Stripe Tax calculates tax on the original price you set (100 USD).
- The price and tax amount are converted to the customer’s local currency for display purposes.
- The customer can pay in their local currency, or in your original integration currency .
For indirect tax purposes, Stripe Tax treats the conversion fee as a non-taxable currency conversion cost, so it isn’t included in the taxable amount.
Examples
The following examples show how tax is calculated for a product priced at 100 USD by a business based in New York, purchased by a customer in Germany who sees the price in EUR through Adaptive Pricing. All examples use a conversion rate of 1 USD to 0.9476 EUR for amounts presented to the customer (Stripe’s conversion fee is included in this rate) and an exchange rate of 1 USD to 0.92 EUR for tax filing calculations.
Taxed at the customer’s destination
When the sale is taxable at the customer’s destination (Germany in this example), the filing currency in the tax reports is determined by the destination jurisdiction. In this example, German VAT at 19% applies and the filing currency in the tax reports is EUR.
In this example, the USD Price has tax-exclusive behavior. German VAT at 19% is added on top of the product price.
| Value | |
|---|---|
| Product price | 100 USD |
| Presentment price (via Adaptive Pricing) | 94.76 EUR (100 x 0.9476) |
| Taxable amount | 100 USD |
| VAT rate (Germany) | 19% |
| Tax amount | 19 USD |
| Tax in presentment currency | 17.90 EUR (19 x 0.9476) |
| Total customer pays | 112.66 EUR (product + tax in EUR) |
| Tax report, currency | USD |
| Tax report, tax amount | 19 USD |
| Tax report, filing currency | EUR |
| Filing tax amount | 17.48 EUR (19 x 0.92) |
In both cases, the tax report records the tax amount in USD (the currency on the Price) with a filing currency in the tax reports of EUR (the destination jurisdiction’s currency).
The filing tax amount in EUR differs from the tax amount expressed in the presentment currency, even though both are in EUR. For VAT reporting, the USD tax amount must be converted to the destination currency using exchange rates from the local tax authority or the European Central Bank (not the rate used for customer presentment).
Taxed at the business’s location
When the sale is taxable at the business’s location (New York in this example), the filing currency in the tax reports matches the business’s jurisdiction. In this example, New York sales tax at 4% applies and the filing currency in the tax reports is USD, the same as the currency on the Price. The customer still sees the price in EUR through Adaptive Pricing, but the filing currency and filing amount don’t involve a currency conversion.
In this example, the USD Price has tax-exclusive behavior. New York sales tax at 4% is added on top of the product price.
| Value | |
|---|---|
| Product price | 100 USD |
| Presentment price (with Adaptive Pricing) | 94.76 EUR (100 x 0.9476) |
| Taxable amount | 100 USD |
| Sales tax rate (New York) | 4% |
| Tax amount | 4 USD |
| Tax in presentment currency | 3.79 EUR (4 x 0.9476) |
| Total customer pays | 98.55 EUR (product + tax in EUR) |
| Tax report, currency | USD |
| Tax report, tax amount | 4 USD |
| Tax report, filing currency | USD |
| Filing tax amount | 4 USD |
In both cases, the filing currency in the tax reports is USD (the same as the currency on the Price) because the tax is filed in the business’s jurisdiction. No currency conversion is needed for filing, even though the customer paid in EUR.
Tax assessment on the price
Tax is assessed on the price you set for your product because:
- Your product’s price represents the actual sale price of the goods or services.
- Tax liability is determined when the transaction is created, not when payment is received.
- For indirect tax purposes, Stripe Tax treats the conversion fee as a non-taxable currency conversion cost. It compensates for exchange rate fluctuations and isn’t part of the value of the goods or services sold.
Refunds
When you issue a refund for a transaction that used Adaptive Pricing, Stripe Tax calculates the tax reversal based on the Price currency and amount, not the presentment amount the customer paid.
Reconciliation considerations
Because tax is calculated and reported in the currency on the Price, keep the following in mind when reconciling your books:
- Tax reports show amounts in the currency on the Price . If your product is priced in USD, tax amounts appear in USD.
- If you need to reconcile against cash received in the presentment currency, account for the currency conversion between the reported tax amount and the amount collected.
- At scale, small rounding differences can accumulate between the converted tax amount and the amount collected in the presentment currency. These rounding differences are a normal result of currency conversion.
Tax-inclusive and tax-exclusive behavior
If you set the default tax behavior setting to Automatic ( inferred_by_currency in the API), tax calculation is tax-exclusive or tax-inclusive based on your integration currency (the currency of your original Price). This ensures that your revenue margins don’t change based on the currency your customer pays in.
The table below demonstrates this behavior, assuming a 10% tax rate:
| Price | Tax behavior inferred | Price after tax | Adaptive Pricing currency | Customer pays |
|---|---|---|---|---|
| 10 USD | Tax-exclusive | 11 USD | USD | 11 USD |
| 10 USD | Tax-exclusive | 11 USD | EUR | 11 USD converted to EUR |
| 10 EUR | Tax-inclusive | 10 EUR | EUR | 10 EUR |
| 10 EUR | Tax-inclusive | 10 EUR | USD | 10 EUR converted to USD |
If you set defaults.tax_behavior as inferred_by_currency, it applies based on the currency on the Price, not the presentment currency. For example, if your price is in USD and you use the inferred setting, the behavior is determined by your USD configuration, even if the customer pays in EUR.
