V8 Central — Product & Technical Spec
  1. Docs
  2. Core platform
  3. Subscriptions

#Subscriptions

#Plan vs subscription vs billing

TermMeaningLives in
PlanWhat the customer can buy: tier, cycle, price, limits, featuresPlan catalog Missing
SubscriptionThe account's/organization's active relationship with one plan: status, cycle, period, cancel flagSubscription record
BillingMoney: wallet, payments, transactions, invoices, charges, taxBilling tables + gateways

#Who owns the subscription

V7 background: one subscription per user in new_subscription_plans (user_id + the organization_id of the user's main organization); servers each have a new_subscriptions row pointing at that plan; permission checks use the organization owner's plan. V7 only

#Subscription flow

  1. The user selects a plan and cycle.
  2. BE quotes the amount (credit already paid, tax, promo).
  3. If the amount is 0 (free/trial), it activates at once.
  4. Otherwise BE charges wallet credits. If credits are short, the user tops up through a gateway first (see Billing).
  5. BE confirms the payment (gateway verify / webhook), then activates or changes the subscription, writes a charge + audit entry, and updates the per-tier API rate limit (V7).
  6. FE reloads subscription, usage, permission map (features depend on the tier) and dashboard.

#States

V7 has no status column. State comes from expires_in_days, cycle and meta flags. V8 should expose an explicit status. Missing

V8 stateMeaningV7 equivalentUI
trialTrial period, no payment yetstandard_trial_plan meta + trial days"Trial, N days left" + "Choose a plan"
activePaid and within periodexpires_in_days ≥ 0Green badge, renewal date
pendingPayment started, not verified yetTransaction status = 2 (pending)"Payment pending", no limits changed
cancelledWill not renew. Works until the period endssubscription_plan_cancel = 1"Ends on " + Resume
expiredPeriod overexpires_in_days < 0 (grace until −16)Red banner: server actions blocked, Renew
failedRenewal or payment failedFailed transaction / not enough credits"Payment failed", Add credit / Retry
renewal (event)Period extendedrenew-subscriptionToast + new date
lifetimeNever expires, can't be cancelledcycle = Lifetime"Lifetime" badge

#Expiry and renewal

  • A daily job counts the remaining days down. Reminders go out from 7 days before the end. V7 only
  • Expired: every server-level action except server delete is refused with "subscription has expired. Please renew it." V7 only VerifyPermission
  • Renew within 15 days of expiry: the remaining (negative) days are kept. After that, a fresh period starts. V7 only
  • Auto-renew: V7 renews by deducting wallet credits, with optional Stripe auto-recharge topping the wallet up. V7 only Is V8 renewal automatic? Open question D-4

#Subscription screen (/[locale]/subscription)

  • Current subscription card: plan, cycle, state badge, period dates, price, payment source (wallet / card).
  • Usage: servers, applications (with the cost caveat in Plans).
  • Actions, each enabled only when the API allows it: Change plan, Change cycle, Cancel, Resume, Renew now.
  • History: subscription events (from the audit log or charges).

#Required API (none exists)

CapabilityV7 referenceStatus
Get current subscription + usageGET /organizations/{org}/new-subscription-planMissing
Create (first plan)POST /create-subscriptionMissing
Change plan / cyclePATCH /change-subscriptionMissing
Quote / remaining creditGET /remaining-creditMissing
RenewPATCH /renew-subscriptionMissing
Cancel / resumePATCH /cancel-subscription, /resume-subscriptionMissing
Promo codesGET /available-promo-codes, GET /discount-percentageMissing
LifetimePOST /create-lifetime-subscription, PATCH /convert-to-lifetimeMissing Open question
ServerAvatar V8 Central · prepared by central-app-2 (Pair 2 frontend) for Bhavik Jethwa · nothing in this spec is implemented yet · Built 2026-10-03 12:35 UTC