I’d Like to Request a Review Prompt, Please

While working on my latest update of Fin, I spent a bit of time playing with Apple’s new SKStoreReviewController API.

For those unfamiliar, this new API was announced with the early betas of iOS 10.3, and it went live with the 10.3 release last month. Though it isn’t the only approved way to prompt a customer to rate your app on the App Store yet, that is Apple’s ultimate intention. Like it or not, you’ll have to learn to work with this thing eventually, in other words. Unless you never prompt for reviews.

rating prompt

I wanted to share a thing or two I learned in my research and implementation for Fin. I had never had any ratings prompts in any of my apps before (I don’t count putting a link on the settings or help screen. That’s not prompting, it’s merely offering easy access.) So when this new controller was announced, I figured I might as well use it, rather than roll my own.

If you have a method of prompting for reviews that works for you already, I’d say leave it as is for now. Apple will make you replace it eventually, but especially if yours is better/more effective, feel free to keep yours as long as you can.

What do I mean by better? Well, frankly, I think SKStoreReviewController isn’t the ideal way to prompt customers for a review. It’s an alert dialog, for one thing, which means it needs to be handled immediately before proceeding with the app. I don’t think ratings are so important they should get in the way of my customer using the app. Embedding it into a tableView cell or collectionView, as implemented by an app like Slopes, for instance, would be greatly preferred. Or, as suggested by Oisín Prendiville, a notification would also be less intrusive.

Another issue with SKStoreReviewController: It only prompts for a star rating, not a review. If a customer wishes to review your app, they will still need to go outside to the App Store to do it. (At least we have the new deep link to directly take the customer to the review tab.)

Having said all that, here’s how I approached implementing SKStoreReviewController for Fin, given its limitations. Perhaps some readers will have some suggestions on how I can improve this.

First, the logic. When do I want this thing to pop up? The way I see it, there are only two possible times that make any sense. Fin is a timer app, so you would never want a rating alert to pop up during a running timer. That leaves the time immediately after app launch, before you start a timer, and the moment you acknowledge a timer has ended by tapping to stop the flashing ending animations. I opted for the latter. (I’m not a fan of apps that prompt for reviews on launch. If I’ve launched your app, I want to use it, not be held up by a prompt.)

I don’t want the prompt happening every time someone finishes a timer, of course (and I can’t with SKStoreReviewController, anyway—more on that in a minute) so I store a date in NSUserDefaults when I request a prompt, and don’t request another prompt until at least two months have passed from that date.

Notice I said “I requested” a prompt. Not “I showed” a prompt. Or “I prompted.” As the name of the sole method available on SKStoreReviewController implies (requestReview), you can’t prompt a customer for a review yourself. You can only request that the App Store prompt the customer for a review.

You get no feedback from the system that this request was approved, by the way, so you will have no way of knowing whether the customer was actually prompted. A request is just that; a request. This is why you can never pop up this review prompt from a “Rate” button. The button may end up doing nothing, and you’ll never be notified as the developer.

Apple hasn’t made public the criteria for saying yes to one of these requests, other than to say that the request will not be approved more than three times a year, but I have a few guesses as to when your request might also be denied.

  • If the customer has already given a rating for this version.
  • If the device is not connected to the internet.
  • If a prompt has been given recently by the same app (within some interval Apple determines).
  • If another app’s prompt was approved recently (again, within some interval Apple determines). I could see Apple not wanting to bombard a single customer with prompts from several apps in the same day, for instance.
  • If a customer with the same AppleID has been given a prompt by this app on another device recently.

It’s actually good in some ways that Apple can make these determinations, as it has far more information than you do about what your customer has been doing outside the little world of your app, and thus can minimize the likelihood of being annoying. Annoyed customers do not leave five-star reviews.

That, of course, assumes you trust Apple to do this well, and it depends on whether you believe, as I do, that prompting for ratings is a necessary evil, not a sport. I want prompts to be done as infrequently and as unobtrusively as possible, while still helping me reach my business goals.

The downside, of course, is the lack of a callback when the request was denied. Not knowing whether my request was approved by the App Store means I now have to make a decision about resetting that two-month clock after making the request.

If I don’t reset the clock, I could theoretically burn out all my prompts for the year on the first three times someone finishes a timer. If I reset the clock in situations where I’m very likely to have been denied, the customer might never see the prompt.

So here’s what I do in my class for determining whether to make a prompt request:

  • I check for connection to the internet. If there’s no internet, there will be no prompt. I’ve confirmed this in my own testing. In the Simulator and in debug builds on device, the request is basically always honored, so you can test your own logic and see the prompt for yourself. When you have no internet connection, however, the prompt won’t show up, even in debug mode. Makes sense, given that if there’s no internet connection, you won’t be able to leave a rating, anyway.
  • I check to see if you are doing a remote session. Fin 4.0 added the ability to connect two or more devices together to run a single timer in sync. This could be an inconvenient scenario in which to see a prompt, even at the timer’s end, because your remote device may be on a stage during a performance, set to be controlled from an AV station. So I opted to not make a request during these remote sessions.
  • I check to see if you are remote-controlling your Fin session via Apple Watch. Again, there’s a chance here that you put your iPhone out of reach when opting to control via Apple Watch, so I don’t want to request a review then, either.

