Skip to content
Create account
or
Sign in
The Stripe Docs logo
/
Ask AI
Create account
Sign in
Get started
Payments
Revenue
Platforms and marketplaces
Money management
Developer resources
Overview
Billing
OverviewAbout the Billing APIs
Subscriptions
Invoicing
Usage-based billing
Quotes
Customer management
Billing with other products
Revenue recovery
Automations
Test your integration
Tax
Overview
Use Stripe tax
    How Tax works
    Set up collection
    Configure behavior
    Testing
    Find your payment type
    Find your business type
      Connect
      Ticket sales
        Integration guide
      Physical goods
      Custom integration
    Supported countries
Manage compliance
Reporting
Overview
Select a report
Configure reports
Reports API
Reports for multiple accounts
Revenue recognition
Data
OverviewSchema
Custom reports
Data Pipeline
Data management
HomeRevenueUse Stripe taxFind your business typeTicket sales

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 event 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.

  • Ruby
  • Python
  • PHP
  • Node
  • Java
  • .NET
  • Go

Configure Stripe Tax

When you set up Stripe Tax for tickets, set the default product tax code to txcd_20030000, General - Services. You can’t set any of the event tax codes as the default product tax code.

To add a registration for testing:

  1. From the tax registrations page in the Dashboard, click Add registration.
  2. Add the registrations applicable for the event location. For example:
    • United States - Colorado, Sales Tax
    • United States - Colorado, Boulder Admissions Tax

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 becuase they’re based on the event 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
  • Fewer API calls
  • Automated handling of refunds
  • Dashboard support, specifically useful for testing
  • Built-in receipts support
  • 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
  • Refunds require custom implementation
  • Limited Dashboard support
  • Testing requires API
  • No automatic receipt generation

Both integrations require you to create a tax location and perform a tax calculation.

Create an event location

Call create a tax location of type performance with specifiying 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.

Command Line
cURL
No results
curl https://api.stripe.com/v1/tax/locations \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -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 tax 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:

idvenue_namecapacityseatplanstripe_location_id
<your_internal_id>Greenleaf Park500https://stripe.cdn.com/seatplan.pngtaxloc_yB7b4tVHRb

Table: your_business.venues

Location address validation errors

If the tax 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. Please use a valid address.

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. Please use a location that is supported by Stripe Tax.

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 event 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

  1. Build an address form into your checkout using the Address Element to collect required address details from your customer.
  2. 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.
  3. 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.
  • *All other countries: We only require your customer’s country code.

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_50010001, Admission to Amusement, Entertainment and Recreation Venues – Participant.

Apply tax 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 tax location in Greenleaf Park in Boulder, Colorado.

Command Line
cURL
No results
curl https://api.stripe.com/v1/tax/calculations \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -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

Common mistake

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.

Apply the calculation result to a payment

The calculation API call calculates the taxes at the tax 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, event 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 Value25 USD
Sales Tax (2.90%)0.72 USD
Admission Tax (5.0%)1.25 USD
Sub Total26.97 USD

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.

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.

Command Line
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node
Go
.NET
No results
curl https://api.stripe.com/v1/payment_intents \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -H "Stripe-Version: 2025-05-28.preview" \ -d amount=2697 \ -d currency=usd \ -d "automatic_payment_methods[enabled]"=true \ -d "hooks[inputs][tax][calculation]"=
{{CALCULATION_ID}}

You can learn more about the Tax Payment Intent integration in the Tax Payment Intent integration guide.

Was this page helpful?
YesNo
  • Need help? Contact Support.
  • Join our early access program.
  • Check out our changelog.
  • Questions? Contact Sales.
  • LLM? Read llms.txt.
  • Powered by Markdoc