Subscription Plans
The price list customers buy from on the public /signup page: name, duration, price, per-plan connection/device limits, the BGPVR package granted, and which payment gateways may be used. A plan is what a payment applies to an account; a package is what the account may then watch. Since 2.9.323 the page and its editor are built like Clients, and Signup & Referrals → Ways to join → Paid plans shows the same table.
On this page

Create a plan
Subscription Plans → "New plan" (or "New plan" in Signup & Referrals → Ways to join → Paid plans). A side window with two tabs. Basics: Plan name, "Package they get" (what the buyer can watch, with its channel count), Description (optional, shown to customers on /signup), Price (in the plan's currency: a new plan is in EUR), Length (days), Connections at once, Set-top boxes and "Offer it on /signup". Payment methods: ePay.bg, Stripe, NOWPayments (Crypto), Revolut Pay, Rampex and CoinGate (Crypto) as cards, all but CoinGate ticked on a new plan. PayPal is hidden while Settings → Billing → "PayPal is frozen" is ticked, which is the default; the plan remembers its PayPal choice for when it is unfrozen. "Create plan".
Read the plan table
Plan (with its connections and boxes, or "Hidden · not offered to new people"), Package, Price ("9.99 EUR / 30 days"), Payment methods (a badge each, "None" if all are off), Shown (Shown / Hidden) and Open + ⋯ (Open, "Show on /signup" or "Hide from /signup", and last "Delete plan…" in red). The line under the title counts them: "3 plans · 2 shown on /signup · 1 hidden". While paid sign-up is off a note says the plans are not offered on /signup.
Change or hide a plan
Open → change what you need → "Save changes" (the save bar names the changes; closing with changes asks first). Only the fields of the form are sent, so what the form does not show — a stream profile, a locker mode, the currency — keeps its value (until 2.9.323 a save here reset them). A Stripe Price id set through the API is shown read-only under Payment methods with "Stripe charges the Stripe Price <id>, not this price.": Stripe keeps charging that Stripe Price, as a subscription, until you press "Clear" and save; from then on new Stripe checkouts take the plan's price as a one-time payment. Subscriptions already running in Stripe do not change. "Hide from /signup" in ⋯, or the Shown switch on Ways to join, takes a plan off /signup without deleting it.
Know what a purchase does
When a payment completes, the server applies the plan to the account: status becomes active; the expiry is extended by Duration Days from whichever is later — today or the current expiry; the plan's package is assigned; Max Connections and Max Devices are written onto the client; Timeshift/DVR/VOD/Live are copied from that package; any banked free days (referral and gift days) are added on top and zeroed; and the "previous package" marker from an expiry downgrade is cleared.
Retire a plan
⋯ → "Delete plan…", confirmed in the page. Deletion is immediate and removes the row outright — existing subscribers are unaffected because their access is already written onto their client record. To stop selling a plan but keep it, hide it.
Watch out
- A new plan is created in EUR: the console has no currency field. An existing plan keeps its own currency, shown after the price.
- A gateway badge in this table only means the checkbox is ticked. Customers are shown a gateway only when its credentials are also configured in Billing/Settings, so a plan can look payable here and offer no payment method on /signup.
- The list endpoint is public (unauthenticated callers get the enabled plans, with unconfigured gateways stripped). Anything you type into Description or Name is customer-visible.
- Staff need "Manage Packages" for this page; since 2.9.323 they see every plan, hidden ones too, as the admin does.
- Plans need the Pro licence (Billing): below it, creating, editing and deleting a plan is refused, and Settings shows no Billing tab.
- A paid renewal currently rewrites Timeshift/DVR/VOD from the plan's package, which removes a feature add-on the subscriber bought separately. Re-tick it on the client after a renewal.
- Since 2.9.323 the API that saves a plan (PUT /api/billing/plans/<id>) checks each field it is sent and refuses a bad one with a 400 and the field name — a non-numeric length, a negative price, an unknown package or a currency that is not three letters. The console already keeps you inside the ranges; this guards a direct API call.