Update (and this will be a long one):
The earnings increased around 10-20% because I pushed a big update for one of my best apps. Basically improved the paywall and onboarding experience. Things like changing the word from "Purchase" to "Get Started" really helps.
Also, I don't know why or how, but one of my apps suddenly, out of nowhere got into the top charts in Ukraine. Never advertised there, nothing at all. Suddenly I saw a huge spike in downloads and purchases.
Earnings:
Admob: $4100
IAP: $15320
also there are other income streams from Adnetworks such as Appodeal, Applovin, Unity and also Meta Ads. Primarily I am using Admob tho.
Total: Around $19600-19800
Expenses:
Paid Ads: $2100
- Apple Search Ads Basic: $1000
- Apple Search Ads Advanced: $600
- Google Ads: $500
Other expenses:
- API: $550
- Upwork: $70
So the breakdown is: $16980
Why Upwork? I hired two guys to make screenshots for one of my apps. I let them both create screenshots and then make an A/B test on which one converts better.
API expenses increased, because somehow someone took control of my API key within 6 hours spent $200. Luckily I have a spending limit on this API key, otherwise it would be much, much higher. I will get into this in more detail below.
In February I tired Apple Search Ads Advanced and found it to be quite expensive. Maybe I didn't optimize it well enough, no idea. I will try more this month.
I also use Apple Search Ads Basic and have put the monthly spending to $500 each for two apps. The costs for Apple Basic are around 30% lower per install than Apple Search Ads Advanced.
However, Apple Search Ads Basic gives almost no insights on where and how they get the users to install the app.
I only used Google Ads a bit in February. On App Store Connect I took a deep dive into analytics and found out the actual numbers of installs I receive from Google Ads is much higher than Google Ads reports.
No kidding, I will have to sit down one entire day to analyze all the data (or let ChatGPT do it) and find a strategy to get a better CPI, and so on.
________________________________________________________
About the API problem, and this is very important:
It is super important you NEVER hardcode your API key into your app. Hackers will simply decompile your app and steal your API key. Don't be a noob, don't do it.
Now you think, I could just store my API key somewhere else (like on a hosting) and retrieve it when the app starts or when I make an API call through my app. This is also a bad idea because these hackers have tools to monitor the network requests (or whatever they do) and they will "catch" your API key whenever you make this network/API request.
Here is what I did and what also fucked me up. My setup was as following:
- Google Secret Manager
- Firebase Functions
- Keychain Manager
- Firebase App Check
So I would put the API key on Google Secret Manager (can be accessed through Google Cloud), then I would use Firebase function to retrieve the Google Secret when my app starts. However, because I use Firebase App Check, ONLY real devices would be able to retrieve the Google Secret (no simulators, no web apps, etc.). Then, it would save the Google Secret(API) to Apple's keychain manager and keep it there.
It was like this:
App Starts -> checks if it is a real device (App Check) -> fetches Google Secret (API key inside) -> saves to Keychain Manager
I thought this was a safe approach...and it worked for a long time and I didn't have any problems, until a few days ago. Either there was a problem with Firebase functions (maybe outdated or leak?) or my setup was bad.
So I changed my setup now. I only make server to server requests to the API and one request in my iOS app to call the initial function. Example:
iOS function -> server function -> inside this server function I call another server function to the Google Secret.
Also, I added rate limiting. A user can only make a specific amounts of requests per minute per IP. Lets see how this will play out.
By the way, I did all of this simply with Claude 3.7.
Keep in mind, you only have to deal with this shit when your app gets a lot of exposure. Means, you only attract these bad people if you already get a lot of organic downloads. The more attention you get, the more you are being targeted. If no one knows your app exists, no one will come after you.
___________________________________________________________
Whats next?
Yesterday and the day before I spent almost all day creating creatives for Meta Ads and Google Ads. I will try out Meta Ads and test the creatives.
Right now, I am about to update most of my apps.
After this, I will create/update my companies websites to include all apps and make it more attractive. The reason why is as following: I will contact various companies like Nvidia, Microsoft, Tencent, Alibaba, and so on, to enroll in their startup program. Of course, I will keep you guys updated on this, and also on the outcome. I am not sure about the outcome tho. All of my apps, and so on are self-funded. I don't have any investors.
If you guys know startup programs, etc. please let me know and I will give it a shot.