# Subscription

> The Subscription row of the Account page, the plan and its status, renewal, license seats, the stations signed in to the account, the attention states, Manage subscription, and free mode with the runtime countdown.

The **Subscription** row reads the subscription of the account this station is signed in to,
and what it means for this station: whether it holds a license seat, and if not, how long the
runtime may run before free mode stops it. It is display only, refreshed at sign-in, at boot,
every 24 hours and every time the Account page opens; a failed refresh keeps the last snapshot
and says when it was taken.

While the station is signed out, or signed in with no snapshot yet, the row shows one line:
"Sign in to see your subscription plan, status and the stations using its license seats."
The temporary-identity banner described under [Account](account-ganter-account#the-temporary-identity-notice)
sits above this row whenever it applies.

## Plan and status {#plan-and-status}

| Element | What it shows |
| --- | --- |
| Billing | **Billed monthly**, **Billed annually** or **Billed every three years**, or **No subscription** when the account has no plan. No plan name is shown: there is one subscription, so naming it would only invite the question of which others exist. |
| Status | Trial, Active, Payment past due, Canceled, or, with no plan, "This account has no active plan." A status the app does not know is shown as the server sent it. |
| Renewal line | "Renews on {date}." while renewal is on; "Ends on {date}. Renewal is turned off." when it is off; "Trial ends on {date}." during a trial; nothing when canceled. The date reads in the format set under Settings > Localization. The line is not drawn while the **Renewal ends soon** banner already names the date. |

There is one plan and no tiers. Monthly, annual and longer terms differ only in commitment;
what the station may do never depends on the plan.

## License seats {#license-seats}

A subscription buys a number of seats, one per station. A station occupies a seat while its
sign-in can still renew silently, that is, for 90 days after it was last seen; signing out
releases the seat at once. The server, not the app, decides which stations hold a seat and
reports the answer per station; the app reads its own line.

The gauge, **License seats**, shows the seats in use over the seats bought: one cell per
seat, used cells filled, up to twelve seats, and a proportional bar above that. The readout
reads "{used} / {total}" with the caption **seats in use**, or **over your seat limit** when
more stations occupy seats than the plan bought; the tooltip reads "{used} of {total}
license(s) in use." The gauge is drawn only while the account has a plan with at least one
seat.

When seats run out, the stations beyond the quantity run in free mode: the server does not
grant them a seat, and this row says so with the **No license assigned to this station**
banner. Freeing a seat (signing another station out, or waiting for one to age out) or raising
the quantity licenses the next station at its next refresh.

## Stations signed in to this account {#stations-signed-in-to-this-account}

With a plan, the row lists every station registered to the account, most recently seen first:
a station glyph, the name it reported (its Windows machine name; **Unnamed station** when
blank), the chip **This station** on the row that is this computer, and "last seen today",
"last seen yesterday", "last seen {n} days ago", the date, or "last seen: unknown". A station
that signed in to a different account moves to that account. There is no eviction command
here: a retired station releases its seat by signing out, or ages out after 90 days.

## Subscription status from {#subscription-status-from}

Under the list, "Subscription status from {date and time}." names when the snapshot was
fetched. It stays visible when the station is offline or a refresh failed, so an old snapshot
is never mistaken for the present.

## Manage subscription {#manage-subscription}

**Manage subscription** opens the site's subscription page, where a signed-in visitor buys a
plan when none exists and reaches the billing portal (payment method, cancellation, monthly or
annual, quantity, invoices) when one does. On the station's window it opens in the default
browser; in a plain browser it opens a new tab. The button sits at the foot of the card, or
inside the attention banner when one is showing.

## License attention {#license-attention}

When the subscription needs action, the card leads with a banner. The same diagnosis marks
the Account entry on the rail with an exclamation (amber for the first three, red for the
last two) whose tooltip carries the banner's text, and the entry then opens straight on this
row. Nothing else is raised for it: no snackbar and no system notification.

| Title | Severity | Text | When |
| --- | --- | --- | --- |
| Payment is past due | Caution | This station remains licensed while billing is retried. Update the payment method to avoid losing its license. | Status is past due and this station holds a seat. |
| Renewal ends soon | Caution | The subscription ends on {date} because renewal is turned off. After that, this station runs in Free mode unless the subscription is renewed. | Active, renewal turned off, end within 14 days. |
| Renewal is turned off | Caution | Renewal is turned off, but no end date is available. This station runs in Free mode when the subscription ends unless renewal is restored. | Active, renewal turned off, no end date known. |
| Subscription canceled | Critical, loud | This station is running in Free mode. Start a new subscription to restore an unlimited runtime. | Status is canceled. |
| No license assigned to this station | Critical, loud | This station is running in Free mode because the subscription has no license free for it: a license stays with the station that took it. To free one, sign out of the account on that station or remove it on the subscription page of the website. Adding a license to the subscription also covers this station. | Status is active or past due and the server did not grant this station a seat. |

Only one banner shows at a time, in the order the table lists them from the bottom up:
canceled first, then a missing seat, then past due, then the renewal cases. The two loud
ones are the states where the runtime is already running down to a stop. A trial with no
seat, and an account with no plan, raise no banner; the free-mode countdown alone says the
station is not licensed.

## Free mode and the runtime countdown {#free-mode-and-the-runtime-countdown}

A station is **licensed** when three things hold at once: it is signed in, the subscription
is active or past due (past due keeps working), and the server granted this station a seat.
Offline is not punished: the cached grant stands for as long as the stored sign-in lives. A
licensed station's runtime never stops on its own.

Everything else is **free mode**. Every feature stays available; what is limited is how long
the runtime runs before it stops and waits for a restart:

| State | Window |
| --- | --- |
| Signed out | 1 hour |
| Signed in without a seat (no plan, canceled, or beyond the quantity) | 2 hours |
| Licensed | No limit |

The window counts from the runtime's start. Signing in during a countdown widens the window
and keeps its start; signing out during one restarts it from that moment, so a station is
never stopped on the tick the state changed. Losing the license (a cancellation, a seat lost
at a refresh) starts a fresh window from that moment. Becoming licensed while stopped restarts
the runtime by itself.

### What you see {#what-you-see}

| Where | What |
| --- | --- |
| Status bar, first item | A clock glyph in amber and "Free · mm:ss" counting down; tooltip "Free mode: the runtime stops when the timer runs out. Sign in or add a license to remove the limit." Hidden while licensed. |
| Five minutes before the stop | A notification, **Free-mode time limit**: "The runtime will stop in about {n} minutes. Sign in or add a license to remove the limit.", raised once per window, and a system toast when the window is hidden or minimized. |
| At the stop | A notification, **Runtime stopped**: "The free-mode time limit was reached and the runtime stopped. Sign in or add a license to remove the limit, or restart the runtime at the station.", and a system toast. |
| The shell band, above the rail on every route | **Runtime stopped**, "Acquisition, Logic and recording are paused. Your configuration and recorded runs are intact.", and the **Restart runtime** button on the station's own window. A browser reads "The restart happens at the station, the computer running Ganter Lab." instead. |
| Status bar while stopped | "Free · runtime stopped", and in place of the health and alarm indicators one message that leads somewhere: "Sign in for a longer free window" or "Add a license to remove the limit" (both open the Account page), or "Restart the runtime to continue" on the station's window. |
| Every page but this one | A paused notice, "This screen is paused": "It reads the station live, and nothing is being read while the runtime is stopped. It waits here instead of showing values that are no longer true." |

### What stops and what stays {#what-stops-and-what-stays}

The stop closes the station to every mutation first, drains the work already admitted, then
aborts any run still open (sealing its file as aborted), stops the logic sweep and stops
communication, the embedded OPC UA server included. The application itself, the MCP endpoint
(inspection tools only) and this page stay up. Every write anywhere answers "Runtime stopped"
until a complete restart: Connector and Logic changes, Process operations, dashboard editing,
settings, backups, and users, roles and PINs. Signing in and out of a local user, changing the
theme, and the Ganter account's own Sign in, Sign out and refresh remain available, because
they are what fixes the situation.

**Restart runtime** is offered only on the station's own window, never to a browser, so a
free-mode window cannot be reset from across the network. It is immediate and unlimited, and
it opens a fresh window. A restart never resumes or restarts a procedure that was running.
A restart that fails leaves the station stopped, with "The runtime could not be fully
restarted. Review Events and try again.", and the button stays for another try. The limiter
writes its steps to the Events console under the **Licensing** source.

## What the row does not do {#what-the-row-does-not-do}

- It never blocks a feature. There are no tiers and nothing is locked behind the plan.
- It does not buy, cancel or resize anything. Every change to the subscription happens on the
  site, behind Manage subscription.
- It does not decide the seat grant. The server computes it and the app reads its own
  station's line; the app never infers a license from the counts.
- It does not free another station's seat. Sign that station out, or let it age out.
- It shows nothing while signed out, apart from the temporary-identity banner.
