@happyvertical/smrt-subscriptions
v0.41.0
Published
Tenant subscriptions, entitlement resolution, usage thresholds, and subscription UI for SMRT
Maintainers
Readme
@happyvertical/smrt-subscriptions
Tenant subscriptions, feature grants, immutable usage evidence, thresholds, effective-dated client pricing, spending policies, and entitlement resolution for s-m-r-t applications.
The package is provider-neutral. Stripe or another billing provider may be recorded as binding metadata, but provider API calls belong in an injected SDK accounting adapter.
Installation
pnpm add @happyvertical/smrt-subscriptionsAdd svelte for the optional plan, subscription, and threshold components.
Resolve entitlements
import { SubscriptionResolver } from '@happyvertical/smrt-subscriptions';
const resolver = await SubscriptionResolver.create({ db: 'app.db' });
const context = await resolver.loadEntitlementContext('tenant-1');
const result = await resolver.resolveTenantEntitlements('tenant-1', {
context,
});
if (!result.allowed) {
throw new Error('Subscription thresholds do not allow this operation');
}
console.log(result.planKey, result.featureKeys, result.thresholdEvaluations);Create one resolver per request or application unit of work and reuse the
loaded EntitlementResolutionContext when several checks need the same
subscription and plan.
Core model
SubscriptionPlanstores versioned feature grants and thresholds.TenantSubscriptionbinds a tenant or external subscriber to a plan over an effective period.TenantUsageMetricis immutable, idempotent usage evidence.SubscriptionResolvercombines current subscription, plan, and batched usage summaries into one entitlement decision.TenantUsageMeterrecords and summarizes ordinary and AI usage.PricingRule,ClientCharge, andBillingAdjustmentmodel effective-dated commercial evidence.SpendingPolicyEvaluatorapplies scoped budget behavior without embedding a payment provider.
Subscribers are polymorphic: tenant subscribers use a tenant ID, while external
subscribers add a stable external discriminator. Utilities such as
normalizeSubscriber() and assertSubscriberInvariant() keep that identity
coherent.
Thresholds and spending
Thresholds define a metric key, time window, limit, and enforcement behavior. The resolver batches metric reads when possible. Do not bypass tenant context or repeatedly construct a new resolver inside one request.
Commercial usage records client-facing prices separately from usage evidence. Spending policy decisions can allow, warn, require approval, or deny based on the configured behavior and scope.
Svelte entry point
@happyvertical/smrt-subscriptions/svelte exports provider-neutral,
presentational components:
PlanPickerSubscriptionSummaryUsageThresholdsCommercialOverview
Hosts own data loading and mutation actions.
Development
pnpm --filter @happyvertical/smrt-subscriptions test
pnpm --filter @happyvertical/smrt-subscriptions typecheck
pnpm --filter @happyvertical/smrt-subscriptions buildSee AGENTS.md for provider, threshold, and resolver guidance.
