The Three Boundaries
Your product
Owns the user experience, workload execution, and the moment a paid action is about to run.
Unprice
Owns pricing rules, entitlement decisions, budgets, wallet credits, billing state, and evidence.
Payment provider
Captures or simulates payment through Stripe, Sandbox, or a custom provider adapter.
The Money Path
| Stage | What happens | Why it matters |
|---|---|---|
| Paid action | Your app is about to run work that can create cost | The money question happens before the cost exists |
| Pricing model | Unprice resolves the plan version, feature, meter, and entitlement | Pricing logic stays out of product branches |
| Runtime decision | Unprice checks entitlement, budget, wallet credits, and meter rules | The request can be allowed or denied immediately |
| Evidence trail | Usage facts, wallet movement, ledger entries, and invoice evidence are kept together | Support, analytics, replay, and invoices share one explanation |
| Payment capture | The provider adapter captures or simulates money movement | The payment rail can change without moving pricing logic back into your app |
The Payment-provider Boundary
Unprice is not a Stripe wrapper. Stripe is the built-in production adapter today, and Sandbox is available for testing. The important boundary is the provider interface: invoice creation, invoice items, payment methods, checkout/setup sessions, payment collection, and webhooks are provider operations. That means the pricing and evidence path can stay in Unprice while the payment-capture system can change. A team running its own deployment can implement another provider adapter without moving entitlement, metering, wallet, billing, or invoice-evidence logic back into product code.The Runtime Paths
Ask without changing state
Use
access.check when your app only needs to know whether a customer can use a feature.Decide and apply now
Use
usage.consume when known usage should be blocked if the customer is over limit, budget, or credits.Report usage evidence
Use
usage.record when the request should not wait for Unprice to decide.Reserve a workload budget
Use
runs.start, runs.consume, and runs.end for jobs, workflows, tool chains, and agents.