(Updated: )

A bootstrapped SaaS cost teardown — and the nuance

Share on social

A bootstrapped monitoring SaaS cost teardown

I post openly about MRR, churn and other SaaS stuff on Twitter. I do this mostly for marketing purposes. Not going to lie. It's also kinda fun. At least when things are growing 😅...

"But what about the cost, goddammit?" someone asked. Good question and great fodder for this blog as developers are obsessed with software and infrastructure cost. Even $200k+ earning "rockstars" cannot imagine paying $5 a month for hosted Docker repo. Ergo, this is great content marketing.

But — as always — onwards! Here is a complete, exhaustive teardown of all my SaaS cost — currently still at the bootstrapped & solo founder stage.

In this post:

  • The shopping list
  • The AWS & Heroku bill  — developers obsess about this
  • The nuance

The shopping list

I'm going into my accounting software right now (hi Moneybird!) and looking at the cost for November 2019.

But this is not the whole story. I have $3000 AWS credits because YCombinator Startup School. Here's the VAT invoice from last month. $640.41 in total. More on that later.

We also have some annually billed costs like Namecheap, this Ghost blog and other bits so I added that to at a 1/12 rate.

Let's break this down and add some context — I'm dropping into Markdown for this as I don't know how to align it otherwise:

Variable cost

- AWS: Lambda, SQS, SNS, S3.                 $640,41

Semi variable / fixed cost

- Heroku: API, background worker, Postgres:  $252 
- Intercom: Startup plan.                     $49
- Solarwinds: Graphing and monitoring         $21 
- Patreon: Sponsoring open source             $11,90
- Google Gsuite: Email, docs etc.             $11,59
- Moneybird: Dutch accounting & billing       $13,48
Sub total                                    $999,38

Yearly
- 1Password: For passwords                    $42,70 
- Ghost: For blog hosting                    $348
- Tableplus: SQL IDEA                         $59
- Jetbrains Webstorm: IDE                     $46    
- Namecheap: domain names.                    $13,16
Sub total                                    $508,86
Sub total / month                             $42,41

Total                                         $1041,79 

$1041,79 bucks to run Checkly at this moment. Here is the context and some interesting bits and bobs:

  • This is not out-of-pocket money: I don't pay the AWS credits yet
  • Intercom will go up once we're out of the 1 year Startup program
  • I rent a desk in Berlin. It's €269 / month. But I also used it for my freelancing...
  • Jetbrains Webstorm is actually getting cheaper year over year. I ❤️ Jetbrains.

  • Google Gsuite is for two people already. There's someone joining soon and he already has an account.
  • I've not added any of the totally & terribly failed attempts at paid advertising Reddit, Twitter and Google. This was in the $500 range. I suck at it and it's not a focus now.
  • I sponsor Hapi.js creator Eran Hammer through Patreon. The idea is to start supporting more OS creators that I depend on heavily. I don't pay a lot — yet! — but at this stage it's mostly about the gesture.
  • I worked as a freelancer before going full time on Checkly. I've tried very hard to keep both ledgers separate, but there is some overlap. The desk? WebStorm? Hard to split that between Checkly Inc. and Tim Nolet Freelancer inc.
  • I left out the Sketch license I bought 4 years ago and the Macbook from 5 years ago.

!! big big BIG Caveat !!

Who files and manages your taxes? An accountant. No cost for them yet in this overview. Also there are no salaried workers, laptops, office supplies, office parties, private bodyguard, you name it. More on this later.

!! /big big BIG Caveat !!

The AWS bill

Again, let's break it down. Sadly AWS' Cost Explorer gets really confused when you have credits.

I copy & pasted the interesting parts here. First up, Lambda cost. We run all checks on AWS Lambda. This is clearly a fair chunk of our cost and it scales linearly with usage.

Why is this amount the way it is? Two reasons:

  • Frequency: We run API checks up to every 1 minute and browser checks up to every 10 minutes.
  • Lambda memory: API checks are fairly light weight and we run them at the lowest 128MB setting. We rarely if ever hit that limit.

    Running a full Chrome browser for browser checks takes a lot more resources. We run these at 1472MB. This is is 99% of the cases way too much. But Chrome needs space for complex website and interactions.

So now you know. Our core variable costs depend for a part on how long and how often our customers run our checks. Until we hit the cutoff point where running on Lambda makes no sense anymore; this point exists but we're not there yet.

Next up: We store logs and screenshots on S3. AWS S3 really rocks. I love it almost as much as Jetbrains.

But last month I noticed huge discrepancy between S3 storage and request cost.

$17,05 spent on requests and $1,76 spent on actual storage!! That just sounds wrong. Turns out I was storing 500 bytes sized logs for each check run, regardless of whether the log actually had useful information.

No one really learned anything from this logs. So now I don't store them and just show this equally useful message in our app.

Formerly it showed data you already knew: "your check ran, it finished and reported this data so you can look at it right now"

This is already a +10% saving on the monthly AWS bill. I also appointed myself CIO of the Checkly International Global Incorporation — It's about "the information" not the just "the data".

Most of the other relevant costs are divided up between Data Transfer, SNS and SQS.  SNS is 99% the cost of sending SMS messages on behalf of our customers. SQS and Data Transfer are just plumbing.

P.S. There were other billing screw ups. I was unnecessarily exchanging data between queues in the Frankfurt and Ireland regions. Hello data transfer costs. Fixed that too.

Onwards.

The Heroku Bill

One screenshot is enough. The money is in the database.

But there is a somewhat deeper meaning here. The database is important [citation needed] and it has a specific role for Checkly.

Next to all the basic — and very low impact — CRUD transactions Checkly ingests a ton of metrics every minute. We use Postgres to handle this. All the average, 95 and 99 percentile data. Keeps things simple and reliable.

The rest is in running an API, some background jobs and some logging. Barely $50 a month.

The Nuance

As mentioned earlier, there are some pretty big caveats here:

  • Employees?
  • Accountants, notaries, lawyers?
  • Other none-cloud / none-software costs?
  • ...your own salary?

As always — and I hate doing this in this blog focussed on concrete information — it comes down to "what are you trying to do?". This is really vague, so let me try to clarify what I mean:

Are you...

a) Experimenting as an Indiehacker to get some ramen profitable business going?b) Going full on VC backed hyper growth mega unicorn?
c) Taking the best parts and figuring out what works for you and your customers?

Not a fair comparison, but you catch my drift. I'm going for a stable, reliable service that supports my customers, me, my cofounders and employees. This is reflected in the cost.

And for all the Hacker News weekend warriors...

Yes, I can run this on one Digital Ocean box. Yes I can crontab. I can VI and and I can run Docker in React sprinkled with K8S.

Is that good for my customers. No.
Is it good for my blood pressure? Also no.
Is this our final state? Again, also no.

Are you a cutting edge personal-dog-walking-todo app with 4 users? Disregard all of the above, just get a Digital Ocean box. (P.S. can I invest? Let's jump on a call...)

In closing

Checkly is going to grow. Checkly aims to be the best active monitoring service you ever used.  This cost teardown is a nice & cute snapshot as we transition into a new phase. Omnia mutantur and panta rhei.

I will start paying my accountant, myself, my cofounder, my employee(s) and it will absolutely dwarf the cost of hosting / cloud / software for now.

Having said that; we're hiring!

Share on social