Case study
April 25, 2022

The only SDK I use in my featured indie app

The only SDK I use in my featured indie app

You've built your app! You've got all the features and fancy animations to make it special, but now it's time to switch to the boring bits and market it. There's only so many times you can rebuild a generic What's New screen, or dig through analytics services before it no is no longer a fun way to spend a day.

And yet it's all crucially important to keep on top of. I'm talking about increasing your App Store rating by asking for reviews (and getting good ones!), pushing messages to get feedback from users on new features, and testing your onboarding to understand retention.


Building all this for yourself would at the very least require...

- A basic analytics stack to track user actions

- Something clever to listen for the actions and show content based on that

- A smart delivery service that can get stuff to users hands, without code changes, or the App Store.


Whilst this is certainly do-able, wouldn't it be great to get this done in a day and then get back to the actually fun stuff?

Meet Unflow

Unflow exists to solve all of these problems, with just one quick integration on your end. It lets you create content online that shows up as a notification-style view or as a popover when triggers are hit.

Let's walk through how we can solve everything I mentioned above using Unflow.

I'm going to show you how I used it with Coffee Book on iOS, but you can apply all of these learnings to your Android app too.

Getting setup

You'll need to add the package, then set it up in your code.

Initializing Unflow is just as easy as any other SDK. You should probably throw it in your AppDelegate. You'll need to have an API key to do this (there's details about getting one at the end).

-- CODE language-swift -- import UnflowUI ... @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { private var unflowClient: UnflowSDK? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { unflowClient = UnflowSDK.initialize( config: UnflowSDK.Config( apiKey: "nicetryuseyourownkey", enableLogging: true ) ) unflowClient?.sync() } }

We'll need to make sure Unflow is retrieving the latest content. Syncing data can be controlled manually, or by making use of App/SceneDelegate hooks to update when things are relevant. I use the SceneDelegate system, so I've thrown it into my sceneWillEnterForeground.

-- CODE language-swift -- import UnflowUI ... /// AppDelegate.swift func applicationWillEnterForeground(_ application: UIApplication) { unflowClient?.sync() } /// SceneDelegate.swift func sceneWillEnterForeground(_ scene: UIScene) { UnflowSDK.client.sync() }

Thats literally it. We're integrated! 🤯

If we want, we can set up some custom fonts using client.setCustomFonts, but I use the default system design so I'll be skipping that, and getting right into my content.

Adding a what’s new page

Within Unflow, adding a What’s New page is trivial. Head to the web dashboard and select create content. There's actually a template just for this called "Product Update", which we'll use here.

The defaults are actually quite pretty, so I'm going to go with those! You could optionally add your own custom thumbnail and text, but we're going to get right to the carousel.

Select content and you'll meet the editor. You get a little preview of what the app would show if you deployed this right now.

Let's get customising. The content I'll show you is for Coffee Book's latest update, please feel free to borrow some ideas! To create this, I selected one of the sample background images, changed the text from the template, and then uploaded my own hero image. Be sure to hit the set live button when you're done.

Before we head to the app, we can take advantage of Unflow themes to really fit in with our app. When we're done, it'll look like we built this ourselves.

Head over to the settings page within your dashboard and choose the Design option. You'll be greeted with a whole bunch of options, take a look and get them adjusted to your apps theme.

The default blues look at home on mobile, but I've switched to the Coffee Book purple.

Take a look at how my update screen looks now, wonderful!

Showing notification banners

This is what we're going for, a nice banner at the top of the page that shows the user something cool. When they tap it, it should open a detail page.

Would you believe me if I said its a one liner to add this? Head to a place in your app you think it might fit. For me that was at the top of my home page, and thats exactly where I'd recommend you put it too. You'll just need to add OpenerView() inside your view. Really, thats it. In Coffee Book, it looks like this.

