app-store-aso-localization

App Store Optimization and metadata localization for iOS/macOS apps. Use this skill when working with App Store metadata for any of these tasks: (1) Analyzing current app metadata health (character usage, missing localizations), (2) Keyword research and optimization across locales, (3) Translating and localizing metadata to 38+ languages, (4) Implementing cross-localization strategies to maximize keyword coverage, (5) Bulk updating metadata via App Store Connect API, (6) Competitor ASO analysis and keyword gap identification, (7) Generating optimized titles, subtitles, keywords, and descriptions, (8) Auditing metadata for ASO best practices compliance.

Safety Notice

This listing is imported from skills.sh public index metadata. Review upstream SKILL.md and repository scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "app-store-aso-localization" with this command: npx skills add onatcipli/skills/onatcipli-skills-app-store-aso-localization

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

FieldLimitIndexedLevelNotes
App Name30 charsYes (highest)AppBrand + primary keyword
Subtitle30 charsYes (medium)AppUSP + secondary keywords
Keywords100 charsYes (iOS only)VersionComma-separated, no spaces
Promotional Text170 charsNoVersionCan update without review
Description4,000 charsNo (iOS)VersionConversion-focused
What's New4,000 charsNoVersionRelease notes

Important: iOS App Store does NOT index the description for search. Focus keywords in Title → Subtitle → Keywords field only.

API Access

TierAuthEndpointsUse Case
PublicNoneiTunes Search/LookupCompetitor research
PrivateJWTApp Store Connect APIManage 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:

  1. Your metadata — Current title, subtitle, keywords
  2. Competitor metadata — Via iTunes Lookup API
  3. Review mining — Common words in user reviews
  4. 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:

MetricDescriptionSource
Search VolumeHow often users search this termASO tools / estimation
DifficultyCompetition level (0-100)Top 10 app ratings
RelevanceHow well it describes your appManual assessment
Current RankYour position for this keywordTrack 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:

  1. No duplicates — Words in Title/Subtitle are already indexed
  2. No spaces — Use commas only: keyword1,keyword2,keyword3
  3. No stop words — Remove "the", "and", "a", "an", "app"
  4. Single words — Break phrases into individual tokens
  5. 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:

TierLocalesRationale
Tier 1en-US, en-GB, de-DE, ja, zh-HansLargest markets
Tier 2fr-FR, ko, es-ES, pt-BR, itHigh growth
Tier 3nl, ru, tr, ar, zh-Hant, svMarket expansion
Tier 4All remainingFull 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:

  1. Check competitor keywords in that locale
  2. Use local App Store search suggestions
  3. 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:

  1. Check character counts are within limits
  2. Verify no encoding issues
  3. Confirm keywords don't duplicate title/subtitle
  4. 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

StorefrontPrimary LocaleSecondary Locale(s)
USAen-USes-MX
UKen-GBen-US
Canadaen-CAfr-CA, en-US
Australiaen-AUen-US
Germanyde-DEen-US
Francefr-FRen-US
Japanjaen-US
Brazilpt-BRen-US
Mexicoes-MXen-US
Spaines-ESen-US
Chinazh-Hansen-US
Taiwanzh-Hanten-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

  1. No overlap — Don't repeat keywords between paired locales
  2. Relevance first — Both sets must be relevant to your app
  3. Language appropriate — es-MX keywords work because US has Spanish speakers
  4. 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

TaskMethodEndpoint
List app infosGET/v1/apps/{id}/appInfos
List app info localizationsGET/v1/appInfos/{id}/appInfoLocalizations
Update app info localizationPATCH/v1/appInfoLocalizations/{id}
List version localizationsGET/v1/appStoreVersions/{id}/appStoreVersionLocalizations
Create version localizationPOST/v1/appStoreVersionLocalizations
Update version localizationPATCH/v1/appStoreVersionLocalizations/{id}
Delete version localizationDELETE/v1/appStoreVersionLocalizations/{id}
iTunes lookupGETitunes.apple.com/lookup?id={id}&country={cc}
iTunes searchGETitunes.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

FilePurpose
aso-best-practices.mdCharacter limits, rules, optimization tips
locale-reference.mdAll 38 locales with cross-indexing map
api-endpoints.mdApp Store Connect API details
keyword-strategies.mdAdvanced keyword research techniques

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

General

app-store-screenshots

No summary provided by upstream source.

Repository SourceNeeds Review
General

app-store-reviews

No summary provided by upstream source.

Repository SourceNeeds Review
General

app-store-price-index

No summary provided by upstream source.

Repository SourceNeeds Review
Security

audit-website

Audit websites for SEO, performance, security, technical, content, and 15 other issue cateories with 230+ rules using the squirrelscan CLI. Returns LLM-optimized reports with health scores, broken links, meta tag analysis, and actionable recommendations. Use to discover and asses website or webapp issues and health.

Repository Source