Subscription plans, lifecycle & architecture
This document serves as a list of the subscription plans which should be avaliable to be purchased, along with the tools they offer, limits, price and usage restrictions.
See:
In short, for organisations and users, the Subscriptions and Plans structure should work as
follows: the organisation purchases N units of a plan, which entitles it to enable N members to
use the tools provided by that plan for that product. Seats are per product, so they cap how
many members may be enabled for that product — not how many may use it at the same instant.
Enabled members are subject both to a concurrency cap and to volume limits over time
(MAX_CALCULATIONS_PER_DAY and MAX_JOB_PER_WINDOW), the latter applying to the non-Pro plans.
| Tool | Analysis |
|---|---|
| GLASS_CHECKER_STATIC | Static Analysis |
| GLASS_CHECKER_COLD_BENDING | Static Analysis |
| GLASS_CHECKER_IMPACTOR | Dynamic Analysis |
| GLASS_CHECKER_THERMAL | Thermal Analysis |
Rank orders the commercial ladder; category carries the semantics. Exactly one plan per product
has category Free — that plan is the fallback target on expiry. See
Subscription Lifecycle §4.
| Plan | Category | Rank | Term |
|---|---|---|---|
| GLASSS Free | Free | 0 | perpetual |
| GLASSS Students | Academic | 0 | 1 year |
| GLASSS Base | Commercial | 1 | 1 year |
| GLASSS Pro | Commercial | 2 | 1 year |
| GLASS_CHECKER_STATIC | GLASS_CHECKER_COLD_BENDING | GLASS_CHECKER_IMPACTOR | GLASS_CHECKER_THERMAL | |
|---|---|---|---|---|
| GLASSS Free | ✔️ | |||
| GLASSS Students | ✔️ | |||
| GLASSS Base | ✔️ | |||
| GLASSS Pro | ✔️ | ✔️ | ✔️ | ✔️ |
| GLASSS Free | GLASSS Students | GLASSS Base | GLASSS Pro | |
|---|---|---|---|---|
| Maximum Bounding Box Area [mm²] | 40000000 | 40000000 | 40000000 | 40000000 |
| Maximum Packages | 2 | 3 | 3 | 5 |
| Maximum Layers | 8 | 10 | 13 | 15 |
| Maximum Holes | 5 | 5 | 8 | 10 |
| Maximum 2D Mesh Nodes | 8000 | 8000 | 10000 | 12000 |
| Maximum 3D Mesh Nodes | 32000 | 32000 | 40000 | 48000 |
| Maximum Barrier Loads | 2 | 2 | 2 | 2 |
| Maximum Point Loads | 2 | 2 | 2 | 2 |
| Maximum Job Per Window | 2 | 2 | 4 | No Limit |
| Maximum Calculation Per Day | 10 | 100 | 20 | No Limit |
| Maximum Concurrent Calculations | 1 | 1 | 1 | 1 |
| GLASSS Free | GLASSS Students | GLASSS Base | GLASSS Pro | |
|---|---|---|---|---|
| Maximum Combinations per Static Analysis | 30 | 30 | 50 | 100 |
| Maximum Steps Number for Dynamic Analysis | ✖️ | ✖️ | ✖️ | 200 |
A single annual price per plan (matching the seeded Plan.Price / DurationInMonth = 12).
| Annually | |
|---|---|
| GLASSS Free | Free |
| GLASSS Students | Free |
| GLASSS Base | 100€ / per unit |
| GLASSS Pro | 1000€ / per unit |
There should be a 7-day free trial on first time a paid plan is purchased. Since the two priced
plans have different tools access, the free trial should be applied the very first time each plan
is purchased. Eligibility is derived from the organisation's subscription history, so a lapsed
trial is never re-granted — see Subscription Lifecycle §11.
| Seats | |
|---|---|
| GLASSS Free | 1 |
| GLASSS Students | 1 |
| GLASSS Base | 1 |
| GLASSS Pro | 1 |
| Plan | Paddle Product ID | Billing | Price (per seat) | Paddle Price ID |
|---|---|---|---|---|
| GLASSS Free | (no Paddle product — internal only, 1 seat, auto-assigned) | — | Free | — |
| GLASSS Students | (no Paddle product — internal only, 1 seat, free) | — | Free | — |
| GLASSS Base | pro_01ky9b9rgf9n85yrpp9zgan7q4 |
Annual | 100 € | pri_01ky9bdktysm0v4egbkeytsxhv |
| GLASSS Pro | pro_01ky9bdm01h3z5gemhyzr2c00n |
Annual | 1000 € | pri_01ky9bdm8kehhe735nzvqahw4w |
The Paddle price IDs above were created for the earlier 50 €/500 € annual figures and need
re-issuing for the 100 €/1000 € prices.
saas.Things still to be handled at the application level, not in the Paddle catalog:
trial_period), only the first time an organization subscribes to each plan (Base and Pro tracked separately).Plan rows with no Paddle product, as agreed.This document describes the lifecycle of subscriptions inside the application: every phase a
subscription goes through, every scenario that must be handled, and the behaviour required at
each step.
It is a specification, not a description of the current implementation. Where today's
behaviour is mentioned it is explicitly marked (current behaviour) so it cannot be mistaken
for the specification.
See:
Everything in this document is scoped per product. An organization holds at most one active
subscription per product, so every phase below describes what happens to one product's
subscription. An organization with GLASSS and OSM subscriptions runs two independent lifecycles.
The following invariants hold everywhere and are not restated in each chapter:
null means unlimited, for seats and for every limit value. The absence of a limit isA subscription is not a mutable row. It is a chain of period records, each describing one
plan, one quantity and one term. Every plan change, quantity change or term change closes the
current record and opens a successor that links back to its predecessor.
This model is what makes the rest of the document expressible:
| It gives you | Because |
|---|---|
| History — "what was this organization entitled to on 12 March, and what did it pay?" | Closed records are never overwritten |
| Trial eligibility | The chain records whether this organization ever held a trial on this plan |
| Proration | The record being closed carries the term and price the refund/charge is computed against |
| Exactly-once renewal | Renewal creates a successor, and a record can only have one — a second concurrent attempt violates the constraint and stops |
That last point deserves emphasis: exactly-once renewal needs no separate idempotency table and
no distributed lock. It falls out of the one-successor constraint. Two application replicas
running the renewal pass concurrently will both find the same expired record, and exactly one
will succeed in attaching a successor.
Every status must answer five independent questions. These are the questions the readers of the
system actually ask, and they are the questions that a single "is it active?" boolean cannot
answer.
| Status | Grants tools | Occupies the Active slot | Counts toward seats | Bills / renews | Terminal |
|---|---|---|---|---|---|
| Draft | No | No | No | No | No |
| Active | Yes | Yes | Yes | Yes | No |
| Expiring | Yes | Yes | Yes | No | No |
| Suspended | No | Yes | No | Retry only | No |
| Cancelled | No | No | No | No | Yes |
| Expired | No | No | No | No | Yes |
Meanings:
Two consequences worth stating explicitly:
Expiring and Suspended both occupy the Active slot but differ completely on access. SlotExpiring is set seven days before the end date purely to avoid sendingStatus == Active, this revokesExpiring means only "will not renew".)"Upgrade" and "downgrade" decide whether the customer pays today or waits until period end,
so they are pricing decisions and must be defined precisely rather than inferred.
Each plan carries two independent attributes:
Free, Commercial or Academic. Category carries the semantics; rank| Plan | Category | Rank |
|---|---|---|
| GLASSS Free | Free | 0 |
| GLASSS Students | Academic | 0 |
| GLASSS Base | Commercial | 1 |
| GLASSS Pro | Commercial | 2 |
Classification of a change from plan A to plan B:
| Condition | Classification | Payment timing |
|---|---|---|
| Both Commercial, rank(B) > rank(A) | Upgrade | Immediately, prorated |
| Both Commercial, rank(B) < rank(A) | Downgrade | Deferred to period end |
| Both Commercial, rank(B) = rank(A) | Lateral | Deferred to period end |
| A is Free or Academic, B is Commercial | Term creation (chapter 6) | Immediately, full term |
| B is Free or Academic | Term destruction (chapter 6) | No charge |
Rules:
Free. That plan is the fallback target forSeats are per product. There is no organization-wide seat limit.
Access requires two independent things to be true, and they are separate levels:
Level 1 — organization activation. A member of an organization is activated or
deactivated. This is organization-wide and uncapped: an organization may invite and
activate as many members as it likes.
Level 2 — product enablement. An activated member may be enabled for individual products
the organization holds a subscription for. This level is capped, by that product's seats.
Rules:
Seat capacity for a product is:
Subscription.Seats = Plan.Seats × Subscription.PlanQuantity (null ⇒ unlimited)
Subscription.Seats is a stored denormalised copy of that product, kept so that reading
capacity does not require loading the plan. It is not an override. It must be recomputed in
the same atomic operation as any plan or quantity change, or it drifts from the truth.
Enforcement is preventive, at a single point. The cap is checked when a member is enabled
for a product — whether that happens on invitation acceptance or by an explicit action. It is
not a periodic correction. A background sweep may verify the invariant, but it is never the
mechanism by which the cap is applied.
(Current behaviour: enforcement is entirely retroactive — invitation acceptance and manual
activation perform no check at all, and the only correction happens inside the expiry job.)
Because level 2 gates access, the question the software asks is no longer "may this organization
use tool X?" but "may this member, in this organization, use tool X?" Both must be true: the
organization is entitled to the tool through a subscription, and the member is enabled for the
product that grants it.
(Current behaviour: the entitlement check takes only an organization id. Making it member-aware
is a change to the core licensing API and to its caching, which currently caches one tool set
per organization.)
Every phase in Part II is a composition of four operations. Naming them removes a genuine
ambiguity in the lifecycle: whether moving from Free to Base is "taking out a new subscription"
or "upgrading a tier". It is neither — it is term creation.
| Operation | What it does | Typical trigger |
|---|---|---|
| Term creation | Assigns a start date, an end date, an auto-renew setting and a price where none existed. Free is perpetual (EndDate = null), so moving from Free to a paid plan creates a term. |
First paid purchase, trial start |
| Term extension | Moves the end date forward by the plan's duration, leaving plan and quantity untouched. | Renewal |
| Term alteration | Changes plan or quantity within an existing term. | Upgrade, downgrade, quantity change |
| Term destruction | Removes the term: back to perpetual (EndDate = null, auto-renew off) on the Free plan, or to nothing at all if the product has no Free plan. |
Expiry, unsubscription |
Invariants tying terms together:
AutoRenew = true ⇒ EndDate ≠ null. An auto-renewing perpetual subscription can neverPlan.DurationInMonth = null ⇒ EndDate = null. A perpetual plan has no term to end.The shared operation the draft called Plan change is not only about entitlements. It acts on
five axes, and a phase that touches one must state its effect on all five:
This matters because of a fact easy to miss: GLASSS Free and GLASSS Base grant an identical
tool set. The most common purchase in the system therefore changes no entitlements at all.
Its entire value is in axes 2 and 4. A specification that treated "plan change" as an
entitlement operation would describe the one axis that does not move.
Every plan change ends with cache invalidation across all five axes, performed after the
change commits, never before. Any derived value that is cached must have a bounded lifetime; no
cached entry may be immortal.
Usage counters (per-day, per-window, concurrency) are runtime state, and their identity must
be chosen carefully, because it determines what resets them.
The counter's identity must match the scope of the limit being enforced, and must never
include the plan.
Carry-over rule. Consumption carries across a mid-period plan change, and the new plan's
value applies to the existing counter. A downgrade can therefore leave a member already over
their new limit and blocked for the remainder of the period. This is intended: the alternative
is a reset that can be farmed by bouncing plans.
Business-day definition. The system has exactly one definition of "day" for quota purposes,
and one answer to when a subscription starts and ends. (Current behaviour: usage quotas roll at
Europe/Rome midnight while subscription dates are UTC, so the "usage day" and the "subscription
day" are different days for part of every night.)
Each chapter states: the trigger, the records closed and opened, the operations from
Part I applied, the side effects, and the failure branches.
Trigger. An organization is created.
Records. A first Active record is opened on the product's Free plan, quantity 1, perpetual
(EndDate = null, auto-renew off).
Operations. Term creation with a perpetual term.
Side effects. Entitlements derived from the Free plan's tools; seat capacity set to the Free
plan's seats; the creating user becomes Owner.
Requirements.
Failure branches. If subscription creation fails, organization creation fails with it.
Trigger. An organization buys a product for which it holds no subscription.
Note this is genuinely distinct from chapter 15 (upgrade). Because every organization receives a
Free GLASSS subscription at creation, it is always subscribed to GLASSS — so for GLASSS this
phase never occurs, and Free → Base is chapter 15's term creation instead. This phase applies to
a second product.
Records. A new chain begins: an Active record on the chosen plan.
Operations. Term creation.
Side effects. All five axes of chapter 7. Seat capacity appears where there was none, so
members may now be enabled for this product.
Failure branches. Payment declined → the record stays Draft and grants nothing; nothing
else in the organization changes.
Trigger. An organization purchases a paid plan it has never trialled.
Records. A record with IsTrial = true, on the target plan, with a term equal to the trial
length (7 days — see Subscription Plans).
Operations. Term creation.
Eligibility. Derived from the chain history: an organization is eligible for a trial on a
plan if no record in its history for that plan carries IsTrial = true. Consequences:
Side effects. Full entitlements and limits of the target plan for the trial's duration. The
trial grants real access, not a restricted preview.
End of trial. Two outcomes:
Failure branches. Conversion payment fails → chapter 14 (dunning), from which the record may
still recover.
Trigger. An Active record with auto-renew on reaches its end date.
Records. The current record closes as Expired; a successor opens as Active with the same
plan and quantity and a term extended by the plan's duration.
Operations. Term extension.
Side effects. Entitlement validity re-derived to the new term (chapter 6). Seat capacity
recomputed — unchanged unless a deferred change applies. If a deferred change is pending
(chapter 22), it is applied as part of this renewal: the successor opens on the pending plan
and quantity, and the pending intent is cleared.
Requirements.
Failure branches. Payment fails → chapter 14.
Trigger. An Academic (Students) record approaches its end date. Academic terms are one year.
Records. As chapter 12, but the gate is eligibility, not payment.
Operations. Term extension.
Requirements. Near the end of the term — and while the record is Suspended, if it reached
that state — the member must be able to re-establish academic eligibility: supplying an academic
email address that can be verified, to which a verification code is sent. Successful
verification renews the term.
Deferred: this verification flow is specified but not built. Administrators renew Academic
subscriptions manually in the meantime.
Failure branches. No re-verification by the end of the dunning window → chapter 20 (expiry),
falling back to the product's Free plan.
Trigger. A charge fails — at renewal, at trial conversion, or on an immediate upgrade
payment.
Records. The record moves to Suspended. It is not closed: it stays in the chain and
keeps occupying the product slot, so no competing subscription can be created while the
situation resolves.
Operations. None on the term. The term is untouched; only status changes.
Side effects.
Dunning window: 2 days.
Active, entitlements and limits rebuilt, seatsTrigger. The customer moves to a higher-ranked Commercial plan (chapter 4).
Records. The current record closes; a successor opens on the new plan.
Operations. Term alteration — or term creation when moving from Free or Academic, where
no term existed.
Side effects. All five axes of chapter 7. Note again that Free → Base changes no
entitlements: the effect is entirely in limits and branding.
Payment. The difference for the remaining period is charged immediately. Coming from a
perpetual Free plan there is no "remaining period" and no prior price, so the charge is a full
term at the new plan's price.
Term anchoring. Whether the upgrade keeps the original renewal anniversary or starts a fresh
term from today must be stated per product, and it must be the same answer as the one the
provider applies, or our end date and the provider's billing period diverge permanently.
Failure branches — each needs an explicit outcome:
Trigger. The customer moves to a lower-ranked Commercial plan.
Records. Nothing closes now. The intent is recorded as a deferred change (chapter 22) and
applied at the next renewal, which opens the successor on the lower plan.
Operations. At effect time: term extension combined with term alteration.
Side effects. Until the period ends, nothing changes — the customer keeps the tools,
limits, seats and branding they paid for. At effect time, all five axes of chapter 7 apply, and
seat reduction (chapter 5) runs if the new plan provides fewer seats.
Payment. No charge now; the next renewal is at the lower price.
Failure branches. See chapter 22 for what happens if the intent is superseded, cancelled, or
if the target plan is retired or repriced before it takes effect.
Trigger. The customer buys more units of their current plan.
Records. The current record closes; a successor opens with the higher quantity.
Operations. Term alteration.
Side effects. Seat capacity recomputed upward (chapter 5), and Subscription.Seats
recomputed in the same operation. Entitlements are unaffected — quantity does not change which
tools are granted.
Raising the cap does not enable anybody. It grants the right to enable more members;
enabling them stays a deliberate Owner action. In particular, members previously disabled by a
reduction are not automatically re-enabled.
Payment. The difference for the remaining period is charged immediately.
Failure branches. As chapter 15. In particular, if the quantity-increase charge fails after
members have already been enabled into the new seats, the rollback must disable them again —
the seat change and the payment outcome are one unit.
Trigger. The customer reduces the number of units.
Records. Nothing closes now; the intent is recorded as a deferred change (chapter 22) and
applied at the next renewal.
Operations. At effect time: term extension combined with term alteration.
Side effects. At effect time, seat capacity is recomputed downward and seat reduction
(chapter 5) runs.
Seat reduction rule. When the cap drops below the number of enabled members, every
enablement for that product is disabled. The Owner then re-enables the members they want,
within the new cap.
This is deliberately simple. The alternative — automatically choosing which colleagues lose
access — makes the system arbitrate a decision that belongs to the customer, and any ordering
rule (newest first, least recently active) needs state that must be maintained correctly to
avoid disabling the wrong people. Disabling all and letting the Owner rebuild is predictable and
never silently wrong.
Ordering requirement. The quantity change and the seat reduction are one atomic unit.
Reducing the quota first lets a concurrent enablement fill a seat that was about to be freed;
reducing seats first evaluates the excess against the old, higher quota and frees nothing.
Trigger. The customer unsubscribes.
Records. The record moves to Expiring. It does not close, and nothing else changes.
Operations. None yet. Auto-renew is turned off.
Side effects. None until the term ends: the customer keeps everything they paid for. They
are told when access will change and what it will change to.
At term end → chapter 20.
Un-cancelling. Re-enabling auto-renew before the term ends returns the record to Active.
Nothing has been lost, because nothing was closed.
Mid-trial unsubscription follows the same path: the trial runs to its end, then chapter 20
applies.
Trigger. An Active or Expiring record reaches its end date without renewing — because
auto-renew was off, or because a dunning window elapsed (chapter 14), or because Academic
re-verification did not happen (chapter 13).
Records. Two cases:
Free, chapter 4): the current record closes asExpired, and a successor opens as Active on the Free plan, quantity 1, perpetualEndDate = null, auto-renew off) — both in one transaction.Expired and no successor isOperations. Term destruction, then term creation in the first case.
Side effects — in this order, and resumable:
Subscription.Seats; run seat reduction (chapter 5).The ordering matters. Getting it wrong produces either the old plan's tools with the new plan's
limits, or — the expensive one — the new plan's limits with the old plan's tools, which is
over-entitlement that costs money. If the sequence is interrupted, the safe partial state is one
where access has already been reduced but the new record is not yet fully built; never the
reverse.
Notification. The customer is told the term ended, what they have now, and what they lost.
Trigger. An organization sitting on the Free plan (or holding nothing) buys a paid plan
again.
Records. The Free record closes; a successor opens on the paid plan. Where the organization
held nothing, a new chain begins.
Operations. Term creation.
Requirements.
Downgrades (16) and quantity decreases (18) take effect at period end, so the intent must live
somewhere between request and effect. A subscription therefore carries a pending change:
a pending plan, a pending quantity, and the date it takes effect.
Division of authority. We are authoritative for what the next period looks like; the
billing provider is authoritative for amounts and when the charge happens. Both sides hold a
version of the schedule, so chapter 23 covers disagreement.
Scenarios that must be handled:
Money lives with the billing provider; entitlement lives here. The two must be reconciled, and
they will disagree.
Cancelled) orThe lifecycle so far covers changes the customer initiates. Changes to the catalogue alter
what existing subscribers hold, and they need the same rigour.
Limits and tools are read live, not snapshotted at purchase. Editing a plan therefore
changes what every existing subscriber of that plan has, immediately and in both directions.
That is the intended behaviour, and it puts the burden on the following rules:
Plan.IsActive is a catalogue flag — never an entitlement or limit gate. Retiring a plan(Current behaviour, and the reason this rule is stated so firmly: limit resolution filters on
Plan.IsActive while entitlement resolution does not. Deactivating a plan therefore leaves
every subscriber with all their tools and no limits at all, because an absent limit is read
as unlimited. Retiring a plan currently makes it strictly more permissive.)
Organizations are never hard-deleted. When an Owner deletes their organization — including
by deleting their own account (chapter 26) — the organization is deactivated:
So a deactivated organization retains its commercial record and nothing else. Reclaim restores
the organization and its billing history — never its data.
Ending subscriptions must cancel them provider-side. An organization deactivated here while
the provider keeps charging is the highest-consequence failure in this flow.
Deactivated organizations grant nothing. Organization status is part of the access decision;
a deactivated organization's subscriptions and entitlements are inert regardless of their own
status.
VAT id and organization email are two separate unique keys. The organization email is the
organization's own field, supplied at registration — distinct from any member's login — and it
must be confirmed by email verification at registration, so that a reclaim always has a
known-good address to reach.
On a collision when creating an organization:
Because reclaim grants access to the prior billing history, that verification step is what
protects it. A user who supplies a VAT id or email that does not match the deactivated record is
shown a specific error rather than silently getting a fresh organization.
User accounts are fully deletable. Erasure is real: all records identifying the person are
removed. Two things survive, anonymised rather than deleted:
The same anonymise-don't-delete rule covers invitations: invitation records are never
deleted — they carry only an email address — and an already-accepted invitation simply has its
membership reference cleared.
The sole-Owner constraint. A user who is the only Owner of an organization cannot simply
vanish. Before erasure they must, for each such organization, either transfer ownership to
another member (where one exists) or confirm that the organization be deactivated (chapter 25).
This whole flow is atomic and all-or-nothing. The system enumerates every organization the
user owns and collects a decision for each. Nothing is deleted and no ownership is transferred
until every organization has been resolved — abandoning the flow at any point leaves
everything exactly as it was. The per-organization choices are therefore collected as a pending
decision set and applied only on final confirmation.
Email reuse. After erasure the address is free. A new account may take it and inherits
nothing. This does not collide with organization reclaim, which keys on the organization's own
VAT id and email.
After a downgrade — or a live limit tightening (chapter 24) — an organization can hold work that
violates its current limits: five packages on a plan allowing two, a mesh above the new node cap,
more combinations than the new plan permits.
This must be defined, because the limits are checked in two different places:
The behaviour to specify, for each: is the work readable, re-runnable, exportable, or
locked? The default this document proposes: existing work remains readable and exportable,
but cannot be re-run until it is brought within the new limits, and the message says exactly
that rather than surfacing a bare limit error.
Related: already-generated reports carrying the organization's logo after a downgrade to a
plan without custom branding. They are historical documents and are not retroactively
re-branded.
A running analysis is never interrupted by a plan change, a seat reduction, a product
disablement, an organization deactivation or an account erasure. It runs to completion.
Subsequent operations are gated by their own logic and see the new state. This keeps the rule
simple and avoids half-finished computations, at the cost of a brief window in which work
completes under an entitlement that has just been withdrawn.
One requirement follows: releasing a concurrency slot must not depend on the member still
existing, since the run may outlive their enablement or their account.
Collected rules, each stated once here and referenced from the phases:
Each transition states what the customer is told, and who is told. At minimum:
| Transition | Notification |
|---|---|
| Trial started | What is included, and when it ends |
| Trial ending | Ahead of the end date, with the conversion price |
| Renewal approaching | Ahead of the charge, with the amount |
| Renewed | Confirmation and the new term |
| Payment failed | The consequence (all access blocked) and the deadline |
| Suspended | Access is blocked and how to restore it |
| Upgraded / quantity increased | What changed and what was charged |
| Downgrade / decrease scheduled | What changes, and when |
| Deferred change applied | Confirmation at the point it takes effect |
| Unsubscribed | What they keep, until when, and what happens after |
| Expired | What they have now and what they lost |
| Seats reduced | That enablements were cleared and must be re-established |
| Price changing | Advance notice, with the right to cancel first |
| Organization deactivated | Confirmation, and what was irreversibly deleted |
Notification state is tracked separately from subscription status (invariant 1.4).
The following must be reconstructable after the fact, for billing disputes and support:
The successor-chain model (chapter 2) provides most of this by construction: closed records are
never overwritten. What it does not provide by itself is actor and timestamp — who did it and
when — which must be recorded per transition.
Every behavioural question is settled above. What follows is deliberately not yet built, listed
so an intentional gap is never mistaken for an omission:
This document describe the structure of the subscription system inside the application.
See:
The portal provides engineering calculation tools that can be accessed via:
The system must allow for:
Represents an engineering firm or practice.
It is a commercial product sold by the portal.
For instance:
Features:
It is a technical feature that can be enabled via the software.
Examples:
Features:
It defines the product functional catalogue.
This answers the question:
“Which tools are included in this product, regardless of the plans?”
Used for:
It represents a marketing plan for a product.
Features:
Free, Commercial or Academic. Exactly one plan per product hasExamples:
It defines the features of the plan.
Answers the question:
“Which tools are included in this plan?”
Reason:
This represents an organisation’s purchased instance of a plan.
Characteristics:
Subscription.Seats = Plan.Seats * Subscription.PlanQuantity,Seats are per product. There is no organisation-wide seat limit: an organisation with a
GLASSS subscription of 5 seats and a ConcreteChecker subscription of 2 seats can have up to 5
members enabled for GLASSS and up to 2 enabled for ConcreteChecker.
Access therefore has two independent levels:
Deactivating a member organisation-wide disables every product enablement they hold. An active
member may be enabled for any number of products. See Subscription Lifecycle §5.
A Subscription is not a mutable row: it is a chain of period records, where each plan,
quantity or term change closes the current record and opens a linked successor. See
Subscription Lifecycle §2.
It represents actual and verifiable authorisation.
It answers the key question:
“Can this organisation use this tool at this time?”
Characteristics:
Reasons for implementation:
Entitlements are purely derived and are never authored by hand. Administrators act on
subscriptions (plan, quantity, expiration) and entitlements follow, which is what makes the
delete-and-rebuild strategy safe. Trials are not extra entitlement rows either — they are a flag
on the subscription record (see Subscription Lifecycle §11).