Activation & machine binding
A license is issued for one machine and proves it belongs there. This page explains how your machine code is computed (safely — it’s a hash, never your raw hardware identifiers), how binding is enforced offline, a planned online check that will add revocation on top, and what it takes to move to a new machine.
Your machine code
The machine code is a SHA-256 hash rendered as 64 lowercase hex characters. The add-in derives it from at least two stable machine signals — drawn from the Windows machine GUID, the system drive’s volume serial, and the first active network adapter’s hardware address — joined and hashed. Two key properties:
- It is a one-way hash, not your hardware IDs. The raw identifiers are never stored as, or transmitted as, the machine code — only the hash is. You cannot recover the underlying signals from the code.
- At least two signals are required. If fewer than two stable signals are readable (rare, and most common on heavily locked-down virtual machines), the code shows “Unavailable” and activation can’t proceed until the machine exposes enough signals.
Where to find your machine code
Open ModelXcel Pro → Help → License Status (keytip LS). The dialog shows your read-only machine code with a Copy button. Include it when you request a license — each license is bound to the code it was issued for.
Why a license is bound to one machine
A current (v3) license carries a signed machineCode claim. On every check the add-in re-derives the machine code for the computer it’s running on and compares it (case-insensitively) to the claim. A match is required; a mismatch makes the license invalid for this machine with the message: “This license was issued for a different machine. Copy this machine code and request a reissue.” Because the comparison is over a signed claim, the binding can’t be forged without re-signing — which only the licensing portal can do.
Legacy v2 licenses behave slightly differently: only v2 licenses at schema version 2 are machine-bound (older v2 licenses are accepted without a machine check), and they additionally use an add-in-side move counter — see Moving to a new machine below.
Activating
- Copy your machine codeOpen License Status, click Copy, and send the code to support with your license request.
- Receive a license issued for that machineYou’ll get a
.licfile (or its text) signed for your machine code. - Paste it or browse to the fileIn the same dialog, paste the license key /
.liccontents, or use Browse… to pick the file. - Click ActivateThe add-in verifies the signature, confirms it was issued for this machine, checks the dates, and saves it locally. Features unlock immediately.
There is no account to sign into — activation is entirely local. The step-by-step dialog walkthrough lives on the Activation & licensing page.
What happens at every startup (offline)
Activation isn’t a one-time unlock — the license is re-checked, offline, each time Excel starts. No network is required to keep working.
- Clock-rollback checkThe add-in keeps a monotonic “last seen” watermark. If the system clock appears set backwards (beyond a 60-second tolerance), the license is marked Invalid until the clock is corrected.
- Load & verifyIt loads the stored license and verifies its signature against the public keys built into the add-in.
- Confirm machine & datesIt re-derives the machine code, requires a match, and checks expiry — resolving Licensed / Trial / Grace / Expired / Invalid.
The add-in only auto-opens the activation dialog when the state is Unlicensed, Expired, or Invalid. A normal Trial / Licensed / Grace launch doesn’t prompt. The license and its metadata are stored per user under %LocalAppData%\Modelxcel\ModelxcelPro\ and the current-user registry; the watermark is read as the maximum of the file and registry values so a single rollback can’t defeat the clock check.
The online freshness check (planned)
Today, activation and every re-check are fully offline: the signed .lic verified locally is the activation artifact, and the add-in makes no routine license network call. Separately, the website exposes a freshness/revocation endpoint, /api/license/validate, designed to add two things a static signed file can’t express on its own — a revoked license and a lapsed subscription. The add-in’s use of that endpoint is a planned layer, not implemented in the current build; for now the offline check is the only check.
The endpoint is built so it will be safe to depend on once the add-in adopts it:
- Rare and cached. Designed to be called about once per session, with the answer cached for roughly 14 days.
- Fail-open. If it’s unreachable, the caller is expected to assume valid — a network outage must never block an offline-activated license.
- Privacy-preserving. It accepts only a
licenseIdand returns booleans (valid,revoked,subscriptionActive,expired) plus a reason code — no customer data. It never signs anything and is rate-limited.
Revocation will be “soft”, not an instant kill switch
By design a signed .lic keeps verifying offline until it expires. So even once the freshness check is in use, revoking a license will take effect only when the cached check next refreshes (up to ~14 days) — not instantly. The model leans on short validity windows rather than a real-time kill switch, which is what keeps the add-in fully usable offline.
Moving to a new machine
Licenses are machine-bound, so a license activates only on the machine whose code it was issued for. How a move is handled depends on the format:
- Current (v3) licenses do not use any local move counter. Moving to a new machine requires a new or rotated signed license issued for that machine’s code — governed by the portal’s seat / move policy (a customer can have a bounded number of distinct machines in a rolling window; see Admin & signing). Copy the new machine’s code and request a reissue.
- Legacy (v2) licenses additionally use an add-in-side counter allowing up to 2 machine changes per 365 days; beyond that, activation on a new machine is refused (“already been activated on 2 other machines in the past year”).
Common activation messages
Where to go next