Our mobile app is feature based, so a user may have 1-4 of the bottom navigation items enabled on their account. Is best practice to hide the menu options that are not enabled or to keep it static and show an empty state if they select one that is not enabled?
Is best practice to hide the menu options
That would be one of the options.
Keep it static and show an empty state if they select one that is not enabled
No. If the user's able to click on something he is going to expect to see something.
You can either hide those inaccessible elements or, if those items lead to a payed feature you can disable the items but use something to notify the user that those features need to be bought.
So have your special icon in the item itself , and if the user tries clicking on it a popup shows with instructions on what do to access the feature.
I wouldn't call this a best-practice situation, rather an opportunity to sell features/premium. By hiding the features you aren't dangling them in front of a potential convert. By disabling them you miss the opportunity to captivate the user with a page of content dedicated to luring them into converting.
However, if the product is more one focused on productivity and the sales lifecycle isn't so much focused on converting a user (perhaps bulk seats/tickets are sold to an organisation?), then best-practice for productivity would tend towards hiding the buttons/tabs/navigation-items outright.
From the user experience perspective: Keep only the options that would be available for the users.
From a business perspective: Show all the features; and, poke the users to get involved with your other features/services. If the click on the options that's not available for them, then open a new section or popup, to inform them about your feature and entreat them to subscribe or something.
Now, it's all up to you actually.
My personal opinion would be, keep all the features static. Via this, you're informing users about your available features and all. However, just keep the available features on the same side and keep the unavailable ones on the other side. I mean, don't do something like, Feature A (Active), Feature B (inactive), Feature C (inactive), Feature D (active) or something similar!
Hope this helps!