Arsalan Zaidi's Blog

Off the shelf software versus custom-built applications

TLDR: Go with an off the shelf application if you can live with it without needing to modify it with custom code. If you know you’re going to have to make significant code changes, bite the bullet and create a custom application.


Introduction

Lets kick things off with some definitions:

OTS Software

With off-the-shelf software the main advantages that you’re getting are faster deployment times and lower upfront costs. The software comes in as a pre-built package and you just need to drop it in and go. Another advantage is that you get access to a wealth of pre-existing information online as well as pre-trained and experienced consultants who are well versed in that ecosystem. This makes it easy to customize the application to meet your needs.

The main trade-off is that while usually available, customization is limited. You’ll need to bend to fit pre-existing workflows, not the other way around. There are usually far too many bells and whistles, leading to feature overload and you suffer from vendor lock-in. There might also be possible compliance gaps if the software is not specifically targeted at your business niche.

Custom Applications

On the other hand, with a custom built application, you get something which is tailored to fit you and your organization’s specific needs. So no need to shake up the entire company and re-train a lot of folks. You can also use it to create a competitive advantage or a moat around your business as you can add unique capabilities that your competitors can’t buy off a shelf.

On the flip side, this approach comes with a much higher initial cost and it can take a lot more time to get up and running. There’s also an ongoing maintenance overhead since you own the bugs, the servers, and all the associated headaches which come with running the application yourself.

So what should you go for?

If you can live within the constraints of using something that’s off the shelf; it is a no-brainer — just do it. It’ll be a lot faster, cheaper, and come with much lower risk. This is especially true if you are a smaller organization and you can mould yourself to fit around the constraints of the application. Avoid customization as much as possible. When I say customization, I mean adding custom code on top of the application. If the application supports native workflows or other ways to setup the application to fit your needs, that should be fine.

However, If you are too large to be quite so flexible and you need to make the software fit you rather than the other way around, then just bite the bullet and go down the custom route. Avoid the mirage of those potentially lower initial costs. The overall cost will end up being much higher in the medium to long term.

Why not go with something in the middle?

It’s a trap. Instead of getting the best of both worlds, you end up with the worst of both of them.

For one, you’re locked into the vendor’s upgrade cycle. This is especially true if you’re on their cloud environment if they have that option. Now you can’t control how or when new features come in and old ones get deprecated. As they go down their development roadmap, chances are your custom code is going to break unless you update it to match.

Secondly, you now have to hire product specialists who are much more expensive than general programmers, which is going to bump up your costs. Hiring generalists and training them up might also not work out since many coders may not want to work within the guts of a specific off the shelf app. You’re going to have to look for people who are comfortable going down that career specialization path, which isn’t for everyone.

Furthermore, your customizations are limited by the base software and the design decisions taken by the vendor. You’ll have to live with the decisions they’ve taken for their tech stack, overall architecture, scaling strategies and so on. Those decisions were not taken with your specific needs in mind, so the chances of them matching them are slim.

Related to the previous point, you can’t refactor the core application code to fix issues or make it work better for you. I mean you can in most cases, it’s just that it’s going to completely break the upgrade path for you. So you’re stuck with whatever bugs and inefficiencies that are baked in, even when you can fix them yourself.

Lessons from the trenches

This isn’t something theoretical. I’m working with two such projects right now and we’ve got:

And even after spending some five years building all this up, we’re still adding features to these applications.

The Bottom Line

We could’ve built something better from the ground up in the same amount of time we’ve spent so far and probably for less money. That custom solution would be completely under our control and we would be able to mould it to our needs without having to spend half our time fighting the base system.

So the key takeaway here is, go with an off the shelf application if you can live with it without needing to modify it with custom code. And if you must customize it — do it around the platform, not on top of it. Use their APIs, REST endpoints, file load points, even direct DB access — whatever you can get away with. Build small ETLs to push and pull data. Use the built-in configuration tools — like workflows or business rules — not custom code.

Stay loosely coupled with the application. That way, your upgrade path stays cleaner and you’ll largely avoid breaking your customizations.

#Software Development