Skip to main content
Back to blogCopy Markdown
·9 min read
·indieiosapp storeproductlaunch

App Store Discovery: Why My Indie iOS App Has Three Users

Rydger is live on the App Store with three users. Apple's search makes new indie apps invisible until you bring your own traffic. The cold start and my move. →

Óscar Gallego

Software engineer · Málaga

A solo developer's iPhone showing a live App Store page next to an install dashboard reading three
On this page

The email from Apple landed on a Sunday. “Your submission has been approved,” the review complete, “eligible for distribution.” Submission ID, timestamp, the polite corporate tone of a machine that just decided your work could exist on a phone.

Rydger’s live on the App Store. Three people have installed it. One’s me. One’s a friend I badgered into it. The third’s a stranger I’ve never met, who found it through some search query or link I can’t trace yet, and downloaded it without me asking. That third install’s the only data point that matters, and it’s a sample of one.

Every indie launch post wants to write “early traction is promising” or “users are responding well.” Every one you’ve read that phrased it that way was hiding a small number too. Three users isn’t a verdict on Rydger. It’s what zero marketing looks like on the App Store. The thing nobody tells you before you ship is that the App Store, by design, makes new indie apps invisible until you either pay Apple or bring your own audience. This post is the first channel I control.

The App Store is a black box that pretends you don’t exist

Here’s the part I didn’t get until I had a live app and a dashboard reading “3.”

Apple’s search and discovery aren’t a level playing field. They reward apps that already have downloads, ratings, retention, momentum. A new app with none of those is, for practical purposes, unfindable through organic search. You rank for your own brand name once someone looks for it specifically. You don’t rank for “motorcycle maintenance” or “car service tracker” or any of the queries your future users actually type, because the algorithm has no signal to rank you on yet. Cold start.

This is the documented shape of every app-store ranking algorithm, and indie iOS devs have written about it for years. The apps that appear are the ones already appearing. The ones that don’t stay invisible, and invisibility reads exactly like “nobody wants this,” when the truer read is “nobody can find this yet.”

Apple sells you one escape hatch: Apple Search Ads. You bid on the keywords you wish you ranked for organically, pay per tap, and buy your way into the ranking signal the algorithm wants. It can move the number. It’s also a treadmill: the moment you stop paying, you risk sliding back into the invisibility you started in, because you were renting the signal, not earning it.

Why I’m not paying Apple to fix this yet

I could turn on a small Search Ads budget tomorrow and watch the install number tick up. I’m not going to, and the reason isn’t principle. It’s sequencing.

Rydger has no investors and no burn rate. I’ve got a day job, this is a side project, and the clock I’m racing is my own patience, not a runway. That’s a strategic advantage most indie apps don’t have, and spending it on paid installs before I have organic signal would burn the one edge I’ve got. Paying for traffic to a product I haven’t proven retains is buying churn. The math doesn’t care that it’d feel good to watch the number move.

So the order runs the other way. Build the audience on channels I control, this blog being the first, before I need the App Store’s algorithm to do my distribution. Then, if the data says paid acquisition pays back, turn it on. Not before.

There’s a lever I’m working that sits between “do nothing” and “pay Apple,” and it’s the one a senior indie dev asked about two seconds into reading the draft: ASO, App Store Optimization. Keyword-field density, title and subtitle keyword allocation, screenshot and icon conversion tests, product-page experiments. ASO is the cheapest move that actually shifts organic ranking, and I’m treating it as the first real acquisition work, ahead of any paid tap. It doesn’t cost ad spend. It costs attention to the listing.

What Rydger is today: free manual, paid passive

Quick context, because the rest only makes sense if you know what shipped.

Rydger’s a maintenance and cost-of-ownership app for motorcycles and cars. You photograph your dashboard, it reads the kilometre reading, it reminds you when the chain’s due or the ITV expires, and it tracks what the vehicle actually costs you per kilometre. The free tier covers one vehicle, photo and manual logging, reminders, expenses, and CSV export. The wedge, the reason I started building it, is passive mileage tracking, and it’s shipped: a Shortcuts automation on your car’s Bluetooth or CarPlay connection starts a background-GPS ride, and the ledger fills itself instead of you typing every fill-up by hand. That part’s Pro, paid, and labelled Beta while I confirm it survives real riders.

