Skip to main content
You sell one or more tiers. Each costs something, and each includes something. You build that in the dashboard, and it looks like what it is — there’s nothing to learn here. What the dashboard can’t show you is what happens on the day you change it.

Changing your offer without changing your customers

Say you raise the Pro tier’s limit from 200 to 500, and add a feature to it. Two things could happen:
  • everyone already on Pro is quietly moved to the new terms, or
  • they keep what they signed up for, and only new customers see the change.
Both are legitimate. A phone carrier usually leaves existing customers on their old plan when the lineup changes; a car insurer reprices everyone at renewal. What’s not legitimate is the third option — finding out which one happened after it happened. So Kerne makes the safe answer the default. When you change what a plan includes, that change reaches new subscribers only. Everyone already subscribed keeps exactly what they had, indefinitely, until you deliberately move them.
Each time you change what a plan includes, you publish a new version of that offer — a pack in the dashboard. A subscription is attached to the version that was current when it started, and stays there.
Your code never mentions a version. allows(), check() and entitlements() resolve through whichever one the customer is on.

Moving someone to a newer version

Two things do it, both deliberate:
  • They change plan. Switching plans re-attaches the subscription to the target plan’s current version.
  • You migrate them. From the dashboard, on purpose, when you’ve decided the old terms should end.
Nothing else moves a customer. A price change, a new feature, a raised limit — none of it reaches someone already subscribed.

What happens when a payment fails, or they cancel

Two moments need a decision from you, because the obvious answer isn’t obvious. Both are set per product in the dashboard.
End of period by default — access continues through what’s already been paid for, and stops when that period ends. An explicit immediately flag on cancel() cuts access right away instead. That’s a per-call choice, not a stored setting.
Nothing happens by default — Kerne never automatically cuts access over a failed payment. The subscription sits at PAST_DUE until the provider resolves it.Or: block after a grace period — the customer keeps access for a number of days you set, then a background sweep moves them to UNPAID, which does cut access, if nothing was paid by then.
PAST_DUE and UNPAID are subscription statuses — see the subscription shape for the full list. A downgrade to a cheaper plan applies immediately today; there’s no end-of-period option yet.

Next

Entitlements

What an offer actually grants.

Pricing models and meters

Flat, metered, and what a meter measures.