Industry
Use Case
Favorite Feature
A software company makes motion control software. It doesn’t sell to factories directly. Machine builders, its OEM partners, put the software into their CNC machines and robots and sell those machines to their own customers.
Until now each OEM received a list of serial numbers and typed one into every machine at the end of production. Nothing tied a serial to a particular machine, so the same number could end up in several. The software company only knew how many machines a partner had built when the partner reported it, once a quarter, and royalties were calculated from that report.
Each machine is a licensee, and the machine’s serial number is the licensee number. Every OEM partner provisions its own machines.
Product: MotionCore
└── Module "Runtime" – Node-Locked, nodeSecretMode = PREDEFINED
└── Per machine: QUANTITY, quantity = 1
Node-Locked in predefined mode means the secret is known before the machine ever validates. At the end of the OEM’s production line, the test station generates a random secret, writes it into the controller’s protected storage, and registers the machine:
# 1. create the machine, tagged with the OEM partner
curl -u apiKey:OEM_API_KEY -H "Accept: application/json" \
-d "number=KRL-R12-0083311" -d "productNumber=MOTIONCORE" -d "oem=KRAUSE-ROBOTICS" \
https://go.netlicensing.io/core/v2/rest/licensee
# 2. give it a runtime license with the stored secret
curl -u apiKey:OEM_API_KEY -H "Accept: application/json" \
-d "licenseeNumber=KRL-R12-0083311" -d "licenseTemplateNumber=RUNTIME-1" \
-d "nodeSecret0=f3a9c1...7e20" -d "oem=KRAUSE-ROBOTICS" \
https://go.netlicensing.io/core/v2/rest/license
The controller later validates with that secret. Only a controller that holds the right secret gets valid=true. Copying the licensee number to another machine doesn’t help, because the other machine doesn’t have the secret.
Each OEM partner has its own API key with the role ROLE_APIKEY_OPERATION, used only by the test station’s server. If a partner’s key leaks or the partnership ends, the vendor revokes that one key, and nobody else is affected. The oem field isn’t a NetLicensing field. Any extra field is stored as a custom property, so every machine and license carries the name of the partner that built it.
Each runtime license is created the moment a machine leaves the production line, and every license creation is recorded as a transaction. At the end of each month, the vendor’s billing job lists the licenses created per partner and invoices the royalties from that list. Partners no longer report numbers. The licenses are the numbers.
Factories don’t always have a reliable internet connection. A controller validates when it starts and once a day, keeps the last signed response until its ttl runs out, and keeps running if a validation fails within that window. The vendor sets a long TTL for this product. A machine that’s sold on keeps its licensee number and secret, so the new owner doesn’t need to do anything.
For production halls with no outside connection at all, see offline and air-gapped deployment.
Shipping your software inside partners’ hardware? Contact us to discuss an OEM setup.

AI Chatbot Platform: Multi-Tenant Licensing
How a white-label chatbot platform can limit bots and premium AI features per tenant with Pricing Table plans and sell extra message packs with Pay-per-Use.

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.