I once had a software company. The salesmen/distributors wanted a lite version for a lower price point (to make their jobs easier, I guess). We can get them on board and upgrade them later they said.
We reluctantly and stupidly (in retrospect) agreed. We used the same code base, with a few simple (we thought) flags and switches based on the license type.
The end result worked great, but getting there
was a nightmare.
Going through the code, disabling features etc. based on the license type seemed simple at first. Until we remembered how interrelated all those features were.
Then there were the multiple builds for multiple platforms. Then there was exponentially more work for regression testing all those builds.
It got really complicated, and wasted a lot of R&D that could have been better spent making our software even more awesome for customers willing and able to pay, instead of spending resources degrading it. What were we thinking?
Then there were salesmen coming back with requests to add just this one or that other full product feature to the lite product. No problem, right? It’s just software. It’s not like you are actually manufacturing a physical thing, right?
Then there was the clever distributor we caught reverse engineering the license switches and whatnot for a major feature to enable it in the lite version. Caught when a customer called us directly about some weird problem they were having with our hacked software. Lawyers got involved.
The lite versions sales never panned out as promised. No full version upgrades materialized. (Until later, see below).
We ended up firing some distributors/salesmen and giving lite customers free upgrades to the full version, eating the cost of the migration, and discontinuing the lite version. It was a happy day for me.
Then we retired, so I don’t care any more.