-- CODE language-swift -- import UnflowUI ... ScrollView { VStack { OpenerView() VStack { Graph() RecentBrewView() BrewGuidesView() /// etc... } .padding() } }

The view looks best when it can scroll right to the edges of the screen, so thats why I have it above the padded section.

Open your app and you'll see the banner right at the top. Tap it, and you can see your gorgeous update page right there, in the app.

Tracking user actions & attributes ( without being creepy )

Tracking actions is, you guessed it, really simple. You'll need to decide what your event is called, and just pass that to Unflow.

-- CODE language-swift -- UnflowSDK.client.trackEvent("coffee_brewed")

Here, I've made a "coffee_brewed" event that fires whenever someone finishes a brew, so for me, thats inside my "saveBrew" function.

To keep your options open, you should go around your app and add a bunch of these, so you can use them later without any code deployments. Try to think about user behaviour that you'd like to react to, or use to show/hide content. For me thats things like have they used the timer, or have they opened the premium view.

Another really useful tool is setting user properties. You can track anything with the setAttributes helper, and it'll send it right up to Unflow. These can help you prevent things like showing premium promotions to users that already have it, or enable things like showing special messages when a user has had the app installed for over a year.

When the app first opens, I check if the user is subscribed, and set their "subscription" to be either "none" or "plus".

-- CODE language-swift -- client.setAttributes(attributes: ["subscription": "plus"])

You should also set a unique ID for a user. The simplest, and most privacy friendly, way to do this is to generate a random UUID that you store in user defaults / shared preferences, and pass that to `setUserId`.

-- CODE language-swift -- UnflowSDK.client.setUserId(userId: uuid)

You can quickly see that opens up a lot of potential for really well-targeted content. This data isn't going anywhere else, so you don't need to worry about privacy.

When you first trigger these events in the app, if you've not already added them in the dashboard, Unflow does that automatically for you.

Showing the right content, at the right time

Let's see our user attributes & analytics in action and have a promotional view for Coffee Book Plus, that shows when the user has brewed ten coffees provided they're not already subscribed. I think that sounds like a user who really enjoys my app, and one thats likely to convert.

Head to the dashboard again and make a new piece of content, this time a bottom sheet in the visual section. We wont need any thumbnails or anything as we'll be showing this contextually.

Select show based on user behaviour, then add events. Pick your event and set the trigger, in this case I want this to show when they hit exactly ten brews.

To make sure this only shows to non-plus subscribers, select edit audience, and set the target to people who's subscription isn't plus.

Easy! Now let's add our content.

My favourite design is a hero image, with a big bold title, and a quick piece of text. I like to really encourage a purchase, but I don't want to be annoying.

To create this, I simply selected hero image and dragged in an image, then added my text.

( This image is from Tyler Nix on Unsplash)

To make this really special, we're going to add a DeepLink to the button. Tap on the button and then the little link icon and you'll be able to enter a link. This should be something unique to your app, so I've gone for coffeebook://buyplus.

Back in the app, we'll need to make sure we can handle that URL. Presuming that your app is setup for the URL scheme you just used, you'll need this in your SceneDelegate/SwiftUI lifecycle.

-- CODE language-swift -- /// SwiftUI ContentView() .onOpenURL { url in if url.host == "buyplus" { goToPlusScreen() } } /// Scene Delegate func scene(_ scene: UIScene, openURLContexts URLContexts: Set) { if let context = URLContexts.first { // coffeebook://buyplus if context.url.host == "buyplus" { goToPlusScreen() } } }

Now, when we brew our tenth coffee, we see our new screen, and when we tap "go on then" it opens our plus screen. The opening of the plus screen is up to you, you might have all kinds of fancy routers or navigation stacks, so we think it’s best you look after that part.

Getting ratings

Ratings go a huge way towards helping your app rise up the ranks, but they can be a challenge to get. When and how do you you show the pop-up? How do you suppress bad ratings and capitalise on people who love your app?

There's a simple way to do that, with Unflow. Using our user attributes and analytics we can show a prompt that only appears when people hit a certain threshold of brews, and push them to the App Store if they select five stars.

Let's head to the dashboard and get this setup. Open it up and select create content. We’re again going to make a visual bottom sheet. Select to show based on user behaviour and tap add events. I've picked "coffee_brewed" and set it to exactly five times. Unflow will handle all this for you as long as you fire off the event.

It's content time. We're going to build something that only forwards to the App Store if you pick a super happy emoji. Head to the content tab and set your text, then hit enter and type "/" to see the other blocks available, pick rating from the list that appears

You can pick stars or emoji, I personally like going for emoji as I like to keep my app really fun, but you do you!

You'll notice the toggle for App Store if 5 stars / 😍, make sure thats turned on. My sheet is below if you fancy copying it.

Hit set live whilst you're here - we just have one quick thing to setup. Go back to your account settings ( where you setup your colors ) but instead just go to the account section. Paste in your app/play store link, and you're good to go.

Back in the app, here's what happens when I brew five coffees.

When I rate it the highest, after a rather splendid animation, I get shown the App Store review prompt.

For those users who don't rate you the highest, you can gather sentiment using the Unflow dashboard, using the Results tab, in the same place you built your modal.

I use this in my app every time I ship a new update. I tag each new screen with an event, and then I ask them for a rating after they finish on a screen.

For a great example, I just added recipes to my app, and I now ask for a rating after they've made their first recipe on the latest version. This really helps me gauge sentiment to each release, and get ratings from those who really love it.

You can also use the "rating_response" event to target users who rate you poorly. Consider something like if a user hits ten brews, and they've rated you less than highly, ask again, and if they keep rating you lowly, show a "what can we do?" popover.

Thats it.

Not bad for a days work right? Think of all the analysis you can do, and all the users you might be able to convert. I hope that you've learned a bunch, and you can see what Unflow can do for you.

If you're interested in using Unflow, please get in touch.

What are you waiting for?

Make apps smarter,
with Unflow

Thanks for your interest!
Something's gone wrong while submitting the form