I built my own ad engine to advertise my own apps
When KaiOS had no paid ad to show, the slot sat empty. So I filled it with my own apps — turning idle ad space into a download engine.
KaiOS has its own ad system, KaiAds, with its own SDK. The problem: there isn’t always an ad to show. It all depends on the ad network and varies with a bunch of factors.
At the time, that bothered me a little, and I thought:
“Since I’m already adding this slot to my apps to show third-party ads, why not use the idle time to show my own apps as ads?”
And that’s how the AdsEngine was born.
How KaiAds works
The KaiOS engine gives you a handful of methods and callbacks, and through them you can request banner or full-screen ads. The callbacks tell you whether there’s an ad to display and whether it’s already preloaded — which avoids a delay before the image shows up.

The core idea of my engine
Using those callbacks, my engine can detect when there’s no ad available from the KaiOS network — and when there isn’t, show a banner for one of my own apps instead.
The clever part: you can request a new ad from KaiAds roughly every 30 seconds without getting blocked or hitting a too many requests response. So my engine, for obvious reasons ($), always prioritizes ads that actually pay. But when none are available, it shows an ad for one of my other apps — keeping the user inside my ecosystem and pushing more downloads.
There’s a whole layer I built to control, per app, which other apps I want to advertise — plus managing each app’s translated CTA. I did all of that inside my backoffice, where I can configure everything easily. I wrote about that here: the control panel every indie dev needs.

Each app in my backoffice has a JSON that defines the app’s icon URL, plus the title, description, and CTA to show in the banner. When an app starts, an endpoint returns all the apps I want to advertise (the “related apps”), and the app figures out internally which language to display. From there, when the user taps the banner, I send them to a deeplink pointing at the app’s Manifest URL — which opens the KaiOS store right on that app’s page.
Results
Overall the results were great, and they helped push my download numbers up.
On average, 60% of the requests to show a KaiOS ad come back empty. So most of the time the banner is showing one of my own apps. For one of them (Wallpaper Pro), the funnel in March 2024 looked like this:

In unique users, out of 5,808:
- 5,466 saw ads for my own apps
- 3,336 saw KaiOS ads
- 2,218 clicked one of my ads
- 410 clicked a KaiOS ad
It was a really interesting experiment, and the engine I built now runs across all my apps, so each one leverages the others.
One possible downside: when I redirect a user to the store, they might not come back to the app they were using — and I might also miss the chance to serve a paying KaiOS ad. But since KaiOS ads never paid all that much, the way I see it the engine worked very well and did its job: taking advantage of that gap in KaiOS ad coverage to promote my own apps. Of course, if I ever noticed the network ads were paying really well, I could tune the engine — but I don’t think that was ever necessary.
Today my apps add up to more than 1.5 million accumulated downloads, and on just one of the apps where I applied the engine (the one in the chart above), it was responsible — across the whole period so far — for redirecting more than 53,000 clicks to other apps in the store.