My main advice is that no software plan survives contact with users
With Discourse some things we thought would work well, did not, and some things we thought were unimportant (presence and other chat-like features) turned out to be far more important than we realized. We had no way of knowing that until the software got in the hands of active users.
Thus the goal should be to get an early working version of your software in the hands of users, and have a tight and fast feedback loop to iterate on:
- deploy software
- gather feedback
- improve software based on that feedback
Don’t optimize for getting everything right, that’s impossible, optimize for speed of improvement.