One week after the launch of my first app – Bird in Hell – I figured this was a good time to share with you all some of my results and learnings from its first week on the iOS app store.
The app was approved and launched on Friday, April 4th, after a prolonged submission process which you can read more about here. It was launched long past the window of opportunity where a Flappy Bird clone could have successfully filled the void left behind by its absence and shot up the charts purely by showing up for the right keywords.
Being fully aware that my app was entering a saturated market and that there were numerous competitors using the same exact source code as I had, I didn’t have grand expectations going into this. The goal was merely to reclaim my investment and learn new insights on the mobile app business.
So, one week later, how has Bird in Hell fared? I’d say it has met my very modest expectations.
One of my goals for this blog is to share my findings in the app business with you all by being as open and transparent as possible with my successes and failures. This will be the first of many updates where I will discuss the performance of my apps.
I hope that these insights might help inspire you to take your own leap into the app business world (if you haven’t already), while bringing to light the many challenges you may face along the way. So without further ado…
Performance Breakdown
Launch Date: 4/4/14
About the App:
- Free, No In-App Purchases
- Monetized with Chartboost, RevMob & Admob
- Marketing: App Store Optimization Only (Learn about ASO)
Initial Investment: $121
- Source Code: $99
- Sounds & Music: $22
- Art & Graphics: $0 (made them myself)
First Week’s Stats ( 4/4 – 4/11):
- Downloads: 607
- Total Revenue: $18.10
- Chartboost: $10.03
- RevMob: $4.71
- Admob: $3.36
$18? Keep the Cristal on ice… (But the Dollar Menu Big Macs are on me!)
As you can see, I’ve got a long way to go to recoup my initial investment. All-in-all, however, I am content with $18 for the first week.
As I mentioned earlier, the market is completely saturated with Flappy Bird clones. I was originally planning on leveraging ASO to rank for the top keywords related to the game, but due to the many delays I had with app store rejections, that ship had sailed by the time it was actually released.
At this point, launching a Flappy Bird clone that doesn’t differentiate itself from the others in any significant way isn’t a fruitful strategy. For that reason, I didn’t expect much.
I didn’t do any outreach to app review websites or any kind of pre-launch marketing since I didn’t feel that the app was original enough to warrant it. I felt that any effort I put toward that for this particular app would be wasted because most sites would ignore my overtures because they are being overwhelmed by solicitations from other Flappy Bird clone peddlers.
My marketing efforts focused entirely on ASO by selecting the best and most reasonable keywords to target and optimizing my app name and description with those keywords. I sent out the app to a few family members and friends to download, but that was really the extent of my marketing.
Speaking of ASO, here are some current keyword rankings:
- Flappy Bird: #171
- Flappy Wings: #20
- Hard Games: #151
- Wings: #47
- Hell: #11
- Bluebird: #2
Taking Flight & Coming Back to Earth
This chart shows the trajectory of the app’s downloads over the first week. It clearly shows the three-day period of growth that is common for most apps due to theorized artificial inflation of keyword rankings during this period and the appearance of the app in “new apps” sections across the app store.
The bulk of its downloads were in the US, yet, interestingly Bird in Hell seemed to get a good chunk of downloads in China a few days in for reasons that are not entirely apparent to me.
The downloads steadily declined each day after hitting its peak on Day 3, reaching a low of 14 downloads on Day 6. As you can see, downloads increased slightly on Day 7, which coincides with the release of version 1.0.1.
First Update – Version 1.0.1
A day after the app was first launched, I got to work to make a few updates to enhance its ASO and localization. Since an app’s name and keywords cannot be updated without a new release, I decided to make a slight change to minimize the appearance of ad interstitials which I believed might have been causing too many people to quit the game and decrease engagement.
For Version 1.0.1 I made the following changes:
- Renamed the app to “Bluebird in Hell: Flappy Wings of the Damned”
- Tweaked some iOS keywords
- Reduced the number of ads displayed after a loss (used to show 2 ads, now it displays only 1)
- Added localized app name, description and keywords for Chinese, Portuguese, Spanish & Japanese
- Added a revamped promotional screenshot:
It will be interesting to see how much the localization of the app improves the download numbers, if at all.
A quick note on localization, I am fortunate to be conversant in Spanish and Portuguese so I didn’t need to hire anyone to localize the meta data for these markets.
As for China, I really wanted to target these markets because the app already appeared to get a small following there. I figured localization might help it grow further there.
Unfortunately, I don’t know Chinese from Klingon! Instead of hiring a professional to localize the meta data into Chinese, I went the free route with Google Translate. I probably wouldn’t recommend taking this shortcut as I am certain the translation looks like a butchered mess to native speakers, but its worth testing to see if I can get a quick win in this way.
Next Steps
I don’t have any future app updates in mind at the moment. For now, I will be monitoring the results of the ASO tweaks and localization efforts to see if I they contributed to a noticeable lift in downloads.
I will launch a monthly app income report in May, so you will see more updates on Bird in Hell‘s revenue and progress in the future.
In the meantime, I will be launching a new blog series and project to develop an app from scratch with the aid of an iOS developer that I will hire via oDesk.
BTW, come join our Google+ community for Mobile Game and App Entrepreneurs! It’s just getting started, but we hope to build it up into a community with lively discussions on the mobile app industry.
Matty G says
Hi Shane,
I’m a fan of this site and have been reading it for a while now. Congrats on your app making 18 bucks in the first weekend, because my app, “Twerky Bird” has made like 3 dollars in the first 3 weeks! It’s only been downloaded like 200 times… I’m wondering if I should’ve included “Flappy” in the title somewhere but at the time, there was a rumor going around about games with ‘Flappy” getting rejected. I have one main question: how did you get the ads to show up after each loss? I used the same source code and it only shows up in the beginning when you first open the app. I think that adding those extra ads would make a huge difference for my sad, sad numbers lol.
Matty G
Here’s the app:
https://itunes.apple.com/us/app/twerky-bird/id838656106?ls=1&mt=8
Shane K. says
Thanks Matty! I originally intended to name my app “Flappy Hell”, but after the news broke they were rejecting “flappy” apps I changed it to “Bird in Hell”. The app that launched in the app store didn’t include “flappy” at all, but I added in “flappy” to the name with my first update. It is really hard to rank for “flappy” keywords at the moment so I’m not sure its the best strategy to target them right now, but I would probably include them in the keywords if you launch a future update. I would look for other keywords that relate to your app that have decent search volume and lesser competition.
As for the ads, I didn’t do anything extra. Out of the box it showed the chartboost and revmob ads on top of each other at the launch of the app and after each loss. Did you tweak the source at all? It may be that you accidentally removed a line of code that played the ads at those moments.
I’ve noticed, however, that sometimes there is a lag from when the ads show, and sometimes can even impact a game where the ad launches during gameplay. I hope you find a solution, because it probably is impacting your revenue potential.
That being said, I actually removed one of the ads from showing up after each loss because I felt that the doubled ads annoyed too many users.
Matty G says
Well, I got my source code from Udemy like many others. I did some searching in the course discussion board and found that other people were having the same issue, so I asked about it. Yohann replied that there was a more expensive version of the code being sold on chupamobile with that feature. Now that I know it’s not something I can easily change myself, I might just make an update to the metadata like you suggested… the way things are going, I’m not sure if it would be wise for me to buy the more expensive version from chupamobile.
Are there specific tools that you use for finding good keywords for your titles and metadata?
-Matty G
Shane K. says
Oh I see. Ya, I got mine from Chupamobile originally. It’s probably a small line of code to make it show up after the player fails.
I would recommend using SensorTower and MobileDevHQ for app store optimization.
Here is a review of the SensorTower tool I did a while back: https://www.appbattleground.com/2014/03/29/sensor-tower-review/
Matty G says
Wish I could figure out what line of code I’m missing… but I REALLY wish that Yohann was more upfront with that information before I purchased the course through Udemy… although I did get it at a huge discount by using an online coupon.
Shane K. says
I’ll look into this to see if I can spot the code and share it with you.
Matty G says
haha that would be phenomenal
Sean Nam says
I have both versions. The Chupamobile version is crap. The Udemy version isn’t any better. Neither compile for me on Xcode 5.1 now so I’m done using the code.
Give the app a little more time. The two reskins I managed both got over 4000 downloads in a few weeks. The first one made over $200 on Chartboost, which easily covers costs.
Shane K. says
It seems like the “Flappy Crocodile” code passed through a few owners’ hands since it was originally posted on Chupamobile. It has gone through a few iterations, so its tough to say which was the best version.
I know I had issues with mine (which was one of the first iterations of the code) because of the in-app purchase issue, which I detailed in a previous post. Other than that, the code compiled fine though it did have a few warnings.
Good to hear that you recovered your initial investment! It has been interesting to see the differences between the different ad networks (chartboost, revmob and admob). Chartboost has definitely been the most lucrative thus far.
Yohann AppFresh.us says
Hi Sean, contact me, I’ll help you out having it work on your machine.
Cheers!
Yohann
Shane K. says
Matty, I think the code you want to look for is in FlappyGamePlayLayer.cpp. Look for code that includes
sk::game_services::show_revmob();
sk::game_services::show_cb_ads();
If they have “//” in front of them, remove them and see if anything changes. “//” in front of a line of code “comments them out” so it basically tells the program not to run the code.
I commented out the last line for “show_cb_ads” in my version, and now the interstitial only shows one ad, except at the beginning. But this particular chunk of code says for SK_PAID which I assume is the paid version, but I used the free version, so be careful which lines of code you change if you do find it in there.
Matty G says
Hey Shane,
So I did some digging and didn’t find “sk::game_services::show_revmob();” or “sk::game_services::show_cb_ads();” but I did find the code below and the entire thing was in green font. I deleted the /* that was right above and right below all of the green code and it all stopped being green. I tested the app in the simulator to see if the ads would now appear. Then, I realized that the Chartboost ads never show up in my apps when I’m using the simulator. I tried downloading a provisioning profile for the app in order to test it on my iphone with the hope that the Chartboost ads would appear, but I still can’t get the app to run on my phone from xcode. So now I’m wondering if A) the ads would show up after losses if I make an App Store update and B) if there is a way to test the Chartboost ads before I make an update.
This was the code:
#pragma mark Chartboost delegate methods
// Called when an interstitial has been received and cached.
– (void)didCacheInterstitial:(NSString *)location
{
NSLog(@”ChartBoost : cached interstitial %@”, location);
}
// Called when the More Apps page has been received and cached
– (void)didCacheMoreApps
{
NSLog(@”ChartBoost : didCacheMoreApps”);
cb_cached_more_games = true;
}
// Called when an interstitial has been received, before it is presented on screen
// Return NO if showing an interstitial is currently innapropriate, for example if the user has entered the main game mode.
– (BOOL)shouldDisplayInterstitial:(NSString *)location
{
NSLog(@”ChartBoost : will dispaly interstitial now %@”, location);
sk::game_services::set_cb_shown(true);
sk::game_services::set_paused(true);
sk::game_services::log_event(“chartboost_interstitial_will_show”);
// SKTODO : make sure you do not call this gameplay ???
return YES; // !!!! YES
}
– (void)didClickInterstitial:(NSString *)location
{
NSLog(@”ChartBoost : didClickInterstitial now %@”, location);
sk::game_services::set_cb_shown(false);
sk::game_services::set_paused(false);
sk::game_services::log_event(“chartboost_interstitial_did_click”);
}
// Same as above, but only called when dismissed for a close
– (void)didCloseInterstitial:(NSString *)location
{
NSLog(@”ChartBoost : didCloseInterstitial now %@”, location);
sk::game_services::set_cb_shown(false);
sk::game_services::set_paused(false);
sk::game_services::log_event(“chartboost_closed_interstitials”);
}
– (BOOL)shouldDisplayMoreApps
{
NSLog(@”ChartBoost : shouldDisplayMoreApps”);
sk::game_services::set_cb_shown(true);
sk::game_services::set_paused(true);
sk::game_services::log_event(“chartboost_more_apps_will_show”);
return YES;
}
– (void)didCloseMoreApps
{
NSLog(@”ChartBoost : didCloseMoreApps”);
sk::game_services::set_cb_shown(false);
sk::game_services::set_paused(false);
sk::game_services::log_event(“chartboost_closed_more_apps”);
}
– (void)didClickMoreApps
{
NSLog(@”ChartBoost : didClickMoreApps”);
sk::game_services::set_cb_shown(false);
sk::game_services::set_paused(false);
sk::game_services::log_event(“chartboost_click_more_apps”);
}
#pragma mark misc methods
-(void)cb_cached_more_games_true
{
cb_cached_more_games = TRUE;
}
@end
Shane K. says
Matty,
If it isn’t showing up on the simulator, I don’t think it is working. I actually never tested mine on a device, only on the simulator. It is tough to say what is the cause, because it does look like the code for chartboost is in there.
I believe the guys at http://startappyard.com own the code so I think they may be able to provide some support on this.
I hope you find an answer!
Matty G says
Hi Shane,
I truly appreciate your help. It’s been frustrating. I’ve asked Yohann and others for help on the issue on the Udemy course, but no working answers have been provided to anyone there. Since Yohann said there was a “deluxe” version available, I’m thinking he just doesn’t care to help and hopes we give in and pay him more, but the course costs 130 bucks as it is. So I’m wondering: do you have an original copy of the code that I could pay for in some way? I have a youtube channel with 9K subscribers and could give this site a plug… or if you prefer money that’s fine too. I’d rather do that than give Yohann more money, consider how sketchy he’s been with answering everyone’s questions about the issue.
Shane K. says
Matty,
I’m sorry to hear that. Yohann has been very helpful to me in the past, so I can’t say what the issue may be. I know he has been pretty busy building his site and business out, so that may be a reason.
Another thing, Yohann doesn’t own the source code. It was developed by another developer, he only created a course to show the process of reskinning it. I can’t say if he has a deal with the developer where he gets a cut of the app sales, but I don’t think so.
From my understanding, startappyard.com owns the rights to the source code, so they should be the ones providing support.
Unfortunately, I cannot give the source code that I have to others because as with any of these source codes that you purchase to reskin there is a licensing agreement. I don’t technically own the rights to the source code, I am only licensing it out. If I were to resell the source code it would be a violation of that licensing agreement.
That is something to be mindful of when purchasing source code. It’s not really yours, so you can’t resell it. All you can do with it is reskin it to sell as a
stand-alone product to an end-user via itunes or android marketplaces.
Matty G says
Well maybe that’s why he hasn’t helped then (because he doesn’t know). Good to know about the licensing thing. Glad I asked. I guess I’ll try to contact startappyard but have a feeling they’re just gonna say “buy the 250 dollar version”. I’ll let you know if I figure it out. Thanks again.
Adrian Edwards says
Just use iAd!