I’ve built a Slack bot in Ruby on Rails and it is profitable. In this blog post I will describe what I did and tools I used to create, promote and monetize a simple SAAS product.
Working professionally as a web developer you usually deal with huge projects containing tons of business logic. It is virtually impossible to create something similarly complex in your free time without going full indie.
I wanted to build something simple but still capable of providing real value to the users.
Here comes the story of Abot.
Purpose and origin
Abot allows you to send anonymous messages to channels and other members of your Slack team. Whoever receives a message can reply to the author without knowing who he is. It basically enables you to talk with your teammates, without knowing who you are talking to.
I came up with an idea after having to participate in yet another endless company meeting. I had a feeling that everybody knew that it was a waste of our time but no one wanted to be the first to tell it.
Abot in action
Costs of running
Server infrastructure
So far over 400 Slack teams registered, totaling to over 50k users. Even the most active teams send at most dozens of messages daily so server load is minimal. I managed to squeeze both web server and background worker processes on a single $7/month Hobby Heroku dyno.
Abot memory usage for both web server and Sidekiq process is stable around 256MB
I only keep necessary data about the teams and delete messages metadata regularly so until now free Heroku PostgreSQL database with 10k rows limit has been enough. If I get close to the limit, I would need to pay $9/month for a larger database, but that still would be acceptable costs.
Payment provider
I use Paddle as my payment provider. I started with Braintree Payments but had legal problems due to some polish tax laws.
Paddle takes a 5% + 0.50$ cut per sale, but handles taxing as well, so for me that’s more than worth it. With Braintree I had to take care of invoicing and taxes myself.
It also offers a flawless checkout process and is very simple to implement programmatically. Just a couple lines of JavaScript and one HTTP webhook handler.
Paddle checkout process
Domain
Abot is located on abot.apki.io. It shares one root domain with a bunch of my other apps:
Some of them are profitable as well so the yearly renewal cost of a root domain is shared. You can check out my other blog post for info on how to setup multiple domains with free SSL.
Other paid services that Abot depends on
Abot logo is just an icon from Icons8. I have to pay $19.90/month for a license, but I use more icons for my other commercial apps as well.
Same with Grammarly. I use it to correct my blog posts and all my apps. Disclaimer: I am participating in Grammarly affiliate program, but I would recommend it anyway.
Devoting tens of hours of work to create a project and end up with a bunch of grammar errors and typos on a landing page is something to be avoided.
For a long time, the only source of signups was an official Slack app directory.
Only recently I’ve started looking into establishing new sources of users. I have to admit I have not been properly tracking visitor and signups sources so I can only assume which of the techniques I mention have the best effect.
Google organic traffic
I’ve optimized the Abot landing page SEO for a couple of keywords, but currently, there are only a few daily visitors from organic search results.
Cross promotion
This blog generates decent traffic of a couple thousands daily visitors. I’ve decided to leverage it for Abot promotion. I write mostly technical posts so they are a good occasion to mention Abot:
Backlinks without a nofollow
attribute are also a proven way to improve a target website SEO, but I am not sure if multiple links from the same domain have an increasing effect.
I had mixed feelings about putting too much advertisement on my blog but a little link won’t hurt anyone I suppose. I can promise there will never be a fullscreen subscription popup here.
“Spamming” discussions
It is also something I’ve started doing only recently. Whenever I encounter a discussion where it makes sense to submit a link to the Abot landing page then I do it. It could be a Reddit thread or an Indie Hackers discussion.
Obviously, I try not to be spammy, just let people know that the project exists when a discussion context is relevant.
An example Abot mention in an Indie Hackers discussion
Contrary to my own backlinks, links in comments always have a nofollow
attribute so they do not improve SEO rating directly.
Motivation
I know that some startups have fancy screens in their offices displaying live stats about current product usage. I have my Slack notifications:
A daily dose of motivation
I started using them as a way to debug scheduled tasks and make sure that things work correctly. I usually disable most of them after some time.
It is always nice to know instantly whenever someone made a purchase or another ten new signups have been made. It has been a good way to keep me motivated to come back to developing the project after hours, even after a long day at work.
Purchase reminders
Purchase reminders from the above image is a feature which turned out to convert to sales reasonably well. Whenever someone tries to use Abot after the trial period, he and the user who did setup the integration receive a friendly Slack message asking them to make a purchase. After 2 days founder gets one more message reminding about Abot.
Teams can disable it at any time just by removing the integration.
Purchase reminder in action
Current income
I will not disclose an exact number. I will only say it has been a couple hundred $$ in the last month. Currently, the number of new signups and paying teams is steadily growing.
Together with minimal infrastructure costs, I mentioned it brings in a nice passive income every month with close to none maintenance needed.
To the contrary, my previous Slack bot Tracky (no longer maintained) grossed a whopping total of $324 throughout his entire ~3 years long lifespan. Its operating costs were over $20/month, so it was a net loss for me.
Tracky was not the most profitable app I’ve made.
Future plans
Pricing changes
Recurrent monthly payments are a holy grail of everyone working on SAAS products. Honestly, I don’t think that this approach would work for Abot.
With the minimal maintenance costs I mentioned before, a single purchase covers months of running the project. Because of it Abot can still be profitable without recurrent payments. If you are a business expert and disagree when reading it I am open to advise on how this business model could be improved.
I am currently working on adding various price thresholds depending on team size. Currently, there are some teams with literally thousands of users and they still pay the same one-time price.
Privacy and terms
Since I started working on this project, users privacy and data have been a top priority for me. With new GDPR laws going live soon, I will have to work on adjusting the privacy terms and how I handle data to the new regulations.
New features
I know that for some teams a tool enabling everyone to send untrackable anonymous messages could be too much of a sharp knife. I am just finishing a new feature, a way for Slack team admins to optionally limit how Abot can be used.
It will be a settings panel where admins can whitelist channels for Abot usage, or optionally disable direct anonymous messages.
This idea came from one of Abot clients:
We use Abot with a separate Slack channel for anonymously shaming employees into keeping their work area clean. Those shamed need to bring in donuts! Since donuts are on the line, it encourages people to participate. And it’s just fun to try and guess who shamed who.
Summary
I have to admit that I am a bit addicted to creating side projects. For the last couple of years, I was avoiding working full-time professionally to have more time for them without going full no-life.
Being able to monetize a side project and receiving a positive feedback from happy users is a great feeling. It took me over 3 years of regularly working on my own stuff after hours to reach a stage where there is some actual profit from it.
I hope to grow Abot user base in the following months. There might be more teams out there that could use some anonymous honesty.