Hi, Habrahabr!
In this post I would like to tell the story of the development of the free version of my application, which was released a little over a year ago. Tell me how I managed to increase the number of downloads (and, in this case, profit) three times using technical means only.

')
Who cares, welcome under cat.
I will not mention the name of the application, I will just say that it lives in the Productivity category. The paid version was released on the day the first iPad appeared, which is not surprising, since originally worked only on tablets. Six months later, there was a version for the iPhone (universal app). A little later - cut down on functionality, a free version with a button leading to the purchase of the full (separate application in the AppStore).
So they existed until January 2012. The free version also had ads, but I never figured out how to count the conversion (free -> paid). The situation was also aggravated by the fact that the code that was responsible for synchronization was ādrunk outā of the free version, and as a result, users could not transfer data when they bought the full version (it was too lazy to return it, the codebase was already very different).
It was decided to remove the free version and in its place to release a "trial" with the possibility of purchasing full functionality through in-app purchase. I already donāt remember why I decided to make the third application, but the original free version is still present in the AppStore and is only available in Uganda (maybe because itās still worth money for advertising ā a couple of dollars a day; although this explains nothing ...).
I have long since abandoned experiments with the price, having determined for myself the optimal price of $ 2.99. This is the price of both the full version and the āunlockā trial; throughout the period that I will consider, the price has not changed.
February 29, 2012 the application got into the AppStore. Knowing about the limit of 20 MB for downloading applications over cellular networks, I achieved the size of the application a little less than this limit. The application really uses a lot of beautiful and high-quality graphics (do not ask why it is necessary for the productivity of the application - it's just one of the "chips", it should be so).
And then, like a bolt from the blue, Apple made another technological leap. I'm talking about Retina Display on iPad 3 - I had to rework the graphics. With great difficulty, I met the new limit - 50 MB.

For four months, an application of 50 megabytes in size was downloaded an average of 750 times a day. It is this stage (in the illustration it is marked as stage ā2ā) we take it as a point of reference (we will consider the first stage organic growth). Once again, no promotion of the trial version was conducted at all.
You know, for several years of the presence of my applications in the AppStore, I used to consider the lack of growth (downloads, sales) as a failure. It was necessary to do something!
But miracles do not happen - you will not feel much JPEG. The only solution (which I resisted for a long time) was to render the hi-res image for download after installation. A set of resources for the iPhone and non-retina iPad remained in the app, and the 2048x2048 pictures āmovedā to the server. Loading was carried out at the first circulation, in the background. If you didnāt peer, you couldnāt notice a special difference on the new iPad (but it was all the same - it means you had to ship).
I was afraid of the violent reaction of users at the expense of their Internet traffic. But it turned out that nothing.
Apparently, users of Apple products can afford it. Not a single complaint in more than half a year has been received.
So, the stage "3" - 17 MB. The experiment was a success! The number of downloads (well, income) increased by one and a half times (an average of 1200 per day). But what is this ??? Again, Apple āthinks differently.ā The iPhone 5 enters the scene with an enlarged screen with a height of 1136 px, and the size of the resources in the application (those that are not downloaded from the server) is 1024x1024. Perfectionism does not allow me to ignore the lack of 112 points. The show goes onā¦
Decided to take the line in the 10 MB. Now only 3 resource files remain in the application, but already in the size of 2048x2048 (of which the required size is ācut outā in runtime, of course, once - further cached), and the rest are moved to the server.
At the same time, resources on the server are now exactly in the resolution required by the device (320x480, 640x960, 640x1136, 1024x1024 and 2048x2048), which allows reducing traffic on the server (at a peak of 90 GB per month) and traffic from users.
As a result - stage ā4ā - 9.8 MB. And another confirmation of the availability of the dependence of the number of downloads on the size - 1700 per day. Let me remind you that this is more than twice as much as our āreferenceā value of 750. Well, the income, of course ... While the minimum supported version of iOS is now 4.3 (thanks to Apple, up to this point, the application worked fine on 3.0).
A couple of months, everything is going well. But no growth again! What to do? It was during this period that services such as searchman.com began to appear, offering a comparative analysis of the application's metadata and suggesting changes. I played with one of them, and I managed to shove a bunch of keywords into the application name. Well, you know how it happens:% APP_NAME% for% 1 1% 1 1%,% 2 2%%% 3 3% 3 3% iPhone 3 iPhone iPhone, iPad, iPod Touch - free version, try me please. The keywords, along with a slight decrease in size (up to 9 MB, stage ā5ā), gave even greater growth. By the end of the stage, I had an average of 3000 downloads per day!
Stage ā6ā is a check: to what extent is the theory correct? All PNGs are compressed in JPEG with a separate alpha channel (PNG). Also, almost all PNGs are placed on the server for download (the benefit is, the technology has been worked out). Loaded PNGs are used instead of pseudo-AJPEG (there is still a difference). Size 2.9 MB. NO effect! This is the limit.
Stage "7". Seeing the lack of effect of reducing the size, I decide to retreat back to the mark of 5 MB, because The use of pseudo-AJPEG spoiled the appearance of the interface elements. Apple censors don't miss the title. The dilemma is either not to release an update (they do not insist on changing the name of the existing version), or to check the theory of the influence of keywords in the title by removing them. I agree with Apple - I return the name. The result is a drop to 2,200 downloads per day.
In fact, steps 5 and 6 should be excluded from consideration of the influence of size on the number of downloads (they are left only to maintain chronological consistency), because the changes in them are due to a greater degree of āhackā with keywords.
Conclusion: 50 MB = 750 downloads, 5 MB = 2200 downloads. Increase downloads / revenue by a factor of three. For fun, you can even derive an approximate formula: new_downloads ā sqrt (old_size / new_size) * old_downloads.
I understand that if your application is so much less than 10 MB, then this method is not for you. But if more - think over optimization. 5, 10, 20% growth is not superfluous.
You ask about the money? I will answer that the conversion (given in view of advertising) is on average 2%. I also note that even at the peak of downloads (3000 per day), the free version never brought more than the paid one.
Versions of the program exist for iOS, Windows Phone, Windows 8 (Metro), Android (currently unavailable, released by a franchise by another company; will soon be released to the whole world in an "improved" form;
Android users will go crazy when they see a 35 MB application " ). MacOS version in development. And the oldest Win32 version of 2008 is still sold on average once a month. Sales on Windows Phone and Windows 8 are, to put it mildly, funny. But on Windows 8 - a conversion of 20% (it doesnāt fit well in my head). I think how to advance in the Windows Marketplace? If anyone has ideas / experience, please share - on which sites to ask for reviews, etc.
From the technical aspects I would like to note the need to ādrive outā all the graphic resources through the PNG / JPEG optimizer - this gave me a 7% reduction in size. It also does not hurt to simplify the splash screen. Attached are 7 files, they are shown literally for a second. Removed all gradients and shadows, translated into 8bit - saved a couple of hundred kilobytes.
About advertising: Apple iAd does not work in all countries, so it makes sense to display ads from another source when iAd shows error. I use google admob. Yes, I heard about AdWhirl, but I'm too lazy to deal with it - the rotator has already written and debugged. eCPM stays at $ 0.3 for AdMob and $ 0.5 for iAd, but the number of AdMob hits is several times higher than iAd. Yes, I also rotate advertising every 45 seconds (iAd-> AdMob-> iAd, and if iAd is not available, then AdMob-> AdMob ...) - this gave me about 30% increase in advertising revenue.
No, I do not mind the user traffic trial version, forgive.Maybe someone useful code to support pseudo-AJPEG. All checks are cut - I trust myself. Hard naming convention: image.png + image_mask.jpg. Appeal by name without extension. Cache support (without it - generally 6 lines of code). For a basis for something more flexible (if you need it) - it will completely come off.
#define maskedCacheStorePath [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:@"maskedImageCache"] + (UIImage *)maskedImageNamed:(NSString *)imageName useCache:(Boolean)useCache { NSString *imageCacheStoreFile = nil; if (useCache) { if (![[NSFileManager defaultManager] fileExistsAtPath:maskedCacheStorePath]) [[NSFileManager defaultManager] createDirectoryAtPath:maskedCacheStorePath withIntermediateDirectories:YES attributes:nil error:nil]; imageCacheStoreFile = [maskedCacheStorePath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.png", imageName]]; if ([[NSFileManager defaultManager] fileExistsAtPath:imageCacheStoreFile]) return [UIImage imageWithContentsOfFile:imageCacheStoreFile]; } UIImage *image = [UIImage imageNamed:[imageName stringByAppendingPathExtension:@"jpg"]]; UIImage *mask = [UIImage imageNamed:[[imageName stringByAppendingString:@"_mask"] stringByAppendingPathExtension:@"png"]]; CGImageRef ref = CGImageCreateWithMask(image.CGImage, mask.CGImage); UIImage *result = [UIImage imageWithCGImage:ref scale:image.scale orientation:image.imageOrientation]; CGImageRelease(ref); if (useCache && result) [UIImagePNGRepresentation(result) writeToFile:imageCacheStoreFile atomically:YES]; return result; }
Behind this all. I will be glad to hear about your experience and answer any questions.