To build, or not to build

Recently someone posed a question on Twitter to the content creators within the Laravel community. They were curious if we had built the course platforms for our content or used existing services.

While the question was specific, it’s rooted in the age old question: do I build something custom or use something existing?

As with all questions regarding choice the answer is: it depends. That’s not a very helpful answer though. So let me share my experience.

Initially save time

Back to the original question, I built my own course platform. But I did so in an minimum viable product (MVP) fashion. My first course, Getting Git, was very basic. There were no special features. A simple checkout flow and video dashboard. Arguably the bare bones requirement for a course platform.

I used Vimeo to manage all of the private content and embedding. I use a free Bootstrap theme for the course dashboard. The landing page used Stripe Checkout. I used Laravel for rapidly developing the models and authentication to tie everything together.

Value your time

This all worked. But was it necessary? No. What I built was a fraction of the features available from existing services.

I could have used paid content on YouTube or Vimeo. I could have hosted my course on an existing platform like Udemy or directly through Gumroad.

Why didn’t I use one of these services? We are quick to think that we’ll need some tiny little thing existing solutions don’t offer. But often if we take a hard look we never actually needed those features.

So why didn’t I use one of those services? If I dig deep enough, the answer is: because I could. Or said another way, I built my own because I am a developer. For the most part, that’s okay. After all, I like what I do.

What’s not okay is devaluing the effort. As developers, we’re terrible at estimating work. Even more so when the work is our own. After all, who cares? It’s just my time. So if I have time, then it’s okay to spend it building something myself.

As I get older, I find this logic to be flawed. Or at least it’s not sound. I have a finite amount of time. In fact, the reality is I will never have more time. Viewed through this grim perspective, time becomes very precious.

I find this helps counterbalance my developer tendencies to build everything myself and devalue time. Doing so puts me nicely in the middle. That Goldilocks Zone where it’s not too custom, but not too generic. It’s just right.

Build over time

Returning to my course platform, it started out pretty minimal. It wasn’t until I made my next course, BaseCode, that I added more features. Things like invoices and course add-ons. When I created my most recent course, Confident Laravel, I added even more features like marking a video complete and auto-advancing to the next video.

I built my course platform slowly, incremental. It took 3 courses for it to have even the basic features which matched existing platforms. Sure maybe a few users asked for these missing features along the way. But this didn’t deter people from buying my courses. It didn’t limit them from watching it in anyway. Again, that’s the critical V in MVP. It has to be viable.

Maintenance takes time

There’s another aspect to building it yourself to which is the ongoing maintenance. This goes beyond just the initial time investment. Now you’re responsible for not only managing the CodeBase and making sure that the dependencies are updated but also the server is updated certificates configuration and so on.

All of this adds up. So if you’re able to offload this onto an existing service, it’s definitely worth saving some of the pain you’ll have by building it yourself.


In the end, I think it’s best to be somewhere in the middle. Leverage what you can in the beginning. As you grow, add additional features which are necessary. With more reuse, allow yourself to add an extra feature. This incremental approach will prevent you from the age old trap of building everything initially and recoup some of the time you might have saved by using an existing service.