The honest part: the wedge shipped, but the activation gap is real

I have to criticize the thing I just shipped. The conflict of interest is obvious: this is my app, I benefit from the click, and every claim here is load-bearing because of that.

The passive engine is live, and it works on my devices. But it shipped as a Beta behind a Shortcuts setup most riders won’t finish without hand-holding. The user has to author a Personal Automation on their CarPlay or Bluetooth-Device trigger, point it at Rydger’s Start Ride intent, and grant Always-on location. That’s three steps a stranger has to complete before the wedge they paid for does anything. Apple gives apps no programmatic API to create or query a user’s Personal Automations, so I can’t pre-wire it; the setup friction is the ceiling iOS allows, and I live inside it.

The honest risk isn’t “does the product exist.” It exists. The risk is the gap between “feature shipped” and “feature works for a stranger who paid for it and opened the app twice.” Three users can’t tell me which side of that gap I’m on. Fifty might.

There’s a second honest snag. The original passive mechanism, in-app BLE beacon scanning, failed under iOS suspension: iOS coalesces background BLE discovery into a single callback, so rides either ran forever or ended mid-drive. I retired that path and pivoted to the Shortcuts and App-Intents mechanism that’s shipping now. That pivot is why the Beta label is earned. The throwaway spike I built first proved a paired signal could survive a commute. The mechanism that actually shipped is different, and younger.

The move: build the channel before you need it

If you’re about to ship a solo app, or you already have and the dashboard reads a number you don’t want to talk about, here’s what I’d do, ranked cheapest first. Each row maps what you’re seeing to the next move, not the reassurance.

What you’re seeingThe move
Live for weeks, installs in single digitsYou’re invisible, which is the default state. Pick one channel you control and write something honest there this week.
Listing converts poorly (impressions but no installs)ASO pass. Rewrite title, subtitle, and keyword field against the queries your users actually type. Free, ships in an afternoon.
ASO done, still invisibleOne owned-channel post (blog, newsletter, subreddit). Test whether the audience you already have is the right one.
Owned channel brings strangers, they don’t retainThe product’s the problem, not discovery. Fix retention before spending on ads.
Retention’s real, ready to scaleNow Apple Search Ads makes sense. You’re buying signal for a product that holds onto it.

The one move I’d make first, if I had to start over: write down the single technical question that can kill the business, prototype only that, throw the code away, and decide whether to proceed before you build the product. Everything else is downstream of that answer. The channel comes second.

Channel one: letting this blog move the number

This post is channel one. The experiment’s simple: I write what shipping Rydger actually looks like, the people who read this blog decide whether to click through, and the dashboard tells me within a week whether the channel works.

If one reader here installs the free tier and logs a real expense, I learn something the dashboard can’t tell me: that the audience I already have, small as it is, is the right audience. If nobody clicks, I learn that too, and I try the next channel instead of paying Apple to paper over a distribution problem.

I’m not in a hurry. Rydger has no runway, the passive engine’s shipped as Beta and I’m watching whether real riders finish the Shortcuts setup, and I’d rather have fifty riders who found it through something I wrote than five hundred who forgot they installed it. The next post in this thread is one of two things: either the Beta held up across real devices and the Pro conversion is real, or the activation gap bit me and I’m writing about what I changed. I don’t know which yet.

If you ride a motorcycle or drive a car, Rydger’s on the App Store. The free tier works today; the passive engine is Pro if you want it. Rydger on the App Store.

Sources

  • The “app-store ranking rewards existing momentum” pattern is the documented shape of every ranking-algorithm store; indie iOS devs have written about the cold-start discovery problem for years. I’m leaning on that shared experience rather than a single citation.
  • The Apple Search Ads mechanics (bidding on keywords, paying per tap) come from Apple’s ads documentation; the “treadmill” framing is my own read, not Apple’s claim.
  • The three-user count is the actual App Store Connect figure at the time of writing.

Related reading: the data-model half of this story is already on the blog. I wrote about what CloudKit and SwiftData cost my schema, and the boundary check worth stealing.

Case study: the Rydger case study gathers the decisions and what went wrong in the app.


P.S. Shipped something solo and watching a dashboard you don’t want to talk about? I want to hear what your real number is, what channel you’re trying, and whether it worked. Find me on LinkedIn.

Share this article