Hi,
*Happy to have a chat, if you want to discuss finer details of licencing (but will say, we might not be 'best' practice for this). *
my basic tips:
1). Keep it simple. you don't need the worlds most complicated licencing system, if people really want to they will work ways around what ever you do, don't spend longer licencing then writing the things you are selling. apply this to everything i am going to say below!
2)** Work out what you are licencing against.** - what is the 'unit' of sale, eg. per umbraco install, domain, customer, agency ? - some of these can be complicated to know what is one thing (e.g what is a "domain" or "instance"). Think about how you will manage that, for uSync/Translation manager - its per domain, we manage the exceptions manually, (and it doesn't really take that much time, simpler than writing uber complex logic everywhere.)
2.5) * Think about your licencing model* are you going to licence per version (e.g umbraco 13) or subscription (e.g per year) or something else , or maybe them all, that will help you decided what to do in terms of the next steps.
3) Pick your licence generating code there are a few open source packages for this (e.g standard.licencing), and .net even has some stuff built in - we rolled our own - i am not sure if we would again, but following principle No 1. a simple licencing model isn't too hard to spin up.