8 Months of OnlineOrNot: From MVP to Stable Product
Tags: saas, showdev, tooling, webdev
Published: 2021-11-03 15:56:02

Previous articles in this series:

- [Building a SaaS in one week: How I built OnlineOrNot](https://onlineornot.com/building-saas-in-one-week-how-built-onlineornot)
- [Two months in: How the SaaS that was built in 7 days is going](https://onlineornot.com/two-months-on-how-onlineornot-is-going)
- [Six months in: How the SaaS that was built in 7 days is going](https://onlineornot.com/six-months-on-how-onlineornot-is-going)

September and October were relatively quiet, so I thought I would write a single article for both months.

While I'd normally try to write at least one useful article per month for OnlineOrNot's audience (as well as an update on how the business is going), I wrote no articles, and no code, actually. Instead, I packed up my life in Sydney, Australia, escaped lockdown, and relocated to France with my wife, and just enjoyed living for a while.

It took just over a month to get over my jetlag, mild burnout from spending months in lockdown, and get back in the groove of working full-time and building OnlineOrNot in the hours before work.

Massive bonus of living in Europe: most of my users are either in this timezone, or nearby (Hi North American friends!) so I'm no longer emailing them at 1am their time.

## The Numbers

In October we experienced our first month of negative revenue growth, as of the start of November 2021, we have:

- 419 (+68) users
- 7 (-1) paying customers
- $127 (-$149) USD MRR

(numbers in brackets are relative to the [last update](https://onlineornot.com/six-months-on-how-onlineornot-is-going))

You'll notice that a single customer represented more than half of OnlineOrNot's MRR. While it hurt to lose them as a customer, they didn't leave due to missing functionality. Their business helped OnlineOrNot scale rapidly, and I don't lose those gains. For example: from the efforts of keeping them as a customer, our backend scaled from only just handling a few dozen simultaneous Uptime Checks to almost fifty thousand simultaneous Uptime Checks.

While I wish I could say it was beautiful to know I had a business running in the background that requires almost no input from me, it's still extremely early days, and OnlineOrNot's growth engine doesn't work if I'm not routinely writing articles, and interviewing potential customers to improve the product's roadmap.

OnlineOrNot **did** however manage to continue attracting users without my input thanks to previous marketing efforts:

![OnlineOrNot User Growth](https://onlineornot.com/assets/eight-months-of-onlineornot/onlineornot-user-growth.png)

It's now a matter of converting free users to paid customers.

## What I Built

Since coming back to work, here's what I've released:

- Bumped a bunch of npm packages (gotta love the JavaScript ecosystem), reducing average frontend build time from 12 minutes to 2 (mainly thanks to the Next.js 12 release)
- Added a [Discord integration](https://onlineornot.com/changelog#discord-alerts)
- Migrated from x86 to ARM-based servers (decent performance boost)
- Made it possible for customers to select which of our [18 locations to monitor from](https://onlineornot.com/changelog#uptime-browser-checks-around-the-world)
- Started tracking uptime check usage to allow for future pricing options
- Started tracking alerts sent for a future alert "cooldown" feature
- Made it possible for customers to remove their own Slack/Discord integrations (before this customers used to email me, and I would do this manually in the backend)
- Began to remove the "UI debt" that came with shipping OnlineOrNot in just seven days:

  For context, OnlineOrNot is currently three services in one:

  - Uptime Checks for marketing websites (and soon APIs)
  - Browser Checks for web apps (also known as synthetic checks)
  - PageSpeed Checks

  I initially built the Uptime Check functionality for regular websites, and just kept adding fields:

  <div className="flex items-center justify-center">
  <img className="text-center" alt="OnlineOrNot's UI Debt" src="https://onlineornot.com/assets/eight-months-of-onlineornot/ui-debt.jpeg"/>
  </div>

  I wound up in a situation similar to tech debt, that I call "UI debt". I would get requests for more features that I'd need to add to this form, while also handling support tickets from customers confused about what certain fields do.

  After a fair bit of customer feedback, I decided to redesign the Uptime Checks form to allow me to keep providing functionality for power users, while keeping the average use case simple:

  ![OnlineOrNot new uptime check ui](https://onlineornot.com/assets/eight-months-of-onlineornot/onlineornot-new-ui.png)

## What's next

Losing half my MRR from a single customer made me realise I need to talk to more customers and potential customers to understand how I can better serve them with OnlineOrNot. I'm currently reading Michele Hansen's [Deploy Empathy](https://deployempathy.com/) and have re-read Rob Fitzpatrick's [The Mom Test](http://momtestbook.com/) to get better at this.

In terms of product, I'm planning on extending the Uptime Checks feature to support monitoring APIs better (right now it just supports GET requests and simple body checks), and adding more chat integrations (like Microsoft Teams, and Telegram).

In terms of marketing, I'm getting back in the groove of writing an article every two weeks on DevOps/SRE topics, which I'll also be releasing on this blog.