OoShirts: A startup case-study

One of the first things you’ll hear at a Scalable Press interview is that we’re bootstrapped and profitable. Only a minority of Silicon Valley startups have taken this path. A majority choose to pursue venture capital funding with shark-like terms and conditions, tying their business model to success KPIs as dictated (vs. measured) by their investors, which can often come with pressure to pursue an exit as quickly as possible. The primary advantage of being a bootstrapped startup is the freedom and flexibility to pursue a long-term vision. Instead of building value strictly in pursuit of an IPO or other exit, a bootstrapped startup can make investments and seize opportunities on its own timing and terms.

Today, Scalable Press could hardly be called a startup anymore. We’re a midsized company heading towards enterprise level. One of the advantages of working within this team is the accessibility of our founders. Speaking from my own experience, they’ve consistently met requests for meetings with enthusiasm and empathy. This has allowed me to get an inside look on how they were able to build this business from its flagship product, OoShirts.


To preface any analysis of OoShirts, you should understand that it is a rite of passage in engineering to work with a code base you will not like. Trash-talking old code with your coworkers over a drink is a cathartic form of stress-relief after hours or days tracing through spaghetti code which hasn’t seen the light of day in years. That said, it’s much easier to criticize than to build something beyond reproach. My goal with this isn’t to explain how I could have built some transcendent version of OoShirts given the right time and budget. Instead, I look at OoShirts as a window into the mindset required to launch a bootstrapped startup.

My first impression of the OoShirts code base was that it was a dumpster fire. I’ve spoken to others who also feel this way and I know that the general consensus is that people will avoid working on the code if at all possible. Amazingly, 7 years after its inception, OoShirts code still runs with minimal oversight. Near the end of one hectic holiday season, I decided to make an effort to crack the code base and build whatever diagrams necessary to understand how it worked and why. I had ambitions to break it into more manageable pieces that could be replaced and retired.

With every attempt, I failed to comprehend the code, and as each of my approaches failed, my respect and admiration for this monster grew. First, I tried to understand the organization Raymond had implemented with his code. I could see he had a modular structure, with his favorites named after slang from his college days - “beast” and “solid”. Eventually it became clear to me just how much this code base was responsible for. This thing had, at various times in its life, handled tasks as diverse as ordering 3rd party fulfilled screenprints, ordering blank shirts to print on, providing a mechanism for vendors to send product selection and stock updates, doing dynamic SEO for Google relevance, providing internal search functionality for people who want to build custom designs from clip-arts, and countless other functions.

Surely, though, there had to be some structure to this. Armed with the confidence only ignorance can bring, I marched forward onto the database. If there was going to be a way for me to crack the armor in this product, it would be by analyzing the schema and seeing what logical groups its functions fell under. This approach failed spectacularly, raising more questions than it answered. It seemed like analyzing the data collections and relationships between them would expose some structure. A table might exist because one of Raymond’s PHP modules had grown too complex to manage without storing some intermediate data, and for the truly complex ones, more PHP modules may have been created to manage the complexity of the data structure, with even more tables to manage those PHP modules. It’s like a Russian nesting doll of complexity. My favorite Easter egg in Raymond’s data is the permission levels of his admin users. His account has permissions set to “9000”, the highest value, and an apparent reference to a Dragon Ball meme.


Over and over again, I asked myself why he would do this. Raymond is a smart guy, surely he realized an organized code base would be easier to develop new features for. Why? One day I had an insight. Maybe Raymond had let the code base fall into this deplorable state because the challenges he faced with starting a business were far greater than whatever technical complexity he had to overcome. This realization finally helped me understand what I was looking at. OoShirts had grown organically. If a forensic analyst explored this application without questioning the founders, I imagine they’d develop the following explanations for the lifecycle of the OoShirts code base.

1. OoShirts started as a glorified spreadsheet with a front end attached to it. During this stage, customers placed orders, and Raymond dealt with those orders himself. He was probably literally calling vendors in the early stages to place orders with fulfillment companies.

2. With limited time and budget, Raymond had to run experiments to drive traffic to his site. There are numerous artifacts from less successful experiments, such as “campus reps” and “referrals”, where he tried to leverage the community for growth. He was as quick to try an idea as he was to abandon it during this phase.

3. Since Raymond didn’t waste any time upfront building complex automation for experiments before they became successful, he was able to do a lot more with his code base. Instead, when people interacted with his site, he would move data around himself until he couldn’t keep up.

4. As the number of orders increased, Raymond would write PHP automation that did more-or-less exactly what he was doing by hand to move orders through the pipeline. By the time he had to automate something, there would be some backlog, forcing him to write code quickly. Code quality would never have been a priority here.

These days, I look at the OoShirts code base with a sort of reverence. There are lessons in the code base for what aspiring entrepreneurs should choose to value early-on. OoShirts isn’t as chaotic as I first thought, though it isn’t put together in terms of technical architecture either. Instead, it’s a code base that is designed around the resolve of a dedicated founder working as efficiently as possible to get a product up and running with a limited budget.