my process

Being active in a few forums, I read about how long some people spend working on their apps before releasing them. Some solo developers spend 6 months, 1 year or longer working on one app. Tweaking one aspect of the game or another until they feel it is perfect and a certain hit.

This sort of thinking reminds me of the old methodologies that were used a few years back in software development. The methodologies that were brought over from manufacturing.

In said methodology you gather the requirements from your head, from whatever you perceive is missing from the market or whatever great idea you came up with. Then you spend days and years locked up building something that nobody wants, needs or finds any use for.

In manufacturing, it makes sense because the cost to get suppliers in line, building a plant, tooling and other aspects I don’t know about are astronomical. As a solo-developer of games and apps, it doesn’t make any sense because there are fees that are re-occurring and the longer you wait the more of those fees you will have to pay. There are also little or no costs to change the game or app in mid-flight.

A few years back I thought of this great idea. What if I could make a game like 1024 but instead of joining numbers to make bigger number what if I join colors to make other colors. So instead of 4 + 4 = 8 how about blue + blue = Green.

Although I planed may aspect of the game ahead of time, I only implemented the bare minimal to get into the marketplace. From the end of planning to the release of the game took me a total of 3 months. I then spent some advertising dollars until I had enough data on how people were playing the game and how the key metrics compared to my successful game.

I realize that most people didn’t get it and even when they figured out how to play the game it was extremely difficult for most people. Apparently, I made the miss-calculation that people are more comfortable with colors than they would be with numbers. The game has other problems, but the core concept is flawed. I could have spent a year or more as a solo-developer tweaking every aspect of the game and then realize that it was not a viable game. I am stubborn and still have plans for that failed game.

This is my process: I create a list of task or features and then I prioritize them by descending order of required for release. So in my list, a feature like “help screens for gameplay” is a lot higher than “help screens for menu scenes”. After I have the list I draw a line on the list of where in this early stage I consider minimal features for release. I then decide on a release date usually 3 months to 2 months for a new game and 1 month for an update to a game.

I then work on the items on the list. Two things usually happen. The happy path is where I get to the line before the deadline. In that case, I release the game early. The not so happy path is where it is getting close to the release and I am not near the line. In those cases, I go through the items that are left and decide if I can live without them for the release. Remember the most import release features should be at the very top. At a minimal a play button, the gameplay scene with a few levels, setting up ids, onboarding process, and other key features/tasks.

I then release it and wait for feedback or observe data from the analytics package. Based on the information I get I add items to the feature/task list. Re-order them for the next release (usually in a month), draw a line on min feature for release and start working on the task until I reach the line or times up.

Some indy studios do this repeatedly. They create a game, limited release, check the data coming back and then either abandon it or make tweaks and release it to a bigger population.

 

 

Advertisements

youtube channel updates.

Somebody in the CoronaLabs forums wanted a step by step instruction on creating native plugins. I created a set of videos showing how to create a native plugin for Tapjoy (read my previous post). Object-C, C++, and Lua bindings scare some people off, but it really isn’t that hard. If I can do it anybody else can. If I can get people to write some more plugins then I won’t have to write any.

 

The plugin is now available for free in the Corona Marketplace.

Tapjoy, me, and violating TOS.

Cuadros started out as a native iOS app. At the time, I used Tapjoy for monetizing and to provide some of the back-end functionality. I have never been a big fan of their interstitials ads. Some are very long and mostly videos. But as rewarded videos they are great.

What people might not know about Tapjoy is that they also provide other free services when you monetize with them. They can keep track of your virtual currency. You can send them substractions and additions and they can also deposit any video rewards directly to the user.

They have some very cool analytics that I have never seen in any analytics package. Some examples of this are that they have retention curves and categorization of users based on expected return.

You can also target your users with messages (non-advertising in-game alerts) based on tags, parameters, segments or events. You set up these alerts by uploading static images and then overlay buttons over them in the control panel. These alerts can be also localized and the API will display the appropriate one based on locale. They even do push notification that you can set up to run on the same parameters I mentioned above.

All of this sounds like an advertisement, but I promise I am not getting paid for this, Tapjoy will probably never read this, and I am probably violating TOS.

Well going back to the main story. I didn’t regularly reach the threshold for payment disbursement, but they allow you to transfer whatever amount for use in incentivized advertising campaigns. So that is what I use to do.

Recently I have been getting e-mails from Tapjoy that my advertising campaign was coming to an end because I only had $4.56 in the account. I have been ignoring these e-mails because in my head I don’t use Tapjoy. When I moved my apps to Corona they did not have a Tapjoy plugin available and I wanted to avoid the mistake I did in Marmalade where I felt compelled to support a half-dozen plugins that I had created and provided for free.

At the same time, I was getting strange support ticket. Some were about how they downloaded the apps to get diamonds but still like the game and others about how they expected x amount of virtual currency but got nothing.  I would say thank you for the first and sorry to the second and then I would give them a few hundred virtual currencies in my game for their troubles. Although I knew that the virtual currency they were talking about had nothing to do with my game.

