As a SAAS business, new customer acquisitions are obviously very important for the organization’s growth – but reducing churn is just as critical. While we don’t do any marketing (at all), our growth is generally consistent and predictable, with around 20-35 new Snipe-IT signups a week, predominantly hosted accounts, but certainly some support customers as well. We also usually churn out around 10 customers a week, so our net customer acquisition is usually around 15-30. Anything over 20 net is considered to be a good week here, over 30 net is a great week – but at $40 a month, that’s $400 we’re leaving on the table every week, $1600 per month, nearly $20,000 per year. That’s real money.
Additionally, the most “expensive” time for a customer, with respect to support load, is always the beginning. Getting them oriented, migrating their data from self-hosted, helping them with their LDAP or SAML setup, etc – all of that takes time. It always sucks to invest hours of support time getting a customer all set up and then they cancel after a month because the software didn’t work the way they thought. That customer is effectively a net loss for us when you factor in support tech salaries and the time spent getting the customer sorted.
Fortunately, our lifetime value per customer is pretty good, even with the churn we currently have. According to Baremetrics’ Benchmarks, we are generally in the upper quartile compared to other companies for almost all of their metrics in the $25 – $50 ARPU (Average Revenue Per User) cohort, and we’re outranking 93% of the other companies in our cohort for Lifetime Value.
While some amount of churn is to be expected in any business, the goal should obviously be to reduce it as much as humanly possible. One of the most straightforward (and really obvious) ways we’re trying to tackle that is by asking the customer why they’re leaving on the cancellation request form. A listbox with an additional box for comments is ideal here so that you can get normalized data. Freeform text for the reason will be difficult to query against in aggregate, since you end up with things like “you suck” and “u suck” being counted as two different reasons.
|Features Did Not Meet My Needs||217|
|Moving to Self-Hosted||130|
|Asset Management is Included in a Product We already Use||119|
|Not enough time 1||42|
|Support Did Not Meet My Needs||18|
|Migrating to new subdomain||16|
|Card Declined / Payment Failed||13|
|Company Acquired – Switched to their Solution||4|
|No Longer Need / Use It||3|
|Switched to Stripe from PayPal||2|
|Client Didn’t Use It / Stopped Using It / Not a Client Anymore||2|
|1 – This reason for cancellation was added more recently, so the count here may not accurately reflect its overall percentage.|
Obviously, “Other” is not super helpful, but we also don’t want to nag the customer for too much additional detail, especially if they’re already frustrated enough to leave us. (We do get customers coming back after cancelling more often than I’d expect.)
We did see a spike in cancellations when COVID-19 broke out, as many companies didn’t survive the pandemic, but we also reached out to customers who cancelled for COVID reasons and offered to keep their accounts going gratis until everything was back to whatever “normal” was going to look like when it was over. After all, with everyone switching to remote work, keeping track of assets was more important than ever.
“Features did not meet my needs” is second in line, and that’s kind of to be expected. Everyone’s needs for asset management are slightly different, and we drill down into what that means in the optional comments. Not everybody fills in the optional comments section (and not every comment is helpful), but we can work with the ones that do, at least. For this category, not having an agent is one we see a lot, and before we added SAML integration (v5), that was one that came up a lot as well. We use these comments as a way to refine our roadmap. Well, that and the 700 feature requests on Github that are open at any given moment in time – but expectedly, paying customers’ requests have a little more weight. We gotta keep the lights on, and the paying customers allow us to be able to continue to work on Snipe-IT and make it available for free. We’re in the rather odd position of being in competition with… ourselves, after all.
Breaking down the optional comments is a little more time consuming, but adding a normalized internal database column wth values like “agent” would allow us to query them a little more easily. We’d have to add the values there ourselves, but we don’t get so many cancellations that it would be impossible to keep up with.
Recently, I surfaced this list of reasons to the team, and posited the question:
What would we have to do to eliminate every single category of these cancellations?
I’ve asked them to sit down and have a think about solutions that could address every one of those reasons for leaving. The solutions don’t necessarily have to be feasible or practical, but I thought it was important to get everybody thinking about it. I’ve been here since the beginning, and am always a little concerned that I’m stuck thinking about things in one particular way out of habit, whereas newer team members may have a fresh take.
|Cancellation Reason||Possible Solution|
|Not enough time||An agent and/or mobile app could help with that.|
|Switched to Stripe from Paypal||Not really a cancellation since they still pay us, but we record it that way – BUT BUT BUT – an answer there could be “build in the ability to cancel via paypal and sign up in stripe”. (We did consider that, but the amount of time it would take for the tiny handful of remaining PayPal customers we have wasn’t worth it.)|
|Asset Management is Included in a Product We already Use||Build integrations into those products.|
|Migrating to a new subdomain||This isn’t really a cancellation, but maybe we should be recording these a little differently, since we don’t technically cancel them in Stripe.|
|Card Declined / Payment Failed||We already use Baremetrics for our Dunning / Recovery emails, but maybe we could integrate something into the hosted product itself that checks and prompts to add a new card if one is about to expire, etc.|
These were just the first examples I came up with as I was describing the task. At our next all-hands zoom call, we’ll go through the solutions everybody came up with and see which ones make the most sense.
Our churn rate is actually pretty low compared to others in our cohort:
That said, it never hurts to try to improve. We’re still small enough that we push every new signup and every cancellation to our #general channel in Slack, and we’re still small enough that every cancellation hurts a little – not just because of lost revenue, but also because we care about providing a great product and great support.
By surfacing all of these signups and bringing the conversation to the entire team, we get the benefit of fresh perspectives and helping all of the employees feel more invested in our successes – and failures.
Until next time,
CEO & Chief Mohawk Officer
PS – Have you checked out GoodForms yet? It’s a great new email form verification and certification platform from Grokability!