i make €500+/month with a rust SaaS designed & written for resilience
And how all software ever is just Excel with extra steps
All software ever, is just Excel with extra steps
The worst part, is that no matter what company you work for, you’re essentially making Microsoft Excel with extra steps. What do I mean by that? Very simple, the foundation of any application is to take some data and do some kind of operation on it. We usually do this by having some code run on a computer, accessing a database and then operating on some data, returning some and/or storing some results. However, most computing that needs to be done by people on a day-to-day basis, doesn’t need “the cloud” in order to be effective. Most apps are just some data that the user wants to do some operation on and see the result. I found this out when I pitched the entire software package I was making to an artist friend of mine. He just responded, “I can do all of this with Excel though, why would I pay 100 euro a month for that?”. He was right. After that, every single software company I worked for was evaluated by this measurement. I soon realized that yes, even though the sheer magnitude of some computing and amount of data might require some custom solution sometimes, the software itself could almost always be easily replaced by Excel. This is a hilariously stupid oversimplification, but in an alternate world where Microsoft somehow gained a 100% monopoly on computing, they would’ve probably found a way to use Excel in these contexts anyway. Obviously, there is enough to be said for the need for custom applications that do things their own ways, for one, I would hate people to have to deal with the UX of Excel when they just want to order some food through Uber Eats. Doesn’t change the inherent depressing thought of “making another Excel” every single time I worked for another software company.
Making Notion Cafe
So, in October of last year, I really wanted to solve a problem I was having. I’m writing a lot of my notes and tasks in Notion. If you don’t know what Notion is, it’s basically your favourite parts of Evernote combined with Trello. It is amazing software if you need to process information and plan a lot of work. Here’s the problem with Notion. It has a really cool way to show your tasks, pages and appointments in a Calendar view. However, there is no way to sync this calendar with something like your phone, smartwatch or calendar on your laptop. I was an avid user of my calendar app on my different devices as well, but I wanted to make sure that I didn’t have to write all of my appointments twice. What if I used Notion’s API to write a small script that converts it into iCal format? 🤔✨
So I did! And guess what, when I initially did some googling to find a solution for this problem, I found out that loads of other people were having problems with this as well. What if I offered this script to them as a service? I mean, most people that use Notion have some form of a disposable income and are willing to spend money to improve their productivity, right? They did.
So I started with a public integration with Notion that provided the Notion-appointment-to-calendar-appointment converter and went to all the Reddit threads where people were asking for a solution to the problem.
Over the span of the last 11 months, more than 15 thousand people have found their way to the integration. The platform has about 6 thousand daily active users and is going towards 200 paying users! This all comes down to more than 500 EUR monthly recurring revenue. I spend this money on things that make me happy and invest it into community projects like gamedev.lgbt 🏳️🌈✨
Designing my software based money tree
So how do we appropriate tech into something that we can build our life on? There is a Venn diagram of different things to come together for the application that can do that.
- It needs to have a demographic willing to pay some amount of money
- It needs to be manageable by 1 individual (me)
- It needs to be low-to-zero cost in order to operate
- The software shouldn’t fundamentally hurt anyone
It needs to have a demographic willing to pay some amount of money
Why start a small business for a demographic that isn't willing to pay money for your service, but a lot of contemporary apps seem to be focussed on solving problems that people might have no need to pay for, or where the last resort is always selling data. I didn’t want that, I wanted to provide a service where people just pay upfront for the service rather than having to do shady data practices (which I don’t even know how to do).
It needs to be manageable by 1 individual (me)
Manageability sounds rather simple, but a lot of people might get it wrong. The solution to the ever-increasing complexity of DevOps & tech in general isn’t to automate it, but to eliminate the need for the complexity to begin with. If you are designing your application to be run in the simplest & least complex way, it will make it more manageable. It also means that you design your code not for cleanness, structure or aestheticism but rather for manageability over the long run. You’ll see this come back several times as some of my code seems counter-intuitive to what most people would consider “correct”. The end goal should be for the project to be manageable, not for it to be “perfect”.
It needs to be low-to-zero cost in order to operate
This is mostly about not having scalability problems, either now or down the line. If an application like this requires costs that outweigh the revenue, then we’re designing a money pit rather than a sustainable business. If we keep our costs low for hosting, deployment & operation, we can extract the most profit per paying user, therefore making it easier to get to our goal: being able to pursue creative freedom!
The software shouldn’t fundamentally hurt anyone
The last point is one that I think should be evaluated more in tech. One could easily make another platform with some bullshit in combination with AI, or doing something to automate a task done by a secretary. My problem with these types of software solutions is that they make working class people obsolete rather than enhancing their (work)lives. My first job at a startup was mostly characterized by a story that the CEO once told me. He was giving a demo of our software to a medium-sized company. Our software was rather simple, it was the combination of a customer management system, with human resources and billing. These tasks were given to a secretary within the company, a secretary that was sat in the same room as my boss while he was giving the demo. When it was time for a round of questions nearing the end, she raised her hands and asked, “But if all of this is automated, what work is there for me to do?”. And this is where my boss really likes to share the punchline of his story: he told her “Well, I hope your boss really likes you enough to come up with some work for you!”. It’s absolutely disgusting, and it made me forever try and design applications that don’t have the opportunity to destroy people’s livelihoods.
The result of all of these design decisions together? A manageably small, cheap to operate & profitable platform. An interesting side effect is that the profit margins of this service are big enough for me to run it by myself and maybe make a living, but would be completely impossible to run a larger business on. This means that this niche is not easily taken over by competitors with bigger engineering teams. The only risk realistically is that Notion decides to sherlock the feature and give users access, completely shutting down my business 😕
Implementing the software
You can skip this if you're not a programmer
The application I landed on is a simple web service written in Rust with SQLite & Litestream as a database. I deploy using fly.io, and I use Stripe as a payment gateway. By leveraging Rust, I have safety guarantees that make sure I don’t have to wake up in the middle of the night to an inbox full of emails telling me that the service doesn’t work because of a trivial software error. By using fly.io I don’t have to worry about the hellscape that is deployment, I just need to make sure that it compiles on their remote builder server, and it should just be fine. Using Stripe, I don’t have to worry about all the different payment methods, and I can just launch the service globally without having to get into the nitty-gritty of setting up payment stuff for every single country.
I also decided to run Rust in the frontend, so I didn’t have to deal with a new JavaScript framework (again) and I could have the same safety guarantees in the frontend as I do in the backend. Also, because Rust is such a low-level language with great community libraries, it was easy to implement a service that is hyperefficient in computing and memory footprint. I used to run a 256MB RAM with one shared CPU core for the majority of the software’s life. I recently had to up it to 1GB RAM because Litestream is a bit RAM hungry, but I’m working on removing that in the future.
The only bottleneck that the platform has is my bad implementation of things & the speed between my service and the Notion API. This means that with the speed of Rust’s data processing, I can process thousands of calendars a second without having to break the bank for that computing. I don’t even need to serve the calendar as quickly as possible, because the client that the user uses, is calendar software that was built to work with archaic calendar servers that are Way slower. This means 50ms+ response times aren’t bad, since the user usually isn’t aware of their calendar updating.
The resulting platform
I am able to service more than 6 thousand daily active users and more than 300k+ requests a day, without having to spend a penny: the resource use is so low that the total costs of running my service is less than $5, which fly.io will just give you for free!
But then how do I make money? Like most services out there, there’s a free version of the service and a Premium version with more features. I really don't like the way that other services lock a majority of their features behind a Premium model, so I decided to make most features available for free, but just with the limit of having 1 calendar, which is enough for most users. When the user is a power user that is likely to pay for Notion already & makes use of advanced Notion features, a Premium plan is more relevant. I didn’t want to make it too expensive either, it shouldn’t be more expensive than Notion itself, that would be silly.
I settled on 3 EUR a month, which after Stripe fees I keep 2.75 EUR, after taxes, about 2,27 per user per month. At the time of writing, I have 197 paid users, which Stripe tells me gives me 541,75 EUR a month. But there’s a small twist that usually makes this number a lot higher. I give users the option to pay for an entire year, giving them a small discount, but giving me a lot more money upfront. A yearly plan is 30 EUR, which loses me a bit of money, but gives a big boost on a monthly basis. This month (September 2023) I’m making about 851,46 EUR!
The future
The low maintenance nature of the project makes it nice to let it just sit for a bit, but with the increase of scale, there are definitely some things that need to change for the future of the platform to be equally fruitful. Right now, I’m running against the limit of what SQLite can do for me, safely. It's okay with the total amount of transaction being below 1 million, but once you get above the marker, it’s more spicy to guarantee data integrity in some situations. I’m currently rewriting the platform to use an external database server to guarantee data safety.
Next thing is to do a whole load of caching of user appointments, so I don’t have to reload all the users’ appointments, but rather only the appointments that are new or updated. Once that is done, I’m going to move on to implementing one of the most often requested features: making it possible to change and add appointments in your calendar software and have those changes reflected inside of Notion. I have a strong suspicion that the reason why a lot of users don't end up paying or using the service, is because they expect this to be a feature. Once I release the feature, I expect the conversion from (inactive/free) users to paying user should increase significantly, potentially doubling my revenue, without increasing operating costs by a lot.
Maybe Notion pulls the plug on my integration before I can get anything true financial stability out of it, who knows. Regardless, I enjoyed this as an exercise in engineering.

hey there 👋 thank you for taking your time to read my article.
my name is bram, and you can follow me if you want to read more stuff like this ✨
if you wanna support me, check out notion.cafe ☕️. are you a queer gamedev? join gamedev.lgbt 🏳️🌈