Everything clicked about a week ago. I wondered if the Tapjoy campaign was still running. This would explain both the e-mails about my campaign running out of money and players feedback that they were not getting their virtual currency. Since Tapjoy is not integrated into my apps the people who downloaded my apps for virtual currency would not get their virtual currency.

I turned off the campaign and I created a very simple plugin in case I ever want to turn it back on. I also documented the creation of the plugin on youtube.

The creative life

At bedtime, my wife puts on various podcasts. Most of the time, I am the only one listening to them since she falls asleep 5 minutes into them. Two of my favorites are Kick in the Creatives and Sketchbook Skool.

I don’t particularly draw, paint or do anything with a sketchbook but I have found that a lot of what they talk about relates to me and coding. The other day in Kick in the Creatives they were interviewing Koosje Koene (she is one of the founders of Sketchbook Skool) and they were talking about what to do when you just don’t feel like doing your art.

I do two types of coding. One is day-job coding. I still enjoy it but even when I don’t feel like coding I have found that just starting gets me going. I open one of the IDEs that I work in and I just start typing.

The other type of coding that I do is for my mobile apps. And if I don’t feel like coding those, I don’t really have to. I don’t really get paid. The money I make on these apps is of very little consequence to my life. If I calculate money made divided by hours spent it would be under $2.00/hour. I really enjoy coding these mobile apps, but there are days where I don’t feel like coding. Paraphrasing Koosje Koene, I feel like I have broken something that I use to enjoy.

Interesting enough the same technique that she uses to get back into her art, I also implement to get back to coding. I give it a break. I go for a walk. And in due time, I get a new idea or a new twist on an old idea and I am off to the races. I have been coding for a couple of decades now and luckily I have not broken it yet.

Another Kick in the Creatives that I heard recently was about your own personal artistic style. Sandra Busby adamantly stated that a style should not be something you look for, but it is something that develops from continuously working on your art.

I have a lot more restrictions when coding than most artist have when doing their art. Although I code for fun, what I create I want it to be enjoyed by other people. I code casual games. I like playing them and I like making them. Most casual games are vertical and important button locations are at thumbs reach. Most people play these games with one hand while doing something else. There are many other restrictions that I impose on my games based on known ways people play these games.

I also try to re-use code as often as possible: it is part of the game I play and part of the fun. Everything I create for game 1, I try to create it so I can easily use it in-game 2.

I mention the restrictions and the re-use of code because I believe they limit the range of possible styles. That being said if you look at my games and if you could look at my code for these games you will see a pattern. A style. As Sandra Busby stated in that podcast if somebody saw one of my art pieces and they knew me,  they would probably know that I created it. I feel the same way about my apps and my code. And if you look at apps I have not upgraded in a while and those that I have you will see an evolution of that style. Not a style that I decided ahead of time and forced upon myself, but a style that evolved from continuous practicing of my craft.

 

 

LTV and Cost of acquisition

I a few years back I read a story or blog post stating that not all paid app users are the same. The story went something like this: you can buy two users at $2.00 but one user would bring you back $3.00 for his/her lifetime of playing while the other users would only bring you back $1.98. With one user you would make money and with the other, you would lose money.

What if you could track each user as they install your game all the way through to when they stop playing your game? You could then know for example that the average lifetime value (LTV) of a woman acquired via Facebook ads is higher than the same type of user acquired via Google Ads. There are services / APIs that do just that and after reading the article, I figured this was the ticket to actually making some money with my hobby. Because I thought that if I can spend $1.00 and get even $1.30 back then I can make a business out of that.

I tried two services both available to Corona users and both free to a certain point. One of them was AppsFlyer. They charge .05 per non-organic installs. The other service that was available to me was Tenjin. For the free plan, you get 1M events. The AppsFlyer pricing seemed at first a very steep price especially when I usually bid for users at .15 or lower, but I figured if this scheme actually makes me money it would pay for itself. I can give 0.05 cents per install to AppsFlyer if that install brings me in .30 or even .20.  Interesting enoughAppsFlyer has never charged me a single cent. I don’t know if my volume is so low that it would cost them more to send an e-mail or they only charge you after you reach a certain threshold.

Both APIs are very easy to set up and both customer services are excellent. I think Tenjin customer service is a bit better, but it might be just the size of the operation. With Tenjin, I felt that I was in contact with the actual team running the show. This is just my perception and maybe it was an illusion but that is how it felt. When you are paying exactly $0 dollars for a service and you getting e-mails and phone calls from the actual engineering team trying to help you out, it feels special.

If this was one of those over-hyped marketing blogs, this is where I tell you how well it all worked out and how I made my first million. The reality was completely different. I think both services are excellent and I plan to add Tenjin back into the mix soon.

