30
10 Comments

Why I Don't Focus on Generating a Quick Profit

Hi Pēteris! Tell me a little about your background and what you're working on.

Hello! I'm Pēteris Caune, a guy from Rīga, Latvia. I'm 36, married, and have a two-year-old daughter and three-month-old son. For almost 10 years now, I've been working remotely from my home office. It's getting more challenging now with small kids around, but I still enjoy having a flexible schedule and no commute.

I'm working on Healthchecks.io, a monitoring service for cron jobs, background services, and scheduled tasks. It works by listening for HTTP "pings" from the monitored services. When it doesn't hear from a service for a configurable amount of time, it sends an alert.

Healthchecks.io is used mostly by development teams to track their various automated processes. It is also popular among homelab enthusiasts. People also come up with unconventional use cases like "Slack alerts when nobody has cleaned the office coffee maker for a while."

Peteris Founder of Healthchecks

What motivated you to get started with Healthchecks.io?

At my "day job" I had a growing number of small background services — things like backups and data import tasks — where monitoring would have been nice to have. This was back in 2015. There were already services doing this style of monitoring: DeadMansSnitch and the recently launched Cronitor. Feature-wise they looked good, but I could not quite justify their pricing for monitoring my non-critical services.

I see this more as a marathon, not a sprint.

I kept circling back to the idea of building it myself. I had expertise in building web applications and some spare time. I thought I might enjoy a side project where I would get to make all the decisions.

I was also annoyed that I could not use the existing services due to their pricing. So I set a challenge to build a service that was as good or better than the existing options with a useful free tier and affordable paid tiers, but still self-sustaining.

Over time this expanded into doing more and more things the "wrong way." I decided to make the code open source. To avoid cookie warnings, I refrained from using any analytics services. When there were pricing changes, I grandfathered in existing users. I don't send any marketing emails, and basically avoid doing anything that annoys me as a user when other companies do them to me.

My primary motivation was to try new things rather than to generate profit as soon as possible. I could afford to experiment like that because I had a reasonably well-paying day job relative to the cost of living in Latvia.

What went into building the initial product?

I based the project on Django because this was a framework I was already proficient in, and I did not want to waste time learning new tools. I wanted something useful up and running as soon as possible. It took me about one month working in my spare time from the first Git commit to launching the initial version.

It had the absolute minimum amount of features for it to be considered useful: user registration, a simple dashboard of the monitored systems, an API endpoint for receiving pings, and email alerts. Initially there were no paid plans, no multiple notification methods, no team access, no ability to organize things into projects.

Everything was running off a single $5/mo DigitalOcean droplet, but it also initially saw very little traffic so that was fine. Since the code was open source, I could take advantage of the "free for open source" plans with GitHub, Travis CI, and Coveralls. I pay it forward by offering the paid Healthchecks.io plan to open-source projects and nonprofits for free.

My primary motivation was to try new things rather than to generate profit as soon as possible.

I made a deliberate decision to keep the technology stack as simple as possible, for as long as possible. As few as possible dependencies in "requirements.txt," traditional PostgreSQL database instead of some fancy distributed data store, no task queue or message broker, simple deployment procedure with as few abstraction layers as possible, and no dependencies on proprietary technologies to avoid vendor lock-in.

I might end up adding some or all of these things eventually, but I want to see how far I can take this simple setup of just a Django app and a PostgreSQL database at its core.

How have you attracted users and grown Healthchecks.io?

The main strategy has been to provide good service and let the word of mouth do the work. I'm happy to see the existing users recommending Healthchecks.io on Twitter, Reddit, forums, and elsewhere. This brings in direct traffic and helps with Google rankings. This effect gets stronger over time as the user base grows. For example, there are fairly regular "What do you use for cron monitoring?" questions on Reddit. Usually by the time I discover them, somebody has already commented with a link to Healthchecks.io or even given their testimonial.

Healthchecks homepage

Seeing recommendations and good feedback is also an incredibly good motivator to keep working on new features and polishing the existing ones.

When there is something substantial to share I write a blog article, cross-post to Medium, and submit it to Hacker News. I've had only one article get upvoted to the Hacker News front page. This was in our first year and brought in a good amount of early users. As a non-native English speaker, I usually pay somebody on Fiverr to proof-read my blog articles; I'm always surprised how many mistakes they find. Definitely worth the literal fiver.

One small thing I do is include a "Powered by" line in the footer of the open-source project. When somebody self-hosts a Healthchecks instance and does not customize the footer template, it shows up there. I don't think this makes much difference with Google rankings, but it spreads the awareness among people who use or stumble upon the hosted instance.

I also dabbled with Reddit, Google, and Twitter ads. Though I could see how many people clicked, I did not have any conversion tracking because I didn't want to add tracking pixels. The ad budgets were small, so it's hard to know how many people signed up and if anybody upgraded to a paid plan because of the ads. But it was interesting to experiment with different creatives and targeting options. I did like how I could target specific subreddits or followers of specific Twitter accounts.

What's your business model, and how have you grown your revenue?