If all the above criteria give me the thumbs up, and it’s been at least two months since the last request date, I request a review when the customer taps at the end of a timer, and I reset the date to today. Maybe the prompt happens; maybe it doesn’t. At that point, it’s out of my hands.

In addition, I sync the last request date via iCloud for those who have turned on iCloud sync. I don’t want someone getting a rating prompt on iPad and iPhone right after one another. (Again, I think Apple may do this already, but just to be sure.)

Why two months? It seemed long enough to me. I could have gone for three or four months, but then there’s a risk the customer won’t be in the correct set of circumstances at least three times a year. If a customer gets all three prompts in the first six months, so be it. I’m not going to lose sleep over it. At least it’ll be spread over six months, minimum.

Some folks have suggested that I tie in the review prompt to the version number as well, but I didn’t do that for a number of reasons. First, Apple will only approve a prompt three times a year, regardless of version number. Second, I believe (and yes this is speculation) that the App Store will know that a user has already rated a current version and thus not approve a prompt again once a person rates for that version, anyway. (At least, that’s how I’d do it.) If I only request a review prompt once per version, then when the customer says “Not Now”, I will lose that customer for the entire version. I know for myself, I often say “Not Now” because now isn’t a convenient time, not because I’m not interested in reviewing tomorrow. Third, Fin is a side project for me, so I don’t anticipate putting out many versions every year. I only released one version in 2016, for instance. I wouldn’t want to only have one opportunity a year to prompt for a rating, especially when I can’t be certain my request was approved that one time.

You’ll have to determine what works best for your app, of course. I welcome suggestions from anyone who has ideas for improving this prompting logic.

And if Apple wants to improve the SKStoreReviewController by making it an embeddable view, or a notification, I’d welcome that. The nice thing is they could do that without breaking anything for us.

Heck, if they wanted to remove ratings altogether, or at least change to a simple thumbs up, thumbs down, I’d be all for that, too. Again, this would require no effort from anyone who is using SKStoreReviewController, either. Which is nice. And it’s probably why Apple wants us all using this thing rather than our home-grown solutions sooner rather than later.


Fin 4.0 is available starting today.

Two major new features I want to point out here. The first is running a timer on multiple iOS devices. Connect your iPhone and iPad, for instance, and start a single timer on both. This is great for when you have a speaker on stage, and an audio-visual table in the back of the room or off stage. You can start the stage timer remotely. Or sometimes you just want to see your timer from multiple positions on stage. Now you can do that with multiple iPads.

Technically, you can connect up to seven devices at once, but I recommend no more than three.

The second major feature is local notifications on Apple Watch. For those who have been using Fin for a while, you know that the Apple Watch app would only tap you on the wrist if the timer were in the background on your iPhone. This is obviously not ideal if you’re on stage and you want to see your timer, yet still get tapped for warning and end times. Later I’ll go into more details about the challenges I faced getting the local notifications to work, and the limitations that still exist in my implementation (fingers crossed for some help from iOS 11) but for most use cases, the local notifications should work very well. Just launch the app on your watch at some point while the timer is running, or start the timer with your watch, and then forget it. Go back to your watch face; lower your wrist. Carry on with your day. You should get notified at warning times and when the timer has elapsed, even while the iPhone app is still in the foreground.

If you only want to be tapped at certain warning times, or only for the end timer, you can set those preferences on the settings screen.

In addition to these new features, I also did a lot of rearchitecting around the app, improving the experience on iPad, tweaking the preset editing process, and more. If you are a Fin user, I’d love to know what you think of the update. There is a Leave Feedback link on the What’s New page, which is available on the information screen.

You can also leave me a rating or review, which would really help.

5 Stars, or GTFO

Furthermore, this shows just how dishonest these rankings are. If you’re aware of the preposterously high standards Postmates, Uber, and Lyft set, you’re much less likely to give a three- or four-star rating if your experience is imperfect — you don’t want to be the user who causes the contractor to lose their job.

—via Nick Heer

This is precisely why whenever I rate anything I give five stars, or I don’t rate at all. People argue with me about this, and they’re wrong.

Giving anything but five stars hurts people. Period. You can take all your principals of honesty, fairness, mathematical purity, and so on, and shove them up your ass. Because rating less than five stars hurts people, and people are more important than your damn sense of fairness.

If you’re a paid professional critic, by all means, write a thoughtful, fair review of a product and publish it. I’m not talking about professionals making expert recommendations here. I’m talking about the bullshit online rating systems that make or break people’s livelihoods.

