Industry
Use Case
Favorite Feature
A mid-size company builds laser cutting machines. Their controller software has options customers pay extra for: a nesting optimiser that saves sheet metal, a camera-based part sorter, and a high-power mode for thick material that wears the laser source faster.
Options used to be enabled at the factory, so they were part of the machine order. A plant that bought three machines without the nesting optimiser and later wanted it on all of them needed a service visit for each one. The high-power mode was all or nothing, although most customers needed it only now and then.
Every machine already connects to the builder’s remote service gateway for diagnostics, so remote activation was possible. What was missing was a licensing system behind it.
Each customer plant is a licensee. Its machines are identified by their serial numbers.
Product: LaserLine Controller
├── Module "Nesting optimiser" – Node-Locked, nodeSecretMode = CLIENT
│ └── Per machine: QUANTITY, quantity = 1
├── Module "Part sorter" – Node-Locked, nodeSecretMode = CLIENT
│ └── Per machine: QUANTITY, quantity = 1
└── Module "High-power hours" – Pay-per-Use
├── 50 hours: QUANTITY 50
└── 200 hours: QUANTITY 200
Options per machine. Every option is its own Node-Locked module, and the machine serial is the nodeSecret. A plant that buys the nesting optimiser for two machines has two slots. The first two machines that ask for it get it, and a third is refused. The plant doesn’t have to decide upfront which machines those are. If a machine is retired, service clears its serial from the license, and the slot is free for another machine.
Usage-based mode. High-power hours are a prepaid Pay-per-Use balance for the whole plant, shared by all machines. The controller counts the minutes it runs in high-power mode.
The service gateway, not the controller itself, talks to NetLicensing. It validates the plant every few minutes and reports the high-power minutes used since the last call, rounded to full hours, in the same request:
curl -u apiKey:SERVER_API_KEY -H "Accept: application/xml" \
-d "productModuleNumber0=M-NESTING" -d "nodeSecret0=LL-6040-20415" \
-d "productModuleNumber1=M-HIGHPOWER" -d "usedQuantity1=2" \
https://go.netlicensing.io/core/v2/rest/licensee/PLANT-ACME-STUTTGART/validate
The response says whether this machine has the nesting optimiser and how many high-power hours the plant has left (remainingQuantity). The gateway passes a signed summary to the controller. The controller checks the signature, enables the licensed options, and greys out high-power mode in the operator panel when the balance reaches zero.
Production can’t stop because a network link is down. The controller keeps the last signed result until its ttl runs out, and the builder sets the TTL in the NetLicensing settings to cover a typical outage. Hours used offline are counted locally and reported when the gateway is back. They aren’t lost, only reported late.
Plants with no outside connection at all are a separate case. See offline and air-gapped deployment.
The plant’s maintenance manager orders options and hour packs in the builder’s customer portal, which opens the NetLicensing Shop with a shop token for the plant. Larger orders go through the builder’s sales team, which creates the licenses in the Management Console and invoices them with the service contract.
A webhook for WARNING_LEVEL_CHANGED warns the plant when its high-power hours get low, so the next pack is ordered before a big job.
Building machines with paid software options? Contact us to talk about your controller and gateway setup.

Embedded Devices: Feature-on-Demand Licensing
How a smart energy device maker can ship one hardware build, unlock features per device after installation and deliver signed offline validation files to sites without connectivity.

Physical Security: Feature-Based Access Control with Time-Limited Permissions
How a building operator can tie tenant amenities to Multi-Feature licenses and give contractors passes that expire on their own with the Subscription model.