101 lines
9.6 KiB
Markdown
101 lines
9.6 KiB
Markdown
---
|
|
name: aso-basics
|
|
description: App store optimization basics for a mobile app's or game's text - App Store keyword field rules (100 characters, commas without spaces, no repeats of name / subtitle words, fill 90%+), subtitle and name, cross-localization keyword room per storefront, screenshot captions with real keywords, Google Play title / short / full description keyword placement without stuffing. Keyword ranks, competitors per keyword, keyword field proposals and one ASO audit from official / public data (iTunes Search API, Apple Ads popularity with the owner's credentials, App Store analytics snapshots). Use when the user writes or improves store listing text, keywords, asks why the app or game is not found in store search, or wants keyword ranks, competitors, keyword ideas or an ASO review.
|
|
---
|
|
|
|
# ASO basics
|
|
|
|
Audit: `storebound check --aso` (offline, over `store/appstore.md` + `store/listing.md`; errors exit 1). Keep claims
|
|
true; never use competitor or other apps' or games' names, "best / #1", or unrelated popular terms (both stores reject it).
|
|
|
|
## App Store
|
|
- **Indexed fields**: app name (30), subtitle (30), keyword field (100). The description is **not** indexed for search.
|
|
- **Keyword field**: comma separated, **no spaces** around commas (they cost characters), singular or plural not both,
|
|
no words already in the name or subtitle (they are indexed anyway), no "app" / "game" / category names, no
|
|
duplicates. Use at least 90 of the 100 characters. Single words combine on their own ("match,puzzle" also finds
|
|
"match puzzle"), so prefer words over phrases.
|
|
- **Name and subtitle**: the strongest words; the name is the brand plus at most one core term, the subtitle is the
|
|
promise in plain words.
|
|
- **Localizations and storefronts**: each storefront supports several localizations (Apple's "App Store localizations"
|
|
table; the US storefront lists English (US), Spanish (Mexico), Portuguese (Brazil), French, Korean, Chinese
|
|
Simplified and Traditional, Arabic, Russian, Vietnamese). Apple states a localization's keywords are searchable in
|
|
every storefront that supports its language. That the keyword fields of several localizations **stack** in one
|
|
storefront (e.g. extra English words in the es-MX field for US search) is community ASO knowledge, not an Apple
|
|
statement: if you use it, the localization must still be a real translation for its own users.
|
|
- **Screenshot captions**: write them with the words people search for ("Budget planner with shared lists", "Match 3 puzzles offline", not "Fun awaits").
|
|
Claims that Apple reads caption text for search ranking are unverified; good captions help conversion either way.
|
|
- Changing keywords needs a new version (submitted with it); promotional text (170) changes any time but is not indexed.
|
|
- **No other platforms (2.3.10)**: no Android, Google Play (Games), Play Store, Galaxy Store, Amazon Appstore, Steam,
|
|
Microsoft Store, AppGallery (and localized forms such as "Google Play Spiele", "安卓") in any App Store field,
|
|
What's New included. Every App Store text write refuses them (store-pitfalls 77).
|
|
|
|
## Google Play
|
|
- **Indexed**: title (30), short description (80), full description (4000). There is no keyword field.
|
|
- Put the core phrase in the title (brand + term), again in the short description, and in the first lines of the full
|
|
description where it reads naturally. Repeat important terms a few times across the full text, not in every line.
|
|
- **No stuffing**: a word in more than ~3 % of the full description, keyword lists, ALL CAPS titles, emoji in the
|
|
title, or "best / top / #1" break the metadata policy. `check --aso` warns on these.
|
|
- Localize every listing you can; Play machine-translates otherwise, which ranks and converts worse.
|
|
- **No Apple platforms (Metadata policy)**: no iOS, iPhone, iPad, App Store, Apple Arcade, Game Center or TestFlight in
|
|
the title, descriptions or release notes; every Play text write refuses them. A real sign-in button name ("Sign in
|
|
with Apple") stays only through the owner's `listing.allowPlatformMentions` entry.
|
|
|
|
## Workflow
|
|
1. List 20-30 candidate terms with the owner: what people would type to find this app (the job it does, the problem it solves; for a game:
|
|
genre, mechanic, theme, setting, mood). No paid tool needed to start; store search suggestions are a free signal.
|
|
2. Put the best 1-2 in name / title and subtitle / short description; the rest in the keyword field per locale.
|
|
3. `storebound check --aso`, fix errors, read warnings.
|
|
4. Push with `apple listing` / `play listing`; measure after a few weeks (App Store Connect / Play Console acquisition
|
|
by search term; `storebound analytics snapshot` + `analytics compare` line impressions and conversion up with
|
|
each committed listing change, store-analytics skill) and change a few terms per release, not all at once.
|
|
5. Track ranks: `storebound aso rank --storefronts us,de=de-DE --dry` lists the queries, then without `--dry` (MCP:
|
|
`aso_rank`, dry_run false). One query per keyword of the locale's keyword field (plus `--keywords`) and storefront
|
|
against Apple's public iTunes Search API, at most one every 3.5 s (Apple allows about 20 calls a minute; a 403 or
|
|
429 stops the run with what was read). The table shows the app's position in the first 200 results, the change
|
|
since the last snapshot (`.storebound/aso/<date>.json`) and the first competitors (title, developer, rating).
|
|
|
|
6. Competitors: `storebound aso competitors --dry`, then without `--dry` (MCP: `aso_competitors`, read-only, saves no
|
|
snapshot). Per keyword (plus `--term`) and storefront the top N apps: name, developer, rating count, first release,
|
|
last update, genre in the storefront's language. Then the words in their names your name / subtitle / keywords do
|
|
not cover; a word only counts when two or more developers use it (one developer's word is most likely a brand).
|
|
Snapshots go to `.storebound/aso/competitors/` and the next run names the apps new in a term's top N.
|
|
7. Keyword ideas: `storebound aso suggest --locale en-US` (MCP: `aso_suggest`, never writes). Candidates come from the
|
|
own name / subtitle / description, the latest competitor snapshot, the category names in that language and, when
|
|
`APPLE_ADS_*` credentials are set (`ads apple status` works), Apple Ads keyword suggestions. For each: relevance
|
|
(in your own text +1, in competitor names +1), competition (top apps with the word in their name, "3/16"),
|
|
popularity (Apple Ads' relative 0-100 score; "unknown" otherwise). Show the owner the proposed field (old -> new,
|
|
characters) and the left-out words with the reason. Only after a yes: `storebound aso suggest --locale en-US --write`
|
|
(terminal); it writes the field with a draft line above it. The owner reviews, deletes the line, runs
|
|
`check --aso`. Never put words in that do not describe the app, other apps' names or brands.
|
|
8. Review: `storebound aso audit` (MCP: `aso_audit`, offline) puts it together: keyword field findings, free keyword
|
|
room in other localizations, rank trend arrows (↑ ↓ → new lost), coverage gaps, Play short description use and word
|
|
density, App Store conversion from `analytics snapshot`, experiment ideas and the next 3 actions. Start there.
|
|
|
|
## Experiments (suggestions only; nothing starts on its own)
|
|
- App Store Product Page Optimization tests the icon, screenshots and app previews only, not the name or subtitle.
|
|
To test a first-screenshot caption: a `shots.variants` entry, `shots render --variant b`, `apple ppo create --variant
|
|
b --dry`, `apple ppo upload --variant b --dry` (store-screenshots skill). Starting a test (`apple ppo start`) is the
|
|
owner's step.
|
|
- A subtitle change ships with a version: change one thing, then compare with `analytics compare`.
|
|
- Google Play store listing experiments (short / full description, icon, feature graphic, screenshots) have no API:
|
|
storebound prepares the text and renders, you set the experiment up in Play Console with your browser tool, and
|
|
the owner presses the button that starts it.
|
|
|
|
## Where the numbers come from (say it to the owner)
|
|
| number | source | is | is not |
|
|
|---|---|---|---|
|
|
| rank | iTunes Search API, first 200 results | the app's position in that API's order today | the App Store search position (no personalisation, ads, in-app events) |
|
|
| competitors, rating count, release dates, genre | iTunes Search API | what the top apps of that term show publicly | their subtitles (no public API has them), downloads or revenue |
|
|
| relevance, competition | own listing + competitor names | how close a word is to your text and how many top apps lead with it | search volume |
|
|
| popularity 0-100 | Apple Ads Platform API keyword suggestions (owner's credentials) | Apple's relative score across the chosen countries | an absolute number of searches; never estimated without Apple Ads |
|
|
| impressions, downloads, conversion | App Store Connect analytics snapshots | real store numbers for the window read | instant feedback: a change needs days on both sides |
|
|
|
|
Google Play has no public search API: there are no Play keyword ranks or Play competitor lists here (that would need
|
|
scraping). Use the Play Console acquisition report (search terms) and `analytics snapshot` for Play.
|
|
|
|
## Rank check limits (say them to the owner)
|
|
- The Search API order is close to, not the same as, App Store search (no personalisation, no Search Ads, no in-app
|
|
event rows). Read ranks as a trend over weeks, not as a promise.
|
|
- Competitor subtitles are not in any public API, so storebound does not show them; it scrapes nothing.
|
|
- Never copy a competitor's name or terms into your keywords (both stores reject it); use the list to see which jobs
|
|
and words the top apps lead with.
|