# Tax exemptions Apply tax exemptions to specific US states, Canadian provinces, or countries for a customer. > [Log in](https://dashboard.stripe.com/settings/tax) or [sign up](https://dashboard.stripe.com/register) for Stripe to enable Stripe Tax. Tax exemptions let you attach one or more exemptions to a customer in the Dashboard, each scoped to a jurisdiction and date range. Stripe Tax automatically applies or removes tax per transaction depending on whether an active exemption covers that transaction’s tax jurisdiction. ### Request early access to tax exemptions Tax exemptions are in private preview. Register your interest and we'll follow up to confirm if you're eligible. ```bash curl https://docs.stripe.com/preview/register \ -X POST \ -H "Content-Type: application/json" \ -H "Referer: https://docs.stripe.com/tax/exemptions" \ -d '{"email": "EMAIL", "preview": "stripe_tax_exemptions_preview"}' ``` ## Before you begin - [Activate Stripe Tax](https://docs.stripe.com/tax/set-up.md) on your account. - Set the customer’s **Tax status** to **Taxable**. If **Tax status** is set to **Exempt** or **Reverse charge**, that global setting takes full precedence over any exemptions you’ve added. See [Interact with the global tax status](https://docs.stripe.com/tax/exemptions.md#interact-with-the-global-tax-status). ## How it works When you add an exemption to a customer, Stripe Tax uses it during calculation as follows: 1. Stripe loads all active exemptions for the customer. 2. Stripe matches those exemptions against the jurisdiction where tax is owed. 3. If a matching active exemption exists, Stripe applies zero tax for that jurisdiction and sets `taxability_reason` to `customer_exempt`. 4. Stripe taxes transactions for jurisdictions without a matching exemption normally. ## Supported locations | Region | Granularity | Notes | | --- | --- | --- | | United States | State level | A state-level exemption applies to all local jurisdictions within that state, including home rule jurisdictions. | | Canada | Province and tax type | Exemptions can be applied on two levels: for federal GST/HST for all Canadian provinces, and for each of the provincial taxes. See [Add Canada exemptions](https://docs.stripe.com/tax/exemptions.md#add-canada-exemptions). | | Other countries | Country level | One entry covers all transactions in that country. | ## Add an exemption 1. In the Dashboard, open the customer’s detail page. 2. In the **Tax information** section, find the **Exemptions** subsection and click **Add an exemption**. 3. Select a **Country** from the dropdown. - For the United States, select the applicable **State**. - For Canada, select the applicable **Province**. Or, to exempt GST and HST across all Canadian provinces, select **Canada GST and HST**. 4. Optionally set the date range: - **Start date**: If left blank, the exemption starts immediately. Set a future date to schedule the exemption. - **End date**: Set a date if the exemption expires. Leave blank for no expiration. 5. Click **Save**. The exemption appears in the customer’s **Exemptions** list. You can add as many exemptions as needed for different locations. If the customer’s global **Tax status** is set to **Exempt** or **Reverse charge**, a warning appears. Set **Tax status** to **Taxable** first for exemptions to take effect. ## Manage exemptions ### View exemptions In the **Tax information** section of the customer’s detail page, you can see all active and expired exemptions. Each row shows the location, start date, and end date, or “No end date” if the exemption doesn’t expire. ### Delete an exemption Click the delete icon next to an exemption and confirm. Deletion is permanent, so add the exemption again if you need to reinstate it. ## Add US exemptions Each US exemption is scoped to a single state. A state-level exemption applies to all local jurisdictions within that state, including home rule jurisdictions such as cities in Colorado that administer their own local sales tax. ## Add Canada exemptions The Canadian tax system consists of a combination of federal (GST/HST) and provincial (PST, QST, or RST) taxes. An exemption for the federal GST and HST applies to sales in all provinces, but an exemption for a provincial tax only applies to that tax in that province. ### Understand GST and HST cross-province behavior GST and HST both represent the federal component of Canadian tax. HST is the combined federal and provincial rate used in participating provinces. Because of this, an active GST or HST exemption for any province also exempts the GST or HST component in every other province. To exempt a customer from GST and HST tax across all provinces, add a **Canada GST and HST** exemption. To exempt a customer from provincial tax in a single province, add an exemption for that province. ## Add multiple exemptions and overlapping date ranges You can add multiple exemptions to the same customer. These can be across different locations, or for the same location with different date ranges. This covers common scenarios: - **Annual exemption renewals**: A customer’s 2026 exemption expires December 31. You receive confirmation of their 2027 exemption in November. Add it with a January 1, 2027 start date. The two exemptions can overlap. - **Replacement exemptions**: A customer receives a new tax exemption mid-year. Add it immediately. It can run concurrently with the existing one. Two exemptions for the same location with the same start and end date count as an exact duplicate and can’t be added. ## Interact with the global tax status When you set a customer’s global tax status in the Dashboard, Stripe Tax uses that customer’s tax status globally by default, so a customer is either taxable, fully exempt, or subject to reverse charge everywhere. The customer’s **Tax status** controls a global override that takes precedence over all exemptions: | Customer Tax status | Exemptions present | Result | | --- | --- | --- | | Taxable | None | Tax calculated normally | | Taxable | Active exemptions | Exemptions applied | | Exempt | Any | Customer is exempt on all transactions | | Reverse charge | Any | Reverse charge on all transactions | Set the customer’s **Tax status** to **Taxable** in the **Tax information** section to activate behavior. ## Exemptions and customizations If you use [Stripe Tax customizations](https://docs.stripe.com/tax/tax-customizations.md) to set custom tax rates, exemptions take precedence. A customer with an active exemption in a jurisdiction receives zero tax for that jurisdiction even if a custom rate is configured. ## Unsupported scenarios The following scenarios aren’t supported: - **Local jurisdiction exemptions**: You can’t scope an exemption to a specific city or county within a state, such as Chicago within Illinois. A state exemption applies to the entire state including all locals. - **Exemption types**: You can’t record the category of an exemption, such as resale, government, or nonprofit. - **Exemption document management**: You can’t upload, store, or validate exemption documentation in Stripe Tax. - **Reduced-rate exemptions**: You can’t apply a partial reduction in tax rate. Exemptions always result in zero tax for the covered jurisdiction. - **Reverse charge per jurisdiction**: You can’t set a reverse charge for a single jurisdiction. Collect your customer’s tax ID or use the global **Reverse charge** tax status. See [Zero tax and reverse charges](https://docs.stripe.com/tax/zero-tax.md#reverse-charges). ## Test with the Tax Calculations API If you use the [Tax Calculations API](https://docs.stripe.com/tax/standalone-tax-api.md), exemptions apply automatically when you pass a `customer` ID — you don’t need any additional parameters. Stripe loads the customer’s active exemptions and factors them into the calculation. The example below creates a calculation for a customer. If that customer has an active exemption covering the transaction’s situs, the line item returns zero tax with `taxability_reason: "customer_exempt"`. If no exemption applies, Stripe taxes the transaction normally. ```curl curl https://api.stripe.com/v1/tax/calculations \ -u "<>:" \ -d currency=eur \ -d "customer={{CUSTOMER_ID}}" \ -d "line_items[0][amount]=1000" \ -d "line_items[0][quantity]=1" \ -d "line_items[0][reference]=line item 1" \ -d "line_items[0][tax_behavior]=exclusive" \ -d "line_items[0][tax_code]=txcd_10000000" ``` When an exemption applies, the line item returns zero tax and `taxability_reason` is `customer_exempt`: ```json { "object": "tax.calculation", "currency": "eur", "tax_amount_exclusive": 0, "line_items": { "data": [{ "reference": "line item 1", "amount": 1000, "tax_amount": 0, "tax_breakdown": [{ "taxability_reason": "customer_exempt", "tax_rate_details": null, "amount": 0 }] }] } } ``` When no exemption applies, Stripe taxes the transaction at the rate for the transaction’s jurisdiction: ```json { "object": "tax.calculation", "currency": "eur", "tax_amount_exclusive": 210, "line_items": { "data": [{ "reference": "line item 1", "amount": 1000, "tax_amount": 210, "tax_breakdown": [{ "taxability_reason": "standard_rated", "tax_rate_details": { "percentage_decimal": "21.0", "tax_type": "vat" }, "amount": 210 }] }] } } ``` The customer’s shipping or billing address is one of the factors that determines the situs. Stripe matches that situs against the customer’s active exemptions, so the same customer can return exempt on one transaction and taxable on another depending on where each transaction ships. ## Use with Invoices, Subscriptions, and Checkout Sessions Exemptions apply automatically to Invoices, Subscriptions, and Checkout Sessions when you pass a `customer` ID. Pass `customer` as a reference to an existing Customer object (not as inline `customer_details` or `customer_email`), so Stripe can load the customer’s active exemptions. Enable `automatic_tax` as you would for any automatic tax integration. No additional parameters are required. ### Invoices ```curl curl https://api.stripe.com/v1/invoices \ -u "<>:" \ -d "customer={{CUSTOMER_ID}}" \ -d "automatic_tax[enabled]=true" ``` ### Subscriptions ```curl curl https://api.stripe.com/v1/subscriptions \ -u "<>:" \ -d "customer={{CUSTOMER_ID}}" \ -d "items[0][price]={{PRICE_ID}}" \ -d "automatic_tax[enabled]=true" ``` Stripe evaluates the customer’s active exemptions on each invoice generated by the subscription. If an exemption expires between billing cycles, the next invoice taxes the customer normally for that jurisdiction. ### Checkout Sessions ```curl curl https://api.stripe.com/v1/checkout/sessions \ -u "<>:" \ -d "customer={{CUSTOMER_ID}}" \ -d "line_items[0][price]={{PRICE_ID}}" \ -d "line_items[0][quantity]=1" \ -d mode=payment \ -d "automatic_tax[enabled]=true" \ --data-urlencode "success_url=https://example.com/success" ``` In all three cases, when an active exemption covers the transaction’s situs, Stripe applies zero tax with `taxability_reason: "customer_exempt"`. The field is exposed at a different path depending on the Stripe product: - **Invoice**: `lines.data[].taxes[].taxability_reason` - **Subscription**: on each generated invoice at `lines.data[].taxes[].taxability_reason` - **Checkout Session**: `line_items.data[].taxes[].taxability_reason`, available when the session is expanded with `?expand[]=line_items.data.taxes` ## See also - [Zero tax amounts and reverse charges](https://docs.stripe.com/tax/zero-tax.md) - [Determine customer locations](https://docs.stripe.com/tax/customer-locations.md) - [Set up Stripe Tax](https://docs.stripe.com/tax/set-up.md) - [Tax customizations](https://docs.stripe.com/tax/tax-customizations.md)