Wednesday, May 20, 2009

First Week of Sales

One of the neat features of developing for the iPhone is a library provided by Pinch Media called Pinch Analytics. It allows you to track usage of your iPhone app in details.

Included among the stats it collects for you are how many people use your app, how many times they start your app, and how long in total your app has been running. From this data, it also predicts how much you may have made, how much goes to apple, etc. And best of all, it only takes about fifteen minutes to install.

In short, I highly recommend using Pinch Media, and I'm going to even give a quick demo of the steps it takes to set it up in your code.

But that's not what this entry is about. This entry is to give an impression of what the first week of sales is like for a company's first game. And, notably, to discuss something that I hadn't expected, and a lot of first-game companies probably will not expect, but that is a very real reality of commercial iPhone Development - Piracy.

Quick Pinch Media Overview

The nice thing about using Pinch Analytics is that, once you have the analytics library installed in your app, there are only three lines of code that you need.

The first starts your 'beacon', and should be called when your application is launched.

- (void)applicationDidFinishLaunching:(UIApplication *)application
NSString *applicationCode = @"AppCode Provied by Pinch in Application Info";
[Beacon initAndStartBeaconWithApplicationCode:applicationCode
useCoreLocation:NO useOnlyWiFi:NO];

The second ends your beacon and, similarly, should be called when your application shuts down.

-(void) applicationWillTerminate:(UIApplication*) application
[[Beacon shared] endBeacon];

Simple, easy, snappy! With just those three lines of code, you get all the usage statistics about when, how much, and for how long. Not too shabby at all. But there is one more thing about Pinch that gives you tons more data - the idea of subBeacons. This allows you to track, not only how used your app is, but WHAT actions inside of your app are being performed.

That, my friends, is vital information that every application developer should want.

-(void) startGame: (id) sender
[[Beacon shared] startSubBeaconWithName:@"NewGame" timeSession:NO];
GameScene* gs = [GameScene node];
[[Director sharedDirector] replaceScene:gs];

And that's it. You can also time sub beacons ... so you can learn how long players are doing things for. That wasn't essential for my app so I never used that feature. By sprinkling your code with such items wherever necessary, you can really learn how players use your app.


I will forewarn all readers who decide to use Pinch Media to be very careful about getting overly excited about the numbers you receive on your first day. It's not that these numbers are inaccurate; it is merely that they may not mean what you think they mean.

I was burned by this. I went to bed the night that Castle Conflict went on sale, and Pinch told me it had 6 unique users (5 of which were me testing it). I woke up and Pinch told me I had 596. I was freaking ecstatic. I had heard that crossing the 100 mark of sales in a day was a huge milestone, and I had received 590 while I slept? That seemed to be a little bit too good to be true. But the numbers were there and they sure looked good. I had spent the few hours before bed sending my game off to as many sites as I could, and I thought that perhaps one of them had posted it on the front page already and it had paid off.

That was, of course, incorrect. It had been posted in a listing of games on one website, and that was about the most it was going to receive in terms of publicity other than a forum post I made on Touch Arcade, which had proved surprisingly active. By the end of the first day of sales, Castle Conflict had reached 1,666 unique users. With the 20 promo codes I had given away and the 5 users who were me, that still looked like over 1600 sales. When I checked my official itunes numbers the next morning and found I had not even cracked 50 sales - 48 new sales and 3 promo codes used - I was confused, and then doubtful, and then angry.

Because I knew what it was. I had seen, through my twitter search for Castle Conflict, a link to a cracked version of Castle Conflict. But I had wanted to believe in the huge numbers of first day sales so much, I had assumed no more than 10% could be crackers. Even when I thought about it from a cynical point of view, I was certain that at least half of the sales had to be real. I mean, it couldn't be THAT easy to put an iPhone game on a cracked iPhone, could it? There must be far more users seeing this game on the top of the new app list willing to pay a buck 99 for it, than hackers deciding to download it. Right?

The numbers obviously proved that I was incorrect in that assumption.

To this date, Castle Conflict is just looking to pass the 200 sale mark. Over 3500 users have run a pirated copy (and know at least 6000 were downloaded!). Let this be a warning to ALL new iPhone app developers: Chances are, when your app is new, it will be pirated between 3 and 4000 times in the first week. Pinch Media even makes a note, in their FAQ, that if your numbers are far larger than apples, it is probably because of pirates.


As I just stated, Castle Conflict has had less than 200 sales so far. The first day, when it reached 48 sales, I am certain that was mostly on the strength of the Touch Arcade post, and it passing through the twitter stream of the city I live in. These 48 sales put it in position #43 in the strategy game section of the app store, and it has yet to surpass that position. The numbers have been slowly declining, and last night it hit its lowest sales yet, with 14 sales.

The marketing engine is slowly getting online, so there is a chance that sales will be up in the near future - in fact, I am expecting it. As mentioned, this game only really had two things to boost the sales and awareness to this point - the touch arcade forum post, and twitter, with a potential slight boost from the site that listed it (148apps).

My app did not even get the initial boost in publicity most iPhone Apps get by being put on top of the 'new app' list. Why not? Because, by my own folly, I forgot to adjust the release date. When I submitted it, I set the release date as the submission date, so that it would go live ASAP. A good strategy, except that when it actually went live, I needed to change that date to the day it went live. Otherwise, the app store would think it's 9 days old.

With that in mind, the sales have been pretty good, and they can only get better as awareness increases. Today it was reviewed and featured on the front page of appvee, and I'll soon know how much that effects sales. We are also planning on doing an update soon, as doing so will boost it to the top of the top app list.

But back to piracy...

