Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
Official Expo AI agent skill for deploying Expo apps to App Store and Google Play.
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
references/app-store-metadata.md
1# App Store Metadata23Manage App Store metadata and optimize for ASO using EAS Metadata.45## What is EAS Metadata?67EAS Metadata automates App Store presence management from the command line using a `store.config.json` file instead of manually filling forms in App Store Connect. It includes built-in validation to catch common rejection pitfalls.89**Current Status:** Preview, Apple App Store only.1011## Getting Started1213### Pull Existing Metadata1415If your app is already published, pull current metadata:1617```bash18eas metadata:pull19```2021This creates `store.config.json` with your current App Store configuration.2223### Push Metadata Updates2425After editing your config, push changes:2627```bash28eas metadata:push29```3031**Important:** You must submit a binary via `eas submit` before pushing metadata for new apps.3233## Configuration File3435Create `store.config.json` at your project root:3637```json38{39"configVersion": 0,40"apple": {41"copyright": "2025 Your Company",42"categories": ["UTILITIES", "PRODUCTIVITY"],43"info": {44"en-US": {45"title": "App Name",46"subtitle": "Your compelling tagline",47"description": "Full app description...",48"keywords": ["keyword1", "keyword2", "keyword3"],49"releaseNotes": "What's new in this version...",50"promoText": "Limited time offer!",51"privacyPolicyUrl": "https://example.com/privacy",52"supportUrl": "https://example.com/support",53"marketingUrl": "https://example.com"54}55},56"advisory": {57"alcoholTobaccoOrDrugUseOrReferences": "NONE",58"gamblingSimulated": "NONE",59"medicalOrTreatmentInformation": "NONE",60"profanityOrCrudeHumor": "NONE",61"sexualContentGraphicAndNudity": "NONE",62"sexualContentOrNudity": "NONE",63"horrorOrFearThemes": "NONE",64"matureOrSuggestiveThemes": "NONE",65"violenceCartoonOrFantasy": "NONE",66"violenceRealistic": "NONE",67"violenceRealisticProlongedGraphicOrSadistic": "NONE",68"contests": "NONE",69"gambling": false,70"unrestrictedWebAccess": false,71"seventeenPlus": false72},73"release": {74"automaticRelease": true,75"phasedRelease": true76},77"review": {78"firstName": "John",79"lastName": "Doe",80"email": "[email protected]",81"phone": "+1 555-123-4567",82"notes": "Demo account: [email protected] / password123"83}84}85}86```8788## App Store Optimization (ASO)8990### Title Optimization (30 characters max)9192The title is the most important ranking factor. Include your brand name and 1-2 strongest keywords.9394```json95{96"title": "Budgetly - Money Tracker"97}98```99100**Best Practices:**101102- Brand name first for recognition103- Include highest-volume keyword104- Avoid generic words like "app" or "the"105- Title keywords boost rankings by ~10%106107### Subtitle Optimization (30 characters max)108109The subtitle appears below your title in search results. Use it for your unique value proposition.110111```json112{113"subtitle": "Smart Expense & Budget Planner"114}115```116117**Best Practices:**118119- Don't duplicate keywords from title (Apple counts each word once)120- Highlight your main differentiator121- Include secondary high-value keywords122- Focus on benefits, not features123124### Keywords Field (100 characters max)125126Hidden from users but crucial for discoverability. Use comma-separated keywords without spaces after commas.127128```json129{130"keywords": [131"finance,budget,expense,money,tracker,savings,bills,income,spending,wallet,personal,weekly,monthly"132]133}134```135136**Best Practices:**137138- Use all 100 characters139- Separate with commas only (no spaces)140- No duplicates from title/subtitle141- Include singular forms (Apple handles plurals)142- Add synonyms and alternate spellings143- Include competitor brand names (carefully)144- Use digits instead of spelled numbers ("5" not "five")145- Skip articles and prepositions146147### Description Optimization148149The iOS description is NOT indexed for search but critical for conversion. Focus on convincing users to download.150151```json152{153"description": "Take control of your finances with Budgetly, the intuitive money management app trusted by over 1 million users.\n\nKEY FEATURES:\n• Smart budget tracking - Set limits and watch your progress\n• Expense categorization - Know exactly where your money goes\n• Bill reminders - Never miss a payment\n• Beautiful charts - Visualize your financial health\n• Bank sync - Connect 10,000+ institutions\n• Cloud backup - Your data, always safe\n\nWHY BUDGETLY?\nUnlike complex spreadsheets or basic calculators, Budgetly learns your spending habits and provides personalized insights. Our users save an average of $300/month within 3 months.\n\nPRIVACY FIRST\nYour financial data is encrypted end-to-end. We never sell your information.\n\nDownload Budgetly today and start your journey to financial freedom!"154}155```156157**Best Practices:**158159- Front-load the first 3 lines (visible before "more")160- Use bullet points for features161- Include social proof (user counts, ratings, awards)162- Add a clear call-to-action163- Mention privacy/security for sensitive apps164- Update with each release165166### Release Notes167168Shown to existing users deciding whether to update.169170```json171{172"releaseNotes": "Version 2.5 brings exciting improvements:\n\n• NEW: Dark mode support\n• NEW: Widget for home screen\n• IMPROVED: 50% faster sync\n• FIXED: Notification timing issues\n\nLove Budgetly? Please leave a review!"173}174```175176### Promo Text (170 characters max)177178Appears above description; can be updated without new binary. Great for time-sensitive promotions.179180```json181{182"promoText": "🎉 New Year Special: Premium features free for 30 days! Start 2025 with better finances."183}184```185186## Categories187188Primary category is most important for browsing and rankings.189190```json191{192"categories": ["FINANCE", "PRODUCTIVITY"]193}194```195196**Available Categories:**197198- BOOKS, BUSINESS, DEVELOPER_TOOLS, EDUCATION199- ENTERTAINMENT, FINANCE, FOOD_AND_DRINK200- GAMES (with subcategories), GRAPHICS_AND_DESIGN201- HEALTH_AND_FITNESS, KIDS (age-gated)202- LIFESTYLE, MAGAZINES_AND_NEWSPAPERS203- MEDICAL, MUSIC, NAVIGATION, NEWS204- PHOTO_AND_VIDEO, PRODUCTIVITY, REFERENCE205- SHOPPING, SOCIAL_NETWORKING, SPORTS206- STICKERS (with subcategories), TRAVEL207- UTILITIES, WEATHER208209## Localization210211Localize metadata for each target market. Keywords should be researched per locale—direct translations often miss regional search terms.212213```json214{215"info": {216"en-US": {217"title": "Budgetly - Money Tracker",218"subtitle": "Smart Expense Planner",219"keywords": ["budget,finance,money,expense,tracker"]220},221"es-ES": {222"title": "Budgetly - Control de Gastos",223"subtitle": "Planificador de Presupuesto",224"keywords": ["presupuesto,finanzas,dinero,gastos,ahorro"]225},226"ja": {227"title": "Budgetly - 家計簿アプリ",228"subtitle": "簡単支出管理",229"keywords": ["家計簿,支出,予算,節約,お金"]230},231"de-DE": {232"title": "Budgetly - Haushaltsbuch",233"subtitle": "Ausgaben Verwalten",234"keywords": ["budget,finanzen,geld,ausgaben,sparen"]235}236}237}238```239240**Supported Locales:**241`ar-SA`, `ca`, `cs`, `da`, `de-DE`, `el`, `en-AU`, `en-CA`, `en-GB`, `en-US`, `es-ES`, `es-MX`, `fi`, `fr-CA`, `fr-FR`, `he`, `hi`, `hr`, `hu`, `id`, `it`, `ja`, `ko`, `ms`, `nl-NL`, `no`, `pl`, `pt-BR`, `pt-PT`, `ro`, `ru`, `sk`, `sv`, `th`, `tr`, `uk`, `vi`, `zh-Hans`, `zh-Hant`242243## Dynamic Configuration244245Use JavaScript for dynamic values like copyright year or fetched translations.246247### Basic Dynamic Config248249```js250// store.config.js251const baseConfig = require("./store.config.json");252253const year = new Date().getFullYear();254255module.exports = {256...baseConfig,257apple: {258...baseConfig.apple,259copyright: `${year} Your Company, Inc.`,260},261};262```263264### Async Configuration (External Localization)265266```js267// store.config.js268module.exports = async () => {269const baseConfig = require("./store.config.json");270271// Fetch translations from CMS/localization service272const translations = await fetch(273"https://api.example.com/app-store-copy"274).then((r) => r.json());275276return {277...baseConfig,278apple: {279...baseConfig.apple,280info: translations,281},282};283};284```285286### Environment-Based Config287288```js289// store.config.js290const baseConfig = require("./store.config.json");291292const isProduction = process.env.EAS_BUILD_PROFILE === "production";293294module.exports = {295...baseConfig,296apple: {297...baseConfig.apple,298info: {299"en-US": {300...baseConfig.apple.info["en-US"],301promoText: isProduction302? "Download now and get started!"303: "[BETA] Help us test new features!",304},305},306},307};308```309310Update `eas.json` to use JS config:311312```json313{314"cli": {315"metadataPath": "./store.config.js"316}317}318```319320## Age Rating (Advisory)321322Answer content questions honestly to get an appropriate age rating.323324**Content Descriptors:**325326- `NONE` - Content not present327- `INFREQUENT_OR_MILD` - Occasional mild content328- `FREQUENT_OR_INTENSE` - Regular or strong content329330```json331{332"advisory": {333"alcoholTobaccoOrDrugUseOrReferences": "NONE",334"contests": "NONE",335"gambling": false,336"gamblingSimulated": "NONE",337"horrorOrFearThemes": "NONE",338"matureOrSuggestiveThemes": "NONE",339"medicalOrTreatmentInformation": "NONE",340"profanityOrCrudeHumor": "NONE",341"sexualContentGraphicAndNudity": "NONE",342"sexualContentOrNudity": "NONE",343"unrestrictedWebAccess": false,344"violenceCartoonOrFantasy": "NONE",345"violenceRealistic": "NONE",346"violenceRealisticProlongedGraphicOrSadistic": "NONE",347"seventeenPlus": false,348"kidsAgeBand": "NINE_TO_ELEVEN"349}350}351```352353**Kids Age Bands:** `FIVE_AND_UNDER`, `SIX_TO_EIGHT`, `NINE_TO_ELEVEN`354355## Release Strategy356357Control how your app rolls out to users.358359```json360{361"release": {362"automaticRelease": true,363"phasedRelease": true364}365}366```367368**Options:**369370- `automaticRelease: true` - Release immediately upon approval371- `automaticRelease: false` - Manual release after approval372- `automaticRelease: "2025-02-01T10:00:00Z"` - Schedule release (RFC 3339)373- `phasedRelease: true` - 7-day gradual rollout (1%, 2%, 5%, 10%, 20%, 50%, 100%)374375## Review Information376377Provide contact info and test credentials for the App Review team.378379```json380{381"review": {382"firstName": "Jane",383"lastName": "Smith",384"email": "[email protected]",385"phone": "+1 (555) 123-4567",386"demoUsername": "[email protected]",387"demoPassword": "ReviewDemo2025!",388"notes": "To test premium features:\n1. Log in with demo credentials\n2. Navigate to Settings > Subscription\n3. Tap 'Restore Purchase' - sandbox purchase will be restored\n\nFor location features, allow location access when prompted."389}390}391```392393## ASO Checklist394395### Before Each Release396397- [ ] Update keywords based on performance data398- [ ] Refresh description with new features399- [ ] Write compelling release notes400- [ ] Update promo text if running campaigns401- [ ] Verify all URLs are valid402403### Monthly ASO Tasks404405- [ ] Analyze keyword rankings406- [ ] Research competitor keywords407- [ ] Check conversion rates in App Analytics408- [ ] Review user feedback for keyword ideas409- [ ] A/B test screenshots in App Store Connect410411### Keyword Research Tips4124131. **Brainstorm features** - List all app capabilities4142. **Mine reviews** - Find words users actually use4153. **Analyze competitors** - Check their titles/subtitles4164. **Use long-tail keywords** - Less competition, higher intent4175. **Consider misspellings** - Common typos can drive traffic4186. **Track seasonality** - Some keywords peak at certain times419420### Metrics to Monitor421422- **Impressions** - How often your app appears in search423- **Product Page Views** - Users who tap to learn more424- **Conversion Rate** - Views → Downloads425- **Keyword Rankings** - Position for target keywords426- **Category Ranking** - Position in your categories427428## VS Code Integration429430Install the [Expo Tools extension](https://marketplace.visualstudio.com/items?itemName=expo.vscode-expo-tools) for:431432- Auto-complete for all schema properties433- Inline validation and warnings434- Quick fixes for common issues435436## Common Issues437438### "Binary not found"439440Push a binary with `eas submit` before pushing metadata.441442### "Invalid keywords"443444- Check total length is ≤100 characters445- Remove spaces after commas446- Remove duplicate words447448### "Description too long"449450Description maximum is 4000 characters.451452### Pull doesn't update JS config453454`eas metadata:pull` creates a JSON file; import it into your JS config.455456## CI/CD Integration457458Automate metadata updates in your deployment pipeline:459460```yaml461# .eas/workflows/release.yml462jobs:463submit-and-metadata:464steps:465- name: Submit to App Store466run: eas submit -p ios --latest467468- name: Push Metadata469run: eas metadata:push470```471472## Tips473474- Update metadata every 4-6 weeks for optimal ASO475- 70% of App Store visitors use search to find apps476- Apps with 4+ star ratings get featured more often477- Localized apps see 128% more downloads per country478- First 3 lines of description are most critical (shown before "more")479- Use all 100 keyword characters—every character counts480