# Tax ticket sales based on event location Integrate Stripe Tax to calculate taxes on admission fees and tickets. When you sell admission to an event (such as a concert, conference, museum visit, or sporting event) VAT and sales tax are based on where the event takes place, not where the customer lives. In the United States, specific local taxes (such as entertainment or amusement taxes) might also apply, in addition to state and local sales tax. Use this guide to automatically calculate taxes on admission fees and tickets. ## Choose your integration Select an integration path that best matches how you want to accept payments with Stripe. If you’re a platform or marketplace using *Connect* (Connect is Stripe's solution for multi-party businesses, such as marketplace or software platforms, to route payments between sellers, customers, and other recipients), see the [platforms and marketplaces](https://docs.stripe.com/tax/tax-for-tickets/integration-guide.md#connect) section to set up tax for tickets. | | [Payment Intent integration](https://docs.stripe.com/tax/payment-intent.md) | [Checkout Session integration](https://docs.stripe.com/tax/custom.md) | [Custom Tax Calculation API integration](https://docs.stripe.com/tax/custom.md) | | ------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- | | Best for | Full control over payment flow with Stripe-managed tax transactions | Low-code, Stripe-hosted checkout with minimal setup | Third-party payment processors or fully custom checkout flows | | Advantages | - Fewer API calls - Automated handling of refunds - Dashboard support, specifically useful for testing - Built-in receipts support | - Fewer API calls - Low-code payment integration, Stripe hosted - Supports subscriptions - Dashboard support, specifically useful for testing | - Fully control the checkout flow - Supports other payment providers, such as PayPal | | Disadvantages | - Preview feature might require SDK update - Limited support for other payment providers, such as PayPal | - Preview feature might require SDK update - Less control over UI and UX - More rigid, might not fit your specific use case | - Refunds require custom implementation - Limited Dashboard support - Testing requires API - No automatic receipt generation | ## Update the Stripe SDK Tax calculation for events is in private preview and requires [a private preview API version](https://docs.stripe.com/sdks/versioning.md#private-preview-release-channel). Check the SDK release notes to see which versions support Tax for tickets. If you must use an SDK version that doesn’t support Tax for tickets, you can still access [SDK private parameters](https://docs.stripe.com/sdks/server-side.md#undocumented-params-and-fields). You can also use custom requests in any of the following SDKs to call private endpoints related to this feature. - [Ruby](https://github.com/stripe/stripe-ruby/blob/master/README.md#custom-requests) - [Python](https://github.com/stripe/stripe-python/blob/master/README.md#custom-requests) - [PHP](https://github.com/stripe/stripe-php/blob/master/README.md#custom-requests) - [Node](https://github.com/stripe/stripe-node/blob/master/README.md#custom-requests) - [Java](https://github.com/stripe/stripe-java/blob/master/README.md#custom-requests) - [.NET](https://github.com/stripe/stripe-dotnet/blob/master/README.md#custom-requests) - [Go](https://github.com/stripe/stripe-go/blob/master/README.md#custom-requests) ## Configure Stripe Tax When you [set up Stripe Tax](https://docs.stripe.com/tax/set-up.md) for tickets, set the default product tax code to `txcd_20030000`, `General - Services`. You can’t set any of the [event tax codes](https://docs.stripe.com/tax/tax-codes.md?type=events#all-tax-codes) as the default product tax code. Add a registration for testing using the Dashboard or the Tax [Registrations API](https://docs.stripe.com/tax/registrations-api.md). #### Dashboard 1. From the [Tax registrations](https://dashboard.stripe.com/tax/registrations) page in the Dashboard, click **Add registration**. 1. Add the registrations applicable for the event location. For example: - United States - Colorado, Sales Tax - United States - Colorado, Boulder Admissions Tax 1. From the [tax locations page](https://dashboard.stripe.com/tax/locations) in the Dashboard, click **Add registration**. 1. Add the registrations applicable for the event location. For example: - United States - Colorado, Sales Tax - United States - Colorado, Boulder Admissions 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]"=CO \ -d "country_options[us][type]"=admissions_tax \ -d "country_options[us][admissions_tax][jurisdiction]"=07850 \ -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. Tax calculations for ticket sales differ from typical tax calculations because they’re based on the performance location instead of the customer’s billing or shipping address. ## Create a performance location Create a tax location of type `performance` and specify the address of the event venue. You can use any address that’s eligible for a [TaxCalculation](https://docs.stripe.com/api/tax/calculations.md) in a [supported country](https://docs.stripe.com/tax/supported-countries.md#supported-countries) where the sales type is `All Sales`. Each country requires different [address formats](https://docs.stripe.com/tax/customer-locations.md#supported-formats) for the location. ```curl curl https://api.stripe.com/v1/tax/locations \ -u "<>:" \ -H "Stripe-Version: 2025-05-28.basil" \ -d type=performance \ --data-urlencode "address[line1]"="Folsom and, Pearl St" \ -d "address[city]"=Boulder \ -d "address[state]"=CO \ -d "address[postal_code]"=80302 \ -d "address[country]"=US \ -d description="Greenleaf Park" ``` 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/tax-for-tickets/integration-guide.md#apply-tax-locations) for sales in this location. ```json { "id": "taxloc_yB7b4tVHRb", // ... other fields omitted } ``` A database entry for this example might be: | **id** | **venue\_name** | **capacity** | **seatplan** | **stripe\_location\_id** | | -------------------- | --------------- | ------------ | ------------------------------------ | ------------------------ | | `` | Greenleaf Park | 500 | https://example.com/seating-plan.png | `taxloc_yB7b4tVHRb` | Table: your_business.venues ### Location address validation errors If the performance location creation request returns an error, check the `param` and `message` properties for specific guidance. #### Invalid address `The address isn't 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 a product Create a product with an event tax code and a performance location to use in your Checkout Session. #### Dashboard You can create a product with an events tax code and a performance location in the **[Product catalog](https://dashboard.stripe.com/products?create=product)**. #### Product API When you create a product, pass the event tax code and a performance location as tax details. ```curl curl https://api.stripe.com/v1/products \ -u "<>:" \ -H "Stripe-Version: 2025-12-26.preview" \ -d name=Ticket \ -d "tax_details[tax_code]"=txcd_50010001 \ -d "tax_details[performance_location]"=taxloc_yB7b4tVHRb ``` ### Errors You might encounter the following errors when creating a product with an event 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. | | `Tax code txcd_50010001 requires a tax location to be passed of the type `performance`.` | Your tax calculation is missing the performance location required for ticketing. | Either change the product tax code or include the performance location. | | `Tax code txcd_99999999 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. | ## Create a checkout session When creating a [checkout session](https://docs.stripe.com/api/checkout/sessions/create.md), use the product you created with an event tax code and a performance location. ```curl curl https://api.stripe.com/v1/checkout/sessions \ -u "<>:" \ -H "Stripe-Version: 2025-12-15.preview" \ -d "automatic_tax[enabled]"=true \ -d "line_items[0][price_data][currency]"=usd \ -d "line_items[0][price_data][unit_amount]"=8500 \ -d "line_items[0][price_data][quantity]"=1 \ -d "line_items[0][price_data][product]"={PRODUCT_ID} \ -d "line_items[0][mode]"=payment \ --data-urlencode "line_items[0][success_url]"="https://example.com/success" ``` ## 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, but pass the [connected account’s ID](https://docs.stripe.com/connect/authentication.md) in the `Stripe-Account` header on all API calls. | 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. | ### Software platforms integration When your connected accounts are liable for tax, follow the standard integration steps with these differences: - **All API calls**: Pass the [connected account’s ID](https://docs.stripe.com/connect/authentication.md) in the `Stripe-Account` header when you create tax registrations, performance locations, products, tax calculations, and checkout sessions or payment intents. - **Tax registrations**: Each connected account requires its own tax registrations. Create separate registrations for each connected account and the platform account. - **Performance locations**: Each connected account requires its own performance locations. Create separate locations for each connected account and the platform account. - **Products**: Create products for each connected account individually. Use performance location IDs that belong to the connected account, not the platform. For example, to create a tax calculation for a connected account, pass the `Stripe-Account` header: ```curl curl https://api.stripe.com/v1/tax/calculations \ -u "<>:" \ -H "Stripe-Version: 2025-05-28.basil" \ -H "Stripe-Account: {{CONNECTEDACCOUNT_ID}}" \ -d currency=usd \ -d "line_items[0][amount]"=2500 \ -d "line_items[0][reference]"="Outdoor concert - L1" \ -d "line_items[0][tax_behavior]"=exclusive \ -d "line_items[0][tax_code]"=txcd_50010001 \ -d "line_items[0][performance_location]"=taxloc_yB7b4tVHRb \ -d "customer_details[address][country]"=IE \ -d "customer_details[address_source]"=billing ``` ## Update the Stripe SDK Tax calculation for events is in private preview and requires [a private preview API version](https://docs.stripe.com/sdks/versioning.md#private-preview-release-channel). Check the SDK release notes to see which versions support Tax for tickets. If you must use an SDK version that doesn’t support Tax for tickets, you can still access [SDK private parameters](https://docs.stripe.com/sdks/server-side.md#undocumented-params-and-fields). You can also use custom requests in any of the following SDKs to call private endpoints related to this feature. - [Ruby](https://github.com/stripe/stripe-ruby/blob/master/README.md#custom-requests) - [Python](https://github.com/stripe/stripe-python/blob/master/README.md#custom-requests) - [PHP](https://github.com/stripe/stripe-php/blob/master/README.md#custom-requests) - [Node](https://github.com/stripe/stripe-node/blob/master/README.md#custom-requests) - [Java](https://github.com/stripe/stripe-java/blob/master/README.md#custom-requests) - [.NET](https://github.com/stripe/stripe-dotnet/blob/master/README.md#custom-requests) - [Go](https://github.com/stripe/stripe-go/blob/master/README.md#custom-requests) ## Configure Stripe Tax When you [set up Stripe Tax](https://docs.stripe.com/tax/set-up.md) for tickets, set the default product tax code to `txcd_20030000`, `General - Services`. You can’t set any of the [event tax codes](https://docs.stripe.com/tax/tax-codes.md?type=events#all-tax-codes) as the default product tax code. Add a registration for testing using the Dashboard or the Tax [Registrations API](https://docs.stripe.com/tax/registrations-api.md). #### Dashboard 1. From the [Tax registrations](https://dashboard.stripe.com/tax/registrations) page in the Dashboard, click **Add registration**. 1. Add the registrations applicable for the event location. For example: - United States - Colorado, Sales Tax - United States - Colorado, Boulder Admissions Tax 1. From the [tax locations page](https://dashboard.stripe.com/tax/locations) in the Dashboard, click **Add registration**. 1. Add the registrations applicable for the event location. For example: - United States - Colorado, Sales Tax - United States - Colorado, Boulder Admissions 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]"=CO \ -d "country_options[us][type]"=admissions_tax \ -d "country_options[us][admissions_tax][jurisdiction]"=07850 \ -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. Tax calculations for ticket sales differ from typical tax calculations because they’re based on the performance location instead of the customer’s billing or shipping address. ## Create a performance location Create a tax location of type `performance` and specify the address of the event venue. You can use any address that’s eligible for a [TaxCalculation](https://docs.stripe.com/api/tax/calculations.md) in a [supported country](https://docs.stripe.com/tax/supported-countries.md#supported-countries) where the sales type is `All Sales`. Each country requires different [address formats](https://docs.stripe.com/tax/customer-locations.md#supported-formats) for the location. ```curl curl https://api.stripe.com/v1/tax/locations \ -u "<>:" \ -H "Stripe-Version: 2025-05-28.basil" \ -d type=performance \ --data-urlencode "address[line1]"="Folsom and, Pearl St" \ -d "address[city]"=Boulder \ -d "address[state]"=CO \ -d "address[postal_code]"=80302 \ -d "address[country]"=US \ -d description="Greenleaf Park" ``` 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/tax-for-tickets/integration-guide.md#apply-tax-locations) for sales in this location. ```json { "id": "taxloc_yB7b4tVHRb", // ... other fields omitted } ``` A database entry for this example might be: | **id** | **venue\_name** | **capacity** | **seatplan** | **stripe\_location\_id** | | -------------------- | --------------- | ------------ | ------------------------------------ | ------------------------ | | `` | Greenleaf Park | 500 | https://example.com/seating-plan.png | `taxloc_yB7b4tVHRb` | Table: your_business.venues ### Location address validation errors If the performance location creation request returns an error, check the `param` and `message` properties for specific guidance. #### Invalid address `The address isn't 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). ## Optional: Create a product You can create a product with an event tax code and a performance location. You can use the product in all of the supported Tax for ticket integrations. #### Dashboard You can create a product with an events tax code and a performance location in the **[Product catalog](https://dashboard.stripe.com/products?create=product)**. #### Product API When you create a product, pass the event tax code and a performance location as tax details. ```curl curl https://api.stripe.com/v1/products \ -u "<>:" \ -H "Stripe-Version: 2025-12-26.preview" \ -d name=Ticket \ -d "tax_details[tax_code]"=txcd_50010001 \ -d "tax_details[performance_location]"=taxloc_yB7b4tVHRb ``` ### Errors You might encounter the following errors when creating a product with an event 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. | | `Tax code txcd_50010001 requires a tax location to be passed of the type `performance`.` | Your tax calculation is missing the performance location required for ticketing. | Either change the product tax code or include the performance location. | | `Tax code txcd_99999999 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 Ticket sale tax calculations require the following information: - Your business location, provided during [Stripe Tax configuration](https://docs.stripe.com/tax/tax-for-tickets/integration-guide.md#configure-stripe-tax) - The performance location ID, returned in the [create location](https://docs.stripe.com/tax/tax-for-tickets/integration-guide.md#tax-location-api-usage) response - The customer billing address (for [B2B reverse charges](https://docs.stripe.com/tax/zero-tax.md#reverse-charges)) - The product code (ticket, merchandise, and so on), for example, `txcd_50010001–-Admission to Amusement, Entertainment and Recreation Venues--Participant`. ### Collect customer address 1. Build an address form into your checkout using the [Address Element](https://docs.stripe.com/elements/address-element.md) to collect [required address details](https://docs.stripe.com/tax/customer-locations.md#supported-formats) from your customer. 1. Verify that the billing address is [valid for Stripe Tax](https://docs.stripe.com/tax/customer-locations.md#other). Perform this validation directly on your integration to avoid incurring [tax calculation](https://docs.stripe.com/tax/tax-for-tickets/integration-guide.md#calculate-tax-location) fees in live mode for validation. 1. Disable the checkout button until completing collection and validation. > - **United States**: We minimally require your customer’s postal code, but recommend providing a full address for the most accurate tax calculation results. - **Canada**: We require your customer’s postal code or province. - **India**: We require your customer’s state or union territory. - **All other countries**: We typically require only your customer’s country code. See [Supported countries](https://docs.stripe.com/tax/supported-countries.md) for specific country details. ### Types of products [Tax codes](https://docs.stripe.com/tax/tax-codes.md) can have a location requirement of: - `optional`: You *can* pass a performance location. - `required`: You *must* pass a performance location. - `not supported`: The tax code doesn’t support a performance location. You can find all ticket tax codes on our [product tax code reference](https://docs.stripe.com/tax/tax-codes.md?type=events#all-tax-codes) page, including `txcd_50010001`, `Admission to Amusement, Entertainment and Recreation Venues – Participant`. ### Apply performance locations You must pass all the required data within the tax calculation API call. In this example, you calculate the taxes for a customer based in Ireland who buys a ticket for an event at your performance location in Greenleaf Park in Boulder, Colorado. If you created a relevant [product](https://docs.stripe.com/tax/tax-for-tickets/integration-guide.md#create-product), you can pass its `id` in a line item and [create a tax calculation](https://docs.stripe.com/api/tax/calculations/create.md). ```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]"="Outdoor concert - L1" \ -d "line_items[0][tax_behavior]"=exclusive \ -d "line_items[0][tax_code]"=txcd_50010001 \ -d "line_items[0][performance_location]"=taxloc_yB7b4tVHRb \ -d "customer_details[address][country]"=IE \ -d "customer_details[address_source]"=billing ``` > If the calculation endpoint returns a `customer_tax_location_invalid` error code, prompt your customer to check the address they entered for accuracy and completeness. To sell an item alongside event tickets, for example, a T-shirt, add another line item to the tax calculation request and select the correct product tax code. ### Apply the calculation result to a payment The calculation API call calculates the taxes at the performance location of the event. In this case, the Greenleaf Park in Boulder, Colorado. You can use the [top-level tax breakdown](https://docs.stripe.com/tax/custom.md#tax-breakdowns) to display all the taxes that are charged. In this case, the response looks similar to the following: ```json { "id": "taxcalc_fQSaHNaU", "amount_total": 2697, // ... other fields omitted "tax_breakdown": [ // ... other entries omitted { "amount": 125, "inclusive": false, "tax_rate_details": { // ... other entries omitted "country": "US", "state": "CO", "percentage_decimal": "5.0", // This is an example. The Stripe Tax calculation API returns the correct tax rate. "tax_type": "admissions_tax" }, "taxability_reason": "standard_rated", "taxable_amount": 2500 } ] } ``` The `calculation` object contains an ID. Each time one of the four input parameters (business location, customer address, performance location, or product type) changes, you must perform a new calculation. You save the latest calculation ID to commit a tax transaction later. You need this for compliant reporting. Your checkout interface can display the taxes as a preview similar to the following example based on the `tax_breakdown` object of the response of the Tax Calculation API call. **2023 college football Rose Bowl Game on Mon, Jan 1, 2025 at Rose Bowl** | Checkout preview line | Amount | | --------------------- | ------------- | | Total Face Value | 25 USD | | Sales Tax (2.90%) | 0.72 USD | | Admission Tax (5.0%) | 1.25 USD | | **Sub Total** | **26.97 USD** | ### Tax calculation errors If the tax calculation request returns an error, check the `param` and `message` properties for specific guidance. #### Unknown tax location `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. Performance locations are exclusive to an account and you can’t share them between connected accounts or with the platform. #### Tax code requires a tax location `Tax code txcd_50010001 requires a tax location to be passed of the type `performance`.` Your tax calculation is missing the performance location required for ticketing. You must either change the product tax code or include the performance location. #### Tax code doesn’t support a tax location `Tax code txcd_99999999 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. You must either change the product tax code or remove the performance location. ## Create a payment The payment is created with the `amount_total` from the tax calculation. After the payment succeeds, you can create a tax transaction. Use this record for reporting and compliance. #### Tax Payment Intent integration (Recommended) With the Tax Payment Intent integration, you need to use the Payment Intents API. By defining the `hooks` field, you can pass the tax calculation ID to the payment intent. This creates a Payment Intent and then creates a tax transaction in the background. ```curl curl https://api.stripe.com/v1/payment_intents \ -u "<>:" \ -d amount=2697 \ -d currency=usd \ -d "automatic_payment_methods[enabled]"=true \ -d "hooks[inputs][tax][calculation]"="{{TAXCALCULATION_ID}}" ``` You can learn more in the [Tax Payment Intent integration guide](https://docs.stripe.com/tax/payment-intent.md). #### Manual Tax Calculation API integration Whether or not you use Stripe to process your payments, after the payment is successful, you must create a tax transaction. ```curl curl https://api.stripe.com/v1/tax/transactions/create_from_calculation \ -u "<>:" \ -d calculation={{TAX_CALCULATION}} \ -d reference="{{PAYMENTINTENT_ID}}" \ -d "expand[]"=line_items ``` Store the [tax transaction ID](https://docs.stripe.com/api/tax/transactions/object.md#tax_transaction_object-id) to record refunds later. Store the transaction ID in your database (near your third-party payment transaction) or in the PaymentIntent’s metadata when using Stripe Payments: ```curl curl https://api.stripe.com/v1/payment_intents/{{PAYMENTINTENT_ID}} \ -u "<>:" \ -d "metadata[tax_transaction]"={{TAX_TRANSACTION}} ``` Learn more about the [Tax Transaction API](https://docs.stripe.com/tax/custom.md#tax-transaction). ## 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, but pass the [connected account’s ID](https://docs.stripe.com/connect/authentication.md) in the `Stripe-Account` header on all API calls. | 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. | ### Software platforms integration When your connected accounts are liable for tax, follow the standard integration steps with these differences: - **All API calls**: Pass the [connected account’s ID](https://docs.stripe.com/connect/authentication.md) in the `Stripe-Account` header when you create tax registrations, performance locations, products, tax calculations, and checkout sessions or payment intents. - **Tax registrations**: Each connected account requires its own tax registrations. Create separate registrations for each connected account and the platform account. - **Performance locations**: Each connected account requires its own performance locations. Create separate locations for each connected account and the platform account. - **Products**: Create products for each connected account individually. Use performance location IDs that belong to the connected account, not the platform. For example, to create a tax calculation for a connected account, pass the `Stripe-Account` header: ```curl curl https://api.stripe.com/v1/tax/calculations \ -u "<>:" \ -H "Stripe-Version: 2025-05-28.basil" \ -H "Stripe-Account: {{CONNECTEDACCOUNT_ID}}" \ -d currency=usd \ -d "line_items[0][amount]"=2500 \ -d "line_items[0][reference]"="Outdoor concert - L1" \ -d "line_items[0][tax_behavior]"=exclusive \ -d "line_items[0][tax_code]"=txcd_50010001 \ -d "line_items[0][performance_location]"=taxloc_yB7b4tVHRb \ -d "customer_details[address][country]"=IE \ -d "customer_details[address_source]"=billing ```