The game had been ready for app store release since April 14th, but I wanted to have a working landing page all cleaned up and also a trailer:
Once that was all done, I set the release date to 4/27/14 because I wanted to release on a Sunday. Sunday rolls around and I find some minor bugs and am then horrified to find a monster bug:
In-app purchases are given away for free without charging the user.
In my code, I have in-app purchases set up to give away for free when it is a DEBUG build, so that I can freely get tickets when I need them while testing the app. Somehow, this logic was being applied to RELEASE builds as well. I stripped out any code saying to give away things for free and resubmitted to Apple.
So what, you say? This is a free game so the only way to make anything is from ads and in-app purchases. Unfortunately, the damage was already done. The patch didn’t hit the app store until May 4, and virtually all of my 755 downloads took place in the first two days when purchases were accidentally free. Here’s a Google Analytics report of tap events in the game:
Those labeled Purchase are for in-app purchases, and if those were all paid for I would have netted almost $5,000 over those two days. Instead, I made about 10 cents in ads. To be fair, those numbers are very inflated because once someone saw it was free, they probably tapped it another 20 times.
While that was disheartening, you live you learn. It’s important to test a final release build on actual devices, instead of assuming they will work like you expect in the simulator. This is a type of disappointment that’s hard to describe, but I read a blog post by the developer for A Dark Room where he had a similar “NOOOOOOO” moment when he first released and got crashes on certain devices.
I’m a little torn on how to proceed with the Attack of the Zombie Clowns. On the one hand I have a shipped game and should probably focus on promoting it, but on the other hand I’d like to focus on creating something new. I suppose I’ll see if it gets any traction, look at the data, and take it from there.