From emasoft-complete-ios-app-authoring
App Store Optimization (ASO) for iOS App Store and Google Play — keyword research and placement, metadata writing within exact character limits, screenshot/icon/preview conversion, review tactics, competitor intelligence, localization, A/B testing, and store-policy compliance, with App Store Connect API (asc CLI) and iTunes Search API recipes. Use when asked to improve app discoverability, rank for keywords, optimize a title / subtitle / keywords field, audit a listing, or raise install conversion. Triggers: "ASO", "keyword research", "rank in the app store", "optimize my app listing", "app store keywords", "screenshot conversion", "increase installs", "will this get rejected".
How this skill is triggered — by the user, by Claude, or both
Slash command
/emasoft-complete-ios-app-authoring:app-store-optimizationThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
ASO is search-engine + conversion-rate optimization for app stores. Two
references/app-store-connect-cli.mdreferences/category-playbooks.mdreferences/competitor-intelligence.mdreferences/conversion-and-visuals.mdreferences/keyword-research.mdreferences/localization-aso.mdreferences/metadata-specs.mdreferences/quality-gates.mdreferences/screenshot-rendering.mdreferences/store-policies.mdscripts/aso_audit.pyscripts/google_signals.pyscripts/itunes_search_check.pyASO is search-engine + conversion-rate optimization for app stores. Two levers move installs:
Optimizing the wrong field wastes effort. The single most important fact in all of ASO: on iOS the description is NOT indexed. Never put keyword work there — it does nothing for ranking. (On Google Play the full description is indexed; see below.) This asymmetry drives almost every platform-specific rule.
This skill works in two modes:
These are absolute. Never recommend a change that breaks one.
couple in the subtitle AND
in the keywords field = one word's worth of budget thrown away.)face, dating, generator, avatar, ring) are owned by giants
with millions of ratings. A vertical app gets zero impressions for them
and burns the characters. Go long-tail and specific.vintage, retro, romantic)
have near-zero local search volume. Use native search terms instead
(table in references/localization-aso.md).When one model both researches and decides ASO, its own prior conclusions / session memory / "regional flavor" intuitions are the dominant pollution source — it fabricates plausible-but-wrong keywords. Countermeasures:
ASO_*.md / *Market_Research*.md / .aso/ files out of reach first);
let the orchestrating model only do mechanical execution + data passing.untested after a throttle) must be validated
before shipping — never extrapolated. Real failure: a model invented
boho/winter/cottage/maple for en-AU/en-CA; iTunes testing showed all
were function-mismatches.| Field | Limit | Indexed? | Update needs review? | Use for |
|---|---|---|---|---|
| App Name | 30 | YES — highest weight | Yes | Brand + #1 keyword |
| Subtitle | 30 | YES — high weight | Yes | #2–#3 keywords / benefit |
| Keywords field | 100 | YES — medium weight | Yes | All remaining unique terms, comma-separated, no spaces |
| Description | 4,000 | NO | Yes | Conversion copy only |
| Promotional Text | 170 | NO | No — instant | Seasonal / limited-time messaging |
| What's New | 4,000 | NO | Per-version | Update notes |
| IAP display names | — | YES — low weight | Per-IAP | Bonus keyword coverage |
Limits count Unicode codepoints, not bytes — one CJK character = 1, one
emoji can be 1–2. Keyword field format: kw1,kw2,kw3 — no space after
commas (each space wastes a character).
| Field | Limit | Indexed? | Use for |
|---|---|---|---|
| Title | 30 | YES — highest weight | Brand + primary keyword (natural language) |
| Short Description | 80 | YES — medium-high | Secondary keyword + benefit |
| Full Description | 4,000 | YES — high weight | Primary keyword in 1st sentence, 2–3% density |
| Developer Name | — | YES — low | Branding |
| What's New | 500 | NO | Update notes (shorter than iOS) |
Google uses NLP/semantic matching and penalizes unnatural keyword stuffing. Additional Play ranking signals grep can't see in the listing: user-review text (indexed), backlinks to the Play page, and Android Vitals (ANR <0.47%, crash rate <1.09%) — poor vitals directly reduce visibility.
Full field specs, indexing nuances, and per-device visual sizes live in references/metadata-specs.md.
When no app ID is given, detect the project first. Look for, in priority order:
| Source | Detects | Files |
|---|---|---|
| Fastlane iOS | per-locale name, subtitle, keywords, description | fastlane/metadata/<locale>/{name,subtitle,keywords,description,promotional_text}.txt |
| Fastlane Android | per-locale title, short/full description | fastlane/metadata/android/<locale>/{title,short_description,full_description}.txt |
| Xcode | bundle ID, app name | *.xcodeproj/project.pbxproj, Info.plist |
| Gradle | application ID, app name | app/build.gradle, AndroidManifest.xml, res/values/strings.xml |
Fastlane metadata is richest (all fields available). Xcode/Gradle give only identifiers — extract the app ID and optionally fetch the live listing.
For iOS shops using App Store Connect directly (no Fastlane), pull current
metadata with the asc CLI — see references/app-store-connect-cli.md.
When asked to audit a listing (/aso audit <app-id> or a local project),
run this pipeline:
Fetch / detect the listing data → structured per-locale metadata.
Classify category (gaming, SaaS/productivity, health/fitness, e-commerce, social, fintech, …) to load the right benchmarks and templates from references/category-playbooks.md.
Run mechanical checks (these are free and deterministic — see the audit logic in references/keyword-research.md):
Run analytical passes — keyword coverage, metadata quality, visual assets, reviews/ratings, competitor gap, conversion signals, technical health, localization. For a big listing these are independent and can be dispatched as parallel sub-agents (one per dimension), each returning a scored sub-report.
Score a weighted ASO Health Score (0–100):
| Dimension | Weight |
|---|---|
| Keyword optimization | 20% |
| Metadata quality | 20% |
| Visual assets | 15% |
| Reviews & ratings | 15% |
| Competitive position | 10% |
| Technical health | 10% |
| Conversion signals | 10% |
Generate two outputs:
You do NOT need a paid tool (AppTweak / Sensor Tower) to do real keyword research. The free, current stack:
iTunes Search API (public, no key) — returns the real top-ranked apps for any term in any storefront. This is how you detect the "category-match ≠ function-match" trap (golden rule #5): look at what the top 5 apps for a candidate keyword actually do, and compare to your app's function.
curl -s "https://itunes.apple.com/search?term=<KEYWORD>&country=us&entity=software&limit=5" \
| python3 -c "import json,sys;[print(a['trackName'],'—',a.get('primaryGenreName')) for a in json.load(sys.stdin)['results']]"
Apple Search Suggestions — Apple's own autocomplete (the strongest
App-Store demand signal): search.itunes.apple.com/.../hints?clientApplication=Software&term=<partial>
(see references/competitor-intelligence.md).
Google Suggest — keyless cross-platform corroboration:
https://suggestqueries.google.com/complete/search?client=firefox&q=<term>&hl=<lang>&gl=<country>
— data[1] is the completions list; completion-count is the reliable proxy
(Google Trends/pytrends is reliably 429-throttled — best-effort only).
App Store Connect Analytics — your own actual traffic-driving search terms (the ground truth for what's already working).
Throttle caveat: the iTunes Search API trips 403/429 under parallel load (N sub-agents from one IP). When throttled, mark a candidate
untestedand validate later — never extrapolate or invent regional words.
Apple Search Ads (ASA) API does NOT expose a public keyword-popularity /
search-volume endpoint (verified 2026; the searchPopularity field only
exists inside ASA Custom Reports, whose GET has returned 403 since
2026-03-16 as Apple migrates to the Insights API). Do not promise users a
volume number from the ASA API — use the free signals above instead, and if
they run ASA campaigns, the in-console Search Match / keyword recommendations
are the practical popularity proxy.
Full keyword methodology — the three-layer candidate gate, the
function-mismatch procedure, the Opportunity Score ranking, the runnable
mechanical audit (scripts/aso_audit.py), script-aware tokenization, and
the monopoly/giant word lists — is in references/keyword-research.md. Deeper
competitor/review research (reviews RSS, ratings histogram, Apple Suggest) is in
references/competitor-intelligence.md.
Conversion benchmarks (2025–2026): iOS ~25%, Google Play ~27% average, but category variance is huge (10–115%+). Audit the first impression — everything a user sees before scrolling or tapping "more":
Score conversion 0–100 weighting: first-3-screenshots 25%, title clarity 20%, rating strength 20%, social proof 15%, subtitle/short-desc 10%, icon appeal 10%. Psychology levers to evaluate: social proof, authority (awards, Editor's Choice), specificity (concrete numbers beat vague claims), benefit framing (outcomes, not features). Detailed scoring rubric, screenshot narrative arc, and icon rules: references/conversion-and-visuals.md.
iOS Product Page Optimization tests visuals only (icon, screenshots, preview video — NOT title/subtitle/keywords/description), max 3 treatments + original, 7–90 days. Google Play Store Listing Experiments also test text (short/full description), up to 5 localized + 1 main, 7-day minimum. Change ONE element per test, make it meaningful, aim for ~1,000+ views/variant and ≥90% confidence; primary metric is install conversion rate; test screenshots first, then icon. Full table, hypothesis template, and roadmap: references/conversion-and-visuals.md.
Don't localize every storefront — prioritize by iOS penetration and spend. Per-locale keyword research, not translation — translating your en-US keywords gives words nobody searches. Exploit the cross-indexed locale matrix (e.g. a US storefront also indexes several other locales' keyword fields) to pack overflow terms for free. Watch for transliteration traps and cultural fit. Market tiers, the cross-index matrix, transliteration tables across 8+ languages, and ASC-unsupported locales: references/localization-aso.md.
Run a policy pass on any metadata you recommend, both your current values and proposed changes. The high-frequency rejection causes:
#1, best, top, free, new,
sale, download now, install now, etc. No emojis, no ALL CAPS.Full policy matrix with guideline references and the complete banned-words list: references/store-policies.md.
Scope note: this skill covers discoverability and conversion metadata, including screenshot framing/rendering (references/screenshot-rendering.md — chrome decision, bezel install, aspect-ratio crop, captions, the scaffold→AI-enhance pipeline). For the binary submission, build upload, and the full pre-submission review checklist, see the companion
app-review-preflightskill — don't duplicate that work here.
asc CLI)To push optimized metadata to a live iOS listing, use the asc CLI. The two
gotchas that silently fail:
asc raw PATCH
with a JSON body file — passing \n through shell args returns HTTP 200
but stores empty content.raw DELETE it.Pull → edit → push → re-audit recipes, plus the exact localizations update, metadata pull/push, screenshot upload, and resource-ID lookup
commands: references/app-store-connect-cli.md.
Name: "Snap — AI Couple Photos" (24/30)).| File | Contents |
|---|---|
| references/metadata-specs.md | Full iOS + Android field specs, indexing rules, visual-asset sizes per device |
| references/keyword-research.md | Seed expansion, intent, the function-mismatch detection method, mechanical audit checks, giant/monopoly word lists |
| references/quality-gates.md | Hard thresholds, Critical→Low severity mapping, density bands, scoring labels |
| references/localization-aso.md | Market tiers, cross-indexed locale matrix, transliteration + face-swap tables, full 39-locale set, ASC-unsupported locales |
| references/store-policies.md | Apple + Google policy matrix with guideline refs, banned-words list, category-specific gates |
| references/category-playbooks.md | Per-category keyword themes, benchmarks, 4-phase roadmap, launch checklist, seasonal calendar, In-App Events + Custom Product Pages, review/rating-prompt tactics |
| references/conversion-and-visuals.md | Conversion scoring, screenshot narrative, icon rules, A/B test design, launch-velocity tactics |
| references/screenshot-rendering.md | How to render/frame screenshots: chrome decision, bezel install, aspect-ratio crop, file prep, panoramic, captions/fonts, scaffold→AI-enhance, source-capture QA |
| references/competitor-intelligence.md | Off-device iTunes/App Store API toolkit: reviews RSS, ratings histogram, Apple Suggest, chart feeds, bundle/developer lookup, storefront/genre IDs |
| references/app-store-connect-cli.md | asc CLI pull/push recipes + env-var auth / auth doctor / capabilities, raw PATCH for multi-line fields, screenshot upload, pre/post-write verify |
scripts/aso_audit.py | Runnable mechanical audit (budget, cross-field stem, CJK substring, cross-locale dup, traps, format); offline JSON or live asc; exits non-zero on ERROR |
scripts/itunes_search_check.py | iTunes Search competition check — result-count bands + top-5 + aggregate ratings |
scripts/google_signals.py | Google Suggest (+ best-effort Trends) demand corroboration |
npx claudepluginhub emasoft/emasoft-complete-ios-app-authoring --plugin emasoft-complete-ios-app-authoringBlocks Edit/Write/Bash actions until Claude investigates importers, data schemas, and user instructions. Improves output quality by forcing concrete facts before edits.