Abstract credits model
Credits are now stored as abstract integers rather than currency-denominated amounts. This decouples billing logic from specific currencies and simplifies multi-currency support. What changed:- Customer balances are a single
{ balance, currency }object instead of a per-currency array - A new
creditsPerMinorUnitfield defines how credits map to the provider’s currency (e.g. 100 credits = 1 USD cent) displayExchangeRatelets the frontend show USD-equivalent values regardless of the provider’s settlement currency- Provider currency is locked after the first transaction to prevent inconsistencies
- Credit topup webhook processing is now idempotent
Plans that previously used
pricePerUnit now use creditsPerUnit. See Plans overview for the updated schema.Sandbox-first onboarding
New providers now start directly in a sandbox environment instead of being routed through Stripe setup on first sign-up. This removes friction from the onboarding flow and lets providers explore the platform before connecting a payment processor.- Sandbox is the default environment for new accounts
- Stripe provisioning is non-blocking — providers can set up payments later
- Sandbox comes with sample data for faster testing
- Dev tools include a new Clear all data option alongside the existing reset
Go-Live flow
A new Go Live modal guides providers through the transition from sandbox to production.- Stripe OAuth popup: connects a Stripe account without leaving the SolvaPay Console
- Copy products toggle: optionally migrates sandbox products and plans to the live environment
- Validate-only OAuth linking: verifies the Stripe connection before committing
- Environment switcher intercept: prompts providers who try to switch environments manually
- Checklist gating: blocks the “Next” button while validation is in progress
- Improved security on the OAuth connection flow
Unified plans array
Products now store all plans in a singleplans[] array instead of separate freePlan and paidPlans fields.
What changed:
freePlanandpaidPlansmerged intoplans[]requiresPaymentis now derived on the backend from planprice,creditsPerUnit, andtype— clients no longer send it- A
pricingModefield is used on the frontend for UI display logic - Default plan, name, and description fields added to product plans
Usage-based plans
Full support for usage-based plans across the platform:- Usage plans in product onboarding with sub-cent configuration
- Plan selection in checkout and customer account pages
- Usage paywall enforcement in the SDK and MCP server
trackUsagehelper and Usage Simulator added to the SDK checkout demo- USD equivalent display in usage-based plan previews
Two-factor authentication
Two-factor authentication is now available for all provider accounts and required to go live.- Set up and manage 2FA from the Account page in the SolvaPay Console
- 2FA is a required step in the Go Live checklist — it can be configured inline without leaving the wizard
- Backup codes are generated during setup for account recovery
Cookie consent
GDPR-compliant cookie consent is now shared acrosssolvapay.com and app.solvapay.com.
- Accept or decline cookies once — your preference carries across all SolvaPay subdomains
- Manage preferences (Necessary / Analytics) at any time from the cookie banner
- All analytics scripts are gated behind consent
SolvaPay Console
- New ProductQuickStart card on the home page with ready-to-paste integration snippets for CLI, Agent Skill, and environment variables
- Product selector dropdown for providers with multiple products
- Manage account link shown after plan activation in checkout
- Faster manage account page loading with parallel data fetching
SDK updates
- Types regenerated from the backend schema
- Multi-currency balances replaced with abstract credits
creditsPerMinorUnitpropagated from server through all SDK layers- Usage paywall enforcement in the SDK and MCP server
trackUsagehelper and Usage Simulator added to the checkout demo- Checkout demo: exchange rate applied to credit estimates, dynamic currency symbol padding