<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Curtis herbert - Curtis Herbert]]></title><description><![CDATA[Curtis herbert - Curtis Herbert]]></description><link>https://blog.curtisherbert.com/</link><image><url>https://blog.curtisherbert.com/favicon.png</url><title>Curtis herbert - Curtis Herbert</title><link>https://blog.curtisherbert.com/</link></image><generator>Ghost 4.32</generator><lastBuildDate>Thu, 05 Jun 2025 13:32:23 GMT</lastBuildDate><atom:link href="https://blog.curtisherbert.com/author/curtis/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Slopes Diaries #46: An Intentional Dozen]]></title><description><![CDATA[Monday was a pretty big day - Slopes is now employing 12 people full-time (not that 12 is a particular number of interest, but we just crossed the 10 people threshold mid-May, so I figured I'd wait until now to write about it 😅).]]></description><link>https://blog.curtisherbert.com/slopes-diaries-46-an-intentional-dozen/</link><guid isPermaLink="false">65c5cf800251c94e7b191075</guid><category><![CDATA[slopes diaries]]></category><dc:creator><![CDATA[Curtis herbert]]></dc:creator><pubDate>Wed, 04 Jun 2025 18:18:37 GMT</pubDate><content:encoded><![CDATA[<p><em>Slopes Diaries is my ongoing journey to turn my indie app into a more sustainable part of my business. First time reading? <a href="https://blog.curtisherbert.com/tag/slopes-diaries/">Catch up on the journey so far</a>.</em></p><p><em>What is <a href="https://getslopes.com">Slopes</a>? Think Nike+, Runkeeper, Strava, MapMyRun, etc for skiers and snowboarders.</em></p><hr><figure class="kg-card kg-image-card kg-width-wide"><img src="https://blog.curtisherbert.com/content/images/2025/06/Screenshot-2025-06-03-at-08.05.19.png" class="kg-image" alt loading="lazy" width="2000" height="1302" srcset="https://blog.curtisherbert.com/content/images/size/w600/2025/06/Screenshot-2025-06-03-at-08.05.19.png 600w, https://blog.curtisherbert.com/content/images/size/w1000/2025/06/Screenshot-2025-06-03-at-08.05.19.png 1000w, https://blog.curtisherbert.com/content/images/size/w1600/2025/06/Screenshot-2025-06-03-at-08.05.19.png 1600w, https://blog.curtisherbert.com/content/images/size/w2400/2025/06/Screenshot-2025-06-03-at-08.05.19.png 2400w" sizes="(min-width: 1200px) 1200px"></figure><p>Monday was a pretty big day - Slopes is now employing 12 people full-time (not that 12 is a particular number of interest, but we just crossed the 10 people threshold mid-May, so I figured I&apos;d wait until now to write about it &#x1F605;). Hard to believe that just 3 years ago I was <a href="https://blog.curtisherbert.com/slopes-diaries-43-chasing-a-goldilocks-business/">writing about hiring my <em>second</em> employee</a> and my concerns with too much growth going forward:</p><blockquote>It&apos;s an easy trap to fall into, to keep chasing growth. You start to feed that cycle innocently enough because you need more people to keep up with work, and then you have to chase bigger and bigger things to keep that growth % up next year to support costs, and then you need more people to keep up, yada yada. Suddenly you look around and realize you have a team of 100 on payroll that you&apos;re responsible for.</blockquote><p>This caution has been a driving force for me behind every hiring decision I&apos;ve made: <strong>growth begets growth</strong>, work will find a way to fill all voids you provide it with increased staff. Growth can be the path of least resistance, and you need to actively and intentionally manage that.</p><p>I am still determined <em>not</em> to fall into that trap.</p><p>I think around 12 people is that Goldilocks business I&apos;ve been aiming for (I&apos;m capping head-count at ~15; I&apos;m sure we&apos;ll still need at least 1 additional support person and that leaves room for 2 more unknown hires above that). We finally have 1 engineer per platform (web, iOS, Android) full-time. That second employee I wrote about has transitioned to a &quot;Chief of Staff&quot; role (a mix of operations and EA-type-stuff), freeing me up to focus more on product and less on ... payroll and taxes and process. </p><p>These two changes take a <em>lot</em> of pressure off of me; now something can move along even when I&apos;m not actively working it. I don&apos;t have to bring Project A to a halt to ensure Bug Fix B sees progress. After being <em>the</em> bottle-neck for everything for 12 years, lemmi tell you how freeing that is. I get to spend my time designing and building things I&apos;m best-suited for, focusing on making sure Slopes stays special.</p><hr><p>Not only is the lack of &quot;I&apos;m the bottle-neck&quot; pressure nice, but I&apos;ve finally able to support a ton of the ambitious projects I had in mind for Slopes back in 2013. </p><p>And some new ones. </p><p>A fun problem our GIS team trying to solve? Trees! Yes, trees. A lot of the data out there for trees is ... lacking, at best. For example, Killington Ski Resort used to have a big square (like 1/3 the size of the resort) removed from the middle of their trees. Outside the bounds of most Colorado ski resort the trees just ... disappear. In places where tree data does exists, it can be pretty low resolution and over-simplified.</p><p>This is why <a href="https://www.justinobeirne.com/new-apple-maps">Apple Maps did their own thing</a> a few years ago to run satellite photos through ML to detect stuff, like trees &amp; over vegetation, golf cources, baseball fields, even little side-buildings in someone&apos;s yard.</p><p>We prototyped this project at a smaller scale last season for our first partner resort in Japan (I really need to write about that) and it looks amazing. But a great A vs B example is Breckenridge, Colorado. The left uses the default tree layer that&apos;s out there (trees are in green), and the right is output (trees in yellow) of ML analyzing &#xA0;imagry for tree clusters where the trees are &gt;1 meter in height.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://blog.curtisherbert.com/content/images/2025/06/Screenshot-2025-06-04-at-11.35.40.png" class="kg-image" alt loading="lazy" width="2000" height="825" srcset="https://blog.curtisherbert.com/content/images/size/w600/2025/06/Screenshot-2025-06-04-at-11.35.40.png 600w, https://blog.curtisherbert.com/content/images/size/w1000/2025/06/Screenshot-2025-06-04-at-11.35.40.png 1000w, https://blog.curtisherbert.com/content/images/size/w1600/2025/06/Screenshot-2025-06-04-at-11.35.40.png 1600w, https://blog.curtisherbert.com/content/images/size/w2400/2025/06/Screenshot-2025-06-04-at-11.35.40.png 2400w" sizes="(min-width: 1200px) 1200px"></figure><p>We&apos;re gonna have to simplify the polygons a <em>bit</em> on our output, otherwise RIP our hosting bill, but this makes the resort maps look so much better. And outside of resorts, like in the backcountry, it will help a ton for visual wayfinding and planning.</p><p>Now the goal for next season is to roll this out as close to world-wide as we can. First step is buying the $8,000 (!!) computer to churn through all this data at a larger scale this week, else we&apos;d probably set fire to Lydia&apos;s laptop.</p><p>Sorry, I&apos;m done nerding out on mapping. &#x1F605;</p><hr><p>One other aspect that keeps my hiring in check is our revenue cycle. From April-Nov the revenue flat-lines, meaning we don&apos;t have a ton of leading indicators through the spring/summer/fall for how the next season might go. I&apos;ve gotta make sure what&apos;s in the bank account in May will last us until Feb of the following year (when Apple finally pays out for December, our first big month). </p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://blog.curtisherbert.com/content/images/2025/06/Screenshot-2025-06-04-at-11.05.29.png" class="kg-image" alt loading="lazy" width="2000" height="586" srcset="https://blog.curtisherbert.com/content/images/size/w600/2025/06/Screenshot-2025-06-04-at-11.05.29.png 600w, https://blog.curtisherbert.com/content/images/size/w1000/2025/06/Screenshot-2025-06-04-at-11.05.29.png 1000w, https://blog.curtisherbert.com/content/images/size/w1600/2025/06/Screenshot-2025-06-04-at-11.05.29.png 1600w, https://blog.curtisherbert.com/content/images/size/w2400/2025/06/Screenshot-2025-06-04-at-11.05.29.png 2400w" sizes="(min-width: 1200px) 1200px"><figcaption>Gross Revenue: Sept 2013 - June 2025. I&apos;ve been neglegent on posting revenue graphs. Sorry!</figcaption></figure><p>We keep growing at a consistent 40%+ (overdue revenue update: 2025 so far has made $3.6mil gross, will probably cross $5mil), but I <em>never</em> plan on future growth for any future spending. I always allocate funds, be it for hiring or marketing spend or anything, based on what we earned <em>last</em> season. If last season can&apos;t cover it, we don&apos;t do it.</p><p>Sure, I&apos;d probably be a little bit ahead of where I am today if I was more aggressive with spending the money I have and planning around assumed growth (a fun what-if I play in my head sometimes), but especially now that our payroll is over $1mil USD/yr (!!) there is no way I&apos;m taking the risk of people&apos;s livelihood based on just a guess at growth numbers.</p><p>(By the way, I recently switched over to <a href="http://fathomhq.com">Fathom</a> for my revenue predictions / runway estimates to help me manage spending especially during that April - Nov timeframe. Working out pretty well so far and it integrates with Xero (my book-keeping software) to automatically keep things up to date. Much better than my old spreadsheets approach. Give it a look if that sounds useful to you.)</p><hr><p>So yeah, fun times. We&apos;re a company with an org chart and team directory now &#x1F92E;. But we&apos;re trying our best to preserve the indie-small-app-small-team culture and not lose what we love about doing this.</p><p>&apos;Cause that&apos;s the nightmare situation: turning Slopes into something we (I) hate and don&apos;t look forward to showing up for.</p><p>I&apos;ll be honest, had I not hired these engineers and gotten a Chief of Staff, I might have personally been on that trajectory (ok, &quot;I was&quot; is the proper phrasing, but I&apos;m in denial ok!). I&apos;ve been feeling the weight of having so many customers, a business that&apos;s growing to this size, managing a bank account with such seasonality, and so many responsibilities. I&apos;ve been feeling burnout creeping in.</p><p>If you&apos;re considering hiring, they always say the first hire is the most intimidating, and it is. But looking back I feel like things <em>really</em> shift after 3-5 people, that&apos;s when it starts to feel like a lot.</p><p>But I will say, I&apos;m glad I stretched myself thin and hired engineers last (besides the <a href="https://blog.curtisherbert.com/slopes-diaries-38-android/">part-time Android engineer</a> who has built that version of Slopes since 2020. Which by the way, he&apos;s gone full-time!). It&apos;s kept the product relativly lean and made us focus on the infrastructure (customer support, resort data management, GIS, etc) needed to support an app like Slopes. It&apos;s made us pick the most impactful features to focus on as we went, vs building everything and the kitchen sink.</p><p>But hopefully now, we can really get moving.</p>]]></content:encoded></item><item><title><![CDATA[Slopes Diaries #45: Building Trust]]></title><description><![CDATA[Oh boy, it's been a spicy few months in the Apple ecosystem 🍿. But this might just let us answer the big question we've long been unable to answer with anything but speculation.]]></description><link>https://blog.curtisherbert.com/slopes-diaries-45-building-trust/</link><guid isPermaLink="false">68263993166835068837736e</guid><category><![CDATA[slopes diaries]]></category><dc:creator><![CDATA[Curtis herbert]]></dc:creator><pubDate>Thu, 15 May 2025 21:37:18 GMT</pubDate><content:encoded><![CDATA[<p><em>Slopes Diaries is my ongoing journey to turn my indie app into a more sustainable part of my business. First time reading? <a href="https://blog.curtisherbert.com/tag/slopes-diaries/">Catch up on the journey so far</a>.</em></p><p><em>What is <a href="https://getslopes.com">Slopes</a>? Think Nike+, Runkeeper, Strava, MapMyRun, etc for skiers and snowboarders.</em></p><hr><p>Oh boy, it&apos;s been a spicy few months in the Apple ecosystem &#x1F37F;. </p><p>Ever since the EU alternative payments ruling a while ago, and especially now with the injunction in the US opening the web payment floodgates, I&apos;ve had people asking me about what I intend to do with Slopes and Apple IAPs vs web-based purchase flows? To answer that, I need to take a step back and explain why I&apos;ve long-held the opinion that IAPs weren&apos;t just a &quot;3% credit card fees, so they&apos;re charging us 27% for hosting and bandwidth!&quot; situation.</p><p>There are two things Apple provides as part of the IAP system that has always been undervalued, and in my opinion they are <em>well</em> worth that theoretical 27% (or 12% on subscription renewals).</p><h2 id="banking-taxes-and-compliance">Banking, Taxes and Compliance </h2><p>I don&apos;t think most developers realize how much of a PITA it is to sell internationally. </p><p>Slopes is a global app, with only 60% of its business coming from the US. If I wanted to sell with Stripe today I&apos;d need to register in many of the countries/states we have a presence in. Each country has a threshold of sales where you don&apos;t need to register/report; sometimes that&apos;s a volume of transactions and sometimes it&apos;s sales volume. But if your app has any international traction you&apos;ll hit those thresholds quickly.</p><p>Once you do, you have to worry about keeping on top of each countries&apos; various reporting requirement about sales, and then submitting tax payments to them. You&apos;d have to keep adjusting IAP prices as tax rates adjust in each country and make sure you&apos;re collecting taxes on every sale. Sometimes all of this may have a cost associated with all this (lawyers, etc), but it&apos;s guaranteed to have a cost on your time. </p><p>Thankfully <a href="https://docs.stripe.com/payments/managed-payments">Stripe just announced</a> they&apos;re going to be offering a service to become your merchant of record in many EU countries (hopefully expanding to Asia over time?). They&apos;ll handle tax compliance, fraud, bank disputes, and all the other &quot;selling products directly to customers&quot; BS that Apple shields us from.</p><p>We don&apos;t have any pricing on that service yet (it&apos;s in private preview at the moment, so those details are pending), but a similar service like Paddle charges 5% + $0.50 per transaction. On Slopes&apos;s yearly plan that equates to 6% of each sale. If you&apos;re a $9.99/yr kinda app, that&apos;s 10% per sale. If you charge monthly ... that $0.50 will add up quick.</p><p>We also don&apos;t know how Stripe will deal with chargebacks on our behalf, but Paddle has a $15 fee (+ the original transaction value) for every chargeback dispute lost. And you need to keep your chargeback rate at &lt;0.65% of your sales volume per month or else Paddle may &quot;make you make changes.&quot;</p><h2 id="transitive-properties">Transitive Properties</h2><p>The biggest benefit I&apos;ve always seen to relying on Apple for IAPs is that <strong>Apple&apos;s hard-earned trust gets extended into our products</strong>. I&apos;ve long-argued that if we could measure the conversion rate difference between IAP checkouts and web checkouts, IAP would beat web by more than enough to make the 30% fee worth it (not to mention the long-tail of subscription renewals on those checkouts, at 15%, or if you&apos;re making &lt; $1,000,000 USD/yr and in the small business program also at 15%).</p><p>Today, <a href="https://www.revenuecat.com/blog/growth/iap-vs-web-purchases-conversion-test/">numbers</a> are starting to come out from people who initially jumped on the alternative-payment checkout options strategy showing just that: a 25% - 45% drop in conversion rate between IAPs and web-based. </p><p>(Keep in mind that&apos;s without adjusting for the additional 3-6% you&apos;d pay in fees for web checkouts. That&apos;s the conversion rate, not your effect on earnings %.)</p><p>(Also keep in mind, as the video of the checkout process on that page shows, this is likely as smooth as the flow can get. This does <em>not</em> have the scary screen Apple added in the EU about &quot;leaving to an untrusted external payment platform.&quot;)</p><p>And it makes sense: customers don&apos;t know us. Why would they want to trust some random app with their credit card number (not to mention entering that information is <em>work)</em>? They have no idea if Slopes is going to make you call a 1-800 number and sit on hold for 20 minutes to cancel your subscription, or if Slopes is actually going to take all the steps needed to secure the credit card information and prevent leaks. In a world of increasing scams and PII leaks, people will pause to consider things like this.</p><p>Remember, your goal when trying to convert a sale is to try to cause as little friction as possible. Make the user <em>think</em> as little as possible. &quot;Enter your credit card information for this random app to start your free trial&quot; is hardly frictionless compared to IAPs.</p><p>Services like AirBnB / Uber / Netflix have no problem grabbing credit card information because the customers already want or even <em>need</em> those apps. A lot of us don&apos;t have that advantage, we aren&apos;t big brands with high intent-to-convert users where you can force that on them. Hopefully we have good word-of-mouth, and those new customers will likely convert at the recommendation of their friend. But for everyone else who is just stumbling on your app, they&apos;ll think twice, or abandon checkout due to sheer laziness. And that&apos;s what the numbers are showing.</p><p>(Aside: I&apos;m a little worried to see that the answer to this problem is &quot;offer a discount!&quot; Sure, it works to bridge that conversion gap, but devaluing your product is not a long-term sustainable solution here.)</p><h2 id="earning-trust">Earning Trust</h2><p>All that said I don&apos;t think the answer is to give up on web payments; we just need to look at them through a different lens.</p><p>Today, we offer free trials to give our products a week to prove our value to the customer. We don&apos;t just say &quot;we&apos;re worth it, trust us!&quot; like we used to with paid-up-front apps, we take a week to <em>show</em> them. And it works! It&apos;s a lot easier to convert this way than it ever was with paid-up-front apps and a splashy marketing page.</p><p>We need to treat the movement to web payments the same way: you need to first earn their trust, <em>then</em> you have a chance of moving them to a payment provider you choose.</p><p>The way I&apos;m looking at all this is that IAPs are the best way to gather your first payment from a customer, especially if you have a free trial. They&apos;ll provide the least friction and highest conversion rate. From there, after you earn a customer&apos;s trust over time, you can try to move them over to the web, likely from other flows like emails. Maybe you have a black friday sale with a one-time discount to move them over. Maybe a year after they first subscribe, you offer a one-time 15% renewal discount if they move to web. Maybe you leverge the web to try to win back people who have churned out, or people who abandoned checkout.</p><p>There&apos;s a <em>lot</em> to experiment with here, and a lot to learn, as an industry. Just like you needed to experiment with things like the best time to show your paywall, you&apos;ll have to experiment with when&apos;s the best time to try to move them to the web.</p><hr><p>Here&apos;s the spicy takeaway for me, though. This might just let us answer the big question we&apos;ve long been unable to answer with anything but speculation: it looks like Apple&apos;s IAP service <em>is</em> worth their 30% cut (and without a doubt worth the 15% on renewals &amp; 15% small business program devs). And I don&apos;t see Apple lowering their cut due to &quot;competitive pressure&quot; in that situation, the numbers are working in their favor.</p><p>I am <em>very</em> curious how the next few months/years will play out.</p>]]></content:encoded></item><item><title><![CDATA[Slopes Diaries #44: A Decade]]></title><description><![CDATA[After working nights and weekends since April, Slopes 1.0 launched on September 24 2013. The launch ... didn't go exactly as planned. ]]></description><link>https://blog.curtisherbert.com/slopes-diaries-44-a-decade/</link><guid isPermaLink="false">6509ee7a0251c94e7b190ed2</guid><category><![CDATA[slopes diaries]]></category><dc:creator><![CDATA[Curtis herbert]]></dc:creator><pubDate>Sun, 24 Sep 2023 18:33:30 GMT</pubDate><content:encoded><![CDATA[<p><em>Slopes Diaries is my ongoing journey to turn my indie app into a more sustainable part of my business. First time reading? <a href="https://blog.curtisherbert.com/tag/slopes-diaries/">Catch up on the journey so far</a>.</em></p><p><em>What is <a href="https://getslopes.com">Slopes</a>? Think Nike+, Runkeeper, Strava, MapMyRun, etc for skiers and snowboarders.</em></p><hr><p>After working nights and weekends since April, Slopes 1.0 launched on September 24 2013.</p><p>The launch ... didn&apos;t go exactly as planned.</p><p>A last-minute bug I found + the old app review snail-pace meant I missed the iOS 7 launch-day by almost a week. That delay compounded my launch-fun: I had a cruise (meh) in Alaska (awesome) planned for the week after my (original) release date to celebrate. This left me hitting &quot;go&quot; out in the Pacific Ocean on spotty metered satellite internet, disconnecting and reconnecting every ~30min to save bandwidth but still check if I got any traction. I had been working towards a big unveiling since that kind of launch was the life-blood of a paid up front app and frankly how all the cool apps did it.</p><p>My refresh-monkey&apos;ing on the Pacific Ocean would leave me disappointed. It&apos;d take me ~9 months to get my first press coverage, largely out of &quot;wait, no one has written about this app yet?? This looks like a great app even if I don&apos;t ski!&quot; pity (thanks Brett Terpstra). &#x1F605;</p><p>To say I wouldn&apos;t have expected Slopes to be where it is today, 10 years later, is a clich&#xE9;d understatement.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://blog.curtisherbert.com/content/images/2023/09/Artboard@2x-3.jpg" class="kg-image" alt loading="lazy" width="2000" height="1132" srcset="https://blog.curtisherbert.com/content/images/size/w600/2023/09/Artboard@2x-3.jpg 600w, https://blog.curtisherbert.com/content/images/size/w1000/2023/09/Artboard@2x-3.jpg 1000w, https://blog.curtisherbert.com/content/images/size/w1600/2023/09/Artboard@2x-3.jpg 1600w, https://blog.curtisherbert.com/content/images/size/w2400/2023/09/Artboard@2x-3.jpg 2400w" sizes="(min-width: 1200px) 1200px"><figcaption>(oh yeah I guess I shoulda made a post about how Slopes won an ADA last summer?)</figcaption></figure>]]></content:encoded></item><item><title><![CDATA[Slopes Diaries #43: Chasing a Goldilocks Business]]></title><description><![CDATA[I've been thinking a lot about a problem we all face time and time again: one of our favorite apps dies. Either through a pivot, or an acquisition / acqui-hire. ]]></description><link>https://blog.curtisherbert.com/slopes-diaries-43-chasing-a-goldilocks-business/</link><guid isPermaLink="false">6296bc250251c94e7b1909e0</guid><category><![CDATA[slopes diaries]]></category><dc:creator><![CDATA[Curtis herbert]]></dc:creator><pubDate>Wed, 01 Jun 2022 16:23:31 GMT</pubDate><content:encoded><![CDATA[<p><em>Slopes Diaries is my ongoing journey to turn my indie app into a more sustainable part of my business. First time reading? <a href="https://blog.curtisherbert.com/tag/slopes-diaries/">Catch up on the journey so far</a>.</em></p><p><em>What is <a href="https://getslopes.com">Slopes</a>? Think Nike+, Runkeeper, Strava, MapMyRun, etc for skiers and snowboarders.</em></p><hr><p>I&apos;ve been thinking a lot about a problem we all face time and time again: one of our favorite apps dies. Too often though it isn&apos;t a true case of blinking out of existance, it&apos;ll be a &quot;death of what we knew and loved&quot; &#x2013; either through a pivot or an acquisition / acqui-hire everything starts to change and we no longer recognize the original qualities that made us love the product. </p><p>Specifically the recent update to 1Password has me reflecting on how I can best avoid this for Slopes. </p><p>For context, 1PW started 10 years ago an example of <em>delightful</em> native software on iOS + macOS, and is now instead a bland Electron cross-platform app that is chasing that addictive enterprise-market money, a pivot which has left many of their original core users feeling abandoned. This post, though, is not an internet-rage on them.</p><p>See, here&apos;s the sitch - 1PW has Apple, who thanks to their auth team has been doing a great job making authentication suck a lot less on iOS / macOS, so much so that I&apos;d argue 1PW for the average consumer on iOS is <em>almost</em> unnecessary. With a team of 500+ today [<a href="https://1password.com/company/">1</a>] at 1PW (~100 the year they took their first round of funding [<a href="https://web.archive.org/web/20190117105623/https://1password.com/company/">2</a>]) that threat from Apple feels pretty risky to ignore. That&apos;s a <em>lot</em> of employees to support and Apple&apos;s system-level tools are gonna eat into 1PW&apos;s consumer growth more and more every year. So their choice to raise some money and get into enterprise software to hopefully become entrenched as a passwords / secrets management service seems like smart business to me.</p><p>I genuinely don&apos;t think they did the &quot;wrong&quot; thing, even though they are losing me as a customer. Sure it meant building <em>enterprise software</em> (&#x1F92E;), but it&apos;s better than laying off employees because Apple is chipping away at their customer base from one side and LastPass (who also raised a ton of money) is eating the base from the other.</p><p>But just &apos;cause they didn&apos;t do anything wrong doesn&apos;t mean this outcome was inevitable. I personally think there is room, even in today&apos;s market, for a smaller password management app. A business that could support 1-4 full-time people. Said app doesn&apos;t have the audience of today&apos;s 1PW, but that scale of app <em>did exist</em> in the beginning. The team just chose to grow beyond it.</p><p>Managing team size is a challenge, though, because so much of what is around us as founders pushes us away from smaller businesses: &quot;unicorns&quot;, &quot;exits&quot;, needing constant growth year over year, big ideas that have to &quot;change the world&quot; (was talking with a friend a few weeks ago who was lamenting that a coworker was told to change their pitch deck to be more change-the-world-big in order to raise funding &#x1F644;). As a founder you have internal pressure too because more growth means more employees, which means you can do more. &quot;But if we can just hire 1 more developer, we can finally do X.&quot;</p><p>It&apos;s an easy trap to fall into, to keep chasing growth. You start to feed that cycle innocently enough because you need more people to keep up with work, and then you have to chase bigger and bigger things to keep that growth % up next year to support costs, and then you need more people to keep up, yada yada. Suddenly you look around and realize you have a team of 100 on payroll that you&apos;re responsible for.</p><p>Left unchecked you may stop worrying about building the best <em>product</em>, and you instead focus on building the best <em>business. </em>It is a subtle subconscious switch, but it&apos;ll have massive impact on the product your customers use.</p><hr><p>To counter this, one thing I&apos;ve realized with Slopes is that <strong>time</strong> is one of my greatest resources. </p><p>I might be the solo developer building the iOS app + watchOS app + and PHP backend, but over the years I&apos;ve built a product that rivals those from many teams. Just like we all tend to over-estimate what is needed for an MVP, we&apos;re even more likely to overestimate how much we have to ship every year to keep customers happy. If you aren&apos;t in what I&apos;d call a &quot;unicorns-only market&quot; niche, and you&apos;re decent at being nimble / focusing your efforts in the right places, odds are you can ship more than enough with a small team or even just yourself. </p><p>It&apos;s easy to get caught up in the priorities of the month / quarter / year, the sense of immediate urgency, and lose sight of the fact that we do have time as a resource on our side. In those cases I try to take a step back and play my choices out over the long game &#x2013; 2, 5, 10 years out. You don&apos;t have to have a roadmap that far out, geez no I fly by the seat of my <a href="https://independence.fm">nonexistent pants</a>, but I always try to consider how I&apos;m impacting my future-self. What burdens or risks are you putting on my future-self? Does this fire I&apos;m putting out actually matter in the long-term? What pieces do I really need to put in place today to help myself next year?</p><p>9 years in and I&apos;d argue being small and nimble with a focus on future-self has been a <em>huge</em> strategic advantage for Slopes. Sure it took me this long to get to 1.25mil ARR and I could probably be at 2mil+ by now had I taken more risks and over-extended with confidence (hiring sooner / etc, I play it <em>very</em> conservative), but I&apos;m sure I wouldn&apos;t be shipping the same product. That &quot;Slopes&quot; would be serving the business needs, not the business existing to serve the product.</p><p>Don&apos;t get me wrong I certainly watch my growth metrics, write and tweet to share them, but behind the scenes I&apos;ve been trying to temper any focus on immediate metrics with a purpose of building Slopes for a decade+ more.</p><hr><p>These recent events have helped me solidify the idea that I want to keep Slopes small(-ish). Not solo-dev, but small-team.</p><p>What does that look like in my head? Keep it just me on iOS + watchOS. Maybe get a web developer one day once I just can&apos;t manage to do Apple platforms + web alone, but a part-time contractor might even do. Keep my part-time contractor on Android (he&apos;s awesome). Basically one full-time dev per platform, if that, max. From there build whatever team is needed to support the product we devs can create and maintain.</p><p>But I think, I hope, that size will keep me from over-extending the product. Keep me from setting myself up to have to compromise the product too much in order to suit the needs of the business. But at the same time the team will be big enough to build a product that supports the needs of market and my vision.</p><p>Slopes: Just Right Edition.</p><p>(It&apos;s fun to think of the multi-verse of Slopes ... PWWDR (VC Edition).)</p><hr><p>All that is to say that one year after Slopes hired its first full-time employee (<a href="https://twitter.com/elanovac">Ela</a>), I&apos;m bringing on our second employee (<a href="https://twitter.com/emmarnott">Emma</a>) today. Emma&apos;s been running point on customer support part-time for 2 years, plus leading the mapping project team (5 part-timers) last winter. Titles are hard at a small business, but &quot;Comms and Ops&quot; seems about right.</p>]]></content:encoded></item><item><title><![CDATA[Slopes Diaries #42: Building Ramps, not Walls]]></title><description><![CDATA[There’s always a lot of talk about optimizing your paywall - hell, I usually redesign and test new version of mine at least once a season 😅. It makes sense that you'd focus so much on the paywall – it is a single screen that every purchase goes through, so the potential for impact is high.]]></description><link>https://blog.curtisherbert.com/slopes-diaries-42-building-ramps-not-walls/</link><guid isPermaLink="false">624bb4bf0251c94e7b1907a6</guid><category><![CDATA[slopes diaries]]></category><dc:creator><![CDATA[Curtis herbert]]></dc:creator><pubDate>Tue, 12 Apr 2022 15:49:00 GMT</pubDate><content:encoded><![CDATA[<p><em>Slopes Diaries is my ongoing journey to turn my indie app into a more sustainable part of my business. First time reading? <a href="https://blog.curtisherbert.com/tag/slopes-diaries/">Catch up on the journey so far</a>.</em></p><p><em>What is <a href="https://getslopes.com">Slopes</a>? Think Nike+, Runkeeper, Strava, MapMyRun, etc for skiers and snowboarders.</em></p><hr><p>There&#x2019;s always a lot of talk about optimizing your paywall - hell, I usually redesign and test new version of mine at <em>least</em> once a season &#x1F605;. It makes sense that you&apos;d focus so much on the paywall &#x2013; it is a single screen that every purchase goes through, so the potential for impact is high.</p><p>Then once you are confident our paywall is performing OK you start to focus on <em>where</em> you show it. You&apos;ll start to make sure the UI has enough premium features visible in free mode that the user will likely tap something to launch the paywall. On and don&apos;t forget the common wisdom: show it during onboarding, get a ton of trials! And then randomly pop it up on launch sometimes, maybe with a special offer.</p><p>All roads lead to paywall.</p><p>But tunnel vision like this is dangerous in any situation. Fixating on the paywall as your main tool to convert people to subscriptions so much can leave you blind to other potential opportunities. </p><p>This is the first season the Slopes paywall went untouched, and yet we dramatically improved our year-over-year growth by focusing on everything <em>but</em> the paywall. In fact, for many users this season who purchased a subscription, <em>they never saw a paywall at all</em> ...</p><h2 id="the-%E2%80%9Ctrial-quickstart%E2%80%9D">The &#x201C;Trial Quickstart&#x201D;</h2><p>The idea for this came last summer: Ela had noticed Apple doing something interesting with Apple Arcade in the App Store, specifically how they presented the free trial:</p><figure class="kg-card kg-image-card"><img src="https://blog.curtisherbert.com/content/images/2022/04/eb735afd-ebef-46b1-8ee2-ada8b7e72f66.png" class="kg-image" alt loading="lazy" width="800" height="904" srcset="https://blog.curtisherbert.com/content/images/size/w600/2022/04/eb735afd-ebef-46b1-8ee2-ada8b7e72f66.png 600w, https://blog.curtisherbert.com/content/images/2022/04/eb735afd-ebef-46b1-8ee2-ada8b7e72f66.png 800w" sizes="(min-width: 720px) 720px"></figure><p>It isn&#x2019;t a paywall at all! No &#x201C;unlock now&#x201D; or &#x201C;see plans&#x201D; or &#x201C;learn more&#x201D;, no popup with a feature list and other junk to add friction and cognitive load. Just a nice simple CTA with an appealing graphic. The phrasing here is interesting, too, and that was what made her take notice at first; it isn&#x2019;t &#x201C;here is a year subscription, oh and it has a free trial to lower risk&#x201D; but rather &#x201C;hey, it is <em>your</em> free trial, it is sitting here waiting to be used, why don&#x2019;t you use it?&#x201D; </p><p><em>Edit for clarification: This redeem button starts the IAP flow right there. No popup beyond the system one.</em></p><p>And thankfully, thanks to the changes Apple made a year+ ago where we don&#x2019;t have to include a ton of boilerplate text along side IAPs, what Apple did is within the App Store guidelines for third party apps, too (minus their small font size choice for the pricing).</p><p>Eager to see how it&#x2019;d perform we hooked up something similar in a few of the key upsell locations within Slopes, and let it run for the first 2 months of the winter 2021/22 season.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://blog.curtisherbert.com/content/images/2022/04/eb735afd-ebef-46b1-8ee2-ada8b7e72f66-2.png" class="kg-image" alt loading="lazy" width="1250" height="904" srcset="https://blog.curtisherbert.com/content/images/size/w600/2022/04/eb735afd-ebef-46b1-8ee2-ada8b7e72f66-2.png 600w, https://blog.curtisherbert.com/content/images/size/w1000/2022/04/eb735afd-ebef-46b1-8ee2-ada8b7e72f66-2.png 1000w, https://blog.curtisherbert.com/content/images/2022/04/eb735afd-ebef-46b1-8ee2-ada8b7e72f66-2.png 1250w" sizes="(min-width: 1200px) 1200px"></figure><p>With this new &#x201C;trial quickstart&#x201D; we saw a <strong>25% improvement</strong> in trial starts over the course of the A/B test, which mostly converted from trial -&gt; paid at the same rate as before (so we weren&#x2019;t just stuffing a funnel with bad candidates). We&apos;ve gotten tons of comments that people didn&apos;t know how awesome Slopes Premium was until they tried it, so in retrospect putting <em>walls</em> between the user and Slopes Premium instead of <em>ramps</em> was just plain silly.</p><p>See, this works well because Slopes is now focusing on a CTA that is appropriate for where the user is in their own journey: they&apos;re curious but probably not ready to buy. With a standard paywall I&apos;m focusing on what I eventually want them to do (convert to subscription). With this, I&apos;m focusing on what I want them to actually do in the moment (try premium). </p><p>Aside: As a bonus, this approach solved another issue I&#x2019;d had for a while: because Slopes offers one day + one week passes along side the subscription things always <em>felt</em> complicated. In the moment of purchase the user would have to do the mental math of which purchase made the most sense for them. We had also noticed that, since introducing the free trial over a year ago, even people who would eventually buy the day or week passes would usually redeem the free trial first anyway (back to the &#x201C;why don&#x2019;t you use it?&#x201D; mentality). This new quickstart approach allowed us to focus on a single path on the journey and worry about the branching into different pass types <em>after</em> they tried it out to see if Slopes Premium was something they wanted.</p><h2 id="better-ux-better-sales-who-knew-s">Better UX = Better Sales? Who Knew. /s</h2><p>While the quickstart trial was running, the next batch of changes in the sales process came from the redesign of the recording screen for Find-my-Friends (&#x201C;Slopes: The Next Generation&#x201D; as I called it), <a href="https://blog.curtisherbert.com/slopes-diaries-41-asymptotes/">which I wrote about last time</a>. For the first time in Slopes&#x2019;s history there was a <em>compelling</em> reason to start Premium when you start recording at a resort - the premium maps w/ trail info. This is pretty big deal, but more on that in a second.</p><p>The UX gave us some better opportunities to highlight an existing Slopes Premium feature: run-by-run breakdowns while you record.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://blog.curtisherbert.com/content/images/2022/04/iPhone-5.8---Recording.jpg" class="kg-image" alt loading="lazy" width="2000" height="1030" srcset="https://blog.curtisherbert.com/content/images/size/w600/2022/04/iPhone-5.8---Recording.jpg 600w, https://blog.curtisherbert.com/content/images/size/w1000/2022/04/iPhone-5.8---Recording.jpg 1000w, https://blog.curtisherbert.com/content/images/size/w1600/2022/04/iPhone-5.8---Recording.jpg 1600w, https://blog.curtisherbert.com/content/images/2022/04/iPhone-5.8---Recording.jpg 2365w" sizes="(min-width: 1200px) 1200px"><figcaption>Left: Old, Right: New</figcaption></figure><p>Before you&#x2019;d have to notice this (left) was a pager and swipe over twice to get to a tiny little upsell CTA crammed in the little white box. Not very discoverable. But the new screen (right 3) really encouraged more exploration (the bottom card opens up automatically when they pause, like at lunch, for people who might not think to hit the expand button anyway).</p><p>So where the old version hardly got any trials from the recording screen, the new version has 10% of all trial starts in the app coming form the run-by-run breakdowns. Which is great because that also means people are actually <em>finding</em> this feature now.</p><h2 id="asking-for-the-sale">Asking for the Sale</h2><p>The third, and last, major change to how Slopes approached Premium this season might be the most revolutionary - actually asking for the sale. </p><p>Ela did a new-user journey walkthrough and noticed that the new recording UX, despite its improvements, didn&#x2019;t mention Slopes Premium unless you happened to explore and find that run-by-run breakdown or if you hit the map layers icon to try to swap map types. While the new run-by-run visibility was great, the most valuable offering Premium has to offer while recording are those new maps, especially when you&#x2019;re skiing with friends.</p><p>With the quickstart experiment going well by this point we decided to try something new - a quickstart popup when they start recording, but <em>only</em> if they are at one of the resorts we&#x2019;ve built enhanced trail maps for.</p><p>I had always avoided any kind of do-you-want-premium popup here for two reasons: A) before this year there wasn&#x2019;t anything of real, and more importantly easy-to-explain, value to offer and B) asking for a sale here was terrible timing as they&#x2019;re likely rushing to get their gloves on and get on the lift. But the trial quickstart? That&#x2019;s a very low risk choice that can be impulse decided. And the new maps? Super easy to visualize and &#x201C;explain.&#x201D;</p><figure class="kg-card kg-image-card"><img src="https://blog.curtisherbert.com/content/images/2022/04/Simulator-Screen-Shot---iPhone-13---2022-04-04-at-09.31.58-1.png" class="kg-image" alt loading="lazy" width="936" height="1013" srcset="https://blog.curtisherbert.com/content/images/size/w600/2022/04/Simulator-Screen-Shot---iPhone-13---2022-04-04-at-09.31.58-1.png 600w, https://blog.curtisherbert.com/content/images/2022/04/Simulator-Screen-Shot---iPhone-13---2022-04-04-at-09.31.58-1.png 936w" sizes="(min-width: 720px) 720px"></figure><p>This rolled out to users at the ~30 resorts we initially had enhanced maps for, and then another 20 resorts towards the later season as we got maps in place for them. And we did this test right away without being hidden behind an A/B experiment (just kill switch); annoyingly the season was already in full swing when we thought of this and we didn&#x2019;t want to delay further improvements as the season would be almost over by the time we&#x2019;d have real numbers if we did an A/B.</p><p>How&apos;d it go? We&#x2019;re already seeing 10% of trials are come from this popup &#x2026; which is only shown at only 50 resorts in North America &#x1F605; (sample bias here: these are the bigger / more popular resorts, and NA is our strongest market, so these are the best target users. But still, huge bulk of trials from a very targeted part of the market). And it appears the popup isn&#x2019;t just cannibalizing trial starts that would have occurred elsewhere &#x2026;</p><h2 id="stacking-those-bricks">Stacking Those Bricks</h2><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://blog.curtisherbert.com/content/images/2022/04/Screenshot-2022-04-12-at-18.47.06.png" class="kg-image" alt loading="lazy" width="2000" height="675" srcset="https://blog.curtisherbert.com/content/images/size/w600/2022/04/Screenshot-2022-04-12-at-18.47.06.png 600w, https://blog.curtisherbert.com/content/images/size/w1000/2022/04/Screenshot-2022-04-12-at-18.47.06.png 1000w, https://blog.curtisherbert.com/content/images/size/w1600/2022/04/Screenshot-2022-04-12-at-18.47.06.png 1600w, https://blog.curtisherbert.com/content/images/2022/04/Screenshot-2022-04-12-at-18.47.06.png 2146w" sizes="(min-width: 1200px) 1200px"><figcaption><em>(Note: these are % growth, so 100% = 2x, 200% = 3x, etc. And even though the winter season has a natural bell-curve to usage for Slopes, comparing calendar week 1 2021 to week 1 2022 etc helps account for that).</em></figcaption></figure><p>We didn&#x2019;t have A/B experiments running for changes 2 (Next Generation) and 3 (Popup), so looking at the YoY trial start growth is a good way to see their effect. Change 2 doubled the trial YoY growth with the launch of the new maps screen, and then change 3 added that same volume of new trials <em>again</em>.</p><p>And no, don&#x2019;t worry, this wasn&#x2019;t a tunnel vision with a focus solely on trial starts. Conversions stayed healthy in North America, too, where the resorts with the trial quickstart popup all live. We always have a strong start to conversions trial -&gt; paid that diminishes over the season users are less likely to ski again that season, and as we get more one-off trips in Jan/Feb for people:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://blog.curtisherbert.com/content/images/2022/04/Compare-Seasons.png" class="kg-image" alt loading="lazy" width="2000" height="1300" srcset="https://blog.curtisherbert.com/content/images/size/w600/2022/04/Compare-Seasons.png 600w, https://blog.curtisherbert.com/content/images/size/w1000/2022/04/Compare-Seasons.png 1000w, https://blog.curtisherbert.com/content/images/size/w1600/2022/04/Compare-Seasons.png 1600w, https://blog.curtisherbert.com/content/images/2022/04/Compare-Seasons.png 2400w" sizes="(min-width: 1200px) 1200px"><figcaption><em>(Note: null = converts to paid subscription.)</em></figcaption></figure><p>The biggest potential risk of hurting conversion rates came with change 3, the trial popup, and we see that play out with a ~7% YoY drop in conversion when it went live (week 3 / 4). But considering we&#x2019;re seeing 3x the trial starts &#x2026; the math still works out in our favor.</p><p>It&#x2019;s a balancing act of these two numbers, start of trial vs overall conversion, but I think we&#x2019;re finding the right blend. It&apos;s good that we&apos;re not being as shy about trying to sell Slopes Premium &quot;in the moment.&quot; I want to see if I can improve the conversion rate again next season, but I wouldn&apos;t be surprised if quite a good percentage of the trials that didn&apos;t convert this year will convert next year (pattern I see: try a week mid-season, end up converting next year in the beginning of the season when it is &quot;worth&quot; it.)</p><hr><p>So what&#x2019;s the end result here? Earlier in the season, before all the changes, trends were showing a 50-60% growth YoY. Now after all these changes we&#x2019;re sitting on a 90% growth year (which would have been a 130%+ growth year had everything been in place since the beginning &#x1F62B;).</p><p>But that&#x2019;s <em>great</em> news, and all this is largely why Slopes blew past the $1mil ARR mark this season. &#x1F973;</p>]]></content:encoded></item><item><title><![CDATA[Slopes Diaries #41: Asymptotes]]></title><description><![CDATA[One thing I've noticed about Slopes's downloads since 2018 is that my download rate per season has been pretty consistent, fluctuating somewhere between 250k and 280k.]]></description><link>https://blog.curtisherbert.com/slopes-diaries-41-asymptotes/</link><guid isPermaLink="false">61c0b95accafc90ab04c7dc5</guid><category><![CDATA[slopes diaries]]></category><dc:creator><![CDATA[Curtis herbert]]></dc:creator><pubDate>Mon, 20 Dec 2021 20:40:46 GMT</pubDate><content:encoded><![CDATA[<p><em>Slopes Diaries is my ongoing journey to turn my indie app into a more sustainable part of my business. First time reading? <a href="https://blog.curtisherbert.com/tag/slopes-diaries/">Catch up on the journey so far</a>.</em></p><p><em>What is <a href="https://getslopes.com">Slopes</a>? Think Nike+, Runkeeper, Strava, MapMyRun, etc for skiers and snowboarders.</em></p><hr><figure class="kg-card kg-image-card"><img src="https://blog.curtisherbert.com/content/images/2021/12/Screen-Shot-2021-12-20-at-10.20.15.png" class="kg-image" alt loading="lazy" width="1798" height="806" srcset="https://blog.curtisherbert.com/content/images/size/w600/2021/12/Screen-Shot-2021-12-20-at-10.20.15.png 600w, https://blog.curtisherbert.com/content/images/size/w1000/2021/12/Screen-Shot-2021-12-20-at-10.20.15.png 1000w, https://blog.curtisherbert.com/content/images/size/w1600/2021/12/Screen-Shot-2021-12-20-at-10.20.15.png 1600w, https://blog.curtisherbert.com/content/images/2021/12/Screen-Shot-2021-12-20-at-10.20.15.png 1798w" sizes="(min-width: 720px) 720px"></figure><p>One thing I&apos;ve noticed about Slopes&apos;s downloads since 2018 is that my download rate per season has been pretty consistent, fluctuating somewhere between 250k and 280k. The vast, vast, majority of these are from word of mouth / organic acquisition methods, which means this is strong and consistent growth.</p><p>The bit that has been bugging me though is that it feels impossible to move the needle on things sometimes, in this case downloads. In late 2019 Slopes <a href="https://blog.curtisherbert.com/slopes-diaries-31-saying-yes/">added a lightweight social aspect</a>, which was the beginning of any kind of referral loop to Slopes (friends encouraging friends to grab Slopes so they could compete / compare). Despite adding this, though, downloads have stayed in the same ballpark. I never expected downloads to rocket-ship as a result of the features, I didn&apos;t build them with growth hacks in mind (in fact, if anything, I purposely hindered their growth-hackiness), but I was expecting a <em>bit</em> more of an uptick.</p><p>(Of course two things are at play here: COVID hit mid-march 2020, which hurt downloads. And we don&apos;t know what downloads would have looked like <em>without</em> social, maybe there would have been a 20%+ drop-off in downloads?)</p><p>In the early days of a product, growth can come easy if you have decent product market fit; 3x&apos;ing or more YoY as you gain adoption in a market, despite a lack of optimization or perfected set of features. But over time, without change, that growth slows as the easy acquisitions are in the bag. You see your growth curve start to plateau. You have to start to fight for it.</p><p>That&apos;s because you&apos;re fighting against a natural asymptote to your curve, brought on by everything that makes up your product. If your product doesn&apos;t change and your strategy doesn&apos;t change, that same asymptote is always there, a ceiling you&apos;ll never break through. Change the formula, you push that asymptote a bit higher.</p><p>(And I&apos;m not always talking about features, even if that is the go-to for most developers. What&apos;s holding you back could be branding, it could be not having the right marketing channels.)</p><p>It&apos;s my job to recognize those patterns in the curves. I always try to look at Slopes and think &quot;what is holding me back, how am I shooting myself in the foot?&quot; Because make no mistake, at any moment I&apos;ve made <em>dozens</em> of decisions that seemed like the right one but are holding Slopes back.</p><p>I do think it&apos;s important to look at the situation through the lens of &quot;how am I holding my product back?&quot; and not just &quot;how can I grow more?&quot; You don&apos;t want to chase <em>growth</em>, you want to chase your<em> ideal product</em>. Just understand how the two play off each other.</p><p>In today&apos;s case, what was holding Slopes back was fear and focusing too much on an &quot;ideal feature&quot; vs an MVP.</p><hr><p>Ela and I were having a conversation in early November about making the social aspects more compelling. She really wanted to see more people using them (which, in turn, would help growth and &quot;building the moat&quot;) and felt strongly that needed to be a priority for the season. We brainstormed many feature ideas over a long FaceTime call, but eventually something just felt off. I felt we were going about it the wrong way; trying to force a feature set to be more appealing or engaging (adding features to broaden appeal) instead of actually <em>being</em> useful.</p><p>I started postulating that the root problem is that as-is the Slopes social features are pretty passive and very much fall in the nice-to-have, not must-have, category for users. In fact, almost no social feature we could build around stat tracking (things like showing who you rode with, leaderboards, etc) would really fix this problem.</p><hr><p>I started a project almost a year ago to map ski resorts. Open Street Maps has ski trail data, but it is often out of date or wrong, so I knew it&apos;d be a competitive advantage to build and maintain the data set myself. I spent the spring and summer diving into the world of GIS tools figuring out how to manage a data set like this in-house, and then building some tools myself on top of existing platforms to help the data acquisition process.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://blog.curtisherbert.com/content/images/2021/12/Screen-Shot-2021-12-20-at-11.29.12.png" class="kg-image" alt loading="lazy" width="2000" height="1299" srcset="https://blog.curtisherbert.com/content/images/size/w600/2021/12/Screen-Shot-2021-12-20-at-11.29.12.png 600w, https://blog.curtisherbert.com/content/images/size/w1000/2021/12/Screen-Shot-2021-12-20-at-11.29.12.png 1000w, https://blog.curtisherbert.com/content/images/size/w1600/2021/12/Screen-Shot-2021-12-20-at-11.29.12.png 1600w, https://blog.curtisherbert.com/content/images/size/w2400/2021/12/Screen-Shot-2021-12-20-at-11.29.12.png 2400w" sizes="(min-width: 1200px) 1200px"><figcaption>QA tool for trail data management in Slopes I built</figcaption></figure><p>We prototyped and validated the process and got 5 resorts mapped and in-app over the summer/fall. In mid November we moved onto scaling up, hiring 4 part-timers to get rolling on mapping resorts. As of today we have 20 resorts.</p><p>As things took shape I planned that in Jan 2022 I&apos;d launch these new &quot;winter trail maps&quot; as a premium feature, an upgrade to the existing premium &quot;winter maps.&quot; Premium users would be able to replay all their data on maps with labeled trails, launching with ~50 or so resorts supported. Playing with the prototype of the new maps in-app, it really felt like a big upgrade visually speaking and fleshed out the resorts.</p><p>This one feature wasn&apos;t the end-game of why I was building this data set, but it was a great near-term win that users would love while I worked behind the scenes on the more ambitious use of the data.</p><hr><p>Back to that conversation with Ela. </p><p>At this point in the conversation I off-hand mentioned that the <em>real</em> fix to making friends within Slopes actually a must-have was to do something I&apos;d wanted to do since I started Slopes in 2013: build a better Find My Friends, just for skiing.</p><p>Despite it being a top-requested feature all these years, I&apos;d held off forever on building this for two reasons. The first, fear. Ski resorts don&apos;t always have the best cell reception and that&apos;d effect any find-my kinda thing working reliably. Second, my ideal vision for the feature was to show users on the actual PDF trail map from the resort, since regular satellite maps were going to prove pretty useless for finding people at ski resort. And I hadn&apos;t figured out how to, at scale, come up with custom transformation matrices to translate from GPS -&gt; pixel coordinates (since the PDFs aren&apos;t linear mappings, they&apos;re perspective artists&apos; renderings, you can&apos;t just linear transform your way to a geocoded PDF).</p><p>Immediately after my off-handed comment ideas flooded together. I realized I was holding Slopes back because I was chasing perfection. With this trail data I&apos;d been gathering the new winter maps would be <em>great</em> for seeing where people are on the mountain. Not just useful when reviewing their stats at the end of the day but <em>during</em> the day, too. I didn&apos;t need some ideal &quot;show them on the PDF&quot; solution. Cell reception had generally improved vs when I envisioned it in 2013 and while it wasn&apos;t perfect, it was more hit-than-miss and people knew to expect that.</p><p>Showing the new trail maps during recording, and their friends, would mean redesigning the recording screen (now the most outdated screen in Slopes, untouched for 5 years?) to really focus on said map (which had the added bonus that I could also show users their GPS track for the day while recording, something people had also been asking for). The redesign would give me the opportunity to rethink UX during recording so I could surface the official resort PDF trail maps right on the recording screen and ski patrol info, two things they&apos;d previously have to hop back to the resort tab and look up the resort to find (terrible UX).</p><p>It&apos;d mean, though, I&apos;d also have to finally tackle having data from your Watch show on your phone as you recorded, as Watch users would want all this nice new mapping stuff too. But, hey, &quot;iPhone + Watch: better together&quot; is more compelling.</p><p>As much work as it&apos;d be, <em>this</em> was the answer.</p><hr><p>Queue a Rocky-style montage of sleepless nights and a flurry of work over a 5 week period to bring what should have been an entire off-season&apos;s worth of work to reality.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://blog.curtisherbert.com/content/images/2021/12/Collapsed.jpg" class="kg-image" alt loading="lazy" width="1800" height="1113" srcset="https://blog.curtisherbert.com/content/images/size/w600/2021/12/Collapsed.jpg 600w, https://blog.curtisherbert.com/content/images/size/w1000/2021/12/Collapsed.jpg 1000w, https://blog.curtisherbert.com/content/images/size/w1600/2021/12/Collapsed.jpg 1600w, https://blog.curtisherbert.com/content/images/2021/12/Collapsed.jpg 1800w" sizes="(min-width: 1200px) 1200px"><figcaption>Slopes v2021.17</figcaption></figure><hr><p>When you&apos;re looking to change your curve(s), sometimes there are small hidden gems and easy wins, but sometimes it takes something entirely new and tangental.</p><p>The problem with the old social features I built was that they expanded my reach <em>within</em> my existing market segment (stat tracking), they didn&apos;t expand my appeal to new segments and users. They just helped me acquire users within my existing segment a bit more virally / faster. Conversely, this new update finally makes Slopes a must-have <em>while</em> recording, not just after-the-fact. It makes Slopes useful to a whole new (much larger) class of people: a very large part of the market that doesn&apos;t give a damn about tracking their stats (I venture many of which will get Slopes for the find-my and will come to appreciate the stats).</p><p>But, it doesn&apos;t Frankenstein&apos;s monster Slopes in the process. I love it because this new stuff is natural and complementary to the core of Slopes. The find-my stuff is, at its core, about GPS tracking. It all fits in very well to the narrative of Slopes, and doesn&apos;t feel like some set of features that are just growth-hacking my way to a better curve (like adding an activity feed of friends&apos; activity might). It builds on top of the existing mapping / tracking stuff, and on top of the existing private social graph already within Slopes. It is part of a coherent story, not a pivot.</p><hr><p>So take a step back every once in a while. Challenge your old fears and assumptions; you never know how the equation of your product might have changed that&apos;ll allow for things you previously thought impractical. </p><p>Sometimes you have to take a step back to move forward.</p>]]></content:encoded></item><item><title><![CDATA[Slopes Diaries #40: The Droid (Stats) You're Looking For]]></title><description><![CDATA[This season brought a major expansion to Slopes: Android. I talked a lot about the rollercoaster of development that came with it in my previous post, and I wanted to follow up with what all that effort yielded and how the season went.]]></description><link>https://blog.curtisherbert.com/slopes-diaries-40-the-droid-stats-youre-looking-for/</link><guid isPermaLink="false">60bce4374e038e352234509f</guid><category><![CDATA[slopes diaries]]></category><dc:creator><![CDATA[Curtis herbert]]></dc:creator><pubDate>Sun, 06 Jun 2021 15:12:03 GMT</pubDate><content:encoded><![CDATA[<p><em>Slopes Diaries is my ongoing journey to turn my indie app into a more sustainable part of my business. First time reading? <a href="https://blog.curtisherbert.com/tag/slopes-diaries/">Catch up on the journey so far</a>.</em></p><p><em>What is <a href="https://getslopes.com">Slopes</a>? Think Nike+, Runkeeper, Strava, MapMyRun, etc for skiers and snowboarders.</em></p><hr><p>This season brought a major expansion to Slopes: Android. I talked a lot about the rollercoaster of development that came with it <a href="https://blog.curtisherbert.com/slopes-diaries-38-android/">in my previous post</a>, and I wanted to follow up with what all that effort yielded and how the season went.</p><hr><p>To start, last time I said it took 3 updates to really iron out the bugs from v1.0 ... and that turned out to be an optimistic lie. It took a bit longer. There was one bug that persisted, one that was very annoying to track down and we kept thinking was fixed but kept coming up. One of those fun bugs that you can never reproduce yourself (I recorded 4 days on Android in January without issue, too), isn&apos;t a crash or something with logs, and it looks like you&apos;re doing everything right. For a while it looked like it might be an issue with some manufacturers and their over-aggressive background termination (in the name of battery life), but it wasn&apos;t that (that issue is so bad they have a web site dedicated to it: <a href="https://dontkillmyapp.com">https://dontkillmyapp.com</a>).</p><p>Basically Slopes would stop recording in the background for no reason.</p><p>Not a great bug to have.</p><p>A bug like this alone isn&apos;t a surprise for me, I knew we&apos;d hit plenty like this in the first season of Android. But where things fell apart a bit was the timing of things. See, we <em>thought</em> it was fixed going into mid January which is when the season really starts to pick up. And, at the same time, DeRon was having his first kid at the end of January. Seemed like a perfect timing fix kinda thing, in just under the wire to leave me in a great position for the busy part of the season.</p><p>Sadly, while the fix did help, a lot of people still were hit by the issue. It ... wasn&apos;t good. And, at this point, DeRon was on leave for 6 weeks or so. Now I&apos;m not the kinda guy that&apos;s going to hound him to come fix the bug. As much as this wasn&apos;t a good look for Slopes, at the end of the day it&apos;s just a business and honestly I&apos;d recover from waiting to fix it. iOS had its share of bad bugs over the last 8 years, ones that felt like major a crisis in the moment, but in the rear view mirror they&apos;re just blips now.</p><p>As the season went on though, the bug started to have public reproductions. The Android ratings started to go down, bottoming out somewhere around 3.4 stars. What really broke my heart was people leaving reviews saying things like &quot;oh look another iOS app port where the developer doesn&apos;t care about Android.&quot;</p><p>Aside: a fun part was users <u>yelling</u> at us via customer support claiming they knew the issue and it was &quot;one easy fix.&quot; Slopes uses the new location API on Android where it asks for &quot;when in use&quot;, and we had a lot of Android well-actually users write in to say the issue was we should be asking for &quot;always.&quot; Of course the docs say to use when in use (as long as you start location fetches from a foreground process, your background service keeps the when in use permissions) and even going further to say if you use &quot;always&quot; for an app like Slopes they&apos;d be rejecting apps during review because we don&apos;t need the permission.</p><p>Once DeRon was back it took a few more weeks of flailing to fix the bug. We had built up a dedicated group of users that were experience the bug and added them to an alpha build list through the Play Store, so were able to iterate builds with extra debugging turned on with them without a huge release process. But most people only go skiing on the weekend, so we had annoyingly long turnarounds on confirmations of how any fix was working. But, DeRon figured it out. Turned out we had the background service set to a medium priority and we actually should be setting it to the highest setting so the system keeps it alive. Looks like some devices don&apos;t care if the service is doing location stuff and only goes off of this declared importance level?</p><p>But, by the time the fix was live, we were in mid March. Like I said the ratings took a hit, and I knew many people had abandoned the app in frustration (I don&apos;t blame them).</p><p>Just before that, in early March, Ela suggested we had to do something to win people back. And she was 100% right. So during said flailing / fixing we sent out an email to all the Android users (at least ones with accounts, couldn&apos;t reach free users who never made an account) explaining the situation - it was a hard bug, we had a dedicated test group helping to test our fixes, we were dedicated to Android and we hadn&apos;t been ignoring the issue. We had to make this right and <em>prove</em>, not just say, we cared about Android though. So as part of that email we gave everyone who paid for Slopes Premium an extra year on their account, and we gave any free users Premium for the 2020/21 winter season retroactively.</p><p>It was a big give, but it was the right move, and people genuinely appreciated the honesty / transparency paired with the money-where-our-mouth-is. The actual bug fix shipped a few days later, so it was a nice way to end to the season. Ratings quickly turned around (sitting back at 4.6 stars now) and I think we not only got back some of the frustrated users we lost but also cultivated a lot of now-passionate users out of the situation.</p><hr><p>One other thing that threw me off with the first Android season was that I was honestly hopeful that Slopes might get a bit of an assist from the Play Store team. I figured a well-regarded iOS app coming to Android would be something they&apos;d want to highlight.</p><p>Getting in touch with them about this though, was a lot of dead ends.</p><p>Back in 2017 they launched the &quot;Start on Android&quot; program to help new apps on the platform, offering assistance and guidance during the Early Access phase and more (and, probably, a little extra exposure on the official launch). I had multiple people recommend I submit for that as I was talking publicly about making an Android port over the last two years. Sadly like many Google projects, it seems abandoned? I filled out all the forms and never heard back. Followed up via Linked In messages to the &quot;right people&quot; and they never got back to me. God, I even built a Crunchbase profile for Slopes because apparently they look for that.</p><p>Even without the assist of the program I made sure everything was &quot;right&quot; with Slopes on Android: targeting the latest API level, using Material, supporting Sign in with Google, a good store page with nice screenshots, a nice looking developer page, free trial for any subscriptions, and I even commissioned a video preview for my store page. I reached out via the <em>other</em> normal channels too.</p><p>Despite everything, nada.</p><p>Which is fine, I never make plans that rely on Apple or Google featuring me. But it was kinda a bummer ya know? I put a lot of work into doing right by Android, and I figured Google might want to support an app like that and help make a splash with the launch.</p><p>Props to Apple&apos;s App Store editorial team - I&apos;m constantly seeing new apps highlighted, and not just ones from big publishers. Apple is doing a better job of highlighting small indies than Google, for sure.</p><hr><p>OK, so what about stats? Development drama aside, how&apos;d the Android app actually <em>do</em>?</p><p>Android had a little over 20,000 downloads this first season, which is &lt;10% of the iOS downloads this season. But that isn&apos;t surprising: a lot of Slopes users don&apos;t realize there is an Android app yet (despite email marketing). It&apos;s been an iOS only app for so long that word of mouth will take a while to build. And, like I said, no in-store features so they&apos;d only find it by searching for Slopes (because isn&apos;t like I&apos;m going to rank at the top of competitive keywords like &quot;ski tracker&quot; my first season).</p><p>Revenue wise, Android was &lt;4% of iOS&apos;s revenue at $22,000. Revenue per user on Android was ~66% of what it is on iOS this season.</p><hr><p>I&apos;d call this season a success for Android, despite everything. Not a glowing success, but a success.</p><p>The main box I wanted to check was getting a stable version of the core Slopes experience ported, and that&apos;s now there. We have a good foundation to build on, and we&apos;ve already moved on to shipping (hopefully this week?) the first major feature past v1.0 - the timeline editor letting users do things like delete data from when they accidentally drive away in their car with Slopes still recording.</p><p>I got into this knowing Android wan&apos;t going to be a huge revenue source, so this season didn&apos;t have much of a revenue goal in place. Mostly I wanted to test the waters and see for myself. I&apos;d always been told that for fitness apps Android would likely make up ~10% of my <em>total</em> revenue once it gets going, and we&apos;re at 3.3% this season, so we&apos;ve got work to do. Of course Europe wasn&apos;t open for skiing this year, and Android is certainly more popular over there vs the US, so I expect the downloads to go up next year helping reach that 10% ratio. 3.3% isn&apos;t bad, in my book, given the order of magnitude difference in active user base.</p><p>So yeah, a bit of a bumpy road, but I&apos;d say it is off to a good start. Over 1,000 paying subscribers on Android, a 4.6 star rating, and a good app I&apos;m proud of. I&apos;ll put that in the win column.</p>]]></content:encoded></item><item><title><![CDATA[Slopes Diaries #39: Risky Business]]></title><description><![CDATA[So that free trial idea I was toying with back in September? It launched, and I think it has been a success for Slopes.]]></description><link>https://blog.curtisherbert.com/slopes-diaries-39-risky-business/</link><guid isPermaLink="false">602153ac4e038e3522344dc3</guid><category><![CDATA[slopes diaries]]></category><dc:creator><![CDATA[Curtis herbert]]></dc:creator><pubDate>Mon, 05 Apr 2021 20:56:54 GMT</pubDate><content:encoded><![CDATA[<p><em>Slopes Diaries is my ongoing journey to turn my indie app into a more sustainable part of my business. First time reading? <a href="https://blog.curtisherbert.com/tag/slopes-diaries/">Catch up on the journey so far</a>.</em></p><p><em>What is <a href="https://getslopes.com">Slopes</a>? Think Nike+, Runkeeper, Strava, MapMyRun, etc for skiers and snowboarders.</em></p><hr><p>So that <a href="https://blog.curtisherbert.com/slopes-diaries-36-try-me/">free trial idea</a> I was toying with back in September? It launched, and I think it has been a success for Slopes. Like many things Slopes it seems to largely be affected by when in the season the trial is happening, but I seem to be around 65% conversion from trial -&gt; paid overall for the season (higher than that in the early season, lower in the mid-to-late season).</p><p>Android is pulling the iOS numbers down a <em>bit</em> (the above % is for both platforms), but iOS has a ton more premium features, so I&apos;m not surprised.</p><p>Regardless, it seems to be working well.</p><hr><p>Of course implementing this trial meant revisiting my upsell screen <em>again</em>. After all, it had only been half a year since I last did that. &#x1F605;</p><p>I had spent time in Jan of 2020 simplifying my upsell process to be a single-screen (vs a feature list modal followed by a purchase options modal) since those usually convert better (and they do!). Then in fall 2020 I worked on visually simplifying this single new screen as my old one was a bit cluttered and didn&apos;t really have the room for all the free trial explainers required.</p><p>With all those changes, this is what the screen looked like leading into the 2020/21 ski season:</p><figure class="kg-card kg-image-card"><img src="https://blog.curtisherbert.com/content/images/2021/02/Merged.jpg" class="kg-image" alt loading="lazy" width="375" height="1058"></figure><p>And I was pretty happy with everything. Considering how stubborn I am on keeping the Day / Week passes, I think this presents the lineup pretty cleanly.</p><p>This screen above is what got me the conversion rates I was talking about in the beginning. Doing pretty well, but I&apos;m always curious where there is room for improvement.</p><hr><p>In mid January a post made the rounds, <a href="https://uxplanet.org/how-solving-our-biggest-customer-complaint-at-blinkist-led-to-a-23-increase-in-conversion-b60ad514134b">&quot;How Solving Our Biggest Customer Complaint at Blinkist Led to a 23% Increase in Conversion&quot;</a>.</p><p>(go read that now for context, but TLDR; offer the user a push notification reminder on day 5 of a 7-day trial)</p><p>In it, Jaycee talks about how she changed their free trial screen at Blinkist to inform the user that they&apos;ll get a push notification reminder on day 5 of their 7-day trial reminding them of the trial and that they&apos;d be billed soon. </p><p>In fact, the entire upsell screen they tested is dedicated to this flow:</p><figure class="kg-card kg-image-card"><img src="https://blog.curtisherbert.com/content/images/2021/02/5fc55acc93998f0be2013d37_Image003.jpg" class="kg-image" alt loading="lazy" width="277" height="600"></figure><p>For Blinkist, the experiment was a huge success. The key stats from her experiment were:</p><ul><li>Increased trial sign up by 23%</li><li>Reduced cancellations during the trial by 4%</li></ul><p>I mean, these results are amazing, so <em>of course</em> I was going to experiment and see how it might work for Slopes. I set out to work and rolled out a version to production behind an A/B test flag one week later.</p><hr><p>One hitch, design-wise: like I said I&apos;m stubborn about keeping the Day and Week passes around, and I didn&apos;t want to hide them behind a &quot;See all options&quot; button making them second-class citizens. &#xA0;I could largely mimic Blinkist&apos;s flow (mention reminder, start trial, notification permission prompt after), but I needed to adapt the idea to work within Slopes&apos;s requirements. And ideally without a <em>massive</em> redesign, again (&#x1F605;).</p><p>So this is the adapted flow I went with:</p><figure class="kg-card kg-image-card"><img src="https://blog.curtisherbert.com/content/images/2021/02/Screen-Shot-2021-02-22-at-6.00.40-PM.png" class="kg-image" alt loading="lazy" width="1778" height="1262" srcset="https://blog.curtisherbert.com/content/images/size/w600/2021/02/Screen-Shot-2021-02-22-at-6.00.40-PM.png 600w, https://blog.curtisherbert.com/content/images/size/w1000/2021/02/Screen-Shot-2021-02-22-at-6.00.40-PM.png 1000w, https://blog.curtisherbert.com/content/images/size/w1600/2021/02/Screen-Shot-2021-02-22-at-6.00.40-PM.png 1600w, https://blog.curtisherbert.com/content/images/2021/02/Screen-Shot-2021-02-22-at-6.00.40-PM.png 1778w" sizes="(min-width: 720px) 720px"></figure><p>I do think that dedicating my entire pass-picker interface to be single-purposed to converting to the trial, a la Blinkist, would have increased the screen&apos;s conversion rate, but even with just this small change I saw a 4% increase in trial starts. </p><p>Not 23%, but still positive movement. Sadly Jaycee&apos;s article doesn&apos;t show what the screens / flow originally looked like before their test, so we can&apos;t see the full picture of the changes and what else might have added up to the +23%, but I&apos;m def willing to say I&apos;m shooting myself in the foot at least a little bit here. (After my go at this someone <em>else</em> <a href="https://twitter.com/nermincatovic/status/1373547301269086212?s=21">tweeted</a> they experimented with this and saw a 3% trial start increase too, so my number might not be way off base actually?)</p><p>But anyway, so far so good. </p><p>But the big question is what effect the notification would have once day 5 rolled around? Like Blinkist, Slopes saw a great opt-in rate for notifications. Around 75% of users starting the trial asked to be reminded on day 5. And like Blinkist, I saw my day-zero cancellations drop dramatically as people were willing to give the trial a proper go until the reminder came their way.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.curtisherbert.com/content/images/2021/02/Time-to-Cancel-variance.png" class="kg-image" alt loading="lazy" width="1650" height="1384" srcset="https://blog.curtisherbert.com/content/images/size/w600/2021/02/Time-to-Cancel-variance.png 600w, https://blog.curtisherbert.com/content/images/size/w1000/2021/02/Time-to-Cancel-variance.png 1000w, https://blog.curtisherbert.com/content/images/size/w1600/2021/02/Time-to-Cancel-variance.png 1600w, https://blog.curtisherbert.com/content/images/2021/02/Time-to-Cancel-variance.png 1650w" sizes="(min-width: 720px) 720px"><figcaption>Day 0 means canceling the trial as soon as you start it</figcaption></figure><p>I also went ahead and tried out different notifications on day 5 depending on what you had done. If you recorded via Watch, for example, I tailored the notification to something about the great heart rate analytics users love and have them check out that premium feature.</p><p>But Slopes did not see the same 4% increase in trial -&gt; paid conversions that Blinkist saw. In fact, it saw a 7.8% <em>decrease</em> over the two weeks I ran this test for those that requested the notification.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.curtisherbert.com/content/images/2021/02/Screen-Shot-2021-02-22-at-6.53.03-PM.png" class="kg-image" alt loading="lazy" width="2000" height="917" srcset="https://blog.curtisherbert.com/content/images/size/w600/2021/02/Screen-Shot-2021-02-22-at-6.53.03-PM.png 600w, https://blog.curtisherbert.com/content/images/size/w1000/2021/02/Screen-Shot-2021-02-22-at-6.53.03-PM.png 1000w, https://blog.curtisherbert.com/content/images/size/w1600/2021/02/Screen-Shot-2021-02-22-at-6.53.03-PM.png 1600w, https://blog.curtisherbert.com/content/images/2021/02/Screen-Shot-2021-02-22-at-6.53.03-PM.png 2132w" sizes="(min-width: 720px) 720px"><figcaption>Blue is baseline, red is those that requested the notification</figcaption></figure><p>Oof. After 2 weeks I turned off the A/B test to stop the bleeding. I waited a bit to let refunds come in just incase this was helping on the back-side there before coming to conclusions (even though my refund rate is well under 1%, so I only get 1 per day out of hundreds of sales). Sadly through all this the A/B test users showed equal refund requests.</p><p>Additionally, in the test only <strong>1</strong> person turned auto-renew back on day 5 after having turned it off on day 0 (aka only one sale recovered).</p><hr><p>Since I tried this in Slopes I saw another person talk about using it in their own app, and they saw a positive outcome (much better than Blinkist&apos;s 4% jump, a 20% jump!):</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.curtisherbert.com/content/images/2021/04/Screen-Shot-2021-04-05-at-4.15.10-PM.png" class="kg-image" alt="Amazing! We have introduced changes in 5.0 version where users can subscribe for a 7 day trial, and will receive push notification reminder that it expires, on the 5th day. This resulted in 48% trial conversion over Stripe. This is almost a 20% jump comparing to our usual!" loading="lazy" width="1196" height="1344" srcset="https://blog.curtisherbert.com/content/images/size/w600/2021/04/Screen-Shot-2021-04-05-at-4.15.10-PM.png 600w, https://blog.curtisherbert.com/content/images/size/w1000/2021/04/Screen-Shot-2021-04-05-at-4.15.10-PM.png 1000w, https://blog.curtisherbert.com/content/images/2021/04/Screen-Shot-2021-04-05-at-4.15.10-PM.png 1196w" sizes="(min-width: 720px) 720px"><figcaption>https://twitter.com/nermincatovic/status/1373400358811230218?s=21</figcaption></figure><hr><p>So here&apos;s the thing: it is hard for me to do anything right now but scratch my head. There are multiple factors at play here, and I have my theories (beyond just &quot;Curtis fucked up&quot;, which is always option A):</p><ul><li>Asking someone &quot;are you sure you want this?&quot; always runs the risk of them changing their mind. Not that they aren&apos;t happy, but they are re-evaluating the value a <em>second</em> time. The goal here is to make sure you&apos;re convincing <em>more</em> of those normal cancel-right-away people to stay than you are losing people who change their mind.</li><li>So a core of this notification is making sure you can keep them engaged / show value over the whole trial, and using the notification as your last chance to get them back. You don&apos;t ask &quot;hey do you still want this?&quot; in the push, you prompt them to do something within your app related to the trial to show the usefulness one more time.</li><li>Slopes is an app where people get the most out of it at a ski resort. There is minimal room for &quot;re-engagement&quot; outside of that &#x2013; if you ski and then go home, you&apos;re not going to find the app nearly as valuable. So if I ask them to re-evaluate 5 days later when they are at home, Slopes feels less valuable. (plus maybe they just totaled up the bill from the ski trip lol)</li><li>Maybe that means a 5-day trial is bad for Slopes + this push. Maybe a 3-day is better? That lines up better with trip lengths that they&apos;d still be skiing, but then the push is kinda useless (&quot;start your trial today, we&apos;ll remind you 24hrs before billing just to be safe, which is uhhhh tomorrow&quot;).</li></ul><p>So yeah, I dunno. That&apos;s my current train of thought as to why it didn&apos;t work for Slopes. I <em>really</em> like the idea of building / earning user trust with this push method, but I need to go back to the drawing board and find a way that works for Slopes.</p><p>Regardless though, even though it was a bit of a flop for me, you should totally go try it in your app. I&apos;m sure for many apps this is a great way to both increase trust and help convert more users. Just make sure when you send the push, you&apos;re sure to be in a <em>better</em> position to show/have shown your value than you were when they started the trial.</p>]]></content:encoded></item><item><title><![CDATA[Slopes Diaries #38: Android]]></title><description><![CDATA[Well, it finally happened. The "1.0" for Slopes launched in the Play Store yesterday. I've tweeted here and there about the journey over the last year+, even chatted about it on a podcast, but I haven't written much about it since I started.]]></description><link>https://blog.curtisherbert.com/slopes-diaries-38-android/</link><guid isPermaLink="false">5ff4c4bca253e1307d2343f3</guid><category><![CDATA[slopes diaries]]></category><dc:creator><![CDATA[Curtis herbert]]></dc:creator><pubDate>Wed, 06 Jan 2021 15:24:39 GMT</pubDate><content:encoded><![CDATA[<p><em>Slopes Diaries is my ongoing journey to turn my indie app into a more sustainable part of my business. First time reading? <a href="https://blog.curtisherbert.com/tag/slopes-diaries/">Catch up on the journey so far</a>.</em></p><p><em>What is <a href="https://getslopes.com">Slopes</a>? Think Nike+, Runkeeper, Strava, MapMyRun, etc for skiers and snowboarders.</em></p><hr><p>Well, <a href="https://blog.curtisherbert.com/slopes-diaries-32-looking-elsewhere/">it</a> finally happened. The &quot;1.0&quot; for Slopes <a href="https://play.google.com/store/apps/details?id=com.consumedbycode.slopes">launched in the Play Store</a> yesterday.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://blog.curtisherbert.com/content/images/2021/01/Android-Hero-Resort.jpg" class="kg-image" alt loading="lazy" width="1200" height="707" srcset="https://blog.curtisherbert.com/content/images/size/w600/2021/01/Android-Hero-Resort.jpg 600w, https://blog.curtisherbert.com/content/images/size/w1000/2021/01/Android-Hero-Resort.jpg 1000w, https://blog.curtisherbert.com/content/images/2021/01/Android-Hero-Resort.jpg 1200w" sizes="(min-width: 1200px) 1200px"><figcaption>Slopes &quot;1.0&quot; for Android</figcaption></figure><p>I&apos;ve tweeted here and there about the journey over the last year+, even <a href="https://releasenotes.tv/367-curtis-herbert/">chatted about it on a podcast</a>, but I haven&apos;t written much about it since I started. I thought now, with hindsight, would be a good time to talk about how it went.</p><p>Buckle up.</p><h3 id="going-native">Going Native</h3><p>Before the project had even started around Aug of 2019, I knew I wanted to avoid React as a cross-platform shortcut. Part of what makes Slopes on iOS great is, as a user put it, it&apos;s &quot;the ski app apple would write&quot; (high praise, I don&apos;t think Slopes is <em>that</em> good, but thanks!). Spit-and-polish on the UI, tight integration with the system through things like CoreLocation HealthKit and more, and feeling 100% at home with native controls. </p><p>Plus, having to run everything through a JS interpreter isn&apos;t exactly great for my 12hr battery life target &#x1F605;</p><p>(To avoid a #holywar, I do think React apps can be good, and I do think they have their place. Tragically React is often presented as a cost-savings solution, which means the polish needed for a great-feeling app is usually not a priority to begin with.)</p><p>Slopes on Android was going to have the same polish it does on iOS. I wanted to build the app Google would write. I think Android users get the short end of the stick a lot, and they deserve quality apps that aren&apos;t just shortcut-fueled copy/pastes of an iOS app. So Google&apos;s Material design framework, Kotlin language, everything you&apos;d expect from an Android native app.</p><p>I did briefly debate porting my recording engine to C++ or some such so I could share some of that cross-platform, but ultimately didn&apos;t. Nothing stood out as great for cross-plafrom code (Kotlin native was interesting, but I&apos;d need it to run on WatchOS and it was all still alpha level stuff) and that would add a lot of risk to the iOS app if adopted.</p><h3 id="android-mvp">Android MVP</h3><p>With the stack chosen, the next step was figuring out &quot;what is the 2020 MVP of Slopes?&quot; I wasn&apos;t naive, I didn&apos;t think I&apos;d be able to get all of Slopes out as a 1.0 on Android. I&apos;m a big fan of iterating and learning, so I knew I wanted to get a core version out and go from there. Plus I wanted to launch it for the 2020/21 season, so unless I had a full-time dev, that just wasn&apos;t do-able.</p><p>This meant cutting a <em>lot</em>. Some things were easy, there was no platform equivalent. The Photo Library integration on iOS, the heart rate / HealthKit integration, Siri integration. 3D was absolutely off the table, it was all written in Apple&apos;s SceneKit, same with AR / ARKit. And more.</p><p>But even without all that, there is still a <em>lot</em> to Slopes. Thankfully I&apos;m pretty good at sniffing out what <em>has</em> to be in release vs what is optional. Examples of things I didn&apos;t need for v1? </p><ul><li>The timeline editor letting users add/remove lifts/runs, incase they leave Slopes running when they drive away. They can always fix this data later. Having this in place really helps customer support, lets users fix a lot of their own problems, but I can absorb that temporary hit to support.</li><li>The entire social share card generator. People are more than happy to screenshot the app itself to share stats (and many iOS people do this despite my share creator lol).</li><li>The run comparison feature I added last season. It is unique to Slopes, letting you play back two runs side-by-side on maps and watch stats.</li><li>My entire &quot;trip&quot; support. Letting users group multiple days into a single trip, so they could see stats aggregated for multiple days.</li><li>The lifetime &amp; season screens. Similar idea of showing stats for multiple days.</li><li>My recording reminder notifications (geofence and time-based).</li><li>Localization. I lived for 7 years without it on iOS, Android could go a year or two.</li><li>Not to mention a bunch of the infrastructure things in Slopes on iOS like migrations between versions, what&apos;s new highlighting, and stuff like that.</li></ul><p>I figured I needed: </p><ul><li>The ability to record (and the entire Slopes recording engine)</li><li>To view those recordings</li><li>The sync engine to save the recordings online</li><li>The social stuff I had built out for leaderboards (adding/removing friends)</li><li>Account management</li><li>And purchases / IAPs (thankfully all my purchase logic is server-side, so it was mostly just getting the order through Google Play and pushing it up to the server).</li></ul><h3 id="takeoff-then-a-crash-landing">Takeoff, Then a Crash Landing</h3><p>So summer of 2019 I put out a tweet talking about needing a native Android developer. The pickings were a little slim though. I think as a byproduct of Android being an afterthought for many companies, there isn&apos;t as healthy of a consulting ecosystem on Android, especially when looking at going all-native / Kotlin / etc. Had a lot of very part-time hobbyists that hadn&apos;t really shipped much, or only had a few hours a week to offer.</p><p>One resume stood out though, was a senior engineer who just left their job to start freelancing. I&apos;d be his first client. We chatted, he seemed to have a good head on his shoulders and wasn&apos;t setting off any of my red flags. Apps he referenced working on were pretty good. So we agreed that 2019 would be partial hours to start, with more ramping up in 2020 (once the season started and Slopes earned $$ again). We got started with the first commit to the project on July 19 2019.</p><p>I ran the project like I normally lead - I have opinions, but ultimately I like to trust people to do what they are hired to do. I like to avoid dictating everything and instead defer to them to tell me how they want things to work. After all, they are the expert. So he was given a list of v1 features, but I left it to him to pick what to work on first, etc. He set his own hours of course. I stayed pretty low-touch, making myself available for any questions, and only asking for a twice-a-month call to go over progress to start.</p><p>Between August and end of December I was pretty distracted with iOS (social features, pricing experiments, etc) so I wasn&apos;t watching like a hawk, but things seemed to be moving along. Communication wasn&apos;t the best, and time was wasted down rabbit holes because he didn&apos;t want to bother me even though I told him to, but whatever. He did oversell himself a bit on his ability to help translate the iOS design to Google&apos;s Material design framework, so I took up that responsibility.</p><p>In January things started turn sour though. We switched to weekly progress reports since the contracted hours increased a lot, near full-time. I was stood up for those meeting 5 or 6 times before the end of March? Progress was feeling a behind where I&apos;d expected it to be (which I didn&apos;t make a big deal of, he&apos;s the Android senior engineer and I was trusting him. Software always slips). But annoyingly deadlines I asked him to set himself were being missed too. </p><p>All along I was asking him to rectify all of this, but I was too soft. I don&apos;t like conflict, so I was too eager to trust him when he said things would improve for the 4th time.</p><p>Where shit hit the fan though was an opportunity with Google. Slopes got invited to a Material workshop to be hosted in late March, helping a few apps make the most of their design framework in-app. This was huge for me being able to make Slopes feel like a Google app. Since the workshop was both code and in person, we agreed we needed the major 3 screens (logbook, daily summary, timeline) mostly in place code-wise for feedback by the workshop.</p><p>Leading up to the in-person workshop, things kept slipping to get those 3 screens done. But then COVID happened, and the workshop turned virtual and was pushed back a few weeks, buying more time. The week of the new date (workshop was on Thurs) we were to have a call Monday to finalize having everything finished in time (which was still &quot;totally doable&quot; w/ the weekend before) and ... he stood me up. Worse, I couldn&apos;t get a rescheduled date out of him. I couldn&apos;t get any comments about the code out of him. I chased him for a day trying to reschedule the meeting for the next day and got ... nothing.</p><p>So here I was 24hrs before the Google workshop, with one screen completed, another &quot;close to finished&quot; but hardly working and the code wasn&apos;t even pushed to GitHub for me to see or present myself to Google. At that point I didn&apos;t even know if my developer would show up to the Google meetings, hell I had ever right to assume he wouldn&apos;t.</p><p>All this for the low-low price of $74,713.</p><p>So I did what I should had done probably some time before then - issued a stop-work the morning of the workshop. He was introducing too much additional risk to the project, and crippled me for a major Google opportunity. I had my designs to get feedback on, but half the workshop was code, and I had to completely miss out on that. </p><p>It was super embarrassing.</p><p>But that stop-work finally got him to call me &#x1F605;</p><hr><p>I found out that his personal life was spiraling with someone he cared about suffering from new metal health issues, and not getting help. All those missed meetings were either him finally getting sleep, or him dealing with caring for them. And as he was new to consulting, he did what many first-timers do: assume if they just work extra hard &quot;this week&quot; they&apos;ll be able to catch up. No need to raise a flag and possibly piss off the client, just work harder and they&apos;ll never know the difference.</p><p>So I get it. It is an honest mistake many people make, myself included.</p><hr><p>This failure was on me, though. </p><p>When I interviewed originally I was focused on finding a good engineer - one that knew how to write good code, but wouldn&apos;t over-engineer and knew how to balance product + code. And he was certainly, well mostly, that.</p><p>But my failing was assuming everyone had the same respect and communication habits I had built up when I was an iOS consultant. I respect the hell out of people&apos;s time, and if you set a meeting, I won&apos;t miss it (I&apos;m the guy to show up 1min early to Zoom calls). If I have to miss the meeting, I let you know ASAP and don&apos;t leave you hanging on a zoom call for 20min, and I&apos;m the one proactively offering reschedule times/dates, you don&apos;t have to chase me to reschedule. If I&apos;m worried a feature is slipping, I raise that flag early so my lead/boss/client can factor that into their plans.</p><p>But that&apos;s me, a pretty seasoned consultant. I was stupid to not look for the red flags that&apos;d affect project management. Especially since I knew I was going to be his first client, of <em>course</em> these were a risk.</p><hr><p>I got through the workshop, learned a lot of frustrating things about designing for Android (buy me a drink sometime), and had to regroup. </p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://blog.curtisherbert.com/content/images/2021/01/Screen-Shot-2021-01-05-at-7.26.10-PM.png" class="kg-image" alt loading="lazy" width="2000" height="1392" srcset="https://blog.curtisherbert.com/content/images/size/w600/2021/01/Screen-Shot-2021-01-05-at-7.26.10-PM.png 600w, https://blog.curtisherbert.com/content/images/size/w1000/2021/01/Screen-Shot-2021-01-05-at-7.26.10-PM.png 1000w, https://blog.curtisherbert.com/content/images/size/w1600/2021/01/Screen-Shot-2021-01-05-at-7.26.10-PM.png 1600w, https://blog.curtisherbert.com/content/images/size/w2400/2021/01/Screen-Shot-2021-01-05-at-7.26.10-PM.png 2400w" sizes="(min-width: 1200px) 1200px"><figcaption>Lots of exploration to figure out how to Android-ify Slopes</figcaption></figure><p>I felt super deflated to be honest. We had moved to a fixed-price monthly contract in Jan 2020, and he didn&apos;t have to track hours anymore. I think with his personal life spiraling he might not have come close to the hour commitment (it is easy to over-estimate if you worked 35hrs this week without a normal schedule and your life upside-down). </p><p>Honestly, I think this whole fiasco wasted me $20,000. But hey, one major screen was done and I had a working sync engine (or so I thought).</p><h3 id="getting-back-on-track">Getting Back on Track</h3><p>At this point it is May and COVID is a full-swing thing. Ski resorts shut down in mid March, months early, costing me a lot of revenue. Who knew what 2020/21&apos;s season would be like? 2019/20 was already rough due to terrible early-season conditions + COVID, for all I knew ski resorts could be shut down for all of 2020/21&apos;s season too. I had enough in the Slopes bank to keep the business running until Oct 2021, even if the upcoming season was a total bust. But that wasn&apos;t not enough to get me to Jan 2022 when I&apos;d get my first major check from Apple for the 2021/22 season. </p><figure class="kg-card kg-image-card"><img src="https://blog.curtisherbert.com/content/images/2021/01/Screen-Shot-2021-01-06-at-9.22.23-AM.png" class="kg-image" alt loading="lazy" width="1182" height="382" srcset="https://blog.curtisherbert.com/content/images/size/w600/2021/01/Screen-Shot-2021-01-06-at-9.22.23-AM.png 600w, https://blog.curtisherbert.com/content/images/size/w1000/2021/01/Screen-Shot-2021-01-06-at-9.22.23-AM.png 1000w, https://blog.curtisherbert.com/content/images/2021/01/Screen-Shot-2021-01-06-at-9.22.23-AM.png 1182w" sizes="(min-width: 720px) 720px"></figure><p>That impending doom actually made the decision to give Android another go a bit easier - either way, Android costs or no Android costs, Slopes was looking at an empty bank account mid-2021 if the season was a COVID bust. Android alone wasn&apos;t going to kill me. &#x1F605;</p><p>What also helped was when I put out the call for Android developers (again) I got 2 much better candidates this time. A good agency promising Android for ~$80k, and a part-time independent dev promising delivery for a little over half that. He was double the original developer&apos;s rate, but at the same time the amount of time he thought it would take to finish was surprisingly low. I was skeptical as a result, seemed classic under-estimation, but had a call anyway because he was impressive on paper. </p><p>And we hit it off, like &quot;I want this guy to be my coworker&quot; level.</p><p>Thankfully it turned out a friend of Paola knew him from his previous job (he works full-time on a popular meditation app now) and was able to get me references from 3 people that were all glowing including in the areas of communication, project management, and estimation. One reference was from a director-level person (when a director knows about an individual contributor, that&apos;s a good sign). That put my mind at east and over-the-top in moving forward with him.</p><p>His first commit was June 25th 2020.</p><h3 id="delivering">Delivering</h3><p>There were a few surprises as we got moving, for example that sync engine I thought I had on Android was a read-only sync engine. The whole &quot;upload new activities, upload changes to activities, and delete activities&quot; bit wasn&apos;t even written yet. &#x1F605; But the foundation the first dev had built was at least good, code didn&apos;t have to be thrown out. Just a bit more had to be written than expected.</p><p>But DeRon got to work, and those 3 hero screens I wanted for the Google workshop came together <em>fast</em>. He was moving fast, but importantly what he was building worked great. He was as good as I had been lead to believe. He was even able to step in and take the reigns on translating the iOS design to Material (within the theme of what I had already worked out, but still, I got to stay hands of there and didn&apos;t have to spell out everything). He even care about the little things, like transition animations.</p><p>And let me tell you it felt <em>good</em> to have some screens working on my Pixel 3a that I could play with. It went from almost giving up to &quot;OMG this is Slopes&quot; inside a month. </p><figure class="kg-card kg-embed-card kg-card-hascaption"><blockquote class="twitter-tweet" data-width="550"><p lang="en" dir="ltr">This screen is finally coming together on android. That transition animation. &#x1F60D; (design still WIP - blue buttons not final) <a href="https://t.co/g0wQ6Vjnez">pic.twitter.com/g0wQ6Vjnez</a></p>&#x2014; Curtis Herbert (@parrots) <a href="https://twitter.com/parrots/status/1284629809704898560?ref_src=twsrc%5Etfw">July 18, 2020</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<figcaption>Video of early Slopes build</figcaption></figure><p>Most of the app, sans the recording screen / engine, was done by early October. I had originally hoped to launch Slopes in Early Access (Android&apos;s public TestFlight) on the Play Store early Nov along side the big iOS update that added the resorts tab, but we ended up having to push that beta a bit. The recording engine landed in time, but we wanted a few more weeks for that &quot;last 10%&quot; that always takes longer than expected (which of course meant a bit more budget).</p><p>But honestly, this was playing out exactly how I&apos;d expect a software project to play out. A little bit of under-estimation of how hard something would be, a little over-estimation of how much the original developer had completed, and sprinkle in my high standards for polish. But all within my expectations running software projects.</p><p>We launched Slopes into Early Access in the first few days of December. That gave us (finally) lots of real-world tests of the recording engine and insights into the hardware differences with Android phones and GPS. Of course it a few bugs, which took 3 updates to get all the major ones. Users were super happy to see Slopes on Android, very forgiving of the bugs, and excited to see us committed to shipping updates and fixing things quickly.</p><p>The nice surprise was that I asked DeRon how he felt about getting the Resorts tab (the thing that just launched on iOS) in as part of the &quot;1.0&quot; for Android in late Dec / early Jan, and he said totally lets do it.</p><p>And he did it. </p><p>It wasn&apos;t even on the original scope (it didn&apos;t exist on iOS during scoping &#x1F605;), but this additional tab really helped flesh out Slopes on Android. It really felt complete with it in place. And honestly, I think the premium offering needed it (offline trail maps for resorts if you are a subscriber). Without resorts, the premium offerings felt a little lacking.</p><h3 id="1-0-and-beyond">1.0 and Beyond</h3><p>Yesterday (Jan 5, 2021) Slopes for Android left beta and released its &quot;1.0&quot;. After starting the project back in fall of 2019, and many ups and downs, we&apos;re here.</p><p>The 1.0, including the first dev fiasco and increased scope, ended up costing $150k (he still came in under the agency quote, even with more scope &#x1F973;) over the course of a year and a half. My hope for Android all along has been getting it to the point where it can pay for itself. It won&apos;t be a big money-maker like iOS, but I felt it could probably make enough to pay for the dev working on it. Out of the gate though, this is all iOS paying for Android, and I knew the 1.0 was a sunk cost.</p><p>There&apos;s a lot of catching up with iOS to do, this won&apos;t be one of those &quot;ship it and forget it&quot; Android apps that my competitors have shipped. You saw the list above of how much was left on the editing floor. I wanna see Slopes on Android hit all those things, and more. 1.0 + a bugfix release in two weeks is not the end of it.</p><p>My experience working with DeRon has been really good to date, and he is clearly a senior engineer that&apos;s capable of a bit more product leadership than I think he&apos;s been given opportunity for in the past. So I proposed something...</p><ul><li>Slopes/iOS will guarantee a minimum amount per year to him, which pays for a (pretty large) retainer of hours for the year at a discount. That retainer is enough to move Android forward: bug fixes and maybe a feature or two. But it only covers about 1/3 the hrs per month he had been working to ship 1.0.</li><li>Assuming he works any more hours than those, he gets the Android revenue (up to a cap we agreed on, he won&apos;t be making 1mil/yr off this &#x1F605;, eventually I get some of the revenue again). That helps soften the blow to him of Android being in its early years (since subscription businesses can take a bit to get off the ground). But gives him the room to earn more than he could consulting alone, and start to divorce the time &lt;-&gt; money relationship that comes with consulting.</li><li>I can&apos;t give him the risk of Android&apos;s performance without responsibility, so he gets to figure out the roadmap. I get veto power, but he&apos;s shown to have a pretty good eye for managing this so far. And he gets the iOS roadmap as a cheat guide to accelarate the Android business.</li></ul><p>This works out for me because iOS is now <em>just</em> responsible for the retainer (which is quite a chunk, but a lot more managable than $150k). And then I just don&apos;t rely on Android money going to me anytime soon. It&apos;ll take a year or two to get there, but he has the headway to make a lot more than he could consulting.</p><p>We negotiated all this over the course of December and came to an agreement we&apos;re both happy with. &#x1F973; </p><p>So yeah, I&apos;m pretty jazzed. Not only did I ship a 1.0, I have a plan forward for Android so those users aren&apos;t neglected. Hopefully now that Slopes it out of Early Access it&apos;ll get some more attention / downloads and things will start getting a move on over there.</p><hr><p>Honestly didn&apos;t expect to be in such a good position after where I was in April. </p><p>But I&apos;m glad I didn&apos;t give up, my calculated risk of continuing Android seems to have worked out. The season is going OK so far, thank goodness, so I&apos;ll likely survive 2020/21&apos;s winter and last until 2021/22 when things should be back to normal. And now I&apos;m in a much stronger position for next season with Android in place and launched. Having Android unlocks a lot of opportunities I couldn&apos;t have touched before when it comes to working with other businesses (like for example the Red Bull partnership Slopes did).</p><p>It was a very scary, very calculated risk to take, but it worked out. &#x1F3B2;</p>]]></content:encoded></item><item><title><![CDATA[Slopes Diaries #37: A Commitment to Y-Axis Values]]></title><description><![CDATA[<p><em>Slopes Diaries is my ongoing journey to turn my indie app into a more sustainable part of my business. First time reading? <a href="https://blog.curtisherbert.com/tag/slopes-diaries/">Catch up on the journey so far</a>.</em></p><p><em>What is <a href="https://getslopes.com">Slopes</a>? Think Nike+, Runkeeper, Strava, MapMyRun, etc for skiers and snowboarders.</em></p><hr><p>I&apos;ve put off writing about how</p>]]></description><link>https://blog.curtisherbert.com/slopes-diaries-37-a-commitment-to-y-axis-values/</link><guid isPermaLink="false">5fba98a2a253e1307d23413d</guid><category><![CDATA[slopes diaries]]></category><dc:creator><![CDATA[Curtis herbert]]></dc:creator><pubDate>Mon, 23 Nov 2020 16:50:22 GMT</pubDate><content:encoded><![CDATA[<p><em>Slopes Diaries is my ongoing journey to turn my indie app into a more sustainable part of my business. First time reading? <a href="https://blog.curtisherbert.com/tag/slopes-diaries/">Catch up on the journey so far</a>.</em></p><p><em>What is <a href="https://getslopes.com">Slopes</a>? Think Nike+, Runkeeper, Strava, MapMyRun, etc for skiers and snowboarders.</em></p><hr><p>I&apos;ve put off writing about how the 2019/20 season went for three reasons. </p><p>First, the numbers are starting to feel big. 2019/20 is ~2X+ what I&apos;d need to live on in Philadelphia, so it is really starting to be a bit crazy talking out loud about. It is going from &quot;cool, he&apos;s an indie finding success!&quot; to &quot;uh, ok, that&apos;s a lot of money ... did he buy a money bin to swim in, greedy SOB?&quot;</p><p>I&apos;m also seeing these bigger numbers at a time when the world, for many people, is collapsing. Walking around Old City in Philadelphia I&apos;m seeing business after business close down due to COVID. So talking about success, and even continued growth, feels super awkward.</p><p>But lastly, for the first time since 2015, the season didn&apos;t live up to my expectations. And that <em>sucks</em>. Somehow that fact has escaped hitting me mentally as hard as I expected it to, but it still isn&apos;t fun to write about and admit publicly.</p><p>Don&apos;t worry though, I&apos;m not about to stop publishing my proceeds numbers.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.curtisherbert.com/content/images/2020/11/Screen-Shot-2020-11-22-at-1.23.04-PM.png" class="kg-image" alt loading="lazy" width="1516" height="1064" srcset="https://blog.curtisherbert.com/content/images/size/w600/2020/11/Screen-Shot-2020-11-22-at-1.23.04-PM.png 600w, https://blog.curtisherbert.com/content/images/size/w1000/2020/11/Screen-Shot-2020-11-22-at-1.23.04-PM.png 1000w, https://blog.curtisherbert.com/content/images/2020/11/Screen-Shot-2020-11-22-at-1.23.04-PM.png 1516w" sizes="(min-width: 720px) 720px"><figcaption>(Yes, Charles, you can be happy I stopped using Photoshop to build this chart)</figcaption></figure><p>So how&apos;d it not live up? Since I switched to subscriptions in 2015, I&apos;ve been seeing 2.x X growth in revenue year over year. I wasn&apos;t going to take that growth for granted, so I was really working hard to ensure another 2.x+ X year:</p><ul><li>I was finally taking the user journey out of the app with <a href="https://blog.curtisherbert.com/slopes-diaries-33-hi-there/">email marketing</a> (which, by the way, went pretty well). </li><li>I was spending a lot of effort <a href="https://blog.curtisherbert.com/slopes-diaries-34-passive-vs-active/">fighting my tendency to minimize my upselling</a>. </li><li>I had started the season shipping my vision for a <a href="https://blog.curtisherbert.com/slopes-diaries-31-saying-yes/">privacy-first social aspect</a> to Slopes. Now you have a selfish reason to get your friends on Slopes.</li><li>I tried my first Black Friday sale (which also went well, ~1k new subscriptions).</li><li>I was offering 2 free day passes with subscriptions, encouraging users to share them with their friends (didn&apos;t really work).</li><li>And a lot more...</li></ul><p>So going into the season I felt pretty good that 2.x X was very realistic. After all, I was doing all the right things and I had a trend line!</p><p>I&apos;m always conservative with money and I don&apos;t like debt, so I didn&apos;t dig myself into any holes I couldn&apos;t abort as needed. I didn&apos;t buy a Tesla knowing I&apos;d 2X. But I did start taking on more monthly costs. I started Android development in Aug 2019, which has been a sink of ~$10k a month. That new email marketing is around $1k a month to run, the biggest single non-human cost to Slopes. This was my first season spending <em>real</em> money on advertising, around $20k on App Store Search Ads (which did net a profit).</p><p>This was the year I finally let myself live a little, business wise, and upgraded my database server from a $10/mo Digital Ocean machine I administered myself to their managed PostgreSQL cluster w/ replication for a whopping ~$80/mo (big spender, I know). Little things like that happened more often. I wasn&apos;t <em>as</em> focused on only taking on a cost if I 100% needed it, I was worrying a bit about my quality of life and the nice-to-haves.</p><p>It felt like it was all building towards a major milestone: hitting that 2x goal would have given me the breathing room I needed to safely take Slopes from one-man-shop to the start of a team.</p><p>This season ended at 1.4 X growth.</p><p>So of course after missing that milestone, a lot of the mid-to-late season was spent with me trying to figure out &quot;what did I screw up?&quot; After a lot of reflection over the summer I think I&apos;ve realized (well I mean I <em>knew</em> this, but I think I started to <em>internalize</em> it) that it&apos;s just hard to keep growing at that rate naturally, and this is why VCs and money come into play because you need gasoline, not natural wood, to keep accelerating at this rate. </p><p>Continuing past where I am requires a relentless focus on product-market fit, perfecting onboarding and funnels, pricing experiments, and a whole lot more. I&apos;m getting well into the &quot;average consumer market&quot; at this point, and that&apos;s hard.</p><p>It wasn&apos;t <em>just</em> that though, I did realize as the early season was progressing that I had some things working against me:</p><ul><li>This was the worst winter in recent history around the world. I noticed this early on, in Nov/Dec. Vail resorts (big ski corporation that owns dozens of resorts world-wide) reported ~10% drop in attendance in their January report. That&apos;s huge when they&apos;ve been seeing growth. Whistler in Canada reported the worst early season on record in 30 years. Many resorts in Europe never opened because they rely more on natural snow that snowmaking. That all leads to less people going out to record. Of course all of the resorts said were hoping to make up the difference in the mid-to-late season...</li><li>COVID cost me ~$60k. Ski resorts shut down early-to-mid March world-wide, and my revenue hit a cliff abruptly as a result. I hit $0/day over a month earlier than normal. I probably would have ended around 1.6x or 1.7x if it weren&apos;t for that.</li></ul><p>Running a lot of numbers, my conversion rate sill seemed healthy. My churn was OK. What was really killing me was activations - there were just less people using Slopes than expected.</p><p>So I dunno, I&apos;m weathering the storm of not hitting my 2X goal surprisingly well. I had a lot stacked against me, and it isn&apos;t like I&apos;m a growth expert and I already know how to make this jump. </p><p>I&apos;ll just keep shipping, and keep learning.</p><hr><p>All that is a long-winded way of saying &quot;boo-hoo, I only grew by 40% during a global pandemic and climate change threatening my business.&quot;</p><p>&#x1F602;</p><hr><p>This all did make for an interesting summer with lots of calculations. </p><p>I had to decide if I wanted to keep Android going (see: <a href="https://releasenotes.tv/367-curtis-herbert/">Release Notes podcast episode</a>). Obviously &quot;because, COVID&quot; would be a reasonable excuse to hit pause for now.</p><p>My runway math showed if I halted Android shortly after COVID locksdowns started, and the 2020/21 season was like my March/April 2020 was (AKA, non-existent), Slopes would run out of money in Oct 2021 ... not quite making it until the <em>next</em> season where things in theory should be back to normal. If I kept Android going to be able to ship in 2020, I&apos;d last until May 2021 or so.</p><p>(Keep in mind, I earn &lt; 5% of my revenue during the summer w/ the southern hemisphere, so I need to make it until ~Jan 1 2021 when I get my first &quot;real&quot; paycheck from Apple again.)</p><p>On top of this I had to decide how much I wanted to work on the iOS version even. Because after all, it isn&apos;t like the 2020/21 season is a guarantee given everything (as I write this most of Europe is locked down with ski resorts closed in Nov 2020 until Dec 1). Skiing or snowboarding itself is a very COVID-safe activity, but everything surrounding it, not so much. People don&apos;t feel safe to fly, which will kill a <em>ton</em> of ski business. Travel restrictions will hurt European ski resorts even after they can re-open. But at the same time people are going stir-crazy, and many bought houses at the mountains to escape cities during this time, so it could be offset by more &quot;locals&quot; riding all season. But with skiing being such an unknown, it might be wise to split my time 1/3 Slopes and 2/3 something new that I could have in place before that May 2021 moment-of-truth.</p><hr><p>In the end I decided I&apos;d keep working on Slopes full-steam until the end of 2020 and see how the season is looking before considering another revenue stream. I did end up keeping Android going, because I was screwed either way on that one &#x1F605;. I&apos;m playing the long game with Android, but it isn&apos;t like canceling it would get me to Jan 2022 when I&apos;d be &quot;safe&quot; again, so I&apos;ll roll the dice with it while keeping its costs manageable. I&apos;m not planning on dumping a lot into advertising this season, and I&apos;ll trim fat as needed from services Slopes relies on. I held back on my original hope of bringing on more part-time help this season, too.</p><p>I&apos;m staying nimble, but I&apos;m using the season to focus on the long game. The ski market<em> will</em> be back next year, so I&apos;m trying to focus on A) just surviving this year so I can B) be in an even better position then. I&apos;ve had 1 major competitor w/ funding drop out in late March, another very popular free one finally pull their ski apps after pivoting to soccer 3 years ago, and yet another free one pull their Android app after it seemingly flopped (nothing but 1-stars and no updates for ~2 seasons). This year is thinning the market out, and if I&apos;m smart I can be in a <em>really</em> strong position come next season.</p><p>So far, things are not a disaster for the 2020/21 season. People are skiing, and revenue is coming in. I need to earn ~$120k this season to make it into next winter, and that looks like (knock on wood) it&apos;ll happen based on the early season numbers I&apos;m seeing.</p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[Slopes Diaries #36: Try Me]]></title><description><![CDATA[While exploring a lot of the possibilities with Slopes's pricing, if I were to change it, a light bulb went off.  Some pieces of the puzzle had changed over the years, but I had never taken a step back to look at how they all fit together now.]]></description><link>https://blog.curtisherbert.com/slopes-diaries-36-try-me/</link><guid isPermaLink="false">5f551fa1a253e1307d233f2b</guid><category><![CDATA[slopes diaries]]></category><dc:creator><![CDATA[Curtis herbert]]></dc:creator><pubDate>Wed, 09 Sep 2020 18:19:18 GMT</pubDate><content:encoded><![CDATA[<p><em>Slopes Diaries is my ongoing journey to turn my indie app into a more sustainable part of my business. First time reading? <a href="https://blog.curtisherbert.com/tag/slopes-diaries/">Catch up on the journey so far</a>.</em></p><p><em>What is <a href="https://getslopes.com">Slopes</a>? Think Nike+, Runkeeper, Strava, MapMyRun, etc for skiers and snowboarders.</em></p><hr><p>While exploring a lot of the possibilities with Slopes&apos;s pricing, if I were to change it, a light bulb went off. &#xA0;Some pieces of the puzzle had changed over the years, but I had never taken a step back to look at how they all fit together now.</p><p>I&apos;ve talked about how in the ski market, there are season pass holders, but those makes up only a small part of my target market. A much larger part of my market are the people that go for one or two trips a year, or on weekends to their local hills. Riders for whom the annual Slopes pass just doesn&apos;t make sense to them - why pay for a year&apos;s access if they only ride 4 days?</p><p>That&apos;s why shortly after I launched the annual subscription back in 2015, <a href="https://blog.curtisherbert.com/slopes-diaries-10-understanding-value/">I added the Day and Trip(week) passes</a>, moving me to a hybrid consumable + subscription model similar to ski resorts. This was still way in the early days of iOS subscriptions though. So early in fact, Slopes wasn&apos;t even eligible to use auto-renew when I launched; that gate wasn&apos;t opened up for another year and I had launched with a manual renewing solution. Also back then, subscriptions weren&apos;t able to offer a free trial.</p><p>But that lack of trial turned out to be OK. The Day Pass not only accommodated those that didn&apos;t ski often enough to justify an annual pass, it became a popular way for Slopes customers to try out the premium features, at just $1.99 (usually then buying annual the following season).</p><hr><p>Fast forward to 2018, 3 years after I launched my annual pass, and Apple finally enabled free trials on subscriptions. </p><p>I didn&apos;t bat much of an eye though because I had the Day and Trip Passes, cheaper and lower barrier gateways into Slopes Premium. I didn&apos;t completely ignore the idea, but at the time I was focused on a one month free trial (how so many other services worked back then). For many people, that could be their entire ski season. I worried that people would abuse it to use Slopes Premium on their one trip a year and then cancel before the week was over, people that would otherwise pay for a few Day Passes or Trip Passes within that month.</p><p>If you&apos;ve talked to me since 2018 about free trials, I&apos;d probably have mentioned to you how I just don&apos;t think they&apos;d be a good fit.</p><hr><p>So I&apos;m talking about pricing, and the other person suggests the Day Pass should go away to simplify the lineup, but we quickly breeze by that. The conversation continues for another 10 minutes until my brain comes to a screeching halt and jumps back to a world without a Day Pass.</p><p>See, I now know in 2020 that a large number of my Day Pass purchasers are customers using it for the trial aspect. Specifically I&apos;d venture (based on a lot of SQL queries I&apos;ll spare you) around 2,500 people are using it as I originally intended with an additional 5,200 Day Pass purchasers using it as a trial. That&apos;s 10% of my 2019/2020 winter premium customer base using it as intended, vs 20% of that base using it as a trial.</p><p>And people that use the Day Pass as a trial do convert to yearly users. Sometimes that same season, sometimes the following season. But iOS&apos;s free trials convert a <em>lot</em> better that this setup, somewhere between 2x and 4x better. </p><p>Suddenly using my Day Pass as a trial route seems ... less than ideal. Especially since now I&apos;m not limited to a one month, and have 3 day and 7 day trials available.</p><p>See, this goes all the way back to the <a href="https://blog.curtisherbert.com/slopes-diaries-3-removing-barriers/">third post in the series</a> where I talk about how being paid up front, instead of freemium, makes it a lot harder to sell to my customers. With an up-front price I couldn&apos;t let them use Slopes and see why they&apos;d love it, I had to <em>sell</em> them on it with pretty screenshots and text. Turns out, I&apos;ve been having the same issue, only now it was in-app with Slopes Premium. I&apos;ve always struggled in-app trying to show just how great Slopes Premium is, and had no way for someone to just <em>try</em> it. They had to pay $1.99 at a minimum to try it out.</p><p>If I moved to a free trial (probably 1 week?), it becomes so much easier. Just <em>try</em> it. All my upsell buttons become &quot;try it for free&quot; instead of &quot;grab a pass&quot; or &quot;unlock now&quot;. And <em>free</em> is a strong seller.</p><p>Of course, I will still have plenty of tire kickers, but now they&apos;ll be using a system specifically designed for them, not hijacking a Day Pass to do the same thing. But being able to design around that trial, I think, will help lower the intimidation customers feel today in trying Premium. If I just take the people that use the Day Pass as a trial and assume they convert at the average for apps in the fitness category, I&apos;m looking at a 10 - 15% increase in gross revenue. That is without taking into account the tons of new people that will finally give Premium a try and hopefully convert. </p><p>There is a risk though: I do need to offset that with the people that&apos;ll use the free trial in place of a Trip Pass, which is a loss of $9.99 per Trip Pass. They can only do that once, but if every customer that buys just one Trip Pass a season does that their first year ... worst case would be in 2019/2020 I would have lost 8% of my revenue. I&apos;m not sure how many people will be willing to start a free trial vs just buy the Trip Pass and be done with it, I have to assume if they don&apos;t go more than one trip a year they&apos;ll just ignore the yearly plan anyway? Dunno. Plus, there are the people who buy the current annual pass that won&apos;t want to stick with it after using it for a few days. I have a hunch those people usually are the ones asking for a refund, but I don&apos;t know what the overall drop because of that will be.</p><p>I&apos;m really not sure how to math this through, seems like something I might just have to brace myself for and try?</p><hr><p>But back to the Day Pass though, even if I go with a free trial setup, I still debate what to do with this IAP. I&apos;ve always wanted Slopes to be accessible to a wide audience, and the ski market has a very diverse set of travel patterns. The Day Pass helps support that. But at the same time, I&apos;ve always seen that simplifying things ultimately helps conversions as customers don&apos;t have to try to figure as much out.</p><p>I could leave the Day Pass around for those 2,500 people to keep on using as they want. Or I could simplify the Slopes Premium purchase system even more and keep Day Passes around just for special deals, like buy a yearly sub get two Day Passes to give to friends. There is a large balancing act right now with pricing things right between a Day, Trip, Season, and Household Season Pass.</p><hr><p>So I&apos;m not sure yet, but this feels like I might be onto something. If nothing else, it&apos;s nice to have a new perspective and a new set of options.</p>]]></content:encoded></item><item><title><![CDATA[Sim Genie]]></title><description><![CDATA[If you had told me 2 months ago that the Mac Catalyst version of Slopes was not going to be the first Mac app I'd launch, I would not have believed you.]]></description><link>https://blog.curtisherbert.com/sim-genie/</link><guid isPermaLink="false">5efa2f8a77b9946921d89ee0</guid><dc:creator><![CDATA[Curtis herbert]]></dc:creator><pubDate>Tue, 30 Jun 2020 14:58:00 GMT</pubDate><content:encoded><![CDATA[<p>If you had told me three months ago that the Mac Catalyst version of Slopes was <em>not</em> going to be the first Mac app I&apos;d launch, I would not have believed you. But around &#xA0;beginning of May I <em>really</em> started to get an itch to work on a second app. More so than normal.</p><p>Not sure if it was the fact ski resorts closed a month early because of COVID, and there was an unexpected snowboard-shaped hole in my life. Or if it was me winding down after pushing hard with Slopes over the winter. Or, if like many other people, being stuck inside due to &#x1F9A0; was causing me to need something I could really lose myself in.</p><p>Whatever the reason, here we are. Say hi to <a href="https://simgenie.app">Sim Genie</a>.</p><figure class="kg-card kg-image-card"><img src="https://blog.curtisherbert.com/content/images/2020/06/Shot-1.png" class="kg-image" alt="Sim Genie - Menu bar app for xcode" loading="lazy"></figure><p>Sim Genie is a Mac app that is built for those of us that spend our days in Xcode. Apple has been adding a lot of hidden capabilities to the Xcode simulator, but they haven&apos;t been making those capabilities particularly easy-to-use or discoverable.</p><p>So I got to thinking: the simulator can do a lot of things now a days, and I&apos;d save a lot of time and avoid many annoyances if those things were more easily exposed. What would an app look like that really took a serious go at making a proper product out of the simulator? One that didn&apos;t just focus on the raw capabilities of the simulator, but the workflows that could be built around it?</p><p>Sim Genie is that answer.</p><p>You should head on over to the <a href="https://simgenie.app">Sim Genie web site</a> if you want to learn more about the app itself. I wanna talk about the behind-the-scenes stuff for the rest of this post.</p><h3 id="green-fields">Green Fields</h3><p>I had a half-dozen or so app ideas, from cool smaller apps I&apos;d use daily to &quot;full&quot; products on the scale of Slopes. But I am <em>very</em> critical of my own ideas, and hesitate to actually start working on something unless I think it can be a success (see many episodes of <a href="https://independence.fm/61?t=0">Independence</a> where Jelly keeps telling me I need to branch out). I shoot down my own ideas way too early in the explorative process. Some of the reasons I&apos;d shoot things down were 100% legit: by the time I&apos;d finish app Y, it would be the wrong time of the year to launch, for example. But there was also a lot of self-imposed pressure to live up to something.</p><p>(Fun fact: work on Slopes wasn&apos;t started for 6 months after the idea, because I was unsure that I could actually make something of it. Self-doubt is a killer.)</p><p>To push myself over the hump and actually start working on something, I decided to pick something smaller in scope, something I wouldn&apos;t be putting pressure on myself to reproduce the success of Slopes. Something I in fact <em>couldn&apos;t</em> achieve Slopes-levels with.</p><p>That very quickly narrowed the list down to this product. Sim Genie was something I&apos;d been wanting to take a crack at for <em>years</em>; it was a space I thought I had some unique and good ideas in. Much like Slopes, it was going to be an app I&apos;d use myself a lot. And, for-freaking-once, my online audience would actually largely line up with what I was making (let me tell you how many members of the tech press don&apos;t ski &#x1F624;).</p><h3 id="holding-pattern">Holding Pattern</h3><p>Funny enough, though, I almost <em>did</em> take a crack at this app two years ago.</p><p>As I was kicking the rough idea around with friends back then, I quickly learned that my co-host <a href="http://twitter.com/jellybeansoup">Jelly</a> had started work on a Mac app for managing and import/exporting the sandboxes for the Xcode simulator. And while his work on it had paused, he assured me that he&apos;d get around to shipping it and it would hopefully contain many of the things I wanted to do in that space, too. </p><p>I wasn&apos;t about to start work on an app with that kinda overlap with a friend&apos;s app, so I eagerly awaited the launch of his app &quot;Bindle.&quot;</p><figure class="kg-card kg-image-card"><img src="https://blog.curtisherbert.com/content/images/2020/06/Screen-Shot-2020-06-29-at-8.35.31-PM.png" class="kg-image" alt loading="lazy"></figure><p>Fast forward to present day. We&apos;re chatting about life and things one evening over FaceTime, and I mention my I-need-a-new-app itch and how it was <em>really</em> bugging me. Jelly reminds me of his app, the one I had expressed interest in doing something similar to, and informs me that he had been unable to commit any code to it since we last spoke those two years ago. Life happens. But, after this long, he was willing to concede that <em>just maybe </em>he<em> </em>might not be shipping it anytime soon. </p><p>And so he was happy to give me his blessing, let me grab whatever I wanted out of his codebase, and finally build the product I had been wanting to do.</p><p>So, hat-tip to you good sir. Thank you for your early work, and I hope I&apos;m doing your vision proud.</p><h3 id="the-finish-line">The Finish Line</h3><p>Now of course here we are, two months later, in classic Curtis fashion with a polished marketing site and featured-packed product in hand for what was supposed to be a simple side project to scratch an itch. I coulda launched a month ago (and multiple friends on the betas have been yelling at me to for many weeks) but that&apos;s apparently not how I roll, even for side projects.</p><p>The extra time afforded me a lot of polish. Simple, but powerful things like the ability to have Sim Genie automatically apply a status bar preset before taking a screenshot or video with Sim Genie. And things you&apos;ve gotta roll yourself outside of the Mac App Store like crash reporting and update handling.</p><p>If I had launched earlier I probably could have avoided one last-minute snag though: having to redesign the app icon, and the preference pane icons, a week before launch (I <em>loved</em> what I did for those icons, too &#x1F62D;). Sim Genie is a menu bar app so you don&apos;t see the icons that often, but I was still particularly fond of what I made pre-Big Sur. I&apos;m sure the Catalina icon will look antiquated in a year once we all get used to the new design language of Big Sur icons, but I&apos;m still adjusting to the new look.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.curtisherbert.com/content/images/2020/06/Screen-Shot-2020-06-29-at-2.12.42-PM.png" class="kg-image" alt loading="lazy"><figcaption>Sim Genie for Catalina vs Big Sur</figcaption></figure><p>But on the plus side, I think I get to claim &quot;FIRST!!!!111!&quot; for the prize of app-with-big-sur-icon? </p><p>(I&apos;ve made the <a href="https://simgenie.app/faq/#alticons">original icon available</a> if you&apos;d like to override it while you&apos;re still on Catalina. I can&apos;t <em>not</em> ship that original icon, in some form at least.)</p><h3 id="lets-talk-shop">Lets Talk Shop</h3><p>It wouldn&apos;t be my blog without talking about the business side of things here. Astute readers will notice that Sim Genie is doing many things I&apos;d normally caution against in this day and age:</p><p><strong>It is a developer tool, which means it is targeting niche which historically has a strong <em>inverse</em> relationship between their vocal demand of features vs their willingness to spend money.</strong></p><p>I don&apos;t have much to say about this, except I&apos;m an idiot.</p><p><strong>It is software <em>prime</em> for <a href="https://www.urbandictionary.com/define.php?term=sherlocked">sherlocking</a>.</strong></p><p>First off, I&apos;d be OK if Apple sherlocked me! I would love to see Xcode support a lot of these features without the need for additional tools.</p><p>That said, I think I&apos;m safe placing good money (or, in this case, dev-hours) on the fact they won&apos;t anytime soon. Apple is building out its <code>simctl</code> command-line utility quite a bit, but they don&apos;t really seem interested in the simulator itself. I can easily see an exec there saying &quot;well, they can do it today with the tools we gave them, right?&quot;. </p><p>They have bigger fish to fry, and I feel like this would have been low-hanging fruit for them that they&apos;d have addressed in Xcode 12.</p><p><strong>I&apos;m charging a one-time fee for the app, there is no recurring revenue here unless I go the 2.0 upgrade-pricing route.</strong></p><p>I&apos;m mixed feelings here, to be honest. </p><p>This is the kind of tool a developer will use daily, and could save a ton of time during something like making marketing screenshots (assuming they still do them manually ... like many of us do). There is real value here and it does address some real pain-points, which means I should be able to charge &quot;real money.&quot;</p><p>But I&apos;m also well aware of just how anti-subscription developers and the dev-tool market can be. Every market is going to have people that complain about subscriptions, I run into them with Slopes, but the developer market in particular can be savage. I think Sim Genie is a prime example of why I&apos;m always saying to experiment with app pricing and take into account your target market when playing with pricing. </p><p>You can&apos;t just add subscriptions to an app and expect success. In fact, I think if I added subscriptions I&apos;d have a net-negative effect on Sim Genie.</p><p><strong>What, no Mac App Store version?</strong></p><p>Sim Genie has to use the Xcode command line tools, and some other terminal goodies, to work. And that kinda stuff ain&apos;t exactly sandbox-friendly.</p><p>That said, I think I see some ways in which I could get a <em>slightly</em> limited version of Sim Genie into the MAS. I&apos;m going to see how things go with the direct-download version before investing the work into that, though.</p><p>In the mean time lemme tell you - it is nice to bypass my normal checklist of marketing assets for the App Store. But, interestingly, it made me appreciate the things Apple provides me when I distribute Slopes via their App Store:</p><ul><li>I had to integrate my own crash reporter, set up a server endpoint to gather them, which emails me the logs. I could have used Crashlytics, but I didn&apos;t want third-party tracking code in this app. And without the App Store I don&apos;t even get basic crash reporting via the Xcode organizer like I do for Slopes. Would have been nice to be able to rely on Apple to get <em>some</em> crash reports from users.</li><li>I had to set up my own updater, both client-side and server-side. I&apos;m using <a href="https://sparkle-project.org">Sparkle</a>, the go-to &quot;there is a new version of X available, do you want to download it now?&quot; library. But that means I&apos;ve gotta maintain an XML feed of releases and the releases themselves on my server, make sure I have a CDN for them, and all that fun stuff. Wrote a nice little deploy script that <code>rsync</code>&apos;s it all up, so it isn&apos;t too much work, but woulda been nice not to waste that day+ on it.</li><li>Had to integrate a third party in-app purchase library, <a href="https://paddle.com">Paddle</a>. Of course I would have had to write IAP code if I was in the MAS, but I&apos;m quite familiar with Store Kit, and that&apos;d be one less third party with info on my customers.</li><li>I haven&apos;t done much research yet, it is a post-launch problem, but I&apos;m worried what kind of tax reporting situation I am in, both domestically and internationally. Apple handles a <em>lot</em> of that for us, and since it is so transparent to us we never realize how much work they&apos;re actually saving us.</li></ul><hr><p>Sim Genie is my first Mac app; all in all it has been a fun process. I would definitely encourage any iOS developer to take a look at making one &#x2013; there are some new concepts that&apos;ll trip you up, but there&apos;s also some cool stuff in AppKit land that never made its way to iOS.</p><p>And man, I had forgotten how much of a rush it is to build and release a new product.</p><hr><p>If you have a moment, <a href="https://www.producthunt.com/posts/sim-genie?utm_source=badge-featured&amp;utm_medium=badge&amp;utm_souce=badge-sim-genie">Sim Genie is on Product Hunt today</a> for the launch.</p>]]></content:encoded></item><item><title><![CDATA[Slopes Diaries #35: Abandonment Issues]]></title><description><![CDATA[Going into the 2019/20 season I had an ambitious plan: finally ship the iPad version of Slopes I've been wanting to see for years. It isn't so much that I thought that the additional platform would be a huge boon to my business,]]></description><link>https://blog.curtisherbert.com/slopes-diaries-35-abandonment-issues/</link><guid isPermaLink="false">5e1a061e1c0e5341798347c7</guid><category><![CDATA[slopes diaries]]></category><dc:creator><![CDATA[Curtis herbert]]></dc:creator><pubDate>Mon, 30 Mar 2020 16:31:35 GMT</pubDate><content:encoded><![CDATA[<p><em>Slopes Diaries is my ongoing journey to turn my indie app into a more sustainable part of my business. First time reading? <a href="https://blog.curtisherbert.com/tag/slopes-diaries/">Catch up on the journey so far</a>.</em></p><p><em>What is <a href="https://getslopes.com">Slopes</a>? Think Nike+, Runkeeper, Strava, MapMyRun, etc for skiers and snowboarders.</em></p><hr><p>Going into the 2019/20 season I had an ambitious plan: finally ship the iPad version of Slopes I&apos;ve been wanting to see for <em>years</em>. It isn&apos;t so much that I thought that the additional platform would be a huge boon to my business, although I think there&apos;s some effect on conversion of window shoppers by showing that Slopes is mature and exists everywhere they might want it. More-so this was about an itch I really wanted to scratch. What&apos;s the point of running your own product if you can&apos;t scratch your own itch occasionally?</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.curtisherbert.com/content/images/2020/03/header@2x-6b62226d.jpg" class="kg-image" alt loading="lazy"><figcaption>The full Slopes family (for now ;) )</figcaption></figure><p>Adding a proper iPad version to an app can add a lot of complexity, though, and I needed to manage that. I needed to make sure that the iPad app didn&apos;t slow down my ability to ship other features in the future. I am a solo developer, after all, so this is something I always consider. </p><p>iOS 13 brought us a lot of great new APIs to make powerful iPad apps so my decision was to drop support for iOS 12 in September 2019 and go 13-only. The perceived complexity of maintaining iOS 12 support (Appdelegate vs Scenedelegate) while also trying to adopt all the new great iPad APIs (along with the new background API, SF Symbols, etc) made me decide in June to drop iOS 12 support with my iOS 13 launch. I always drop support for 2-year old operating systems so I can stay lean, but I usually wait until January or later. This would be the first time I&apos;d drop support so quickly.</p><p>But hey, going iOS 13 only drops support for 1 generation of phones, surely it won&apos;t be a mistake?</p><p>From a code perspective, it went very well. Focusing on iOS 13 let me rip out a lot of old iOS 11/12 code, refactor and clean up a lot of stuff. The codebase improved as a result.</p><p>But when it came to customers, two things really bit me with my choice.</p><p>First, Slopes has moved a bit more mass-market. It&apos;s no longer the niche snowboard app used by just the tech enthusiasts, ones that are always running the latest and greatest or ones that know all the nooks and crannies of iOS. My market is shifting into one where more people are on older devices, more people can&apos;t or don&apos;t upgrade OSs for one reason or another. Which isn&apos;t a bad thing, but it made the second item hurt a lot more...</p><p>The App Store did not help me the way I hoped it would. In fact, it actively hurt me.</p><p>See, a large part of my choice to go iOS 13-only rested on the fact that existing users can always re-download an older version of Slopes that supports iOS 12. Going into the version bump I felt secure knowing my existing customers would be taken care of if they stayed on iOS 12 for whatever reason. I was confident this was a <em>great</em> compromise.</p><p>Boy was I wrong.</p><p><em>No one knows the ability to redownload an app&apos;s older version exists if it bumps OS requirements or gets removed for sale. No one knows about that purchases screen.</em></p><p>Seriously, don&apos;t rely on this feature. Tons of customers wrote in angry that they paid for something in Slopes and now I <em>removed</em> the app from their phone. They were appeased once I explained how to go through the purchases section to redownload Slopes and the version I made available to support iOS 12, but that was a support reply I was having to send out way too often. And plenty of people likely didn&apos;t even write in, they just moved onto another app in frustration.</p><p>Even better, though, was what happened to potential customers still on iOS 12. Ones who had never downloaded Slopes to begin with. You know what they do when they want to download Slopes for the first time? They type &quot;Slopes&quot; in the App Store search bar, naturally. You know what comes up in the search results in iOS 12? <em>Not Slopes</em>. </p><p>Apple seemingly doesn&apos;t want to highlight just how many apps a user can&apos;t install due to OS requirements, so instead they go with an ignorance-is-bliss approach. The App Store hides third-party apps from the search results that can&apos;t be installed. No product page with a note saying &quot;needs iOS 13, update first&quot; note. </p><p>Just a list of my competitors.</p><p>I&apos;m fine having people on an older OS find out they need to update their OS to install Slopes, but I&apos;m not fine with them thinking one of my competitors is what they&apos;re looking for because I&apos;m not listed. I had people legit think I removed my app from the store.</p><p>&#x1F926;&#x200D;&#x2642;&#xFE0F;</p><p>In retrospect, it worked out OK enough, despite the rocky road. I was able to retrofit iOS 12 support back in, and it worked out pretty clean (actually much cleaner than if I had tried to add iOS 13 support on top of 12 &#x2013; this retrofit forced me to make some compromises for 12 and not insist on keeping 12 support 100% the same). I launched the update early January and iOS 12 users were thrilled to have all the new stuff I had worked on.</p><p>In the end iOS 12 only made up ~3% of my sessions in February, but that isn&apos;t what is important. Being a mature app means supporting existing customers as best I can, doing whatever I can reasonably do to make sure they feel supported. In this case, it meant adding back iOS 12 support so users wouldn&apos;t <em>feel</em> abandoned (even though they weren&apos;t, it was just the App Store failing me).</p><p></p>]]></content:encoded></item><item><title><![CDATA[Slopes Diaries #34: Passive vs Active]]></title><description><![CDATA[I always have been ... one might say squeamish ... about upselling my premium IAPs within Slopes. Which is of course silly because Slopes Premium is the lifeblood of the app and the only reason I'm able to build and grow the product (vs selling user data or monetizing some other way).]]></description><link>https://blog.curtisherbert.com/slopes-diaries-34-passive-vs-active/</link><guid isPermaLink="false">5e5acd040941393b15e7ad64</guid><category><![CDATA[slopes diaries]]></category><dc:creator><![CDATA[Curtis herbert]]></dc:creator><pubDate>Mon, 23 Mar 2020 15:31:34 GMT</pubDate><content:encoded><![CDATA[<p><em>Slopes Diaries is my ongoing journey to turn my indie app into a more sustainable part of my business. First time reading? <a href="https://blog.curtisherbert.com/tag/slopes-diaries/">Catch up on the journey so far</a>.</em></p><p><em>What is <a href="https://getslopes.com">Slopes</a>? Think Nike+, Runkeeper, Strava, MapMyRun, etc for skiers and snowboarders.</em></p><hr><p>I always have been ... one might say squeamish ... about upselling my premium IAPs <em>within</em> Slopes. Which is of course silly because Slopes Premium is the lifeblood of the app and the only reason I&apos;m able to build and grow the product (vs selling user data or monetizing some other way). But after all, this upselling is basically marketing, and we all know most developers are allergic to marketing. &#x1F605;</p><p>Many of us take a lot of pride our craft and the designs we polish for our products. There is some purity that we feel we are losing when we upsell, that we&apos;re adding a <em>dirty</em> <em>ad</em> inside our otherwise beautifully created products. (see: recent iOS community opinions on Apple upselling their services within their own free apps).</p><p>When I&apos;m working on Slopes, I often initially treat the premium features as things I hope users will naturally stumble on or just instinctively want and seek out. &quot;<em>Slopes is known for the 3D, so of course that is why they&apos;re downloading it, so they&apos;ll be looking for it in-app! So that one &apos;3D&apos; button on that single screen is enough!</em>&quot; It&apos;s kinda the &quot;if you build it they will come&quot; mentality a lot of golden-era iPhone app developers had about their own apps, but for the new freemium world. Build great features backed by an IAP and they will pay, no in-app marketing required. </p><p>Spoilers: way more often than not they don&apos;t know much about your product at all.</p><p>What&apos;s obvious to you is <em>never</em> to them, and there&apos;s good odds they didn&apos;t even look at all your App Store screenshots where you highlight these features. They just typed &quot;ski tracker&quot; and downloaded the first result that wasn&apos;t a game.</p><p>Talking to my users has backed up this: I&apos;m hearing over and over this season from users that they had no idea how awesome the premium features in Slopes were, and if they had known they would have upgraded a lot sooner.</p><p>A great example of this is how I advertised the 3D feature compared to how I reworked it for this season. In past seasons I actually went out of my way to minimize the upsell (I mean, god, look at that low-contrast and tiny text) <em>and</em> provide free users with some kind of alternative feature (a 2d map):</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://blog.curtisherbert.com/content/images/2020/02/Screen-Shot-2020-02-29-at-4.22.38-PM.png" class="kg-image" alt loading="lazy"><figcaption>I&apos;m <em>still</em> a little squeamish looking at that last screenshot.</figcaption></figure><p>I&apos;ve realized that I can&apos;t just hide away the premium features on some &quot;About Slopes Premium&quot; screen on the About tab, keep the app clean by shoving all that upselling to one dirty little corner of the app. I need to make the premium features discoverable along the user&apos;s natural usage <em>so they&apos;ll know they want them</em>.</p><p>These kinds of mistakes <a href="https://blog.curtisherbert.com/slopes-diaries-17-missed-conversions/">aren&apos;t new for me and Slopes</a>, of course. I&apos;ve always been bad at framing the conversation around an itch they want to scratch, something they <em>want</em>, vs just a list of features:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://blog.curtisherbert.com/content/images/2020/02/Screen-Shot-2020-02-29-at-4.47.43-PM.png" class="kg-image" alt loading="lazy"></figure><p>That change to the unlock block has made a pretty big difference. Framing the upsell in terms of their own content, that thing that they&apos;re coming to the screen to check out: &quot;which run did I hit my top speed on, and where on the mountain was that?&quot; has been much more effective.</p><hr><p>With these change in place, this season was the first in which I received complaints (2 app store reviews) that the ads for premium were too much. Some people really don&apos;t like to be reminded that they are missing out on things. </p><p>If anything though, just like pricing, if no one was complaining I probably wasn&apos;t doing enough.</p><p>And you know what? They&apos;re using my app <em>for free</em>, they can deal with a few ads like this (which I&apos;d much prefer over third-party ads with nasty tracking). </p><p>All of this is certainly a balance. You can go too far and litter your app with upsell ads. You don&apos;t want to loose effectiveness by having too many ads on screen at a time (even little lock icons everywhere), as people will start to get blind to it. In my opinion it&apos;s important to try to focus one call to action per screen. Figure out the most important thing on that screen that they can unlock, and focus on marketing that. If you can unlock a lot on a screen, maybe figure out a way to condense that into one upsell, or pick the most important feature and focus just on that. Advertise the other features elsewhere.</p>]]></content:encoded></item><item><title><![CDATA[Slopes Diaries #33: Hi There, Do You Have a Moment to Talk about the One True App]]></title><description><![CDATA[Back when I was working on implementing my sync engine over the summer of 2017 the main problem I was trying to solve was helping protect customer data. I hated getting emails from users who didn't realize they needed to use iTunes / iCloud backups to move Slopes data to a new phone,]]></description><link>https://blog.curtisherbert.com/slopes-diaries-33-hi-there/</link><guid isPermaLink="false">5ddafe15f94875381e13c892</guid><category><![CDATA[slopes diaries]]></category><dc:creator><![CDATA[Curtis herbert]]></dc:creator><pubDate>Mon, 25 Nov 2019 17:12:27 GMT</pubDate><content:encoded><![CDATA[<p><em>Slopes Diaries is my ongoing journey to turn my indie app into a more sustainable part of my business. First time reading? <a href="https://blog.curtisherbert.com/tag/slopes-diaries/">Catch up on the journey so far</a>.</em></p><p><em>What is <a href="https://getslopes.com">Slopes</a>? Think Nike+, Runkeeper, Strava, MapMyRun, etc for skiers and snowboarders.</em></p><hr><p>Back when I was working on implementing my sync engine over the summer of 2017 the main problem I was trying to solve was helping protect customer data. I hated getting emails from users who didn&apos;t realize they needed to use iTunes / iCloud backups to move Slopes data to a new phone, incorrectly assuming that Slopes would backup things for them like many other fitness apps. Other fitness apps had made sync table stakes.</p><p>But I knew giving free users a reason to make a Slopes account would be useful from a business standpoint, too. It would allow me to improve to how and when I was able to interact with my customers. See, before sync I had no way to reach out to free users <em>outside</em> of the app itself, and that&apos;s problematic. </p><p>It&apos;s a situation a lot of app developers will naturally find themselves in. When you&apos;re an &quot;app developer&quot; it is easy to focus on the <em>app </em>and not the think of the app as part of a <em>whole product</em>. I&apos;m certainly guilty of this from time to time. We put a lot of thought into what we can do within our apps to improve our customers&apos; experiences (and hopefully our business&apos; revenue), but it can seem unnatural to focus on how we can break out of that screen. After all, the app <em>is</em> the product, so why look elsewhere?</p><p>(Which explains app developer mistake #1: always finishing the app <em>then</em> working on marketing it 1 week before launch. The app will just sell itself, right?)</p><p>Relying on in-app messaging during Slopes&apos;s brief screen time was even more problematic because of the fact that Slopes isn&apos;t the kind of app that a user will open daily or even weekly throughout the year. I&apos;m very seasonal. Targeted and timely in-app messaging could help but it is very tricky to get right with such time constraints. I&apos;ve got a lot I&apos;m trying to talk to customers about at any given time: trying to help them discover features &amp; educate them, trying to nudge them along to moments of joy that&apos;ll help them <em>get</em> Slopes. Oh, and I&apos;m also supposed to be up-selling.</p><p>The thing is, though, not all product messaging needs to be synchronous along side the user&apos;s on-screen experience. As a product owner I have to be aware of not just the messaging that&apos;s right for any given user (based on where they are with using your app + what messaging needs to take priority over others) but also how receptive the customer will be to hearing any message right then and there.</p><p>My messaging is fighting against them just trying to get something done quickly because the outside world is demanding their attention. They&apos;ve just finished a day skiing and they just want to save their day and get back to taking off their ski boots. So sadly the right message at the wrong time gets ignored. My perfect messaging instead can get in the way, leaving users quick to dismiss whatever message I&apos;m trying to give them. </p><p>Sometimes messaging works better if it is a bit asynchronous. Give them a bit of time to go about their day, get some immediate use out of your app. Queue up the messaging in a way they can async go back to it, when they have time to process things.</p><hr><p>So I was excited: with a much better chunk of users give me their email I&apos;d finally be able to try out another SaaS trick: lifecycle emails. Sending out an email at key points in the customer journey to guide them to the next step, ultimatly aiming to keep them coming back to Slopes year after year, and hopefully making some purchases along the way.</p><p>Lifecycle emails are tricky, though. I&apos;ve seen way too many companies abuse it just to keep people &quot;engaged&quot; (which usually results in emails from that company quickly finding themselves automatically flagged as spam). I&apos;ve seen others seemingly implement it to check the box on their roadmap, but the marketing isn&apos;t particularly thoughtful as to how it is helping customers along.</p><p>But I knew that doing <em>nothing</em> was a wrong answer, too, because lifecycle emails have been shown in the SaaS world to work, and sometimes have <em>huge</em> payoffs.</p><hr><p>So one of this season&apos;s goal to finally start experimenting with this kind of marketing. I&apos;ve gotta start working to learn what works and what doesn&apos;t for Slopes in this arena of marketing outside of the app itself. I&apos;m trying this 2 years later than expected, but hey, such is the indie life. As usual I probably left money on the table in favor of shiny new features I wanted to work on. &#x1F605;</p><p>Originally I was going to do <em>all</em> of this in-house, but I was pointed to <a href="https://www.getvero.com">Vero</a> by another app founder, and decided that I could offload a bunch of problems that have already been solved in this space. For example I knew I&apos;d be wanting to try new flows / emails as I learned, and the idea of making some dynamic system to let me (or someone non-technical) edit those workflows w/o code wasn&apos;t enticing. I just wanted to focus on the aspects that were specific to my business, not implementing branch logic, job delaying, and a bunch of other crud.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.curtisherbert.com/content/images/2019/11/Screen-Shot-2019-11-24-at-6.37.54-PM.png" class="kg-image" alt loading="lazy"><figcaption>Sample workflow I just starting testing. Yeah, I don&apos;t want to code that visual editor.</figcaption></figure><p>One thing I underestimated was the amount of work it would be to generate all the events I needed to power all my messaging. The ski niche once again complicated my life. Slopes can&apos;t just say &quot;do this on their second day recorded&quot; (which first of all, I have to be able to group multiple recordings from one day into a single event where needed so I don&apos;t trigger the day 2 messaging because they recorded once after breakfast and once after lunch), it has to be &quot;the second day of this season&quot;. Do &quot;such and such&quot; if they haven&apos;t bought a pass <em>this season</em> but they have recorded 4 times <em>this season</em>.</p><p>But a week later it is all done, and all my workflows are online. I&apos;ve got some workflows in place now that I&apos;m <em>very</em> curious to follow / tweak. </p><p>Now that Apple gives us a server-to-server notification when a customer disables auto-renew, I have an email going out 10 days before that subscription without auto-renew on expires to remind the user about it. They bought a Slopes subscription a year ago and might have turned it off at the end of the season just to be safe. Totally fair. Without this email I&apos;d have to hope that they just happened to open the app within the two weeks before it would expire so they&apos;d see the in-app messaging I added. Without extra outreach effort like those two, they&apos;ll likely resubscribe anyway this season, but maybe a month after the original subscription expired. Which means I&apos;m back to that 30% cut from Apple for a &quot;new&quot; subscription vs the 15% cut for a renewal. This one email might save me 15% of my revenue per customer in situations like this.</p><p>I&apos;m also using these emails to help offload some of the messaging / reminding I&apos;d have to do in-app. For example when a user buys an Annual Pass this year, they get 2 free Day Passes to share with friends (partly inspired by Vail&apos;s Epic Pass and the 6 buddy passes you get when you buy it). I mention this on the buy-a-pass screen, but I&apos;m venturing this bonus is secondary thought at the time of purchase. And directly after the purchase I want to prioritize getting them to <em>use</em> the features they just paid for and fall in love with all the cool new stuff they can do, not spam them with a reminder to send those bonus passes. Now I get the chance to remind them in their purchase confirmation email, a little bit later, that they should go give the 2 free Day Passes to a friend.</p><p>Slopes has a total of 10 lifecycle workflows like these right now (which can contain any number of email sequences / branch logic, etc). We&apos;ll see how they go throughout the season.</p><hr><p>It is so easy to rely on Apple to do everything for me, send my customers purchase confirmations and remind them of an upcoming renewal, but these lifecycle emails &#xA0;help me build a relationship with my customers outside of the App Store.</p><p>Because at the end of the day I need to be interacting with customers at these key points to take the opportunity make them <em>my</em> customers, not just Apple&apos;s.</p>]]></content:encoded></item></channel></rss>