Tax ticket sales based on event locationPrivate preview
Integrate Stripe Tax to calculate taxes on admission fees and tickets.
VAT and sales tax for event admission (for example, tickets to concerts, conferences, museums, or sporting events) apply to the tax jurisdiction where the event is performed, or performance location, not the customer’s location. In the US, specific local taxes (such as entertainment or amusement taxes) might also apply, in addition to state and local sales tax.
Update the Stripe SDK
Tax calculation for events is in private preview and requires updating to the latest API version. You can inspect the changelog to make sure your changes are backwards-compatible.
If needed, you can access SDK private parameters. You can also use custom requests in any of the following SDKs to call private endpoints related to this feature.
Configure Stripe Tax
When you set up Stripe Tax for tickets, set the default product tax code to txcd_, General - Services. You can’t set any of the event tax codes as the default product tax code.
You can add a registration for testing through the Dashboard or the tax registrations API.
Stripe Tax calculations don’t incur fees in a sandbox 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.
Design your checkout flow
Stripe Tax only supports ticket sales using the Tax Calculation API directly or with PaymentIntents. You can’t use other integrations such as Stripe Checkout or subscriptions.
Choose the integration path that corresponds to your existing payments integration:
| Payment Intent integration (Recommended) | Custom Tax Calculation API integration | |
|---|---|---|
| Advantages |
|
|
| Disadvantages |
|
|
Both integrations require you to create a performance location and perform a tax calculation.
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 in a supported country where the sales type is All Sales.
Each country requires different address formats for the location.
The response returns the id as a unique identifier for the performance location. Store this value for use in transactions where you calculate tax for sales in this location.
{ "id": "taxloc_yB7b4tVHRb", // ... other fields omitted }
A database entry for this example might be:
| id | venue_name | capacity | seatplan | stripe_location_id |
|---|---|---|---|---|
<your_ | Greenleaf Park | 500 | https://stripe.cdn.com/seatplan.png | taxloc_ |
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 is not supported by Stripe Tax for a tax location.
The address validation failed, see supported address formats for address requirements.
Unsupported country or exluded territory
The address is not supported by Stripe Tax for a tax location.
The country isn’t supported or the address is in an excluded territory.
Calculate Tax
Ticket sale tax calculations require the following information:
- Your business location, provided during Stripe Tax configuration
- The performance location ID, returned in the create location response
- The customer billing address (for B2B 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
- Build an address form into your checkout using the Address Element to collect required address details from your customer.
- Verify that the billing address is valid for Stripe Tax. Perform this validation directly on your integration to avoid incurring tax calculation fees in live mode for validation.
- Disable the checkout button until completing collection and validation.
Regional considerations
- 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 for specific country details.
Types of products
Tax codes 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 page, including txcd_, 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.
Common mistake
If the calculation endpoint returns a customer_ 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 to display all the taxes that are charged. In this case, the response looks similar to the following:
{ "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 just 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_ 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.
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. 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 requires a tax location
Tax code txcd_
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 does not support a tax location
Tax code txcd_
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_ from the tax calculation.
After the payment succeeds, you can create a tax transaction. Use this record for reporting and compliance.