Automatic Tax

Tax is Stripe's to calculate, and whether it runs is the API's call. The API creates the Checkout Session with automatic tax on when its flag is set, and the App has no flag of its own. It renders whatever the session reports, so no rate, region or tax rule lives in the front end.

The App collects the billing address either way. Tax is the default, and having the address on file already is the better path if it gets switched on later. The rest of this describes the flag on. This is a layer on top of Plans & Subscriptions.

Why the address comes first

Stripe cannot place a tax until the session carries a billing address, and the Billing Address Element does not put one there on its own. So the address is its own step, and continuing pushes it onto the session with updateBillingAddress(). Until then the total is the one before tax, and the page says so with a note beside it for as long as the session still reports tax as pending. After the push, the same total carries the tax.

The element is unmounted as part of that push. Stripe refuses to confirm while the element is mounted and the address has also been set on the session, since those are two competing sources. It only goes back up if the customer returns to change the address.

Customers with an address on file

A returning customer already has an address on their Stripe customer from when their card was stored, and the session reads tax off it from the moment it is created. They never see the address step, and the total on the confirm step is final.

Nothing stored on the API

The Stripe customer holds the address and every renewal invoice computes tax off it. The API keeps no copy and the page never reads one back.

© Websanova 2026 About Privacy