- Collect business details in the checkout or top-up form (
PaymentForm.BusinessDetails/TopupForm.BusinessDetails). - Attach them to the payment intent (
attachBusinessDetails), which triggers Stripe Tax and returns aTaxBreakdown. - Confirm the payment — the forms refresh Stripe Elements after attaching so the tax-updated amount applies before confirmation.
Wire the backend route
api.attachBusinessDetails (/api/attach-business-details).
The helper validates the input, calls
POST /v1/sdk/payment-intents/{paymentIntentId}/business-details, and returns
{ taxBreakdown } (or { error, status: 400 } on a validation failure).
Input fields
Business details are persisted on the customer, so returning buyers don’t re-enter them.
Tax breakdown
A successful attach returns aTaxBreakdown:
reverse_charge applies to valid EU cross-border B2B purchases — show the customer that they are
responsible for reporting VAT. Tax behavior is exclusive for USD/CAD and inclusive for other
currencies by default.
React form parts
PaymentForm.BusinessDetails (plan checkout) and TopupForm.BusinessDetails (credit top-ups)
expose the same headless compound parts: Root, Toggle, BusinessName, Country, TaxId, and
a pre-composed Fields (labeled toggle plus the three inputs with country-aware tax ID labels).
- The input fields render
nullwhile the business toggle is off (ToggleandFieldsalways render). - Attaching is debounced (300 ms) and happens automatically once a payment intent exists. Confirmation is blocked until the attach round-trip completes, so the confirmed amount always includes the computed tax.
- All parts accept standard HTML attributes plus
asChildfor rendering into your own elements.
Validating outside the forms
validateBusinessDetails from @solvapay/core/business-details runs the same validation the
helpers use — useful for custom UIs or pre-flight checks:
customerCountry must be a supported country.
MCP tool
MCP apps get the same capability through theattach_business_details tool (defined in
@solvapay/mcp-core and registered by the MCP server factory). It takes paymentIntentId,
isBusiness, and the optional businessName / country / taxId / taxIdType fields, resolves
the authenticated customer, and returns the taxBreakdown. The embedded checkout views in
@solvapay/react/mcp call it automatically — no extra wiring is needed.
Seller VAT on receipts
Set your VAT number (or US EIN) in the SolvaPay Console under provider business details before selling in regions that require it. Receipts then show the seller tax identifier alongside the applied tax rate and treatment. In the SDK,resolveSellerIdentityDisplay from @solvapay/core
picks the right identifier for display (VAT number for EU/GB sellers, EIN for US sellers), and the
MCP checkout views render it via the seller details card.
Next steps
- React guide — checkout and top-up forms in depth
- Purchase lifecycle management — activation and plan switching
- Webhooks —
payment.succeededpayloads for fulfillment