I mentioned Pinch, I mentioned Piracy, and I mentioned Sales. This was to give some context regarding the interesting stats I am about to show, which actually give me a lot of heart about the future of this game and how well I believe it's going to do.

The thing to think about pirates is as follows...for the most part, they are often younger and probably do not have credit cards. They have iPhones or iTouches, yet still refuse to pay for apps that are $3 and less. They feel they are part of a pirate 'community' and that probably allows them to justify their action better than anything else they claim; the fact that others are doing it too. They have jailbroken their iPhones. And they can crack your app with a fair amount of ease, and then submit it to many sites. (I have found Castle Conflict on at least 6 websites, including one in Japanese and one that my computer didn't have fonts for. The number I cited above, of over 6000 downloads, was from the only one of those websites that actually counts downloads, so the real number is undoubtedly higher).

So when a pirate sees a 5 MB game posted to the websites they follow, it isn't even a matter of whether or not they would pay for that game. It's a matter of it being easy to install a 5 mb app without even thinking about what it is, before the app gets taken down by the apps creator. (I haven't bothered going through that process). They will download it. They might even run it, if they ever feel the compunction. But since they have a slew of new, free apps to try, their attention span for any one app is likely to be limited.

Their 'public' justification is that they believe the app store is flawed, that apple has allowed many crappy apps through, and that they are tired of being burned by paying $0.99 for an app that actually kind of sucks. They worked hard for that dollar, and now, they want the chance to try such an app BEFORE they download it. If they like it, then they'll buy it.

This is an outright lie. And Pinch Media will help me prove this.

Let's consider the numbers that Pinch Media has to report about Castle Conflict:

To date, Castle Conflict has 3,796 unique users. Roughly 200 of those are legit (paid, promo code, developer). The rest pirated the game.

To date, Castle Conflict has been run 11,858 times. That means that, if sessions were divided evenly across users, the game had been roughly 3.12 times per person. If the Pirates truly had NOT liked the game, they would not have run it more than perhaps twice, but probably only once. So if each pirate who has not bought a copy had only run the app once, then that would mean that there were somewhere in the field of 8,250 play sessions by the 200 legitimate users.

If that were the case, I'm sure a lot more word of mouth would spread about this app, which users thought was worth playing 40 times in the week they bought it, and I'd be making a lot more money. So the assumption must be that, in general, people who download Castle Conflict like it enough to play it multiple times.

But there is one other stat that is interesting. In the 11, 858 sessions, players have started 22,036 new games, and continued 697 more; that's 22,733 times in total. That means that players play roughly 1.91 games per session. That means that the average number of times a player plays Castle Conflict, so far, is 5.98. Nearly 6 times per user! That's a pretty good record, as far as I'm concerned. (For those who don't think continuing is as valuable as a new game, the number is 5.81 play per user; I would argue, however, that continuing is MORE valuable than new games, as it indicates the player's desire to keep playing clearer than a new game).

And that's not even counting how many pirates are likely to have run the app once and quit. I can't account for what percentage that is, but it seems that this app has at least SOME staying power to it.

So the reality is that pirates are incorrect. They will play an app beyond the 'free trial' range, and they will still not pay for it, even if that app costs a paltry two dollars. If all the pirates who played this game 6 times had bothered to pay for a copy, I'm sure I would be a lot closer to breaking even.

One Last Note...Detecting and Dealing with Piracy

I found a great blog this week about piracy and detecing/dealing with it. It's located at this location. If you go to the first few of entries, the author includes a great explanation of HOW pirates crack your app, and how to detect in your app if that crack has been used on your app.

As a summary for the technically inclined, what pirates essentially do is load your app into memory, grab that RAM and output it as a file, then modify the root.plist to have the SignerIdentity field claim that the app was signed by apple. This allows them to put it on their jailbroken iPhones.

As a programmer, what you can do is detect if your plist is a different size than you know it should be, or you can check if the SignerIdentity key exists in your plist. The code to do so is pretty easy, and again, exists in more detail in the above blog. For convenience, it is:

NSBundle *bundle = [NSBundle mainBundle];
NSDictionary *info = [bundle infoDictionary];
if ([info objectForKey: @"SignerIdentity"] != nil)
/* do something */

What should you do once you reach this point? I have considered several options...from allocating tons of memory, to putting in an infinite loop, but upon further consideration, I realised these were all BAD ideas.

Simply because, pirates can be just as vocal as regular users. And you don't want them spreading the word that your app causes crashes or locks up iPhones, because that will scare potential buyers as much as it will scare potential pirates. And you want to do everything in your power to not scare potential buyers.

My recommendation is to put in a splash screen that pops up from time to time. This is less likely to be something pirates will try to figure out how to remove, it still allows them to have a good experience (and hopefully sing your games praise somewhere), and there's the off chance that they may be guilted enough by it to actually purchase your app.

Of course, unless this is under a one hour task, it probably will NOT be worth your time. The reason for this is simple - most pirates still will not convert to sales, but you're not doing anything about them. You could probably generate more personal income by continuing to plan/implement features/polish that actually improve your game and make more people want to buy it. It is, truly, impossible to solve the pirate issue completely.

At the very least, I intend to use Pinch Media to give me some REAL numbers about how many people are running a pirated version of my app, instead of the conjecture used above. I would even like to know how many times they are playing the game. It may not add any value to my game, but I'll be honest, I want to know how much pirates are playing my game. That may be the best test of how successful your game is - if you can find out that pirates, who have no financial backing pushing them to play the game, and who have a slew of other free apps to distract them from it, keep coming back to it, then you can feel confident that once your game does get more widely known in the actual app store, it should do quite well.

1 comment:

Jon said...

Very interesting read. I'd buy your game but dont have an iPhone =[