HostiFi 2.0: Why I’m completely rewriting my $5,735 MRR SaaS
I started HostiFi, a Ubiquiti cloud hosting service, 1 year ago this month. Since then, it has grown from 0 to $5,735 monthly recurring revenue. 266 paying subscribers are using 309 servers, and have connected a total of over 12,000 Ubiquiti devices!
Everything has been going great… but to scale to 1,000 servers and beyond there are some major changes that I am going to start working on now proactively.
I’m pretty sure that the current website/platform can get to 1,000 servers, but this rewrite will make the codebase easier to add new features to, make bugs easier to troubleshoot, and with the new self-service features I’ll be able to add to the user dashboard, there will be less support work.
Optimizing speed is not a primary concern, although part of the rewrite will include adding threading to be able to build multiple new servers at the same time rather than consecutively. So for example, if 5 people place an order at the same time, and each server takes 10 minutes to build on average, the current solution will finish the last person’s server in 50 minutes. After the rewrite, all 5 servers would be ready in 10 minutes instead of 50.
I estimate these changes will take the next 2–3 months of full-time work (in between doing support and maintenance of the existing site).
Limitations of the current platform
WordPress pages
The pages of the website must be customized within WordPress using a page builder GUI. As someone who knows HTML and CSS, I find it slow and annoying to drag and drop. I would much rather be able to edit the code directly instead.
WordPress user dashboard
The user dashboard is a plain PHP page integrated with WordPress. Plain Javascript is used to hard refresh the page while the server is building, and when finished, the page simply displays a row from the database providing the user with a link to their server and login credentials.
It is difficult to add new features to the dashboard because of the lack of PHP framework to be able to build an API, and lack of Javascript framework for handling the frontend, so I’ve put off adding even simple features.
Without an MVC framework, the code is messy and hard to read, debug, or extend.
EDD plugins
I use Easy Digital Downloads Stripe and Recurring plugins which handle the subscription billing. However, the dashboard for subscription management is quite limited. Users are unable to pause/resume a subscription or upgrade/downgrade between plans.
Python scripts
The Python scripts are original code from a year ago that I’ve been continually been adding more on top of. The primary server building script has grown from 1,500 lines to 3,000 lines, and most of it is procedural — lacking objects and functions. When errors occur, bugs can be very difficult to track down. I’ve stopped adding new features to it out of fear of breaking other sections of the code, so it is overdue for a rewrite.
Self-hosted email
I’ve always hosted all of my email on my own servers just to save money. But more and more I’ve been realizing that the risk of a customer or prospect missing an email because it gets sent to their spam box isn’t worth the few dollars I am saving each month. In addition, with the amount of support I’ve been doing each day and the amount of spam I get, I’ve had to upgrade the server a few times just because of the disk space that email is consuming now.
Email support
Since the start, I haven’t had any kind of help desk platform. I use email and live chat for support, and they aren’t integrated. I’ve begun to have problems because of the volume of email that I’ve been receiving, I have occasionally missed emails from customers or prospects.
Hubspot Live Chat
I’ve tried out several Live Chat solutions — Small Chat, Drift, Freshchat, Hubspot. So far my favorite has been Freshchat. I was able to set it up for https://captifi.net where it sends me all of the customer’s information if they are logged in — including name, server name, subscriptions status, plan etc.
Hubspot has been my least favorite chat application of all of them.
New platform replacements
Laravel Spark (to replace WordPress and EDD plugins)
Replacing WordPress with Laravel Spark will give me the ability to edit the webpage code directly instead of using a drag and drop GUI like WordPress which is what I prefer.
In addition, Laravel Spark has a bunch of nice SaaS features built-in which will fix the problems that I’ve had with the EDD plugins:
- User has the ability to pause/resume subscriptions
- User can upgrade/downgrade between plans
- User can enable 2FA
- User can invite other team members to manage their server
- User can switch between different server dashboards
- User can pay for different servers with separate cards
Most importantly, Laravel Spark will provide me the framework to easily add features to the user dashboard. I will be able to build an API with Laravel, and use VueJS in the frontend to consume it.
OOP Python scripts (to replace long procedural scripts)
I will rewrite all of the Python scripts to be OOP — organizing the code into objects and small manageable functions instead of one long program. I’ll also be adding threading to be able to speed up operations by running multiple processes (like building servers or taking backups) simultaneously instead of consecutively.
Rackspace email (to replace self-hosted email)
I will switch from self-hosting my email to $2.99/month email accounts at Rackspace. This will hopefully stop emails from going to spam folders, and reduce the load on the server storage.
Freshdesk support (to replace email support)
I plan to implement Freshdesk as email support platform. This will help reduce missed emails, and possibly help automate some workflow with canned response templates, internal notes, and customer info readily available.
Freshchat (to replace Hubspot)
I will replace Hubspot with Freshchat which will integrate with Freshdesk to provide better customer support tracking.
New platform additions
New user dashboard features
Thanks to Laravel Spark, I will finally be able to easily add new features to the user dashboard. I plan to start by automating SSL installs, server location changes, SSH public key setup, reboot, snapshot restore, backup restore, and firewall configuration.
Drip
To scale to 1,000 servers I need to automate some very important email related tasks that I am currently doing manually:
- Proactively reaching out to new customers who haven’t added any devices yet to see if I can help them get started
- Reach out to customers who canceled to get feedback
Drip will be able to do that, and then I plan to expand to add more onboarding related automated campaigns that correspond to specific actions the user should be completing.
Freshdesk Knowledgebase
A high priority will be to create a knowledgebase with common questions and detailed guides for all of the common customer support requests. This will be key to scaling to 1,000 servers without having to hire any employees.
/open
I would like to add a “/open” page which will show #openstartup type of charts and stats: revenue, number of UniFi devices connected, number of servers etc.
7 day free trial
On HostiFi 2.0 I plan to try out 7-day trials.
Migrating WordPress to Laravel Spark
I don’t expect too much of a challenge in migrating existing subscribers to the new platform. I will have to write a custom script to generate the new tables required and transfer over the Stripe subscription ids.
Closing thoughts
In the end, I will have rewritten every single line of the original HostiFi code, but the new platform should be extensible and scalable enough to never require another complete rewrite.
If I could go back in time, however, I wouldn’t do anything differently. It’s important to launch quickly and use whatever tools you can that are within your current skillset at the time to make it work.
I’ve spent the last year programming on a daily basis and my skills have improved since then. If I had tried to put this plan together a year ago it would have been overwhelming and I would have never launched!
Follow my journey to $100k/yr ARR: https://rchase.com