Multi-currency plans
Plans can now carry per-currency pricing. Recurring, usage, hybrid, and one-off plans support apricingOptions array with a per-currency price, basePrice, and setupFee. Existing
single-currency plans keep working unchanged — they are treated as a single default option, so no
migration is required.
- Checkout resolves the correct price for the customer’s selected or detected currency.
- Providers choose which currencies customers can pay top-ups in. The provider’s default currency is always allowed; the supported list holds only the additional pay currencies.
- Customer-facing balance and checkout surfaces can display amounts in the provider’s default currency using a display exchange rate.
When you expose a currency at checkout, make sure the plan has a matching
pricingOptions entry.
A plan with no price for the selected currency rejects checkout with an explicit “currency not
supported” error that lists the available currencies.Provider credit grants
Providers can now assign credits to a customer without collecting payment, from the SolvaPay Console or through the TypeScript SDK.- Grant credits from the customer detail page in the SolvaPay Console.
- Grant credits programmatically with the SDK. Grants are idempotent when you supply an
Idempotency-Key, which makes sign-up bonus flows safe to retry. - A new balance lookup returns a customer’s credit balance along with display currency and exchange-rate fields for presentation.
- Usage tracking now returns a structured result showing how many credits were debited, the units
remaining, or the reason a debit was skipped — so you can confirm consumption after
trackUsage.
Credit balances remain USD-normalized internally. Display currency and exchange-rate fields are
for presentation only.
External identity linking
You can now link users from your own identity provider (for example, Auth0) to SolvaPay customers, so the same customer is recognized across SDK billing and MCP OAuth consent.- MCP OAuth sign-in reuses an existing customer when a stable external reference matches, instead of creating a duplicate.
ensureCustomer(externalRef)is the canonical way to link a customer from your backend after your own login completes.- A runnable Auth0 + Next.js example and a scaffold template are available to start from.
externalRef
contract, the custom auth guide for the Auth0 adapters, and
the No-code MCP integration authentication guide.
Checkout and plan access fixes
- Credit top-ups no longer count as an active product plan. A customer who only topped up still needs a plan purchase to gain plan access — top-ups and plan access are now independent paths.
- New customers are enrolled into eligible free default plans when they complete MCP OAuth sign-in, so they have plan access before their first tool call. Paid and usage-based default plans are not auto-enrolled.
- Checkout handles plan selection and switching a session to top-up mode more reliably, avoiding mixed plan and top-up state.
MCP tool metadata
For MCP apps, intent tools (upgrade, topup, and manage_account) are now annotated as
read-only, so hosts treat them as view-openers rather than state-changing actions. UI-only
transport tools are marked widget-accessible so an embedded view can call them on the ChatGPT Apps
runtime.
Update @solvapay/mcp-core to pick these up. See the
MCP app guide for details.
Don’t override the intent-tool annotations unless a tool genuinely changes external state.