Licensing model
A ModelxcelPro license is a signed grant of access, issued for one machine, with a start and an end. This page is the reference for the states a license moves through, the claims it carries, the difference between a trial and a paid license, and the two on-disk license formats — legacy v2 and current v3.
License states
At any moment the add-in is in exactly one of six license states. Three of them are active — they enable the feature groups on the ribbon — and three are not.
| State | Meaning | Features? |
|---|---|---|
| Unlicensed | No valid license is installed. | Off |
| Trial | An active trial (an issued signed trial; or, in developer builds only, a local 90-day trial). | On |
| Licensed | An active paid license. | On |
| Grace | Up to 7 days after a paid license expires; the status reads “renew now.” | On |
| Expired | The license — or the grace window — has ended. | Off |
| Invalid | A license is present but failed validation (wrong machine, bad signature, or a clock problem). | Off |
Features are enabled when, and only when, the state is Trial, Licensed, or Grace. There is no per-feature tier — every command that needs a license needs only an active license, and a trial unlocks the same set as a paid license. The greying-out is covered on the Activation page and in Troubleshooting.
What a license carries
A current (v3) license is a signed JSON document. The signature covers a fixed set of claims — change any byte and verification fails. The claims that matter to you:
| Claim | What it is |
|---|---|
machineCode | The machine this license was issued for. The add-in re-derives your machine code and requires a match — this is what makes a license machine-bound. |
validThrough | The inclusive last valid day (e.g. 2026-04-17). This is what the License Status dialog shows, to avoid an off-by-one “expired a day early” display. |
expiresUtc | The internal expiry instant — exactly the validThrough day + 1 at UTC midnight. |
features | What the license unlocks. A paid license carries ModelxcelPro; a trial additionally carries ModelxcelPro.Trial. |
email · name | Who the license was issued to (shown as “Licensed to…”). |
issuedUtc · licenseId | When it was issued and its unique id (lic_…) — the id the website’s freshness/revocation endpoint keys on. |
keyId · issuer | Which signing key signed it and the issuer string (“ModelxcelPro Licensing Portal”). |
renewedFromLicenseId | For a renewal, the id of the license it replaced. |
The signed claims define what is true; the add-in never trusts anything it computes from an unsigned source for entitlement. How the signature is checked is on the Security model page.
Trial vs paid
A license has a kind — Trial or Paid — and the two behave slightly differently at the edges:
- Both unlock the full product. A trial is not a reduced edition; it is the same features with a shorter runway.
- Only a paid license gets a grace window. After a paid license’s last valid day, features keep working for 7 more days (state Grace, “renew now”), then stop. A trial has no grace — when it ends, it ends.
- Issued trials are time-boxed. A signed trial can be valid for at most 90 days; it counts down from its own expiry date.
There is no self-serve local trial in shipped builds
A 90-day local trial (one that starts itself the first time you run the add-in) exists only in developer builds. In released builds, a machine with no signed license is simply Unlicensed (“No signed trial or paid license installed”). Beta access is granted as an issued signed trial or a paid license — both tied to your machine code and activated the same way. (A developer-only bypass also exists when a debugger is attached to a debug build; it cannot occur in production.)
The two license formats: v2 and v3
ModelxcelPro understands two on-disk license formats. The add-in routes by content: a license whose text begins with { is treated as v3 JSON; otherwise it is treated as a legacy v2 signed XML license. New licenses are always v3; existing v2 licenses keep working until they expire.
| v3 (current) | v2 (legacy) | |
|---|---|---|
| Container | JSON envelope + payload | Signed XML (Standard.Licensing) |
| Signature | ECDSA ES256 over the P-256 curve | The Standard.Licensing signature scheme |
| Machine-bound? | Always, via the machineCode claim | Only when its schema version is 2; older v2 licenses aren’t machine-bound |
| Moving machines | Requires a new or rotated license issued for the new machine (portal/seat policy) | Add-in-side counter: up to 2 machine changes / 365 days, then refused |
| Issued today? | Yes — all new licenses | No — kept valid for backward compatibility only |
The most important practical difference: v3 does not use the legacy v2 move counter. A v3 license is verified by signature, machine code, and expiry alone — there is no local “2 moves per year” allowance. Moving a v3 license to a new machine means getting a new or rotated license issued for that machine, governed by the portal’s seat policy (see Admin & signing).
How the state is decided
At startup the add-in loads the stored license, verifies it, and resolves the state from the dates: for a paid license, now before expiry is Licensed; within 7 days after expiry is Grace; beyond that is Expired. A signed trial is Trial until its expiry, then Expired (no grace). A wrong machine, a broken signature, or a system clock set backwards yields Invalid. The full startup sequence and the offline checks are on the Activation & machine binding page.
Where to go next