Here is the problem I encountered and maybe there is a simple solution, but one I could never figure out. I would spend $5.00 a day on Facebook for iOS version of cuadros and according to Facebook and the services that would result in 15 installs. Sometimes one would say 14 and another would say 13. When the services would calculate the LTV of those 15 users, I would undoubtedly lose money. According to the services they would bring in let us say $3.00. So I just lost $2.00 on those 15 users on that day.

When you looked at the revenue for any particular day for cuadros across platform the revenue would be far more than $5.00. Usually between $10 and $20 and sometimes in the low $70s. Of course, there were more users than the 15 installs that were attributed to Facebook. The Android version would get an additional x organic installs and the iOS version would get an additional x organic installs. Those were “free installs” because apparently, I didn’t pay for them.

So why pay for the paid users? I am losing $2.00 a day on the paid users! Guess what disappeared when I stopped paying for those 15 users, the rest of the organic installs not only on iOS but also on Android. I have run this experiment multiple times. Even advertising on Android will result in some installs occurring on iOS. Advertising on a completely different app in your portfolio might cause organic installs in other apps in your portfolio. Maybe it should have been obvious, but advertising is like dropping a drop of ink in water it disperses and touches many molecules.

In no way does this mean that the services are useless, they provide other data that should be extremely useful in more capable hands, and maybe this dispersion doesn’t matter with bigger budgets.

 

 

 

 

 

 

 

OneSignal

I love OneSignal. For those that don’t know they provide mobile push notification for your apps. They recently also added e-mail notifications. There are other providers that do this, but I have not found any that are low-cost or free. OneSignal is free. Completely free. It doesn’t matter how small or large you are. I never question a company revenue methods. I was just glad it was free.

I used them for years for cuadros. When the GDPR deadline approached I looked at what kind of data they collected and for what purpose to add it to the consent dialog. And then I realized that the reason that it is free, is because they collect data to sell. As with most of these privacy policies, they amount to a bunch of maybe will collect this data or that data statements.  I didn’t feel comfortable adding all that information to the consent dialog and I didn’t think anybody would consent to the random list of possible data elements.

Fast forward to a few weeks ago. The Corona plugin is a native plugin meaning that OneSignal wrapped up their iOS and Android plugin in a Lua facade. The Corona plugin has not been updated in a while which resulted in a nasty bug when building for Oreo (probably Pie also).

Since it appeared that it was not going to be fixed in a reasonable timeframe I decided to use their REST API to create a fully Lua solution. I also figured that I could limit or at least know exactly what data I would be sending and this would make the process of being GDPR compliant easier.

Last week was a long weekend, and I didn’t have any day work spill over to the weekend. So I took the opportunity to write it. I am excited that I’ll be able to inform users of new features and other random things. Don’t worry, I know less is more when we talk about push notification.

on the shoulders of giants

After working for two years on a C++ gaming platform the company that provided the tools stopped supporting the engine. It was time to look for another engine. I was amazed at how many options were available.

I had a few simple asks: I wanted to keep using the same programming language. I didn’t want to spend time learning a new language when I could spend that time working on games. I wanted the company to have an active community where if a problem came up other people would be able to help. I wanted ready available and easy to integrate libraries for everything I could possibly need. I wanted to be able to build in the cloud on somebody else’s servers.

The last two parts were my most important ask because I was extremely tired of supporting plugins (my previous engine) and dealing with the minutia of maintaining build configurations.

To evaluate the game engines I decided that I was going to use my next project as a measuring stick. So about 2 years ago, I decided I was going to create a casual puzzle game (the type of games I play). Since I didn’t know any of these engines, I was looking for a well-crafted puzzle template.

I wanted a mostly made backend system that I could configure and maybe write a few scripts. I didn’t want to code this from scratch and then maintain it.

I wanted a monetization plugin that was maintained by the company. And once the app grew, I wanted some sort of mediation plugin. I didn’t want to roll my own mediation with a bunch of if/then clauses.

I wanted a way to track installs and a few events.

In general, I didn’t want to start on the ground floor. I wanted to start on the shoulders of the biggest giant that I could find. Corona was and is that giant.

I was and I am still amazed that Corona had in most cases more than one option for whatever need I can think of. Corona has more than a dozen ad providers and at least a few providers of surveys. Corona has at least 5 options for analytics. Corona has at least 3 options for backend system.

As far as a community, Corona forums are always filled with people willing to help.

And yes I know that Corona isn’t C++, but Lua was so easy to pick-up. And yes you don’t have to point out that I did not come up with the term “shoulder of giants”. It was first written to my knowledge by Sir Newton.

The result of my efforts almost 2 years ago is cuadros. It has almost 50K installs as of this writing and about 800 unique users a day. I am using the Admob Corona plugin for banners and interstitials ads. For rewarded ads, I use NextApp, Ironsource and hopefully Vungle soon. I am using Gamespark as a backend. I have used Tenjin and Flurry to track installs and events. I use one signal to send notification on all three platforms. For all these plugins, I don’t have to install or copy or add dependencies. Everything is done for me. Because I am not a build engineer or a server admin or a desktop configurator. I am a game developer.