How I use RevenueCat to offer users frictionless free trials in my app Personal Best

Discover how indie dev Shaun transformed his app's growth by building a ramp, not a wall.

Indies: A Cat's Eye View "How I use RevenueCat to offer users frictionless free trials in my app Personal Best"
Shaun Donnelly

Shaun Donnelly

Published

I’m Shaun, an indie app developer based in London, UK.

Personal Best is my iOS app for generating insights from your workouts, using Apple’s HealthKit framework. Ever wondered what your fastest run in the last six months was? Your earliest swim? Your total distance covered this month? Personal Best gives you all this and more, along with best-in-class features like customisable images of your workouts for social media, home and lock screen widgets, and support for shortcuts.

In spring 2020, the UK was in lockdown and exercise was one of the only reasons we were allowed to leave our homes, which gave me a lot of free time to work on side projects and go running. I released the first version of Personal Best in May, intending it to be a short two week project to help me track my workouts, but I discovered a love for making apps and I never stopped improving it. Today it’s been downloaded thousands of times and has a dedicated community of users from across the world.

Hitting a wall

Personal Best is free with an optional in-app purchase of Personal Best Pro, which unlocks more insights and customisation. When deciding how to integrate the in-app purchase, using RevenueCat was a no brainer. I’d previously tried integrating an in-app purchase for a tip jar without using any third-party frameworks, and I found it quite challenging to get my head around. On the other hand, integrating RevenueCat was fast and simple, and I was able to launch the Personal Best Pro subscription in September 2022.

Using RevenueCat’s charts I saw my number of active subscriptions grow at first. The big jump in the chart below coincides with iOS 16’s launch, where Personal Best’s updates got some press coverage. After that, things slowed down. Between October and December I only gained a few new subscribers, and growth stagnated completely in January.

Turning the wall into a ramp

I knew I needed to do something to kickstart growth, but I was struggling for ideas. Marketing could help, but as an independent developer I didn’t have much of a budget for this. I decided to spend some time researching what my peers have done, and then I remembered a blog post I’d read a few months prior from Curtis Herbert, an indie developer who’s behind the popular Slopes app.

In the post, titled ‘Building Ramps, not Walls’, Curtis talks about how he was inspired by Apple Arcade to turn his app’s paywall into a payramp by making it as frictionless as possible to start a free trial, leading to to a 25% improvement in users starting trials. I decided to shamelessly copy his work and do the same to my own paywall. In the screenshot below, pressing the ‘Redeem your free 2 weeks’ button will instantly pop up iOS’s subscription confirmation sheet without users needing to go to a secondary paywall screen.

I expected an improvement, but I couldn’t believe how much difference this one small change made. I rolled out the change to the paywall in late January and the graph immediately turned upwards. Since then, my growth in active subscribers has maintained steady.

With RevenueCat, building this was very straightforward. 

My app has a struct named SubscriptionManager which manages all communications with RevenueCat, which is initalized when the app first opens. I added a call to Purchases.shared.checkTrialOrIntroDiscountEligibility when the struct is initialised, which determines whether or not the user is eligible for a free trial. My struct stores this value as a local variable, then I added a computed property to check this variable and return true if the user is eligible for a free trial. Finally, I made a reusable view component named ProUpsellBanner which checks this property and updates its UI according to whether or not the user is eligible for a free trial. When users press the button to start their trial, it calls Purchases.shared.purchase, iOS’s payment sheet pops up, and their trial begins.

All of the above may sound complicated but the opposite is true. From start to end, the whole project took a couple of hours.

The future

I’m planning lots of updates to Personal Best for the coming months, including setting trackable goals and iPad support. As for RevenueCat, I’d really like to try some A/B tests in the future with the Experiments feature, and I can’t wait to see what features come next.

To get best-in-class workout insights and heaps of other features, download Personal Best from the App Store.

In-App Subscriptions Made Easy

See why thousands of the world's tops apps use RevenueCat to power in-app purchases, analyze subscription data, and grow revenue on iOS, Android, and the web.

Related posts

What is SKErrorDomain Error 0 and what can I do about it?
Engineering

What is SKErrorDomain Error 0 and what can I do about it?

What to do when seeing SKErrorDomain Error code 0 from StoreKit on iOS.

Charlie Chapman

Charlie Chapman

April 24, 2024

How we solved RevenueCat’s biggest challenges on data ingestion into Snowflake
How we solved RevenueCat’s biggest challenges on data ingestion into Snowflake
Engineering

How we solved RevenueCat’s biggest challenges on data ingestion into Snowflake

Challenges, solutions, and insights from optimizing our data ingestion pipeline.

Jesús Sánchez

Jesús Sánchez

April 15, 2024

How RevenueCat handles errors in Google Play’s Billing Library
How RevenueCat handles errors in Google Play’s Billing Library  
Engineering

How RevenueCat handles errors in Google Play’s Billing Library  

Lessons on Billing Library error handling from RevenueCat's engineering team

Cesar de la Vega

Cesar de la Vega

April 5, 2024

Want to see how RevenueCat can help?

RevenueCat enables us to have one single source of truth for subscriptions and revenue data.

Olivier Lemarié, PhotoroomOlivier Lemarié, Photoroom
Read Case Study