Update: I've written an extensive guide for people building their first micro-SaaS app on Shopify.
14 months ago, my co-founder Sankalp and I set out to build a business that can sustain our livelihood while allowing us the freedom to live life on our terms.
When we started, we each had roughly 12 months of savings to survive on, assuming we made $0. Hence our minimum goal was to make $1,500/mo and the case where we would be celebrating with champagne was set to $3,000/mo.
14 months later, we grew past $25,000 in MRR while remaining a 2 person team.
I’m so proud of what we have built here.
If life is a video game, and there’s 100 levels to it, I feel like we have finally crossed level 1.
Here's what we've been up to in the 14 months since launch:
We did a lot of things right, but we also messed up here and there. I've tried to capture an honest and accurate account of our journey so far.
Running your own business and having 100% freedom and flexibility is a gift or a curse, depending on how you use it. It’s easy to get lost in building, polishing, bringing your ideas to life. But remember, the only things that matter are what move the needle.
For every decision related to your business, you should always run it through a set of questions that help you filter out whether your idea is aligned to your business goals.
Ultimately, you want to keep making decisions that move the needle for your business - by bringing you more customers and revenue, or making it easier and less time consuming to run the business (if that’s one of your goals, it is for us).
From our research, we learnt that Shopify merchants are mostly solopreneurs or teams of 2-10. They are always time and resource crunched.
We wanted to enable our users to start using the app with the least amount of setup time or steps. This reflects in in the user experience of the app.
For example, when a first time user enters their phone number and hits the “Save” button, at this time the user is looking to test our app and see if it fits their needs. We speed that up by automatically enabling the chat button on first save, along with the best default configuration for all chat button related settings.
Another example, when a user wants to start sending automated messages, all they have to do is click on the “Enable” button. All the app’s default configuration is automatically applied and the user can start seeing value immediately.
Users are on a mission to achieve their goals. They typically need your help when there’s something that stops them from getting there.
From day 1, we were clear on providing the best possible support. Our users would be thrilled to see bug fixes deployed in 15 minutes, WhatsApp & email replies in 5 minutes, and so on. We were fast, we were responsive.
This worked in our favour - users showered us with positive reviews which is how we managed 500+ reviews while staying 5.0 star rated.
But customer support isn’t only about getting reviews. We’ve had users who prefer using our app instead of competitors because
A- We reply quickly
B- We proactively provide information beyond the immediate premise of the query
The downside of trying to be a customer support hero is, you only have finite hours in the day, and you don’t want to spend most of it replying to customers.
We took 3 specific initiatives to reduce support tickets.
1- Embed FAQs within the product
We found that users would have FAQs around specific features, and they wouldn’t really go to the help center and reference it. To them, it’s simpler to ask for help.
To solve this problem, we embedded FAQs inside the product itself.
Here are a few examples where we included the most commonly asked question beside the feature configuration.
The results were always immediately noticeable. Where we would get 10 questions a week about X, would drop to 1-2, thereby freeing us up from answering repetitive support questions.
2- Fix repetitive bugs
If a bug appears more than thrice in a span of days, the third time is when we go ahead and permanently fix it. Why thrice? That way we don’t overwhelm ourselves with trying to fix every single bug, but only the ones that appear repeatedly and take up support time.
3- Remove WhatsApp chat support and go with Email only
During initial days, we found it useful to let our users contact us on WhatsApp. It lead to tons of conversations which shaped our understanding of the user’s needs and how we can better solve them.
But having WhatsApp as a support channel had 3 issues:
1- With time, we discovered that people find dropping a message on WhatsApp to be very low barrier. Which means they wouldn’t take a moment to look around, be patient enough to find out how the issue that they are about to describe has already been solved inside the app. It’s just easier to WhatsApp us.
2- We also discovered that users had an unrealistic expectation of quick replies and quick resolutions on WhatsApp. Granted, we would be quick whenever possible. But if it’s 11pm at night and the user asks if a bug is fixed 10 minutes later, it can get a bit annoying.
3- I started dreading picking up my phone, seeing it full of support tickets every morning.
To solve this, we removed the WhatsApp chat button from our own app, and replaced it with an Email support button instead. All 3 problems listed above got resolved to a great degree.
We also made numerous smaller tweaks to optimise our support flow. One of the tiny but powerful tweaks was to automatically populate the email subject line with the user’s Shopify store url. That made it so much faster for us to look up the specific user instead of a meaningless back and forth of “what’s your store url”.
Our efforts have paid off. Unless we’re building new features, we spend only about 15-30 minutes per day on customer support.
Users ask for all sorts of functionality. It doesn’t mean you should build them.
Whenever we get feature requests, we add a card in our internal Notion board and judge the card against 3 factors
1- how many times do we receive the same request
2- does the feature align with the rest of our product
3- does the feature add core value to the user
Many times, we found users requesting features that would save them the hassle of using another app. Now, if that functionality enhances the rest of our app, it’s the right feature to add. But if it doesn’t, then we politely decline.
There are 2 types of responses we give to customers regarding feature requests:
1- Tell them that this feature isn’t requested by other users that much, and since we are a small team with limited resources, we may not be prioritising this feature in the near future.
2- Tell them that this feature is already part of our roadmap, and that we will reach out to them whenever it’s ready. I generally avoid giving timelines, to account for “life happens, plans change”.
This learning extends beyond just feature requests.
In the past year, we have received tons of business proposals, partnerships, integration requests, collaborative marketing invitations etc. Saying No allowed us to remain focused on what’s really important.
I was under the impression that during build phase, we shouldn’t focus too much on optimisation. After all, you don’t want to get busy squeezing another 10% when the potential is to 10x.
In most cases, I think I made the right call. One place I made the wrong call was the user onboarding flow.
Until March 2020, users would install the app and directly land on the chat settings page, which is the starting point of the user’s journey. We were getting a steady flow of 10-15 paid trials initiated per day.
Adding a step of friction before this would be counterintuitive, right? It couldn’t possibly increase trials, right?
When we added one screen which asked the user upfront whether they want to continue with the Free plan, or start a trial for the Paid plan, daily paid trials DOUBLED overnight, while trial-to-paid conversion rate remained steady at 50%.
The experiment took us a day to build, and after a week we concluded what was clearly the winner.
I normally advocate for focusing on building vs optimising in the early stages, but in this case I didn’t know that optimisation was waiting to unlock 100% increase in trials.
My takeaway here is - always keep your eyes open for bottlenecks at the top of funnel.
If there’s copy on your website, or a specific sign up flow that might be holding you back from getting 2x the users, you need to unblock it early and realise compounded gains over time.
In the past year, we’ve seen competitors copy our app interface, in-app descriptions, button designs, app listing text word-for-word in many cases. Initially we were furious, but instead we kept our head down and focused on customer’s needs.
Eventually we started ignoring our competitors, which was a mistake. While we were not looking, competitors gained ground on the huge lead that we had built up.
While I recommend entrepreneurs to not pay too much attention to competitors, I don't recommend ignoring them entirely.
If you had to split your attention, give 95% to your users and 5% to competition.
You want to remain informed about your competitor’s moves, whether that’s them copying you, building new features you haven’t yet implemented, or changing their pricing.
In today’s competitive landscape and low barrier to tech, all tech can get copied. Hence, build your moats beyond just your product.
I now understand better the value of building a brand.
I think we really struggled with charging correctly. Based on a few conversations with other app developers, we assumed that the right approach was to straight up raise prices. We raised our top plan from $14.99 to $19.99 to $29.99. Our paying user base kept growing, albeit very slowly.
Where did the other customers go?
To our competitors who were busy catching up.
The vast majority of our users are small merchants who barely have a few hundred orders a month. By becoming more expensive, we were alienating the 90% of potential paying users coming our app.
After realising this, we dropped subscription pricing to $10/mo. We make a healthy margin on messages and thus larger customers end up paying us more.
We also moved all chat button features to the Free plan, and combined all other paid plans into one plan.
This greatly simplified things for the customer, for whom there were only 2 choices to be made in the pricing page.
What do you think happened in that flat part of the graph?
Ecstatic about our initial success, we took the foot off the pedal for a few months where we pretty much allowed things to run on autopilot. It was a great time, I thoroughly enjoyed earning money while I ate, slept, read, watched, and relaxed.
But during the same time, our competitors were hard at work copying our app features. They incorporated many of our basic paid features in their free plan, which slowed down our user growth.
We were happy with the revenue we were making, which had already surpassed all our expectations before the slowdown, but we started flatlining around January-February of 2020.
That's when we decided to take back charge of the situation.
We made rapid changes to the product and more importantly pricing, which I’ve covered in previous points. This helped us retake merchants, get back to growth, and plug the leaky bucket.
If we had to go back in time, one thing we would do differently is go beyond Shopify. At the very least, we should have diversified into the Wordpress and WooCommerce ecosystem.
Initially we thought our rating and reviews volume would be enough to keep the #1 spot. Alas, we were mistaken.
There are many ways to game reviews, one is by forcing your users to leave a review. Unfortunately, the Shopify app ecosystem is riddled with more such apps everyday, and one of them set their sights on us and overtook our ranking in less than 3 months.
Thankfully, the effect we had on trials initiated barely registered. We are mostly losing users seeking a “completely free” solution to our competitor. But it can get worse in the future as competition continues cloning our app (down to our code snippets).
My takeaway from this is - depending on 1 distribution channel can be dangerous, especially if that channel is an app marketplace which you don’t own.
Sankalp and I kept enjoying everything this app gave us because it would always surpass our expectations. For example - we expected to hit $3k MRR by end of 2019, but we crossed $8k by then.
This kept happening time and again. And while there’s a risk of setting the bar too low, as long as you’re aware that you’re not doing that, it’s far more enjoyable than setting the bar too high.
Ultimately, we didn’t quit our jobs and start a business to lead stressful lives.
We want the businesses we build to work around our lives, enabling us to live more freely and be more happy.
For the most part, I think we have achieved that.
If you enjoyed this post, do share your thoughts with me on Twitter.
I sincerely hope this post will help new entrepreneurs who are building a Shopify app, or a micro-SaaS product to grow their business. And also give ideas to help entrepreneurs who like us are somewhere in the messy middle.