Freemium and paid monthly or annual subscriptions. The "Hobbyist" plan is free, and can be used to monitor up to 20 services. The "Business" plan is $20/mo and can monitor up to 100 services and supports more team members. I quite often see cases where a user starts with a free account, their usage grows slowly, and then they finally convert to a paid subscription maybe two years later when they have finally hit the limits of the free plan.

Healthchecks.io uses Braintree to process payments and recurring subscriptions and integrates with it directly. As far as I know, Braintree does not generate a PDF invoice so I implemented that on my side. I pulled together a script to generate VAT reports for accounting. Recently I updated the billing code to support 3D secure. If I were starting today, I would consider using an additional service on top of the payment gateway to save me some of that work.

Today Healthchecks.io has more than 7,000 active user accounts, and 150 users are on paid plans. Current MRR is $2,200. It is not yet enough for me to go full time, but the monthly revenue is steadily creeping up. I expect that Healthchecks.io will become my primary source of income and my primary occupation sooner or later.

I see this more as a marathon, not a sprint.

Month Revenue
Oct '18 860
Nov '18 954
Dec '18 1052
Jan '19 1168
Feb '19 1355
Mar '19 1371
Apr '19 1527
May '19 1603
June '19 1766
July '19 1963
Aug '19 2177
Sept '19 2260
Oct '19 2296

What are your goals for the future?

I don't have ambitious goals; the plan is basically to carry on with small incremental improvements. A major milestone will be when I go full time with this project. After that, a partner or first hire to reduce the bus factor. Currently it's just me running everything. Since I cannot be at my PC 24/7, it would be good to have other people being able to jump in and fix problems.

If you had to start over, what would you do differently?

When I started out, I didn't appreciate how important being reliable as a monitoring service is. If I had decided to work on something that is less sensitive to even tiny outages, my job would have been a lot easier. I enjoy the challenge but I wish I was aware of this aspect when I started out.

Also, launching a service means keeping it running for potentially the long term. When I launched the MVP, I didn't think about how long the "long term" might be. I think this really first struck me when one client asked if they could have a three-year billing period instead of just annual. It's all good, but it is something I didn't think about enough when I started.

Have you found anything particularly helpful or advantageous?

Being bootstrapped and relatively stable financially means that there is no pressure to generate profit fast. I can make decisions that are good for users but not necessarily good for short-term profit. I can take a break from new feature development, or I can spend time on a small detail that only a few people will notice.

What's your advice for indie hackers who are just starting out?

If you enumerate every tool and skill that goes into building a complete project, the list would be pretty overwhelming.

I guess the best advice here is to just start somewhere; start with something simple and don't be afraid to learn new tools and skills, even the ones you think you may never use. Sooner or later they will come in handy.

Where can we go to learn more?

  1. 1

    So cool to see a neighbor from Latvia working from home for long time and being an indiehacker! Greetings from Vilnius, Lithuania :)

    1. 1

      Greetings Povilas! I visited Vilnius this spring, went to PyCon Lithuania '19 conference. Was pleasantly surprised how well-attended it was!

  2. 1

    Since the code is open source, are your worried about losing customers because they are just hosting the product themselves?

    1. 1

      Hey @McVes, self-hosting is viable, and I know that both companies and enthusiasts indeed do that but I'm not too worried about it ;-)

      Companies would self-host because they need custom features (e.g. their custom authentication on top), or they need everything on-premises for compliance reasons.

      Individuals would self-host as an learning exercise, or because having everything fully independent in their homelab is their hobby.

      Another scenario would be when a company needs standard service but decides to self-host to save costs. Running any service requires some ongoing maintenance. Even if it's just 1 hour per month, if you consider engineer & ops hourly rates, the $16/mo might end up being more cost effective.

  3. 1

    I use this for my product. Great service and great UI!

    It's very cool to hear you use Django. Would love to learn how you manage these health checks on a schedule in a resilient way.

    1. 1

      Hi @viperfx, under the hood, the notification sending code is pretty simple, there's nothing too fancy or clever about it.

      Every "ping" the service receives gets recorded to the database. One of the fields that's recorded is the "deadline" for the next ping. To calculate the deadline based on cron schedule and current time, I used the "croniter" python library.

      There is a background process (the "sendalerts" management command if you go digging into the code on Github) that regularly queries the database for any checks that have overshoot the deadline, and sends the alerts out. This process is written so that multiple instances of it can run concurrently on multiple app servers. If one instance gets slow while e.g. trying to deliver a webhook notification, other instances can pick up the slack.

      There are few more subtle aspects around it, but that's the basic idea: have a background process poll the database for any new alerts that need to be sent out, and send them out. In practice, this has been working surprisingly well!

  4. 1

    Since Healthchecks is one of my favorite services, I was very interested to know the story behind it. The pricing is incredible when compared with Cronitor/DeadMansSnitch/Cronhub. Keep up the incredible work!

    1. 1

      Thanks! Very much appreciated!

  5. 1

    Congrats on the steady growth and success, Pēteris! Based on the good reputation that Healthchecks has in various online communities, I just integrated it with some backup software so that users can easily Healthcheck their backups. (Yes, I just verbed your company.) Keep up the awesome work!