Thursday 29 December 2011

How to fail at promoting your Android App

I'm not a markerteer, I'm a developer. I like creating things then showing them off for better or worse reactions (usually worse). For my 9-5, we've been given the opportunity to work on and release side projects to the Android market. After releasing an app on there, I wanted to try to figure out how to go about getting it downloaded by people.

The market I was going for was going to be a challenge, the app enables people to create lip sync videos, this obviously narrows down your userbase from predominantly content consumers to content creators. Nevertheless, I googled how to promote your app and really, it seemed there wasn't much resources out there, other than a stackoverflow post from 2008 (perhaps I'm suffering from a search bubble?). So here are the aproaches I tried and their results.

DISCLAIMER: I am not a markerteer, I just did this as a fun learning exercise.

Attempt 1: Social Networks
So step one for me was to talk to my friends and tell them how awesome my app was and how they needed to download it right now. I posted it on my Facebook wall and Tweeted about it. (I didn't go hyperbolic about it, just one single quirky post.)

Results: This generated around 50 downloads and a bunch (~10) of good reviews.
Cost: £0.
Conclusion: Good for good reviews, perhaps I could of spammed my friends more.

Attempt 2: Blogs
There are a lot of Android blogs out there, so googled Android blogs, and e-mailed the reviewers asking them to review the app. I recieved some generic replies asking me for money for their premium review service, which I ignored. But, perhaps I'll try this out in future.

Results: 0 downloads.
Cost: £0.
Conclusions: I should investigate a premium review.

Attempt 3: Ad Networks
Facebook is great for targeting the users you want to see your advert, you can select your age demographic, gender and interests. You can't select multiple interests, it either someone who loves music OR someone who loves Android, not both. Felt like a bad idea. I initially targetted Android users, but no one wanted to click my advert. I expanded to music, but still hardly anyone wanted to click my advert.

The advert took around a day to verify, and there was no minimum pre-payment, you're charged after.

Results: 47 clicks. ~0 downloads
Cost: £4.71.
Conclusions: Perhaps people are just too educated to the advert placements that they just filter them out, that's what I do. Or most likely my advert creating skills are poor.

Let's you specify lots of keywords for your campaign, which, is ok. Can't target users like Facebook, but the main problem here was that keywords simply cost too much. A targeted keyword ranged between £1.50 to £2.50. This was too much for my beliefs, so I set it to £0.50. Of course, no one clicked on the targeted keywords. But the budgeted money magically disappeared at the end of the week from their 'Display Network' which charged £0.07 per click.

The advert took around a few days to verify, and the minimum pre-payment is £10.00.

Results: 142 clicks. ~0 downloads.
Cost: £10.00
Conclusions: Not convinced this is the right way to go.

Google's other advertising platform is more interesting. You can target the phone and OS, not so much the interests or user age like Facebook, but you can really pick out a phone that you know works with your app. Since you can get a few disheartening 1/5 stars from one of the hundreds of customized Android devices that you never managed to test your application on and discover that it doesn't function correctly on that device.

Also note when specifying the region, it's probably best to decouple your adverts into individual regions to keep the minimum cost per click low. As if you select UK on it's own, its $0.05 per click, if you select USA on it's own, it's $0.15 per click, if you select them both it jumps to $0.25, if you add in Japan it'll jump to $0.76.

The advert took a week to verify and the minimum pre-payment is $50.00.

Results: So far after a day of heavily targetted advertising (region+device) we've had 310 impressions and 0 clicks.
Cost:$0.00 ($50.00 pre-payment)
Conclusions: I like how you can pick which OS and phone you want to target. Probably can get more with different regions targetted.

This service allows you to pay per install, which is great to boost your download figures at the least. There's no OS/phone filtering or demographic selection. The recommended cost per install is $0.60, and the minimum is $0.20, I went with $0.20.

Initially the app wasn't on their directory, but I e-mailed them and they added it within a day. The minimum pre-payment is $100

Results: It's only been a day, we've had 1,289 impressed, 22 clicks and only 3 installs. We did get an extra rating during that period; a bad rating.
Cost: $0.60 ($100 pre-payment).
Conclusions: At least it's a gauranteed install your paying for. Although if you're releasing an app which hasn't been tested on every single Android device out there and has a risk of not running on one of them (i.e. uses Camera API/NDK/OpenGL), you may get some negative reviews.

Open Source
I like open sourcing things, I hear it can also promote your app virally via the developer community. In future I plan on open sourcing the source code to provide an explaination on how the code works. However, as it's a work project, I'll need to go through a couple of check points before getting this done.

Another pay per install service, however it seems to require an SDK for app download verification. The app was already released, and I couldn't add the SDK at this stage.

Of course, real life advertising would require a much bigger budget than I was prepared to sacrifice for my experiment. But, I thought this post may be interesting to small time developers like me. In the end, I am not a markerteer. But, if you have any suggestions, please leave a comment.

Monday 26 December 2011

Quran Project - Loading 3D Obj Models

Reading e-books is like eating marmite. You either love it or hate it. Myself personally, I read lots of articles, but never have the attention span to get through a book. Currently we're working together with the Quran Project charity ( in trying to re-create your typical reading experience into something more as an interactive 3d novel. The basic idea being that you get to browse the different chapters of the book, by swiping through different scenery and animations that hopefully entice you to read on more than perhaps you normally would.

Working along with a 3d artist has it's challenges, ranging from getting your naming conventions right to importing the assets created.

The models I'm working with have been exported from Maya as obj files. In the past I'd write my own exporter into my own personal favoured file format. However, I took this opportunity, to go with the flow for compatibility reasons and work on getting obj files imported into the application engine I'm working with.

I found a great ObjLoader tutorial series online here (, I tested out the provided tutorials with the model exported and found that tutorial3 was everything I needed to get to the obj description.

Integrating the objloader header and cpp file into an iOS project can be done with minimal changes to get it compiling. Those being to comment out win32 specific includes and switch from the OpenGL method of drawing polygons using glBegin and glEnd, into an OpenGL ES compatible vertex array using GL_TRIANGLES.

So the first step would be to take the loaded in vertices and draw them using OpenGL ES's GL_TRIANGLE construct, but of course this would lead to an incomplete scene.

What we need to do is switch from OpenGL's GL_POLYGONS to OpenGL ES' GL_TRIANGLES. To do so we can create a triangles from the first vertex and remaining vertices of the polygon.

As in if we have a 5 sided polygon.
We'll make a triangle from the first three vertices (v1, v2, v3).
Then, the first vertex and the next two (v1, v3, v4).
Then finally, the first vertex and the last two (v1, v4, v5).

You can grab the source code from the Open Source cross platform application framework (here) with the file to watch out for being CCModelObj.cpp.