Change a price
Reprice a plan safely — existing subscribers are grandfathered by default.
Reprice a plan safely — existing subscribers are grandfathered by default.
You want to change what a plan costs. Editing the price is one line; the real question is what happens to subscribers already on the old price. Farther Shore's default answer is grandfathering: changing a plan's price and publishing creates a new plan version and leaves existing subscribers on the version they signed up for. New signups get the new price. Moving existing subscribers is a separate, deliberate operate action.
Prices live on the @Plan in product/product.config.ts. amount is integer
cents; interval is month or year.
// product/product.config.ts — raise Pro from $199 to $249/mo.
@Plan("pro", {
name: "Pro",
price: { amount: 24900, currency: "usd", interval: "month" }, // was 19900
grants: [capabilityGrant("managed-cron", { limits: { cron_jobs: 100 } })],
limits: { requests: { rate: 6000, interval: "minute", enforcement: "enforce" } },
})
pro!: unknown;
Build and push as usual:
farthershore build --format json
When product/** is pushed, the platform publishes a new version of the pro
plan. Existing Pro subscribers keep paying $199 at renewal; anyone subscribing
after the release pays $249.
Migration is not a decorator. A @Product class is a snapshot of product
state, not a description of how to move live subscribers. Repricing + publishing
changes the snapshot; existing subscribers are grandfathered by
subscriberChangePolicy (the standing default). To actively move them, run the
operate verb below.
To move subscribers from the old version onto the new one, run plan migrate.
It is owner-only and takes the plan key, the source/target versions, and a
policy. --to head targets the latest published version.
# Migrate every Pro subscriber from v1 to the latest version at their next renewal.
farthershore plan migrate croncloud pro --from 1 --to head --policy next_renewal
Policies:
| Policy | Effect |
|---|---|
grandfather | Keep existing subscribers on their current version (the default). |
next_renewal | Migrate each subscriber at their own renewal boundary. |
immediate | Migrate everyone now. Pair with --proration prorate or --proration credit. |
by_date | Migrate everyone by a deadline — requires --complete-by <iso8601>. |
opt_in | Offer the new version; subscribers choose. |
# Migrate everyone immediately and prorate the difference on this cycle's invoice.
farthershore plan migrate croncloud pro --from 1 --to 2 --policy immediate --proration prorate
# Or give everyone a deadline.
farthershore plan migrate croncloud pro --from 1 --to head \
--policy by_date --complete-by 2026-09-01T00:00:00Z
This is also exposed over MCP as fs_plan_migrate for agents — see
Operate via an agent.
farthershore build succeeds and the new price is in the compiled plan.next_renewal applies).farthershore plan list croncloud --format json shows the plan's version
incremented.