Feature Resolution
Each access check walks override, then subscription, then plan, then default. The first match is the answer.
Eliminate 1,000s of lines of customer subscription management business logic.
You're probably doing subscription management with scattered conditional statements across dozens of files, checking plan names and hardcoding feature limits.
let sub = await db.subscriptions.findOne({
customerId: customer.id
});
if (!sub) {
sub = await db.subscriptions.create({
customerId: customer.id,
plan: "default"
});
}
// scattered across dozens of files
if (sub.cancelled) {
throw new Error("User limit reached");
}
if (sub.expiresAt < Date.now()) {
throw new Error("User limit reached");
}
if (sub.trialEndsAt && sub.trialEndsAt < Date.now()) {
throw new Error("User limit reached");
}
if (customer.plan === "pro"
|| customer.plan === "enterprise") {
if (userCount >= 10) {
throw new Error("User limit reached");
}
} const maxUsers = await subscrio.featureChecker
.getValueForCustomer(
customer.key, "my-application", "max-users", 0
);
if (userCount >= maxUsers) {
throw new Error("User limit reached");
}
await addUser(); getValueForCustomer automatically
You'll also maintain
Right now, you have two disconnected systems, and lots of embedded business logic scattered throughout your app. This creates massive problems:
Subscrio is the entitlement layer your application is missing.
It's not feature flags for gradual rollouts. It's not a billing system for processing payments. It's the authoritative system between them that knows exactly what each customer is entitled to access.
Configure products, features, and plans through a simple API. Set up your business model once and let Subscrio handle the complexity.
{
"version": "1.0",
"features": [
{
"key": "max-users",
"displayName": "Maximum Users",
"valueType": "numeric",
"defaultValue": "0"
},
{
"key": "advanced-reports",
"displayName": "Advanced Reports",
"valueType": "toggle",
"defaultValue": "false"
}
],
"products": [
{
"key": "my-application",
"displayName": "My Application",
"features": ["max-users", "advanced-reports"],
"plans": [
{
"key": "basic",
"displayName": "Basic Plan",
"featureValues": {
"max-users": "5",
"advanced-reports": "false"
}
},
{
"key": "pro",
"displayName": "Pro Plan",
"featureValues": {
"max-users": "10",
"advanced-reports": "true"
}
}
]
}
]
} Query feature values for customers in real-time. Check limits, permissions, and access rights without hardcoded conditional logic.
Sales teams can grant custom overrides, product teams can experiment with new plans, and customer success can handle exceptions—all without requiring engineering deployments.
Each access check walks override, then subscription, then plan, then default. The first match is the answer.
Define the catalog in config or in code. Products own features; plans set the values a customer gets.
Find an account, see every subscription on it, and inspect what that customer can access.
Change a plan or grant an exception on a live account without shipping a new build.
Grant or revoke a feature on one subscription until the next renewal, without changing the plan.
Stripe is included. Forward webhook payloads to the library and subscriptions stay in sync with payment events.
Feature keys and plan values are checked at compile time in TypeScript and C#.
Active, trial, and expired are computed from dates at read time, so you do not store a stale status flag.
Upgrades and downgrades follow billing-cycle boundaries instead of cutting access mid-period.
One customer can hold several active subscriptions, including across products, each with its own entitlements.
Trial start and end dates are first-class. Access follows the trial window without extra status logic.
Sensible defaults cover the common case, so you can check entitlements without wiring a custom policy layer first.
Run your own code before and after create, update, and delete, for mail, audits, or calls to other systems.
When a paid period ends, you can drop the customer to a lower plan automatically instead of leaving paid access open. This is optional.
PostgreSQL is supported in both stacks. The .NET library also works with SQL Server.
LaunchDarkly, Split
Stripe, Paddle
Free
The Subscrio entitlement library is open source and free to use. Embed it in your stack, define your business model once, and enforce entitlements in code.
Full-featured TypeScript/Node.js implementation
subscrio C#/.NET implementation with Entity Framework Core
Subscrio.Core Extend the engine with hooks instead of forking it. An audit log extension ships out of the box: subscrio-audit-log and Subscrio.AuditLog.
The Subscrio entitlement library is open source and free to use. The Server App is a commercial add-on: a web console and REST API. Licensing details are on the Admin page.
TypeScript/Node.js (subscrio) and C#/.NET (Subscrio.Core) are available today.
Documentation lives at docs.subscrio.com. Source code is on GitHub.
Neither. It's not feature flags for gradual rollouts. It's not a billing system for processing payments. It's the authoritative entitlement layer between them that knows exactly what each customer is entitled to access.
Use the open-source library today, or license the Server App when you want a web console for the same catalog.