Bootstrapping with a simple, low-cost tech stack
Cover photo by Eaters Collective on Unsplash
Hey! I’m Danielle, I’m a digital nomad and indie maker from the UK. Three years ago I left it all behind to travel the world with my partner James. Together we founded a remote web development agency in 2017. Since then we have been freelancing to fund our travels while working toward ramen profitability so that we can live off the revenue from our own projects.
On our journey to find something that sticks we have built several products, including one that failed and one that was acquired. Our flagship product and primary focus is Leave Me Alone— a service to easily unsubscribe from unwanted emails.
Whenever anyone asks what tools or language should be used for a project, we think that the deciding factor should almost always be whichever you know the best and can build fastest with. There are always going to be better tools for a job, or better ways to do something, but not knowing the correct tool for the job shouldn’t hold you back from building something. You can always refactor and scale code, there is no point in planning for a million hits a month when you are getting zero.
The Leave Me Alone Tech Stack
MERN
Leave Me Alone is built with JavaScript using the MERN stack: Mongo, Express, React, Node, and Redis (so technically MERRN?). These are the tools that we are most familiar with. They make it easy for us to build and iterate quickly and make good implementation decisions with regards to performance and optimization. We also just love writing JavaScript! We have used Redux in some of our previous projects, but the combination of React Hooks and Indexed DB means that we don’t need to use it anymore to maintain state.
IndexedDB
Privacy is at the core of Leave Me Alone. There are a few existing services that allow people to clear out their inboxes for free, but they don’t charge because they sell all of their user data for marketing. (One example: Unroll.me selling data from Lyft emails to Uber.)
Our promise to protect users' privacy means that we never store the content of any of their emails on our servers. All of their email data is stored in their browser using IndexedDB. This allows us to push new mail to the user using Web Sockets, perform incredibly fast sorting and filtering, and most importantly, keep the user in complete control of their data.
The downside to IndexedDB is that if a user switches browser or device, their emails will need to be fetched from the mail provider servers again, since the data would be stored locally. We store some metadata about the emails, such as the ID and whether they have been unsubscribed from, so that the user will still have the same Leave Me Alone experience from multiple devices.
Digital Ocean
We use Digital Ocean for our hosting. Their user experience is fantastic, they are always adding new features, and their mascot is adorable! It is really easy to add servers, increase resources, and keep an eye on performance for big spikes such as a launch day.
Our database of choice is MongoDB, and we often use Redis too. Digital Ocean makes it really easy to install and manage both of these, which is a big reason why we use it. In fact, for Redis you can actually spin up a fully managed, high-performance database cluster service to make things even easier. Google Cloud and AWS have a huge variety of services available, but their user experience is complicated.
Mailgun
Around 45% of the unsubscribes we perform are by sending an email to a mailto
unsubscribe address (check out our “Unsubscribe Strategy: Link vs. Mailto” pie chart on our open page). It is very important for the email provider we use to have a high email deliverability rate and a good API—and for the pricing to be reasonable.
We use Mailgun for all of our email needs. Their UI is not the most intuitive but they provide everything we need at a very low cost. In the month following our v1 launch we sent 25,572 emails and it cost us $7.79!
If we fail to unsubscribe our customers from a mailing list then it does not cost them any credits. Mailgun's webhooks help us determine the success of delivering an unsubscribe email, and we give the users back their credits if the delivery fails for some reason, such as if the address is invalid or the email bounced.
For previous projects we have used SendGrid and MailChimp to send branded transactional emails, but to send thousands of unsubscribe emails a month would cost us way too much money with both of those tools. Plus, we have over 10K customers on our newsletter mailing list which we use very occasionally to send out important product update announcements; Mailgun doesn’t charge for subscribers, only for emails sent!
Takeaways
We ultimately decided on our stack because we have been building products with these tools and technologies for years. We recommend keeping your tech stack lean and making sure that each tool has a defined need, rather than trying to use too many different technologies and making everything too complicated.
The final bit of advice is to choose tools that will keep costs low. It’s easy to do tasks manually until the need to scale is too great. Most founders and indie hackers are bootstrapping themselves to profitability, especially in the beginning. A few extra dollars a month on additional services or unnecessary tools could be the difference between profit or loss.
Originally published at Indie Hackers on 24 Oct 2019