A month ago, almost nobody in the US or Europe could see my clay shooting app on the App Store: 97% of its impressions came from Russia, Kazakhstan and random countries. Today two thirds of impressions come from the US and Europe, and daily impressions are up 5×. And my Mac app went from #130 to #9 for "eye strain" in the UK store.
Here is how I approach ASO as a solo developer, what I actually changed, what moved, what didn't, and what's next. Two live examples: Clay Sniper (iPhone + Apple Watch, a log for trap, skeet and sporting clays) and SafeYourEye (Mac, eye breaks and self-check vision tests).
About the numbers. All volume metrics below (impressions, page views, installs, ratings) are multiplied by the same constant. I don't publish real values, but proportions and dynamics are exact. Search rankings are real: a position says nothing about money. Revenue, subscriptions and ad budget are not shown at all.
What ASO is made of
ASO has two halves, and the order matters:
- Being found — search ranking.
- Being chosen — conversion from impression to page view to install.
Improving conversion is pointless while nobody sees the product page.
Search on the App Store is driven by a few fields:
- Name — 30 characters, the heaviest weight.
- Subtitle — 30 characters, second by weight.
- Keywords — 100 characters, comma-separated, invisible to users.
- Localizations — each language has its own set of these three fields. And each storefront also indexes several other locales: the US store reads es-MX, ru, zh-Hans, fr-FR and more on top of en-US. That's cross-localization: free extra keyword space.
Conversion is driven by screenshots, the App Preview video, ratings and Custom Product Pages (alternative versions of your page for different queries and ad groups). Promotional text (170 characters above the description) can be changed without review — leaving it empty means wasting a free lever.
The process: seven steps
| # | Step | What I do | Why |
|---|---|---|---|
| 1 | Baseline | Impressions, page views, installs by source and country (asc analytics); rankings for 20–40 queries per target country |
Without a "before", there's no proof. Apple keeps daily analytics for ~9 days, so I collect it weekly |
| 2 | Pick markets | Decide where the app should grow and where to leave it as is | Keywords, locales and screenshots target specific storefronts |
| 3 | Build the semantic core | App Store search suggestions, iTunes Search API results, competitor metadata, terms from the app's own code | Without paid tools you can't measure query volume, so I look at competition: how many apps rank and how relevant they are |
| 4 | Duplicate audit | Overlap between name, subtitle and keywords | A word repeated in keywords is wasted characters. In SafeYourEye, duplicates ate a third of the field |
| 5 | Spread across locales | Own name, subtitle, keywords per storefront language, plus a second keyword pool via cross-localization | Without its own locale, a storefront shows the default language — sometimes Russian |
| 6 | Ship and amplify |
asc metadata push with the release, promotional text right away, Custom Product Pages for key queries |
Metadata lives in the repo, so every change is a diff |
| 7 | Measure in 1–2 weeks | Repeat step 1, compare per country and per query | Indexing takes days; looking earlier means reading noise |
All of this is wrapped into a Claude Code skill and a dashboard: one weekly command pulls App Store analytics for all my apps, rankings across target storefronts and a metadata snapshot with change history, through the official App Store Connect API.
Starting point: nobody saw the page
Clay sports live mostly in the US and Europe. In mid-September Clay Sniper looked like this:
- 72% of impressions from Russia and Kazakhstan, a quarter from random countries, 3% from the US and Europe.
- Three locales: ru, en-US, de-DE. The primary language was Russian, so France and Italy saw the Russian page.
- Not in the US top 100 for "trap shooting", "sporting clays", "skeet".
- Zero Custom Product Pages, empty promotional text, no review prompt in the code.
The diagnosis in one line: no sales not because the page fails to convince, but because almost nobody sees it. The funnel wasn't leaking — it was tiny at the top. So: reach first, conversion second, paid traffic third.
What I changed
| Date | Version | Change |
|---|---|---|
| Aug 23 | 1.1.0 | Keywords rewritten around disciplines: "double, compact, fitasc, 5stand, scorecard" instead of generic "shooting, range, gun, hunting". First promotional text |
| Sep 21 | 1.2.0 | German locale |
| Sep 26 | 1.3.0 | French locale: "ball-trap", "carnet de tir", "compak" |
| Oct 1 | 1.4.1 | en-GB with British terms ("DTL", "clay pigeon", "cartridges"), Italian. en-US keywords cleaned of words already in the subtitle |
| Oct 6 | — | Apple Ads pilot in the US: competitor and niche queries, exact match |
| Oct 7 | 1.4.2 | es-ES and es-MX (a second keyword pool for the US). 8 locales total |
| Oct 8 | — | Apple approved 12 Custom Product Pages (trap, skeet, sporting, Apple Watch, stats…) in under a day |
| Oct 11 | — | All 12 Custom Product Pages got versions in six more storefront languages, with their own keywords and screenshots |
Both apps also got a system review prompt after a good moment (in Clay Sniper — a finished session). Ratings doubled over the period, average 5.0.
For SafeYourEye the audit found two problems: a third of the keyword field duplicated the name, and the app's real differentiator — vision self-checks on a Mac (acuity, contrast, astigmatism, Amsler grid) — wasn't searchable at all. For queries like "visual acuity" and "amsler grid", there are only 12–24 apps in results, almost none about Mac vision checks; for "Sehtest" in Germany we're the only one. New name: "SafeYourEye: Eye Strain Timer", subtitle "20-20-20 Break & Vision Test", plus en-GB, fr-FR and it.
Dynamics
Clay Sniper, daily averages by week (volumes scaled):
| Week | Impressions/day | Page views/day | Impression → page | New installs/day | US + Europe share |
|---|---|---|---|---|---|
| Sep 16–20 | 1,020 | 80 | 7.8% | 0 | 3% |
| Sep 21–27 | 1,193 | 71 | 6.0% | 7 | 25% |
| Sep 28 – Oct 4 | 1,246 | 286 | 22.9% | 21 | 30% |
| Oct 5–7 | 992 | 83 | 8.4% | 0 | 36% |
| Oct 8–10 | 4,867 | 192 | 3.9% | 8 | 68% |
- Geography flipped. The main result: target markets went from 3% to 68% of impressions. Locales started working.
- Installs appeared. Zero new installs in the week of Sep 16–20, every week since Sep 21.
- The late-September spike was a one-off. It matched the 1.4.0/1.4.1 releases, but conversion returned to 8% a week later. At these volumes I can't separate the metadata effect from noise, so I don't try.
- A jump from October 8. Daily impressions grew 5×, almost all of it from the US and the UK. That same day Apple approved the 12 Custom Product Pages and my Apple Ads groups were switched to them. How much is ads vs. organic, the Apple Ads report will tell — next time. Page-view conversion dropped to 3.9%: the new audience sees the app but doesn't open it yet.
- Apple backfills data. The first pull showed October 8 as almost empty; the next one showed it as the peak of the week. Don't draw conclusions from the last 2–3 days.
SafeYourEye gets fewer impressions (Mac App Store search is smaller): 105–185 a day, and zero new installs in a month. People find the page and don't open it. That's a conversion problem now, not a search one.
Rankings, before and after
Positions via iTunes Search API (close to the real App Store, not identical). "—" means not in the top 200. Before: Sep 23–27; after: Oct 9 for SafeYourEye, Oct 12 for Clay Sniper.
| App | Country | Query | Before | After |
|---|---|---|---|---|
| SafeYourEye | UK | eye strain | 130 | 9 |
| SafeYourEye | Germany | eye strain | 83 | 13 |
| SafeYourEye | US | eye strain | 170 | 39 |
| SafeYourEye | Germany | eye health | 126 | 54 |
| SafeYourEye | France / Italy | pause yeux / pausa occhi | no locale | 7 / 5 |
| SafeYourEye | US | 20-20-20 rule | 11 | — |
| SafeYourEye | US | eye care timer | 39 | 100 |
| Clay Sniper | US | clay shooting | — | 29 |
| Clay Sniper | Germany | Tontaubenschießen | — | 8 |
| Clay Sniper | France | ball trap | — | 106 |
| Clay Sniper | UK | clay pigeon | — | 45 |
| Clay Sniper | Germany | Wurfscheiben | 4 | 5 |
| Clay Sniper | US | trap shooting / sporting clays | — | 125 / 108 |
There are wins and losses here, and that's the honest price of a decision. Swapping "Eye Care Timer" for "Eye Strain Timer" in the name lifted the broad query in three countries and dropped the narrow ones. The broad query brings more impressions, so it's a good trade — but if you only look at winners, ASO looks like pure growth.
Clay Sniper's head terms in the US, "trap shooting" and "sporting clays", have only just entered the top 200: niche leaders like HotClays sit there, and those words are only in my subtitle. "Clay shooting" holds in the 20s, but it jumps day to day (35th, 18th, 29th within four days), so I trust weekly trends, not single measurements. In the new locales "shooting log" (UK), "Wurftaube" (Germany) and "strozzatore" (Italy) landed in the top 5 right away.
What I learned
- Locales beat keyword polishing. The biggest shift came not from tuning 100 characters but from the page speaking the storefront's language.
- Custom Product Pages only accept words from the keywords field. Words from the name and subtitle can't be assigned. My two main pages, trap and skeet, ended up with zero US keywords. Plan your field split with future pages in mind.
- Impressions and installs are different problems. SafeYourEye climbed in search and got zero installs. Search brings people to the page; the page has to do the convincing.
- Finish metadata before submitting for review. While a version is waiting for review, you can't add a new locale. I once had to withdraw a submission to add languages.
- No baseline, no proof. Apple keeps daily analytics for about nine days. If you don't collect regularly, a month later there's nothing to compare against.
What's next
Clay Sniper has a 90-day plan until December 22. The locale goal (7) is already exceeded with 8. The rest:
- Keywords for Custom Product Pages — reshuffle words between fields so trap and skeet pages get their own queries.
- A storefront for Western markets — demo data in US/UK screenshots still shows Russian clubs and ammo; reshoot it and add an App Preview to the main page with the next version.
- Community — emails to federations and clubs in the US, UK, France and Italy with free access via offer codes, each link with its own campaign token.
- Apple Ads — US pilot first, then the UK; money decisions only on numbers.
- SafeYourEye — fix conversion: first two screenshots, promotional text, video.
- The rest of my apps — two of them still rank nowhere, even for their own name. They're next.
The goal by year-end: 3× daily impressions vs. the start and 5× more ratings than today. I'll report back in a month.
Originally published at klukyanov.ru.
Shorter weekly write-ups (in Russian) — on Telegram.
Top comments (0)
Some comments may only be visible to logged-in visitors. Sign in to view all comments.