Slopes Diaries #16: Recovering from a Stall

Slopes Diaries is my ongoing journey to turn my indie app into a more sustainable part of my business. First time reading? Catch up on the journey so far.

What is Slopes? Think Nike+, Runkeeper, Strava, MapMyRun, etc for skiers and snowboarders.

We all make mistakes. Lets talk about how I ended up writing off most of November (the month leading into the start of the ski season, a bad month to lose momentum on).

In September I shipped a major iOS 10 update with tons of new stuff like Siri integration, hugely improved watchOS support, and more. At the same time in September I attended a conference, spoke at another conference, and was in the home stretch for prep for the iOS conference I ran here in Philly, CocoaLove. By the time CocoaLove was over in mid October, I was pretty burnt out.

I've never been good at sitting still though, so I was determined to push forward and start my next big feature: localization. It was going to be a lot of work as I was starting from square one. I've been lucky enough to always work on English-only apps, and as such had never typed NSLocalizedStringWithDefaultValue in my life.

I had a lot of work ahead for me:

  1. Localize all my .m files, with the help of the new Xcode 8 static analyzer. NSLocalizedStringWithDefaultValue all the things.
  2. Localize .swift files, which sadly the analyzer misses. Lots of manual searching.
  3. Localize IB / Storyboards.
  4. Figure out how far I wanted to localize server-side stuff like error messages.
  5. Purchase the translations from a service.
  6. Find out all the ways I didn't plan ahead well enough with Auto Layout, and fix those layout issues.
  7. Set up Fastlane automation to generate my screenshots with UI testing so I didn't go crazy with every release.
  8. Testing. Lots of testing with foreign beta users.

I spent all of November to get as far as step partway into step 3. There was a lot of work, but truth be told I was moving at a snails pace; largely because of a mix of motivation, burnout, and some likely other mental health issues that surfaced.

Personal issues aside, lets talk motivation.

Being a solo dev is a hard balance between working on the shiny features that interest you and working on the features that you should work on but really don't feel excited to. Localization, like marketing, usually falls into the second category. But unlike marketing, committing to localization brings a near-guaranteed drag on future productivity and release turnaround times. One can't just translate to a language once and be done with it; every other new feature meant another (although smaller) trip through the localization process.

On the flip side that hard work should pay off. It would in theory lead to more downloads and better revenue in countries speaking the languages supported. Europe is a huge ski / snowboard market so the urge to localize was logical.

I was in a situation like this before: lots of work for a hopeful payoff. I spent most of summer 2015 reworking Slopes to make sense with a subscription model. I had no idea if moving away from paid up front would work well, just a lot of napkin math and theories. But back then my gut was telling me it'd work, so I could push through all the engineering and planning it took to make it happen. (spoilers: it did)

I didn't have my gut backing me up this time.

In November I kept ignoring the nagging voice in the back of my head: was this the right path? If I shipped this, I was committed to it. I can't ship v2.6 or v7.8 and remove German just because it wasn't worth it, at least not without angering a lot of customers that came to rely on your app.

Maybe I had to re-evaluate some assumptions. The real question I was seeking to answer with localization was "how can I better address and attract this segment of my market?" Localization is an answer to that question, perhaps the most recognized one, but that doesn't mean it was the right one for me right now. For example: most of the "why is Slopes $20, make it cheaper!" complaints I get are from Europe. Skiing / boarding in the US is expensive by comparison; the list of most expensive resorts in Europe is cute, to say the least. My podunk hill in the Poconos is $70-a-day on the weekend, and Colorado resorts can easily be double that. I based the Slopes subscription price on my personal feeling for what is reasonable in the US market, but playing with Apple's new regional subscription pricing may likely yield better conversion rates in Europe.

If I'm pricing myself out of the market to begin with, no amount of translations will help.

So, in early December, I decided to shelve my localization branch (which was hard to admit to myself I needed to do, but I felt so good the day after I did).

I can't know if abandoning my efforts was the "right move" for sure, but my gut is telling me holding off is the way to go, at least for the moment. It wasn't total loss; there's some code I salvaged from my efforts; ways I improved Slopes towards the goal of localization. But I do feel set back.

Since abandoning the localization effort I've had a reasonably productive December getting user-requested features in, and squashing many annoying bugs. v2.5 is hopefully shipping the first or second week of January, just in time for the main two months of the North American ski season. I'm feeling pretty good about my new plans for after v2.5, too, now.

If I learned anything last month, it's that I can't fight my gut. In retrospect I think I panicked, trying to be the savvy business dude, and took on something that wasn't a good fit. I'm really kicking myself for having to write off an entire month, but at least I feel like I'm back on track now.

P.S. Make no mistake: I realize this is a 100% American/UK-centric mindset to hold. Localization is a good thing, and I hope to get to it one day. Maybe during a summer when my "the season is ticking, only 3 months left of peak-winter" feeling isn't constantly on my mind.