# Tax in-person sales at a specific location Specify where a sale or service takes place to calculate tax at that location. Many jurisdictions require you to calculate tax for in-person sales of physical goods or services at the location of the sale instead of your business address or the customer’s billing address. By default, each tax code’s default sourcing rule determines the location Stripe uses to calculate tax. You can provide an optional `performance_location` ID on individual line items so Stripe Tax assesses tax for that item at the location address instead of using the sourcing rule. You must still provide your business address and the customer’s address for [reverse-charge determination](https://docs.stripe.com/tax/zero-tax.md#reverse-charges). You can specify optional performance locations through the Tax Calculations API, Checkout Sessions, and Payment Intents. The public preview doesn’t support setting performance locations through the Dashboard. > #### Ticket sales > > Sales for tickets or admission to events require the performance location. See [Tax ticket sales based on event location](https://docs.stripe.com/tax/tax-for-tickets/integration-guide.md) for guidance and relevant product tax codes. ## Eligible tax codes You can apply a performance location to any line item whose tax code has a `performance_location` requirement of `optional`. Common examples include: - `txcd_20030000`: General - Services - `txcd_99999999`: General - Physical Goods - `txcd_50021003`: Fee for Personal Training/Fitness Classes - `txcd_20060044`: Training > Electronic services and digital goods (streaming, software downloads, SaaS) don’t support performance locations. Including `performance_location` on a tax code with requirement `not_allowed` returns an error. See [Product tax codes](https://docs.stripe.com/tax/tax-codes.md) for the complete list with the `performance_location` requirement column. ## Set up Stripe Tax [Set up Stripe Tax](https://docs.stripe.com/tax/set-up.md) and add a registration for the location where you sell. Add a registration using the Dashboard or the Tax [Registrations API](https://docs.stripe.com/tax/registrations-api.md). #### Dashboard 1. From the [tax locations page](https://dashboard.stripe.com/tax/locations) in the Dashboard, click **Add registration**. 2. Add the registrations applicable for the sale location. For example: - United States - California, Sales Tax - United States - California, San Francisco Gross Receipts Tax #### Registrations API See the list of [all supported registration types and jurisdictions](https://docs.stripe.com/tax/registering.md?registrationTypeRegion=united-states#registration-types). ```curl curl https://api.stripe.com/v1/tax/registrations \ -u "<>:" \ -H "Stripe-Version: 2025-05-28.basil" \ -d country=US \ -d "country_options[us][state]"=CA \ -d "country_options[us][type]"=state_sales_tax \ -d active_from=now ``` Stripe Tax calculations don’t incur fees in a *sandbox* (A sandbox is an isolated test environment that allows you to test Stripe functionality in your account without affecting your live integration. Use sandboxes to safely experiment with new features and changes) environment. After you add a tax registration, calculating tax in live mode incurs a fee. ## Create a performance location [Create a tax location](https://docs.stripe.com/api/tax/location/create.md) of type `performance` and specify the address where the sale takes place. The address must be in a country supported by Stripe Tax where the sales type is **All Sales**. See [Supported countries](https://docs.stripe.com/tax/supported-countries.md) for address format requirements. ```curl curl https://api.stripe.com/v1/tax/locations \ -u "<>:" \ -H "Stripe-Version: 2025-05-28.basil" \ -d type=performance \ -d "address[line1]=1 Market St" \ -d "address[city]=San Francisco" \ -d "address[state]=CA" \ -d "address[postal_code]=94105" \ -d "address[country]=US" \ -d "description=Main Street store" ``` The response returns the `id` as a unique identifier for the performance location. Store this value for use in transactions where you [calculate tax](https://docs.stripe.com/tax/optional-tax-location/integration-guide.md#calculate-tax) for sales in this location. ```json { "id": "taxloc_yB7b4tVHRb", // ... other fields omitted } ``` A database entry for this example might be: | **id** | **name** | **address** | **stripe\_location\_id** | | --- | --- | --- | --- | | `` | Main Street store | 1 Market St, San Francisco, CA 94105 | `taxloc_yB7b4tVHRb` | Table: your_business.locations ### Location address validation errors If you have a problem with the address of the tax location, the Tax Location API returns an error. ``` { "error": { "message": "MESSAGE", "param": "address", "request_log_url": "https://dashboard.stripe.com/test/logs/req_eSIK4gvAqUmW26?t=1747141000", "type": "invalid_request_error" } } ``` - The `param` property identifies the most specific address attribute possible. - The `message` property specifies one of the following specific reasons for the error. #### Invalid address `The address is not supported by Stripe Tax for a tax location. Please use a valid address.` The address validation failed, see [supported address formats](https://docs.stripe.com/tax/customer-locations.md#supported-formats) for address requirements. #### Unsupported country or excluded territory `The address is not supported by Stripe Tax for a tax location. Please use a location that is supported by Stripe Tax.` The country isn’t [supported](https://docs.stripe.com/tax/supported-countries.md) or the address is in an [excluded territory](https://docs.stripe.com/tax/zero-tax.md#excluded-territories). Create one location per site and reuse it across transactions. ## Optional: Create a product Pass `tax_details.tax_code` and `tax_details.performance_location` when you create a product. Associating performance locations with products in the Dashboard is only supported for event and ticket tax codes. Use the API for all other tax codes. ```curl curl https://api.stripe.com/v1/products \ -u "<>:" \ -H "Stripe-Version: 2025-05-28.basil" \ -d "name=Pet training session" \ -d "tax_details[tax_code]=txcd_20030005" \ -d "tax_details[performance_location]=taxloc_yB7b4tVHRb" ``` ### Errors You might encounter the following errors when creating a product with a tax code and a performance location. | Error | Description | Suggestion | | --- | --- | --- | | `Unknown tax location being passed. Please use a valid tax location.` | The performance location ID doesn’t belong to a performance location accessible by the Stripe account. You must create separate performance locations for each connected account and the platform account. | If you’re making API calls as a Connect platform on behalf of a connected account, make sure you created the performance location for the connected account rather than your platform. | | `The tax code `txcd_50010001` requires you to specify a `performance_location`.` | The request is missing the [performance location](https://docs.stripe.com/tax/optional-tax-location/integration-guide.md#create-performance-location) parameter required by the provided product tax code. This error occurs for tax codes where `performance_location` is `required`. | Either change the product tax code or include the performance location. | | `Tax code txcd_10000000 does not support a tax location with the type `performance`.` | You included a performance location in your request, but the product tax code you passed doesn’t support a performance location. | Either change the product tax code or remove the performance location. | ## Calculate tax Call [Create a tax calculation](https://docs.stripe.com/api/tax/calculations/create.md) and pass the `performance_location` ID on each eligible line item. Stripe Tax assesses tax on that item at the specified address. ```curl curl https://api.stripe.com/v1/tax/calculations \ -u "<>:" \ -H "Stripe-Version: 2025-05-28.basil" \ -d currency=usd \ -d "line_items[0][amount]=2500" \ -d "line_items[0][reference]=Pet training session" \ -d "line_items[0][tax_behavior]=exclusive" \ -d "line_items[0][tax_code]=txcd_20030005" \ -d "line_items[0][performance_location]=taxloc_yB7b4tVHRb" \ -d "customer_details[address][country]=IE" \ -d "customer_details[address_source]=billing" ``` The example overrides the rules for the `txcd_20030005` (Pet Services — Obedience Training) tax code. Even though the customer is based in Ireland, Stripe Tax calculates the tax based on the address in the performance location, not the customer’s country. ## Optional: Mixed carts A single tax calculation can include a mix of line items: some with a `performance_location`, some without. Line items without a performance location follow the standard origin or destination sourcing rules for their tax code. For example, a customer purchasing a pet training session at a local store and a digital service in the same transaction is taxed differently: - **Pet training session** (`txcd_20030005`, with `performance_location`): Taxed at the training location’s physical address. - **Digital service** (`txcd_10000000`, without `performance_location`): Taxed at the customer’s address using the default sourcing rule for that tax code. ```curl curl https://api.stripe.com/v1/tax/calculations \ -u "<>:" \ -H "Stripe-Version: 2025-05-28.basil" \ -d currency=usd \ -d "line_items[0][amount]=2500" \ -d "line_items[0][reference]=Pet training session" \ -d "line_items[0][tax_behavior]=exclusive" \ -d "line_items[0][tax_code]=txcd_20030005" \ -d "line_items[0][performance_location]=taxloc_yB7b4tVHRb" \ -d "line_items[1][amount]=1000" \ -d "line_items[1][reference]=Online consultation" \ -d "line_items[1][tax_behavior]=exclusive" \ -d "line_items[1][tax_code]=txcd_10000000" \ -d "customer_details[address][state]=IL" \ -d "customer_details[address][postal_code]=60601" \ -d "customer_details[address][country]=US" \ -d "customer_details[address_source]=billing" ``` ## Platforms and marketplaces If you use [Stripe Connect](https://docs.stripe.com/connect.md) to process payments on behalf of connected accounts, [determine which entity is liable for collecting and reporting taxes](https://docs.stripe.com/tax/connect.md). Depending on your business model, it’s either your platform or your connected accounts. | | [Software platforms](https://docs.stripe.com/tax/tax-for-platforms.md) | [Marketplaces](https://docs.stripe.com/tax/tax-for-marketplaces.md) | | --- | --- | --- | | Who is liable for tax | Your connected accounts | Your marketplace | | How to integrate | Follow this guide with the following exceptions: - Pass the connected account’s ID in the [Stripe-Account header](https://docs.stripe.com/connect/authentication.md#stripe-account-header) for all API requests. - Create separate tax registrations for each connected account and your platform account. You can’t use registrations across accounts. - Create separate locations for each connected account and your platform account. You can’t use performance location IDs across accounts. - Create products for each connected account individually. Use performance location IDs for the corresponding connected account. | Follow this guide using your marketplace’s account. [Withhold the collected tax amount](https://docs.stripe.com/tax/tax-for-marketplaces.md#tax-withholding) from payouts to connected accounts. | | Tax settings and registrations | Each connected account configures its own tax settings and registrations. | Your marketplace configures tax settings and registrations. Connected accounts don’t need their own. | | Performance locations and products | Create separate performance locations and products for each connected account. Use the `Stripe-Account` header. | Create performance locations and products on your marketplace account. | ## Test your integration [Testing Stripe Tax](https://docs.stripe.com/tax/testing.md) provides general guidance, but verify the following specific scenarios for performance locations: - **US cross-state**: Confirm that a sale for service in a different US state than your business address calculates tax at the location’s state rates. - **EU reverse charge**: Confirm that a reverse charge for an event in an EU member country to a customer in another EU country uses the customer’s address. - **Mixed cart**: Confirm that tax calculates line items in a single order with different `performance_location` settings or no performance location use the correct location rates for each. ## See also - [Tax Calculations API](https://docs.stripe.com/api/tax/calculations.md) - [Supported countries](https://docs.stripe.com/tax/supported-countries.md) - [Platforms and marketplaces](https://docs.stripe.com/tax/connect.md)