Qlik Sense license info, low-code style
Ctrl-Q NR includes license nodes for both client-managed and cloud versions of Qlik Sense. These nodes make it easy to create license monitoring solutions that will for example alert fixed number of days before licenses expire.

I've more than once been called into emergencies where a client-managed Qlik Sense license has expired and left a company without access to their analytics and insight apps. Not good.
The business model of Qlik Sense Cloud is of course different, but there is still a challenge to understand how much your cloud tenant is used, what the trends are etc.
💡
Using the qscloud-license and qseow-license nodes from Ctrl-Q NR it is easy to get a complete set of license info for both client-managed and cloud versions of Qlik Sense.
You can then use Node-RED to quickly build a license expiration monitoring solution.
Maybe sending an email or Teams message a month or two before the licenses expire or you run out of cloud licenses.
You can then use Node-RED to quickly build a license expiration monitoring solution.
Maybe sending an email or Teams message a month or two before the licenses expire or you run out of cloud licenses.
Solution
The Node-RED flow below uses various Ctrl-Q NR nodes to do the following:
- Client-managed Qlik Sense
- Get all license info from the server (the Repository API, more specifically).
- Show the complete license object and the expiration flag in the debug view.
- Extract the expiration date from the key-value pairs that are included in the complete license object. Show this date in the debug view.
- Qlik Sense Cloud
- Get all license info, including historical usage and other user-focused data.
- Show the license object in the debug view.

Here is the flow as JSON that can be imported into Node-RED:
[{"id":"76eca28338da5711","type":"qseow-license","z":"fda879b9ea21e21b","name":"","server":"5e42d0533190acfb","op":"r","x":530,"y":280,"wires":[["a4b5bee5ce36369a","db807c63640eb748","c99ce31c32093cfc"]]},{"id":"3a8aef891d451790","type":"inject","z":"fda879b9ea21e21b","name":"Get license","props":[],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":340,"y":280,"wires":[["76eca28338da5711"]]},{"id":"a4b5bee5ce36369a","type":"debug","z":"fda879b9ea21e21b","name":"Complete license object","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":770,"y":280,"wires":[]},{"id":"db807c63640eb748","type":"function","z":"fda879b9ea21e21b","name":"Extract key-value pairs of data","func":"\nconst keyDetails = {};\nmsg.payload.license.keyDetails.split(\"\\n\").forEach(pair => {\n const [key, value] = pair.split(\": \");\n keyDetails[key] = value;\n});\n\nmsg.payload.keyDetails = keyDetails;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":490,"y":380,"wires":[["2a6c73d1555c45a3"]]},{"id":"2a6c73d1555c45a3","type":"debug","z":"fda879b9ea21e21b","name":"Valid until","active":true,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload.keyDetails[\"Valid To\"]","targetType":"msg","statusVal":"payload.keyDetails[\"Valid To\"]","statusType":"auto","x":720,"y":380,"wires":[]},{"id":"ce93e1f93d1eef8e","type":"comment","z":"fda879b9ea21e21b","name":"Get license info from client-managed Qlik Sense server","info":"","x":440,"y":220,"wires":[]},{"id":"c99ce31c32093cfc","type":"debug","z":"fda879b9ea21e21b","name":"Expired?","active":true,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload.license.isExpired","targetType":"msg","statusVal":"payload.keyDetails[\"Valid To\"]","statusType":"auto","x":720,"y":320,"wires":[]},{"id":"c8681dfd8fffe818","type":"comment","z":"fda879b9ea21e21b","name":"Get license info from Qlik Sense Cloud","info":"","x":390,"y":480,"wires":[]},{"id":"c3e2bec9d49851e9","type":"qscloud-license","z":"fda879b9ea21e21b","name":"","tenant":"87ac58bf1227411b","x":520,"y":540,"wires":[["29eb1a8ea41ee778"]]},{"id":"e6e254087ff026b8","type":"inject","z":"fda879b9ea21e21b","name":"Get license","props":[],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":340,"y":540,"wires":[["c3e2bec9d49851e9"]]},{"id":"29eb1a8ea41ee778","type":"debug","z":"fda879b9ea21e21b","name":"Complete license object","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":770,"y":540,"wires":[]},{"id":"5e42d0533190acfb","type":"qseow-sense-server","name":"Dummy Qlik Sense server","protocol":"https","host":"my.qlikserver.com","port":"4242","authType":"cert","certFile":"c:\\secret\\client.pem","keyFile":"c:\\secret\\client_key.pem","certCaFile":"","jwt":""},{"id":"87ac58bf1227411b","type":"qscloud-tenant","name":"Dummy Qlik Sense Clound tenant","tenant":"abcdefgh01234567890","region":"eu","authType":"apikey","clientId":"","clientSecret":"","apiKey":"abcdefgh01234567890"}]
Does it work?
Yes it does!