As a regular consumer, if you really can’t recommend something, just don’t rate. Unless the guy punches you in the nose, or something—in which case, sure. Go for the one-star. But giving a 1-star rating, or even a 4-star for that matter, is a power play. It’s you demonstrating your dominance over the maker of this thing or performer of this service.

Personally, I’m not so insecure that I have to feel power over my Lyft driver.

Should Have Posted this Yesterday

If I had posted this last night, when I initially thought of it, I’d seem like a genius now. But I generally don’t engage in speculation about new Apple announcements, so I decided to pass. Oh, well.

The thing is, given the rumors of an edge-to-edge screen on the iPad coming later this year, a minor speed-bumped iPad Pro right now makes little sense. I’m not at all surprised that Apple didn’t have anything to announce on the iPad Pro front today.

I know no one who owns an iPad Pro 12.9 or 9.7-inch who thinks the device is too slow. Adding a slightly faster processor at this point would provide little incentive to people who are thinking of upgrading. True Tone on the 12.9-inch, and fast charging on the 9.7-inch maybe made a little more sense, but frankly, it’s just not a good enough change to be worth upgrading. Save it for the more significant upgrade later in the year.

I use the 12.9-inch now as my primary iPad. It’s over a year old. If Apple had done a minor “bump” today, I very likely would not have upgraded. And I’m a nut for upgrading.

Specs are not the problem with the current iPad.

Now, a lower-cost entry level model does make sense. The new 9.7-inch at $329 is a smart move. Keep expanding that umbrella. I also suspect this is a signal that the mini will be gone soon. It got a small update with more RAM as an option, but in a plus-sized phone world, the mini isn’t really all that useful anymore. I suspect the low-cost 9.7-inch will replace the mini altogether soon.

If all you want an iPad for is watching video or reading, a bigger screen is always going to be better. Or just get an Android tablet. The real future of the iPad is pro applications.

As far as I’m concerned, software is going to make or break iPad at this point. I’ll be very interested to see what happens with iOS 11 this summer. And I’ll be very interested to see if Apple creates new apps itself and/or adds incentives for creative new third-party companies to fill those gaps in the pro market for iPad software. If there aren’t some cool new demos of iPad apps coming during an Apple Keynote this year, I’ll start to be a little worried.

Meanwhile, I look forward to upgrading my iPad this fall, when the changes are more compelling.

Follow Up with New Connections

Confession: I suck at follow-up. There have been many times in my recent past where I’ve failed miserably at following-up or following through with people, so I’m trying to make a good-faith effort to improve in this area.

There are several aspects of follow up I want to explore, so I’m going to split them into a series of posts, starting with this one.

Why is this important? Well, other than the obvious personal business reasons (I make part of my living through freelancing) there’s also just the common courtesy aspect of holding up your end of a relationship. Not following up with people is a good way to lose customers and friends. And, since many of us suck at this, it’ll be helpful to all parties involved if at least some of us get better at it, right?

Human connections are why we’re here, folks. Don’t let anyone tell you otherwise.

So, first up: following up just after meeting someone.

I suspect a lot of people will relate to this: You meet someone at a networking event, or just out and about in your daily routine. You have a nice conversation, make a connection, exchange business cards, shake hands. The whole nine yards. You may even go as far as to add that person into your contacts list when you get home. (I’m willing to bet the majority of us don’t even get that far.)

And then that’s it. The card goes into a drawer, or a contact sits in your phone, and you never speak to that person again.

I don’t know about you, but meeting new people is a big effort for me. I am not comfortable around strangers. Putting myself in a position to meet new people is hard work for me, so I’ve taken to getting pretty mad at myself for making all that effort and then not following through after the hard part is over.

So here’s the easy fix. A day or two after meeting someone new, I now send something like the following:

Person’s name here,

It was great meeting you whenever we met. Add something specific I remember about our conversation. If you ever want to connect again to talk about something relevant given what we talked about, feel free to reach out.

Your name

Now you don’t just have a business card in a drawer, or a new contact in your list that you won’t remember in a year. You have an actual human connection. If they are a contact worth keeping, they will likely reply with a quick “Thanks” email, at the very least. They will more likely remember you among the sea of other random people they handed a card to that week, because they’ve now connected to you twice. And you’ll be in their email address history, should they ever struggle to find your card in the drawer into which they likely dumped it.

Sending this email takes 30 seconds, max. You can even create TextExpander snippets with a few templates, to make it even faster.

Not everyone will become your best friend just because you did this. But they very likely won’t remember you at all if you don’t.

So how do I get better at this? Do I set a reminder for myself whenever I get a new business card? Do I put it in my todo list? One thing that has worked for me recently is whenever I actually think to myself, “It was great meeting new person yesterday. I should totally follow up,” I actually do it. Right then. Right there. On my phone. My iPad. Whatever device is handy. I don’t wait until I forget about it later.

Try it. Like I said. It takes 30 seconds, max. Less time than it takes to check your Twitter feed. You have no excuse.