app-store-aso-localization
npx skills add https://github.com/onatcipli/skills --skill app-store-aso-localization
Agent 安装分布
Skill 文档
App Store ASO & Localization
Optimize your App Store metadata and localize across 38 languages using ASO best practices and the App Store Connect API.
Metadata Field Reference
| Field | Limit | Indexed | Level | Notes |
|---|---|---|---|---|
| App Name | 30 chars | Yes (highest) | App | Brand + primary keyword |
| Subtitle | 30 chars | Yes (medium) | App | USP + secondary keywords |
| Keywords | 100 chars | Yes (iOS only) | Version | Comma-separated, no spaces |
| Promotional Text | 170 chars | No | Version | Can update without review |
| Description | 4,000 chars | No (iOS) | Version | Conversion-focused |
| What’s New | 4,000 chars | No | Version | Release notes |
Important: iOS App Store does NOT index the description for search. Focus keywords in Title â Subtitle â Keywords field only.
API Access
| Tier | Auth | Endpoints | Use Case |
|---|---|---|---|
| Public | None | iTunes Search/Lookup | Competitor research |
| Private | JWT | App Store Connect API | Manage your metadata |
For authentication setup, see api-endpoints.md.
Workflow 1 â Analyze Current Metadata
Audit your app’s metadata for optimization opportunities.
Step 1: Fetch Current Localizations
GET /v1/apps/{appId}/appInfos
GET /v1/appInfos/{appInfoId}/appInfoLocalizations
GET /v1/appStoreVersions/{versionId}/appStoreVersionLocalizations
Step 2: Check Character Usage
For each locale, calculate usage percentage:
fields = {
"name": {"limit": 30, "value": localization.name},
"subtitle": {"limit": 30, "value": localization.subtitle},
"keywords": {"limit": 100, "value": localization.keywords},
"promotionalText": {"limit": 170, "value": localization.promotionalText},
"description": {"limit": 4000, "value": localization.description}
}
for field, data in fields.items():
usage = len(data["value"]) / data["limit"] * 100
if usage < 90:
flag_underutilized(field, usage)
Step 3: Identify Missing Localizations
Compare active localizations against recommended markets:
Priority markets: en-US, en-GB, de-DE, fr-FR, ja, zh-Hans, zh-Hant,
ko, es-ES, es-MX, pt-BR, it, nl, ru, tr, ar
Step 4: Check for ASO Violations
- Duplicate keywords across Title/Subtitle/Keywords
- Stop words in keywords field (“the”, “and”, “app”, “a”, “an”)
- Spaces after commas in keywords
- Keywords repeated across locales (wasteful)
Step 5: Generate Health Report
## Metadata Health Report â {App Name}
### Overview
- Active localizations: 12/38
- Character utilization: 78% average
- ASO violations: 3 found
### Character Usage by Locale
| Locale | Name | Subtitle | Keywords | Status |
|--------|------|----------|----------|--------|
| en-US | 28/30 (93%) | 25/30 (83%) | 98/100 (98%) | Good |
| de-DE | 22/30 (73%) | 18/30 (60%) | 72/100 (72%) | Underutilized |
| ja | 15/30 (50%) | 12/30 (40%) | 45/100 (45%) | Poor |
### Missing High-Value Localizations
- zh-Hans (China) â 2nd largest App Store
- ko (Korea) â High spending market
- pt-BR (Brazil) â Growing market
### ASO Violations Found
1. â Keyword "photo" appears in both Title and Keywords (en-US)
2. â Stop word "app" in keywords field (en-GB)
3. â Space after comma in keywords (de-DE)
### Recommendations
1. Add Chinese (Simplified) localization â potential +15% downloads
2. Expand German keywords to use full 100 characters
3. Remove duplicate keywords to add more unique terms
Workflow 2 â Keyword Research & Optimization
Research and optimize keywords for maximum discoverability.
Step 1: Seed Keyword Collection
Gather initial keywords from:
- Your metadata â Current title, subtitle, keywords
- Competitor metadata â Via iTunes Lookup API
- Review mining â Common words in user reviews
- Category analysis â Top apps in your category
GET https://itunes.apple.com/lookup?id={competitor_id}&country={cc}
Step 2: Keyword Analysis
For each keyword, evaluate:
| Metric | Description | Source |
|---|---|---|
| Search Volume | How often users search this term | ASO tools / estimation |
| Difficulty | Competition level (0-100) | Top 10 app ratings |
| Relevance | How well it describes your app | Manual assessment |
| Current Rank | Your position for this keyword | Track over time |
Step 3: Keyword Scoring
def score_keyword(volume, difficulty, relevance):
"""
Higher score = better keyword opportunity
Volume: 1-100, Difficulty: 1-100, Relevance: 1-10
"""
opportunity = volume * (1 - difficulty/100)
score = opportunity * relevance
return score
Step 4: Generate Optimized Keyword Set
Rules for the 100-character keywords field:
- No duplicates â Words in Title/Subtitle are already indexed
- No spaces â Use commas only:
keyword1,keyword2,keyword3 - No stop words â Remove “the”, “and”, “a”, “an”, “app”
- Single words â Break phrases into individual tokens
- Prioritize â Highest-scoring keywords first
## Optimized Keywords â {App Name} (en-US)
### Title (30 chars)
"PhotoEdit Pro - Picture Editor"
Keywords captured: photoedit, pro, picture, editor
### Subtitle (30 chars)
"Filters, Collage & Retouch"
Keywords captured: filters, collage, retouch
### Keywords Field (100 chars)
"camera,enhance,crop,adjust,brightness,contrast,saturation,blur,sharpen,resize,rotate,frame,effects"
Characters used: 97/100
### Total Unique Keywords: 17
See keyword-strategies.md for advanced techniques.
Workflow 3 â Localize Metadata
Translate and adapt metadata for international markets.
Step 1: Select Target Locales
Prioritize by market opportunity:
| Tier | Locales | Rationale |
|---|---|---|
| Tier 1 | en-US, en-GB, de-DE, ja, zh-Hans | Largest markets |
| Tier 2 | fr-FR, ko, es-ES, pt-BR, it | High growth |
| Tier 3 | nl, ru, tr, ar, zh-Hant, sv | Market expansion |
| Tier 4 | All remaining | Full coverage |
Step 2: Translate Content
For each field, translate while respecting limits:
def translate_field(text, source_lang, target_lang, char_limit):
"""
Translate text and ensure it fits within character limit.
"""
translated = ai_translate(text, source_lang, target_lang)
if len(translated) > char_limit:
# Shorten while preserving meaning
translated = ai_shorten(translated, char_limit)
return translated
Step 3: Localize Keywords (Don’t Just Translate!)
Keywords require localization, not just translation:
Example: "photo editor" app
â Wrong (direct translation):
- German: "fotobearbeitung" (literal translation)
â
Right (localized):
- German: "bildbearbeitung,fotos,bilder,bearbeiten,filter"
(terms Germans actually search for)
Research local search behavior:
- Check competitor keywords in that locale
- Use local App Store search suggestions
- Consider local spelling variations
Step 4: Apply Translations
PATCH /v1/appInfoLocalizations/{localizationId}
{
"data": {
"type": "appInfoLocalizations",
"id": "{localizationId}",
"attributes": {
"name": "Localized App Name",
"subtitle": "Localized Subtitle"
}
}
}
PATCH /v1/appStoreVersionLocalizations/{localizationId}
{
"data": {
"type": "appStoreVersionLocalizations",
"id": "{localizationId}",
"attributes": {
"keywords": "localized,keywords,here",
"description": "Localized description...",
"promotionalText": "Localized promo text"
}
}
}
Step 5: Verify Translations
After applying:
- Check character counts are within limits
- Verify no encoding issues
- Confirm keywords don’t duplicate title/subtitle
- Review for cultural appropriateness
Workflow 4 â Cross-Localization Strategy
Apple indexes keywords from MULTIPLE locales per storefront. Use this to effectively double your keyword coverage.
Cross-Localization Map
| Storefront | Primary Locale | Secondary Locale(s) |
|---|---|---|
| USA | en-US | es-MX |
| UK | en-GB | en-US |
| Canada | en-CA | fr-CA, en-US |
| Australia | en-AU | en-US |
| Germany | de-DE | en-US |
| France | fr-FR | en-US |
| Japan | ja | en-US |
| Brazil | pt-BR | en-US |
| Mexico | es-MX | en-US |
| Spain | es-ES | en-US |
| China | zh-Hans | en-US |
| Taiwan | zh-Hant | en-US |
Strategy Implementation
For the US App Store (indexes en-US + es-MX):
## US Market â Cross-Localization
### en-US Keywords (100 chars)
"photo,editor,camera,filter,retouch,enhance,crop,adjust,collage"
### es-MX Keywords (100 chars) â ALSO indexed in US!
"fotos,editar,imagen,efectos,marcos,belleza,retrato,selfie,blur"
### Result: 18 unique keywords indexed for US users
(vs 9 if only using en-US)
Rules for Cross-Localization
- No overlap â Don’t repeat keywords between paired locales
- Relevance first â Both sets must be relevant to your app
- Language appropriate â es-MX keywords work because US has Spanish speakers
- Monitor performance â Track which locale’s keywords perform better
Generate Cross-Localization Plan
## Cross-Localization Plan â {App Name}
### Target: US App Store
Primary: en-US | Secondary: es-MX
| en-US Keywords | es-MX Keywords |
|----------------|----------------|
| photo | fotos |
| editor | editar |
| camera | cámara |
| filter | filtros |
| enhance | mejorar |
| collage | collage â (duplicate, remove) |
| retouch | retocar |
| beauty | belleza |
| portrait | retrato |
**Recommendation:** Replace "collage" in es-MX with unique term like "marcos"
See locale-reference.md for complete cross-indexing map.
Workflow 5 â Bulk Update via API
Apply metadata changes programmatically.
Prerequisites
- App Store Connect API key (Admin or App Manager role)
- JWT token generation
- App ID and version ID
Step 1: Get Current Version
GET /v1/apps/{appId}/appStoreVersions?filter[appStoreState]=READY_FOR_SALE,PREPARE_FOR_SUBMISSION
Step 2: List Existing Localizations
GET /v1/appStoreVersions/{versionId}/appStoreVersionLocalizations
Step 3: Create Missing Localizations
POST /v1/appStoreVersionLocalizations
{
"data": {
"type": "appStoreVersionLocalizations",
"attributes": {
"locale": "de-DE",
"keywords": "keywords,here",
"description": "German description...",
"promotionalText": "German promo",
"whatsNew": "What's new in German"
},
"relationships": {
"appStoreVersion": {
"data": {
"type": "appStoreVersions",
"id": "{versionId}"
}
}
}
}
}
Step 4: Update Existing Localizations
PATCH /v1/appStoreVersionLocalizations/{localizationId}
{
"data": {
"type": "appStoreVersionLocalizations",
"id": "{localizationId}",
"attributes": {
"keywords": "updated,keywords",
"description": "Updated description..."
}
}
}
Step 5: Update App Info Localizations (Name/Subtitle)
PATCH /v1/appInfoLocalizations/{localizationId}
{
"data": {
"type": "appInfoLocalizations",
"id": "{localizationId}",
"attributes": {
"name": "New App Name",
"subtitle": "New Subtitle"
}
}
}
Batch Update Script
async def bulk_update_localizations(app_id, updates):
"""
updates = {
"de-DE": {"keywords": "...", "description": "..."},
"fr-FR": {"keywords": "...", "description": "..."},
}
"""
version_id = await get_current_version(app_id)
localizations = await get_localizations(version_id)
for locale, changes in updates.items():
loc_id = find_localization_id(localizations, locale)
if loc_id:
await patch_localization(loc_id, changes)
else:
await create_localization(version_id, locale, changes)
# Rate limiting
await asyncio.sleep(0.5)
return {"updated": len(updates)}
Workflow 6 â Competitor ASO Analysis
Analyze competitor metadata to identify opportunities.
Step 1: Identify Competitors
GET https://itunes.apple.com/search?term={category}&media=software&limit=25
Or specify competitor app IDs directly.
Step 2: Fetch Competitor Metadata
For each competitor, across key locales:
locales = ["us", "gb", "de", "fr", "jp", "br"]
for competitor_id in competitors:
for locale in locales:
data = fetch_itunes_lookup(competitor_id, locale)
store_metadata(competitor_id, locale, data)
Step 3: Extract Keywords
From competitor metadata, extract likely keywords:
def extract_keywords(app_data):
keywords = set()
# From title (remove brand name)
title_words = app_data["trackName"].lower().split()
keywords.update(title_words)
# From description (top frequency words)
desc_words = extract_top_words(app_data["description"], n=20)
keywords.update(desc_words)
# Filter stop words
keywords = filter_stop_words(keywords)
return keywords
Step 4: Gap Analysis
def find_keyword_gaps(your_keywords, competitor_keywords):
"""Find keywords competitors use that you don't."""
gaps = competitor_keywords - your_keywords
return sorted(gaps, key=lambda k: estimate_value(k), reverse=True)
Step 5: Generate Competitive Report
## Competitor ASO Analysis â {Category}
### Competitors Analyzed
1. Competitor A (id: 123456) â 4.8â
, 50K ratings
2. Competitor B (id: 789012) â 4.6â
, 30K ratings
3. Competitor C (id: 345678) â 4.5â
, 25K ratings
### Keyword Coverage Comparison
| Keyword | You | Comp A | Comp B | Comp C | Opportunity |
|---------|-----|--------|--------|--------|-------------|
| photo editor | â | â | â | â | Low (saturated) |
| ai enhance | â | â | â | â | High |
| background remove | â | â | â | â | High |
| collage maker | â | â | â | â | Covered |
| beauty camera | â | â | â | â | Medium |
### Keyword Gaps (High Opportunity)
1. "ai enhance" â Used by 2/3 competitors, you're missing
2. "background remove" â Used by 3/3 competitors
3. "portrait mode" â Growing trend, 2/3 competitors
### Title/Subtitle Patterns
- 3/3 competitors include "Photo" in title
- 2/3 use "Pro" or "Plus" suffix
- All include primary feature in subtitle
### Recommendations
1. Add "ai enhance" to keywords â high competitor usage
2. Consider "background" variations in title/subtitle
3. Test "Pro" suffix for premium positioning
Quick Reference â API Endpoints
| Task | Method | Endpoint |
|---|---|---|
| List app infos | GET | /v1/apps/{id}/appInfos |
| List app info localizations | GET | /v1/appInfos/{id}/appInfoLocalizations |
| Update app info localization | PATCH | /v1/appInfoLocalizations/{id} |
| List version localizations | GET | /v1/appStoreVersions/{id}/appStoreVersionLocalizations |
| Create version localization | POST | /v1/appStoreVersionLocalizations |
| Update version localization | PATCH | /v1/appStoreVersionLocalizations/{id} |
| Delete version localization | DELETE | /v1/appStoreVersionLocalizations/{id} |
| iTunes lookup | GET | itunes.apple.com/lookup?id={id}&country={cc} |
| iTunes search | GET | itunes.apple.com/search?term={q}&media=software |
ASO Checklist
Before submitting metadata updates:
- All character limits respected
- No duplicate keywords across Title/Subtitle/Keywords
- No stop words in keywords field
- Keywords comma-separated without spaces
- Cross-localization strategy applied
- High-value markets localized
- Keywords localized (not just translated)
- No competitor brand names in keywords
- Description is conversion-optimized
- Promotional text ready (can update anytime)
Reference Files
| File | Purpose |
|---|---|
| aso-best-practices.md | Character limits, rules, optimization tips |
| locale-reference.md | All 38 locales with cross-indexing map |
| api-endpoints.md | App Store Connect API details |
| keyword-strategies.md | Advanced keyword research techniques |