Answering The Question "When does a CMS make sense?"
When a CMS the right tool for the job and when it isn't.
This article is drawn from an answer I gave to a question posed on Dev.to by Ankush Thakur. Here's a snippet of his question for context.
Here's my response altered slightly to better fit the article format
TLDR: It's not a good idea to build a full blown web app, like Basecamp, on a CMS. CMS should be used when you're managing content, but probably not user generated content. Consider use the JAMstack over traditional dev stacks like LAMP. Use a headless CMS instead of a monolithic CMS.
The Big Question
I'd like to start by addressing this question - "why don't we build everything in Drupal/WordPress/Joomla, etc., and bolt more things on top". I think this question is one of the biggest reasons why we are where we are with CMS today and why there's a real opportunity for changing how we build things by adopting the JAMstack, JavaScript, APIs and Markup. More on the JAMstack later. The WordPress / Drupal / Jooma approach is the monolithic approach to building.
You're exactly right in your description, you're bolting on more and more services and functionality until you have the application you wanted and you're doing all of this on the server. This results in worse and worse performance and more and more opportunity for security vulnerabilities for your application. The trouble is that you're adding on to platforms that were designed for a specific purpose, to manage content, and in the case of WordPress to manage blog content. WordPress is not an application platform, no matter how many times you see people using it in this way. You can bend these systems to your will, but they're more likely to break your spirit while you're doing it.
Compose Your Application Close To Your Users
Enter the JAMstack. When you're building with the JAMstack you're shifting where the functionality of your app comes together, from the server to the client. You're composing best-in-class services together on the client to make your application, rather than using whatever is available to you in your monolithic server app. You might actually already be part way there, think about a commenting system. If you used server side commenting and had a popular blog you'd be in some serious trouble unless you had a beefy backend, not to mention the expense of running a beefy backend during slower times.
Almost no one uses WordPress built in commenting, everyone uses a third-party commenting engine loaded from a user's web browser and rendered on the page with JavaScript.
Getting on the JAMstack
- Prerender you HTML using a static site generator (don't discount this even if you're building UGC app)
- Make your front-end dynamic with React or Vue.
- When you're tempted to use a server, look to using Functions-as-a-Service.
- Use best-in-class services for things like, commenting, forms, e-commerce, auth, and yes even CMS, that can be delivered directly to your users' web browsers.