<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://subscrio.com/feed.xml" rel="self" type="application/atom+xml"/><link href="https://subscrio.com/" rel="alternate" type="text/html"/><updated>2026-08-20T00:45:00+00:00</updated><id>https://subscrio.com/feed.xml</id><title type="html">Subscrio</title><subtitle>Subscrio is the entitlement engine that translates subscriptions into feature access. Open-source library plus paid Server App.</subtitle><author><name>Jasen Fici</name></author><entry><title type="html">Feature flags are not entitlements</title><link href="https://subscrio.com/blog/feature-flags-are-not-entitlements/" rel="alternate" type="text/html" title="Feature flags are not entitlements"/><published>2026-08-19T00:00:00+00:00</published><updated>2026-08-19T00:00:00+00:00</updated><id>https://subscrio.com/blog/feature-flags-are-not-entitlements</id><content type="html" xml:base="https://subscrio.com/blog/feature-flags-are-not-entitlements/"><![CDATA[<p>Teams often wire LaunchDarkly (or a homegrown flag table) into the same places they check a Stripe plan name. It works until someone sells a custom seat count, a trial that should not include SSO, or a downgrade that has to wait until the period ends.</p> <p>Those are different jobs.</p> <h2 id="what-a-flag-is-for">What a flag is for</h2> <p>A flag decides whether a build of the product should show a path. Percentage rollouts, kill switches, beta cohorts. The question is “is this code live for this request?”</p> <p>Flags do not know if the subscription is cancelled. They do not create a default plan when a customer has none. They do not walk override, then subscription, then plan, then default.</p> <h2 id="what-an-entitlement-is-for">What an entitlement is for</h2> <p>An entitlement answers “is this customer allowed to do this?” You ask it on button clicks, resource creates, and API calls. The answer has to stay true when billing changes without a deploy.</p> <p>That is the layer Subscrio is. The library is open source. Your app still owns UX. Stripe still owns money. Subscrio owns the translation between a paid plan and a feature value.</p> <h2 id="a-smell-in-the-codebase">A smell in the codebase</h2> <p>If you grep for <code class="language-plaintext highlighter-rouge">plan === "pro"</code> in a dozen files, you do not have an entitlement model. You have a pile of conditionals that will rot the first time sales needs an exception.</p> <p>Check a named feature instead. Let one resolver walk the stack. Keep flags for shipping code, not for “they paid for ten seats.”</p> <h2 id="where-to-go-next">Where to go next</h2> <p>The <a href="https://docs.subscrio.com">docs</a> cover the catalog model. The <a href="/admin/">Web Admin</a> page is the commercial console for the same catalog if you do not want to mutate it only in code.</p>]]></content><author><name>Jasen Fici</name></author><category term="entitlements"/><summary type="html"><![CDATA[Feature flags roll out code. Entitlements answer whether a customer paid for a capability. Mixing the two is how plan checks leak into every file.]]></summary></entry></feed>