Farther ShoreDocs
Go to Farther Shore
What is FartherShore
Install the CLI
Quickstart
Core concepts
The @Product class
Meters & resources
Features & routes
Capabilities & entitlements
Plans & pricing
The Manifest IR
Bring your own backend
Transport modes
Metering & verification
Runtime tokens
Frontend SDK
Root & data components
Auth & sessions
Entitlement gates
Connect Stripe
Subscriptions & usage
Plan changes & grandfathering
Billing strategies
Apply & deploy
Environments
Migrations
Docs versions & archive
Operate with an agent
Operation classes
MCP server
End-to-end via CLI/MCP
CLI reference
@farthershore/product
@farthershore/backend
@farthershore/farthershore-js
Environment variables
Response & deny codes
Add a metered capability
Gate a feature
Change a price
Edit the priceActively migrate existing subscribersVerify it worksRelated
Prepaid credits
Meter AI tokens
Operate via an agent
Prepare for launch
Status
Docs/Cookbook/Change a price

Change a price

Reprice a plan safely — existing subscribers are grandfathered by default.

PreviousGate a featureNextPrepaid credits

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.

Edit the price

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.

Actively migrate existing subscribers

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:

PolicyEffect
grandfatherKeep existing subscribers on their current version (the default).
next_renewalMigrate each subscriber at their own renewal boundary.
immediateMigrate everyone now. Pair with --proration prorate or --proration credit.
by_dateMigrate everyone by a deadline — requires --complete-by <iso8601>.
opt_inOffer 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.

Verify it works

  • farthershore build succeeds and the new price is in the compiled plan.
  • After publish, a fresh signup is charged the new price.
  • Existing subscribers stay on the old price until you migrate them (or next_renewal applies).
  • farthershore plan list croncloud --format json shows the plan's version incremented.

Related

  • Add a metered capability — change usage pricing, not just the recurring fee.
  • Prepare for launch — the gates a publish must pass.
  • Operate via an agent — run the same migration over CLI/MCP.