App Store Optimization (ASO) --- Keyword Research Workflow Discover and evaluate keywords that drive app store visibility. Workflow: Conduct Keyword Research 1. Define target audience and core app functions: - Primary use case (what problem does the app solve) - Target user demographics - Competitive category 2. Generate seed keywords from: - App features and benefits - User language (not developer terminology) - App store autocomplete suggestions 3. Expand keyword list using: - Modifiers (free, best, simple) - Actions (create, track, organize) - Audiences (for students, for teams, for busine…

, '').replace(',', ''))\n\n roi_analysis = helper.calculate_localization_roi(\n market_codes,\n monthly_downloads,\n estimated_cost\n )\n\n return {\n 'target_markets': target_markets,\n 'roi_analysis': roi_analysis\n }\n","content_type":"text/x-python; charset=utf-8","language":"python","size":22142,"content_sha256":"1c6c26fc2c8c87867d02777bcd90753ed461319573df7961ccaf38bb2c29726b"},{"filename":"scripts/metadata_optimizer.py","content":"\"\"\"\nMetadata optimization module for App Store Optimization.\nOptimizes titles, descriptions, and keyword fields with platform-specific character limit validation.\n\"\"\"\n\nfrom typing import Dict, List, Any, Optional, Tuple\nimport re\n\n\nclass MetadataOptimizer:\n \"\"\"Optimizes app store metadata for maximum discoverability and conversion.\"\"\"\n\n # Platform-specific character limits\n CHAR_LIMITS = {\n 'apple': {\n 'title': 30,\n 'subtitle': 30,\n 'promotional_text': 170,\n 'description': 4000,\n 'keywords': 100,\n 'whats_new': 4000\n },\n 'google': {\n 'title': 50,\n 'short_description': 80,\n 'full_description': 4000\n }\n }\n\n def __init__(self, platform: str = 'apple'):\n \"\"\"\n Initialize metadata optimizer.\n\n Args:\n platform: 'apple' or 'google'\n \"\"\"\n if platform not in ['apple', 'google']:\n raise ValueError(\"Platform must be 'apple' or 'google'\")\n\n self.platform = platform\n self.limits = self.CHAR_LIMITS[platform]\n\n def optimize_title(\n self,\n app_name: str,\n target_keywords: List[str],\n include_brand: bool = True\n ) -> Dict[str, Any]:\n \"\"\"\n Optimize app title with keyword integration.\n\n Args:\n app_name: Your app's brand name\n target_keywords: List of keywords to potentially include\n include_brand: Whether to include brand name\n\n Returns:\n Optimized title options with analysis\n \"\"\"\n max_length = self.limits['title']\n\n title_options = []\n\n # Option 1: Brand name only\n if include_brand:\n option1 = app_name[:max_length]\n title_options.append({\n 'title': option1,\n 'length': len(option1),\n 'remaining_chars': max_length - len(option1),\n 'keywords_included': [],\n 'strategy': 'brand_only',\n 'pros': ['Maximum brand recognition', 'Clean and simple'],\n 'cons': ['No keyword targeting', 'Lower discoverability']\n })\n\n # Option 2: Brand + Primary Keyword\n if target_keywords:\n primary_keyword = target_keywords[0]\n option2 = self._build_title_with_keywords(\n app_name,\n [primary_keyword],\n max_length\n )\n if option2:\n title_options.append({\n 'title': option2,\n 'length': len(option2),\n 'remaining_chars': max_length - len(option2),\n 'keywords_included': [primary_keyword],\n 'strategy': 'brand_plus_primary',\n 'pros': ['Targets main keyword', 'Maintains brand identity'],\n 'cons': ['Limited keyword coverage']\n })\n\n # Option 3: Brand + Multiple Keywords (if space allows)\n if len(target_keywords) > 1:\n option3 = self._build_title_with_keywords(\n app_name,\n target_keywords[:2],\n max_length\n )\n if option3:\n title_options.append({\n 'title': option3,\n 'length': len(option3),\n 'remaining_chars': max_length - len(option3),\n 'keywords_included': target_keywords[:2],\n 'strategy': 'brand_plus_multiple',\n 'pros': ['Multiple keyword targets', 'Better discoverability'],\n 'cons': ['May feel cluttered', 'Less brand focus']\n })\n\n # Option 4: Keyword-first approach (for new apps)\n if target_keywords and not include_brand:\n option4 = \" \".join(target_keywords[:2])[:max_length]\n title_options.append({\n 'title': option4,\n 'length': len(option4),\n 'remaining_chars': max_length - len(option4),\n 'keywords_included': target_keywords[:2],\n 'strategy': 'keyword_first',\n 'pros': ['Maximum SEO benefit', 'Clear functionality'],\n 'cons': ['No brand recognition', 'Generic appearance']\n })\n\n return {\n 'platform': self.platform,\n 'max_length': max_length,\n 'options': title_options,\n 'recommendation': self._recommend_title_option(title_options)\n }\n\n def optimize_description(\n self,\n app_info: Dict[str, Any],\n target_keywords: List[str],\n description_type: str = 'full'\n ) -> Dict[str, Any]:\n \"\"\"\n Optimize app description with keyword integration and conversion focus.\n\n Args:\n app_info: Dict with 'name', 'key_features', 'unique_value', 'target_audience'\n target_keywords: List of keywords to integrate naturally\n description_type: 'full', 'short' (Google), 'subtitle' (Apple)\n\n Returns:\n Optimized description with analysis\n \"\"\"\n if description_type == 'short' and self.platform == 'google':\n return self._optimize_short_description(app_info, target_keywords)\n elif description_type == 'subtitle' and self.platform == 'apple':\n return self._optimize_subtitle(app_info, target_keywords)\n else:\n return self._optimize_full_description(app_info, target_keywords)\n\n def optimize_keyword_field(\n self,\n target_keywords: List[str],\n app_title: str = \"\",\n app_description: str = \"\"\n ) -> Dict[str, Any]:\n \"\"\"\n Optimize Apple's 100-character keyword field.\n\n Rules:\n - No spaces between commas\n - No plural forms if singular exists\n - No duplicates\n - Keywords in title/subtitle are already indexed\n\n Args:\n target_keywords: List of target keywords\n app_title: Current app title (to avoid duplication)\n app_description: Current description (to check coverage)\n\n Returns:\n Optimized keyword field (comma-separated, no spaces)\n \"\"\"\n if self.platform != 'apple':\n return {'error': 'Keyword field optimization only applies to Apple App Store'}\n\n max_length = self.limits['keywords']\n\n # Extract words already in title (these don't need to be in keyword field)\n title_words = set(app_title.lower().split()) if app_title else set()\n\n # Process keywords\n processed_keywords = []\n for keyword in target_keywords:\n keyword_lower = keyword.lower().strip()\n\n # Skip if already in title\n if keyword_lower in title_words:\n continue\n\n # Remove duplicates and process\n words = keyword_lower.split()\n for word in words:\n if word not in processed_keywords and word not in title_words:\n processed_keywords.append(word)\n\n # Remove plurals if singular exists\n deduplicated = self._remove_plural_duplicates(processed_keywords)\n\n # Build keyword field within 100 character limit\n keyword_field = self._build_keyword_field(deduplicated, max_length)\n\n # Calculate keyword density in description\n density = self._calculate_coverage(target_keywords, app_description)\n\n return {\n 'keyword_field': keyword_field,\n 'length': len(keyword_field),\n 'remaining_chars': max_length - len(keyword_field),\n 'keywords_included': keyword_field.split(','),\n 'keywords_count': len(keyword_field.split(',')),\n 'keywords_excluded': [kw for kw in target_keywords if kw.lower() not in keyword_field],\n 'description_coverage': density,\n 'optimization_tips': [\n 'Keywords in title are auto-indexed - no need to repeat',\n 'Use singular forms only (Apple indexes plurals automatically)',\n 'No spaces between commas to maximize character usage',\n 'Update keyword field with each app update to test variations'\n ]\n }\n\n def validate_character_limits(\n self,\n metadata: Dict[str, str]\n ) -> Dict[str, Any]:\n \"\"\"\n Validate all metadata fields against platform character limits.\n\n Args:\n metadata: Dictionary of field_name: value\n\n Returns:\n Validation report with errors and warnings\n \"\"\"\n validation_results = {\n 'is_valid': True,\n 'errors': [],\n 'warnings': [],\n 'field_status': {}\n }\n\n for field_name, value in metadata.items():\n if field_name not in self.limits:\n validation_results['warnings'].append(\n f\"Unknown field '{field_name}' for {self.platform} platform\"\n )\n continue\n\n max_length = self.limits[field_name]\n actual_length = len(value)\n remaining = max_length - actual_length\n\n field_status = {\n 'value': value,\n 'length': actual_length,\n 'limit': max_length,\n 'remaining': remaining,\n 'is_valid': actual_length \u003c= max_length,\n 'usage_percentage': round((actual_length / max_length) * 100, 1)\n }\n\n validation_results['field_status'][field_name] = field_status\n\n if actual_length > max_length:\n validation_results['is_valid'] = False\n validation_results['errors'].append(\n f\"'{field_name}' exceeds limit: {actual_length}/{max_length} chars\"\n )\n elif remaining > max_length * 0.2: # More than 20% unused\n validation_results['warnings'].append(\n f\"'{field_name}' under-utilizes space: {remaining} chars remaining\"\n )\n\n return validation_results\n\n def calculate_keyword_density(\n self,\n text: str,\n target_keywords: List[str]\n ) -> Dict[str, Any]:\n \"\"\"\n Calculate keyword density in text.\n\n Args:\n text: Text to analyze\n target_keywords: Keywords to check\n\n Returns:\n Density analysis\n \"\"\"\n text_lower = text.lower()\n total_words = len(text_lower.split())\n\n keyword_densities = {}\n for keyword in target_keywords:\n keyword_lower = keyword.lower()\n count = text_lower.count(keyword_lower)\n density = (count / total_words * 100) if total_words > 0 else 0\n\n keyword_densities[keyword] = {\n 'occurrences': count,\n 'density_percentage': round(density, 2),\n 'status': self._assess_density(density)\n }\n\n # Overall assessment\n total_keyword_occurrences = sum(kw['occurrences'] for kw in keyword_densities.values())\n overall_density = (total_keyword_occurrences / total_words * 100) if total_words > 0 else 0\n\n return {\n 'total_words': total_words,\n 'keyword_densities': keyword_densities,\n 'overall_keyword_density': round(overall_density, 2),\n 'assessment': self._assess_overall_density(overall_density),\n 'recommendations': self._generate_density_recommendations(keyword_densities)\n }\n\n def _build_title_with_keywords(\n self,\n app_name: str,\n keywords: List[str],\n max_length: int\n ) -> Optional[str]:\n \"\"\"Build title combining app name and keywords within limit.\"\"\"\n separators = [' - ', ': ', ' | ']\n\n for sep in separators:\n for kw in keywords:\n title = f\"{app_name}{sep}{kw}\"\n if len(title) \u003c= max_length:\n return title\n\n return None\n\n def _optimize_short_description(\n self,\n app_info: Dict[str, Any],\n target_keywords: List[str]\n ) -> Dict[str, Any]:\n \"\"\"Optimize Google Play short description (80 chars).\"\"\"\n max_length = self.limits['short_description']\n\n # Focus on unique value proposition with primary keyword\n unique_value = app_info.get('unique_value', '')\n primary_keyword = target_keywords[0] if target_keywords else ''\n\n # Template: [Primary Keyword] - [Unique Value]\n short_desc = f\"{primary_keyword.title()} - {unique_value}\"[:max_length]\n\n return {\n 'short_description': short_desc,\n 'length': len(short_desc),\n 'remaining_chars': max_length - len(short_desc),\n 'keywords_included': [primary_keyword] if primary_keyword in short_desc.lower() else [],\n 'strategy': 'keyword_value_proposition'\n }\n\n def _optimize_subtitle(\n self,\n app_info: Dict[str, Any],\n target_keywords: List[str]\n ) -> Dict[str, Any]:\n \"\"\"Optimize Apple App Store subtitle (30 chars).\"\"\"\n max_length = self.limits['subtitle']\n\n # Very concise - primary keyword or key feature\n primary_keyword = target_keywords[0] if target_keywords else ''\n key_feature = app_info.get('key_features', [''])[0] if app_info.get('key_features') else ''\n\n options = [\n primary_keyword[:max_length],\n key_feature[:max_length],\n f\"{primary_keyword} App\"[:max_length]\n ]\n\n return {\n 'subtitle_options': [opt for opt in options if opt],\n 'max_length': max_length,\n 'recommendation': options[0] if options else ''\n }\n\n def _optimize_full_description(\n self,\n app_info: Dict[str, Any],\n target_keywords: List[str]\n ) -> Dict[str, Any]:\n \"\"\"Optimize full app description (4000 chars for both platforms).\"\"\"\n max_length = self.limits.get('description', self.limits.get('full_description', 4000))\n\n # Structure: Hook → Features → Benefits → Social Proof → CTA\n sections = []\n\n # Hook (with primary keyword)\n primary_keyword = target_keywords[0] if target_keywords else ''\n unique_value = app_info.get('unique_value', '')\n hook = f\"{unique_value} {primary_keyword.title()} that helps you achieve more.\\n\\n\"\n sections.append(hook)\n\n # Features (with keywords naturally integrated)\n features = app_info.get('key_features', [])\n if features:\n sections.append(\"KEY FEATURES:\\n\")\n for i, feature in enumerate(features[:5], 1):\n # Integrate keywords naturally\n feature_text = f\"• {feature}\"\n if i \u003c= len(target_keywords):\n keyword = target_keywords[i-1]\n if keyword.lower() not in feature.lower():\n feature_text = f\"• {feature} with {keyword}\"\n sections.append(f\"{feature_text}\\n\")\n sections.append(\"\\n\")\n\n # Benefits\n target_audience = app_info.get('target_audience', 'users')\n sections.append(f\"PERFECT FOR:\\n{target_audience}\\n\\n\")\n\n # Social proof placeholder\n sections.append(\"WHY USERS LOVE US:\\n\")\n sections.append(\"Join thousands of satisfied users who have transformed their workflow.\\n\\n\")\n\n # CTA\n sections.append(\"Download now and start experiencing the difference!\")\n\n # Combine and validate length\n full_description = \"\".join(sections)\n if len(full_description) > max_length:\n full_description = full_description[:max_length-3] + \"...\"\n\n # Calculate keyword density\n density = self.calculate_keyword_density(full_description, target_keywords)\n\n return {\n 'full_description': full_description,\n 'length': len(full_description),\n 'remaining_chars': max_length - len(full_description),\n 'keyword_analysis': density,\n 'structure': {\n 'has_hook': True,\n 'has_features': len(features) > 0,\n 'has_benefits': True,\n 'has_cta': True\n }\n }\n\n def _remove_plural_duplicates(self, keywords: List[str]) -> List[str]:\n \"\"\"Remove plural forms if singular exists.\"\"\"\n deduplicated = []\n singular_set = set()\n\n for keyword in keywords:\n if keyword.endswith('s') and len(keyword) > 1:\n singular = keyword[:-1]\n if singular not in singular_set:\n deduplicated.append(singular)\n singular_set.add(singular)\n else:\n if keyword not in singular_set:\n deduplicated.append(keyword)\n singular_set.add(keyword)\n\n return deduplicated\n\n def _build_keyword_field(self, keywords: List[str], max_length: int) -> str:\n \"\"\"Build comma-separated keyword field within character limit.\"\"\"\n keyword_field = \"\"\n\n for keyword in keywords:\n test_field = f\"{keyword_field},{keyword}\" if keyword_field else keyword\n if len(test_field) \u003c= max_length:\n keyword_field = test_field\n else:\n break\n\n return keyword_field\n\n def _calculate_coverage(self, keywords: List[str], text: str) -> Dict[str, int]:\n \"\"\"Calculate how many keywords are covered in text.\"\"\"\n text_lower = text.lower()\n coverage = {}\n\n for keyword in keywords:\n coverage[keyword] = text_lower.count(keyword.lower())\n\n return coverage\n\n def _assess_density(self, density: float) -> str:\n \"\"\"Assess individual keyword density.\"\"\"\n if density \u003c 0.5:\n return \"too_low\"\n elif density \u003c= 2.5:\n return \"optimal\"\n else:\n return \"too_high\"\n\n def _assess_overall_density(self, density: float) -> str:\n \"\"\"Assess overall keyword density.\"\"\"\n if density \u003c 2:\n return \"Under-optimized: Consider adding more keyword variations\"\n elif density \u003c= 5:\n return \"Optimal: Good keyword integration without stuffing\"\n elif density \u003c= 8:\n return \"High: Approaching keyword stuffing - reduce keyword usage\"\n else:\n return \"Too High: Keyword stuffing detected - rewrite for natural flow\"\n\n def _generate_density_recommendations(\n self,\n keyword_densities: Dict[str, Dict[str, Any]]\n ) -> List[str]:\n \"\"\"Generate recommendations based on keyword density analysis.\"\"\"\n recommendations = []\n\n for keyword, data in keyword_densities.items():\n if data['status'] == 'too_low':\n recommendations.append(\n f\"Increase usage of '{keyword}' - currently only {data['occurrences']} times\"\n )\n elif data['status'] == 'too_high':\n recommendations.append(\n f\"Reduce usage of '{keyword}' - appears {data['occurrences']} times (keyword stuffing risk)\"\n )\n\n if not recommendations:\n recommendations.append(\"Keyword density is well-balanced\")\n\n return recommendations\n\n def _recommend_title_option(self, options: List[Dict[str, Any]]) -> str:\n \"\"\"Recommend best title option based on strategy.\"\"\"\n if not options:\n return \"No valid options available\"\n\n # Prefer brand_plus_primary for established apps\n for option in options:\n if option['strategy'] == 'brand_plus_primary':\n return f\"Recommended: '{option['title']}' (Balance of brand and SEO)\"\n\n # Fallback to first option\n return f\"Recommended: '{options[0]['title']}' ({options[0]['strategy']})\"\n\n\ndef optimize_app_metadata(\n platform: str,\n app_info: Dict[str, Any],\n target_keywords: List[str]\n) -> Dict[str, Any]:\n \"\"\"\n Convenience function to optimize all metadata fields.\n\n Args:\n platform: 'apple' or 'google'\n app_info: App information dictionary\n target_keywords: Target keywords list\n\n Returns:\n Complete metadata optimization package\n \"\"\"\n optimizer = MetadataOptimizer(platform)\n\n return {\n 'platform': platform,\n 'title': optimizer.optimize_title(\n app_info['name'],\n target_keywords\n ),\n 'description': optimizer.optimize_description(\n app_info,\n target_keywords,\n 'full'\n ),\n 'keyword_field': optimizer.optimize_keyword_field(\n target_keywords\n ) if platform == 'apple' else None\n }\n","content_type":"text/x-python; charset=utf-8","language":"python","size":20824,"content_sha256":"e689b3521cad59b510b89e5e6d9536519286e521079f805fe016d7546d68702f"},{"filename":"scripts/review_analyzer.py","content":"\"\"\"\nReview analysis module for App Store Optimization.\nAnalyzes user reviews for sentiment, issues, and feature requests.\n\"\"\"\n\nfrom typing import Dict, List, Any, Optional, Tuple\nfrom collections import Counter\nimport re\n\n\nclass ReviewAnalyzer:\n \"\"\"Analyzes user reviews for actionable insights.\"\"\"\n\n # Sentiment keywords\n POSITIVE_KEYWORDS = [\n 'great', 'awesome', 'excellent', 'amazing', 'love', 'best', 'perfect',\n 'fantastic', 'wonderful', 'brilliant', 'outstanding', 'superb'\n ]\n\n NEGATIVE_KEYWORDS = [\n 'bad', 'terrible', 'awful', 'horrible', 'hate', 'worst', 'useless',\n 'broken', 'crash', 'bug', 'slow', 'disappointing', 'frustrating'\n ]\n\n # Issue indicators\n ISSUE_KEYWORDS = [\n 'crash', 'bug', 'error', 'broken', 'not working', 'doesnt work',\n 'freezes', 'slow', 'laggy', 'glitch', 'problem', 'issue', 'fail'\n ]\n\n # Feature request indicators\n FEATURE_REQUEST_KEYWORDS = [\n 'wish', 'would be nice', 'should add', 'need', 'want', 'hope',\n 'please add', 'missing', 'lacks', 'feature request'\n ]\n\n def __init__(self, app_name: str):\n \"\"\"\n Initialize review analyzer.\n\n Args:\n app_name: Name of the app\n \"\"\"\n self.app_name = app_name\n self.reviews = []\n self.analysis_cache = {}\n\n def analyze_sentiment(\n self,\n reviews: List[Dict[str, Any]]\n ) -> Dict[str, Any]:\n \"\"\"\n Analyze sentiment across reviews.\n\n Args:\n reviews: List of review dicts with 'text', 'rating', 'date'\n\n Returns:\n Sentiment analysis summary\n \"\"\"\n self.reviews = reviews\n\n sentiment_counts = {\n 'positive': 0,\n 'neutral': 0,\n 'negative': 0\n }\n\n detailed_sentiments = []\n\n for review in reviews:\n text = review.get('text', '').lower()\n rating = review.get('rating', 3)\n\n # Calculate sentiment score\n sentiment_score = self._calculate_sentiment_score(text, rating)\n sentiment_category = self._categorize_sentiment(sentiment_score)\n\n sentiment_counts[sentiment_category] += 1\n\n detailed_sentiments.append({\n 'review_id': review.get('id', ''),\n 'rating': rating,\n 'sentiment_score': sentiment_score,\n 'sentiment': sentiment_category,\n 'text_preview': text[:100] + '...' if len(text) > 100 else text\n })\n\n # Calculate percentages\n total = len(reviews)\n sentiment_distribution = {\n 'positive': round((sentiment_counts['positive'] / total) * 100, 1) if total > 0 else 0,\n 'neutral': round((sentiment_counts['neutral'] / total) * 100, 1) if total > 0 else 0,\n 'negative': round((sentiment_counts['negative'] / total) * 100, 1) if total > 0 else 0\n }\n\n # Calculate average rating\n avg_rating = sum(r.get('rating', 0) for r in reviews) / total if total > 0 else 0\n\n return {\n 'total_reviews_analyzed': total,\n 'average_rating': round(avg_rating, 2),\n 'sentiment_distribution': sentiment_distribution,\n 'sentiment_counts': sentiment_counts,\n 'sentiment_trend': self._assess_sentiment_trend(sentiment_distribution),\n 'detailed_sentiments': detailed_sentiments[:50] # Limit output\n }\n\n def extract_common_themes(\n self,\n reviews: List[Dict[str, Any]],\n min_mentions: int = 3\n ) -> Dict[str, Any]:\n \"\"\"\n Extract frequently mentioned themes and topics.\n\n Args:\n reviews: List of review dicts\n min_mentions: Minimum mentions to be considered common\n\n Returns:\n Common themes analysis\n \"\"\"\n # Extract all words from reviews\n all_words = []\n all_phrases = []\n\n for review in reviews:\n text = review.get('text', '').lower()\n # Clean text\n text = re.sub(r'[^\\w\\s]', ' ', text)\n words = text.split()\n\n # Filter out common words\n stop_words = {\n 'the', 'and', 'for', 'with', 'this', 'that', 'from', 'have',\n 'app', 'apps', 'very', 'really', 'just', 'but', 'not', 'you'\n }\n words = [w for w in words if w not in stop_words and len(w) > 3]\n\n all_words.extend(words)\n\n # Extract 2-3 word phrases\n for i in range(len(words) - 1):\n phrase = f\"{words[i]} {words[i+1]}\"\n all_phrases.append(phrase)\n\n # Count frequency\n word_freq = Counter(all_words)\n phrase_freq = Counter(all_phrases)\n\n # Filter by min_mentions\n common_words = [\n {'word': word, 'mentions': count}\n for word, count in word_freq.most_common(30)\n if count >= min_mentions\n ]\n\n common_phrases = [\n {'phrase': phrase, 'mentions': count}\n for phrase, count in phrase_freq.most_common(20)\n if count >= min_mentions\n ]\n\n # Categorize themes\n themes = self._categorize_themes(common_words, common_phrases)\n\n return {\n 'common_words': common_words,\n 'common_phrases': common_phrases,\n 'identified_themes': themes,\n 'insights': self._generate_theme_insights(themes)\n }\n\n def identify_issues(\n self,\n reviews: List[Dict[str, Any]],\n rating_threshold: int = 3\n ) -> Dict[str, Any]:\n \"\"\"\n Identify bugs, crashes, and other issues from reviews.\n\n Args:\n reviews: List of review dicts\n rating_threshold: Only analyze reviews at or below this rating\n\n Returns:\n Issue identification report\n \"\"\"\n issues = []\n\n for review in reviews:\n rating = review.get('rating', 5)\n if rating > rating_threshold:\n continue\n\n text = review.get('text', '').lower()\n\n # Check for issue keywords\n mentioned_issues = []\n for keyword in self.ISSUE_KEYWORDS:\n if keyword in text:\n mentioned_issues.append(keyword)\n\n if mentioned_issues:\n issues.append({\n 'review_id': review.get('id', ''),\n 'rating': rating,\n 'date': review.get('date', ''),\n 'issue_keywords': mentioned_issues,\n 'text': text[:200] + '...' if len(text) > 200 else text\n })\n\n # Group by issue type\n issue_frequency = Counter()\n for issue in issues:\n for keyword in issue['issue_keywords']:\n issue_frequency[keyword] += 1\n\n # Categorize issues\n categorized_issues = self._categorize_issues(issues)\n\n # Calculate issue severity\n severity_scores = self._calculate_issue_severity(\n categorized_issues,\n len(reviews)\n )\n\n return {\n 'total_issues_found': len(issues),\n 'issue_frequency': dict(issue_frequency.most_common(15)),\n 'categorized_issues': categorized_issues,\n 'severity_scores': severity_scores,\n 'top_issues': self._rank_issues_by_severity(severity_scores),\n 'recommendations': self._generate_issue_recommendations(\n categorized_issues,\n severity_scores\n )\n }\n\n def find_feature_requests(\n self,\n reviews: List[Dict[str, Any]]\n ) -> Dict[str, Any]:\n \"\"\"\n Extract feature requests and desired improvements.\n\n Args:\n reviews: List of review dicts\n\n Returns:\n Feature request analysis\n \"\"\"\n feature_requests = []\n\n for review in reviews:\n text = review.get('text', '').lower()\n rating = review.get('rating', 3)\n\n # Check for feature request indicators\n is_feature_request = any(\n keyword in text\n for keyword in self.FEATURE_REQUEST_KEYWORDS\n )\n\n if is_feature_request:\n # Extract the specific request\n request_text = self._extract_feature_request_text(text)\n\n feature_requests.append({\n 'review_id': review.get('id', ''),\n 'rating': rating,\n 'date': review.get('date', ''),\n 'request_text': request_text,\n 'full_review': text[:200] + '...' if len(text) > 200 else text\n })\n\n # Cluster similar requests\n clustered_requests = self._cluster_feature_requests(feature_requests)\n\n # Prioritize based on frequency and rating context\n prioritized_requests = self._prioritize_feature_requests(clustered_requests)\n\n return {\n 'total_feature_requests': len(feature_requests),\n 'clustered_requests': clustered_requests,\n 'prioritized_requests': prioritized_requests,\n 'implementation_recommendations': self._generate_feature_recommendations(\n prioritized_requests\n )\n }\n\n def track_sentiment_trends(\n self,\n reviews_by_period: Dict[str, List[Dict[str, Any]]]\n ) -> Dict[str, Any]:\n \"\"\"\n Track sentiment changes over time.\n\n Args:\n reviews_by_period: Dict of period_name: reviews\n\n Returns:\n Trend analysis\n \"\"\"\n trends = []\n\n for period, reviews in reviews_by_period.items():\n sentiment = self.analyze_sentiment(reviews)\n\n trends.append({\n 'period': period,\n 'total_reviews': len(reviews),\n 'average_rating': sentiment['average_rating'],\n 'positive_percentage': sentiment['sentiment_distribution']['positive'],\n 'negative_percentage': sentiment['sentiment_distribution']['negative']\n })\n\n # Calculate trend direction\n if len(trends) >= 2:\n first_period = trends[0]\n last_period = trends[-1]\n\n rating_change = last_period['average_rating'] - first_period['average_rating']\n sentiment_change = last_period['positive_percentage'] - first_period['positive_percentage']\n\n trend_direction = self._determine_trend_direction(\n rating_change,\n sentiment_change\n )\n else:\n trend_direction = 'insufficient_data'\n\n return {\n 'periods_analyzed': len(trends),\n 'trend_data': trends,\n 'trend_direction': trend_direction,\n 'insights': self._generate_trend_insights(trends, trend_direction)\n }\n\n def generate_response_templates(\n self,\n issue_category: str\n ) -> List[Dict[str, str]]:\n \"\"\"\n Generate response templates for common review scenarios.\n\n Args:\n issue_category: Category of issue ('crash', 'feature_request', 'positive', etc.)\n\n Returns:\n Response templates\n \"\"\"\n templates = {\n 'crash': [\n {\n 'scenario': 'App crash reported',\n 'template': \"Thank you for bringing this to our attention. We're sorry you experienced a crash. \"\n \"Our team is investigating this issue. Could you please share more details about when \"\n \"this occurred (device model, iOS/Android version) by contacting support@[company].com? \"\n \"We're committed to fixing this quickly.\"\n },\n {\n 'scenario': 'Crash already fixed',\n 'template': \"Thank you for your feedback. We've identified and fixed this crash issue in version [X.X]. \"\n \"Please update to the latest version. If the problem persists, please reach out to \"\n \"support@[company].com and we'll help you directly.\"\n }\n ],\n 'bug': [\n {\n 'scenario': 'Bug reported',\n 'template': \"Thanks for reporting this bug. We take these issues seriously. Our team is looking into it \"\n \"and we'll have a fix in an upcoming update. We appreciate your patience and will notify you \"\n \"when it's resolved.\"\n }\n ],\n 'feature_request': [\n {\n 'scenario': 'Feature request received',\n 'template': \"Thank you for this suggestion! We're always looking to improve [app_name]. We've added your \"\n \"request to our roadmap and will consider it for a future update. Follow us @[social] for \"\n \"updates on new features.\"\n },\n {\n 'scenario': 'Feature already planned',\n 'template': \"Great news! This feature is already on our roadmap and we're working on it. Stay tuned for \"\n \"updates in the coming months. Thanks for your feedback!\"\n }\n ],\n 'positive': [\n {\n 'scenario': 'Positive review',\n 'template': \"Thank you so much for your kind words! We're thrilled that you're enjoying [app_name]. \"\n \"Reviews like yours motivate our team to keep improving. If you ever have suggestions, \"\n \"we'd love to hear them!\"\n }\n ],\n 'negative_general': [\n {\n 'scenario': 'General complaint',\n 'template': \"We're sorry to hear you're not satisfied with your experience. We'd like to make this right. \"\n \"Please contact us at support@[company].com so we can understand the issue better and help \"\n \"you directly. Thank you for giving us a chance to improve.\"\n }\n ]\n }\n\n return templates.get(issue_category, templates['negative_general'])\n\n def _calculate_sentiment_score(self, text: str, rating: int) -> float:\n \"\"\"Calculate sentiment score (-1 to 1).\"\"\"\n # Start with rating-based score\n rating_score = (rating - 3) / 2 # Convert 1-5 to -1 to 1\n\n # Adjust based on text sentiment\n positive_count = sum(1 for keyword in self.POSITIVE_KEYWORDS if keyword in text)\n negative_count = sum(1 for keyword in self.NEGATIVE_KEYWORDS if keyword in text)\n\n text_score = (positive_count - negative_count) / 10 # Normalize\n\n # Weighted average (60% rating, 40% text)\n final_score = (rating_score * 0.6) + (text_score * 0.4)\n\n return max(min(final_score, 1.0), -1.0)\n\n def _categorize_sentiment(self, score: float) -> str:\n \"\"\"Categorize sentiment score.\"\"\"\n if score > 0.3:\n return 'positive'\n elif score \u003c -0.3:\n return 'negative'\n else:\n return 'neutral'\n\n def _assess_sentiment_trend(self, distribution: Dict[str, float]) -> str:\n \"\"\"Assess overall sentiment trend.\"\"\"\n positive = distribution['positive']\n negative = distribution['negative']\n\n if positive > 70:\n return 'very_positive'\n elif positive > 50:\n return 'positive'\n elif negative > 30:\n return 'concerning'\n elif negative > 50:\n return 'critical'\n else:\n return 'mixed'\n\n def _categorize_themes(\n self,\n common_words: List[Dict[str, Any]],\n common_phrases: List[Dict[str, Any]]\n ) -> Dict[str, List[str]]:\n \"\"\"Categorize themes from words and phrases.\"\"\"\n themes = {\n 'features': [],\n 'performance': [],\n 'usability': [],\n 'support': [],\n 'pricing': []\n }\n\n # Keywords for each category\n feature_keywords = {'feature', 'functionality', 'option', 'tool'}\n performance_keywords = {'fast', 'slow', 'crash', 'lag', 'speed', 'performance'}\n usability_keywords = {'easy', 'difficult', 'intuitive', 'confusing', 'interface', 'design'}\n support_keywords = {'support', 'help', 'customer', 'service', 'response'}\n pricing_keywords = {'price', 'cost', 'expensive', 'cheap', 'subscription', 'free'}\n\n for word_data in common_words:\n word = word_data['word']\n if any(kw in word for kw in feature_keywords):\n themes['features'].append(word)\n elif any(kw in word for kw in performance_keywords):\n themes['performance'].append(word)\n elif any(kw in word for kw in usability_keywords):\n themes['usability'].append(word)\n elif any(kw in word for kw in support_keywords):\n themes['support'].append(word)\n elif any(kw in word for kw in pricing_keywords):\n themes['pricing'].append(word)\n\n return {k: v for k, v in themes.items() if v} # Remove empty categories\n\n def _generate_theme_insights(self, themes: Dict[str, List[str]]) -> List[str]:\n \"\"\"Generate insights from themes.\"\"\"\n insights = []\n\n for category, keywords in themes.items():\n if keywords:\n insights.append(\n f\"{category.title()}: Users frequently mention {', '.join(keywords[:3])}\"\n )\n\n return insights[:5]\n\n def _categorize_issues(self, issues: List[Dict[str, Any]]) -> Dict[str, List[Dict[str, Any]]]:\n \"\"\"Categorize issues by type.\"\"\"\n categories = {\n 'crashes': [],\n 'bugs': [],\n 'performance': [],\n 'compatibility': []\n }\n\n for issue in issues:\n keywords = issue['issue_keywords']\n\n if 'crash' in keywords or 'freezes' in keywords:\n categories['crashes'].append(issue)\n elif 'bug' in keywords or 'error' in keywords or 'broken' in keywords:\n categories['bugs'].append(issue)\n elif 'slow' in keywords or 'laggy' in keywords:\n categories['performance'].append(issue)\n else:\n categories['compatibility'].append(issue)\n\n return {k: v for k, v in categories.items() if v}\n\n def _calculate_issue_severity(\n self,\n categorized_issues: Dict[str, List[Dict[str, Any]]],\n total_reviews: int\n ) -> Dict[str, Dict[str, Any]]:\n \"\"\"Calculate severity scores for each issue category.\"\"\"\n severity_scores = {}\n\n for category, issues in categorized_issues.items():\n count = len(issues)\n percentage = (count / total_reviews) * 100 if total_reviews > 0 else 0\n\n # Calculate average rating of affected reviews\n avg_rating = sum(i['rating'] for i in issues) / count if count > 0 else 0\n\n # Severity score (0-100)\n severity = min((percentage * 10) + ((5 - avg_rating) * 10), 100)\n\n severity_scores[category] = {\n 'count': count,\n 'percentage': round(percentage, 2),\n 'average_rating': round(avg_rating, 2),\n 'severity_score': round(severity, 1),\n 'priority': 'critical' if severity > 70 else ('high' if severity > 40 else 'medium')\n }\n\n return severity_scores\n\n def _rank_issues_by_severity(\n self,\n severity_scores: Dict[str, Dict[str, Any]]\n ) -> List[Dict[str, Any]]:\n \"\"\"Rank issues by severity score.\"\"\"\n ranked = sorted(\n [{'category': cat, **data} for cat, data in severity_scores.items()],\n key=lambda x: x['severity_score'],\n reverse=True\n )\n return ranked\n\n def _generate_issue_recommendations(\n self,\n categorized_issues: Dict[str, List[Dict[str, Any]]],\n severity_scores: Dict[str, Dict[str, Any]]\n ) -> List[str]:\n \"\"\"Generate recommendations for addressing issues.\"\"\"\n recommendations = []\n\n for category, score_data in severity_scores.items():\n if score_data['priority'] == 'critical':\n recommendations.append(\n f\"URGENT: Address {category} issues immediately - affecting {score_data['percentage']}% of reviews\"\n )\n elif score_data['priority'] == 'high':\n recommendations.append(\n f\"HIGH PRIORITY: Focus on {category} issues in next update\"\n )\n\n return recommendations\n\n def _extract_feature_request_text(self, text: str) -> str:\n \"\"\"Extract the specific feature request from review text.\"\"\"\n # Simple extraction - find sentence with feature request keywords\n sentences = text.split('.')\n for sentence in sentences:\n if any(keyword in sentence for keyword in self.FEATURE_REQUEST_KEYWORDS):\n return sentence.strip()\n return text[:100] # Fallback\n\n def _cluster_feature_requests(\n self,\n feature_requests: List[Dict[str, Any]]\n ) -> List[Dict[str, Any]]:\n \"\"\"Cluster similar feature requests.\"\"\"\n # Simplified clustering - group by common keywords\n clusters = {}\n\n for request in feature_requests:\n text = request['request_text'].lower()\n # Extract key words\n words = [w for w in text.split() if len(w) > 4]\n\n # Try to find matching cluster\n matched = False\n for cluster_key in clusters:\n if any(word in cluster_key for word in words[:3]):\n clusters[cluster_key].append(request)\n matched = True\n break\n\n if not matched and words:\n cluster_key = ' '.join(words[:2])\n clusters[cluster_key] = [request]\n\n return [\n {'feature_theme': theme, 'request_count': len(requests), 'examples': requests[:3]}\n for theme, requests in clusters.items()\n ]\n\n def _prioritize_feature_requests(\n self,\n clustered_requests: List[Dict[str, Any]]\n ) -> List[Dict[str, Any]]:\n \"\"\"Prioritize feature requests by frequency.\"\"\"\n return sorted(\n clustered_requests,\n key=lambda x: x['request_count'],\n reverse=True\n )[:10]\n\n def _generate_feature_recommendations(\n self,\n prioritized_requests: List[Dict[str, Any]]\n ) -> List[str]:\n \"\"\"Generate recommendations for feature requests.\"\"\"\n recommendations = []\n\n if prioritized_requests:\n top_request = prioritized_requests[0]\n recommendations.append(\n f\"Most requested feature: {top_request['feature_theme']} \"\n f\"({top_request['request_count']} mentions) - consider for next major release\"\n )\n\n if len(prioritized_requests) > 1:\n recommendations.append(\n f\"Also consider: {prioritized_requests[1]['feature_theme']}\"\n )\n\n return recommendations\n\n def _determine_trend_direction(\n self,\n rating_change: float,\n sentiment_change: float\n ) -> str:\n \"\"\"Determine overall trend direction.\"\"\"\n if rating_change > 0.2 and sentiment_change > 5:\n return 'improving'\n elif rating_change \u003c -0.2 and sentiment_change \u003c -5:\n return 'declining'\n else:\n return 'stable'\n\n def _generate_trend_insights(\n self,\n trends: List[Dict[str, Any]],\n trend_direction: str\n ) -> List[str]:\n \"\"\"Generate insights from trend analysis.\"\"\"\n insights = []\n\n if trend_direction == 'improving':\n insights.append(\"Positive trend: User satisfaction is increasing over time\")\n elif trend_direction == 'declining':\n insights.append(\"WARNING: User satisfaction is declining - immediate action needed\")\n else:\n insights.append(\"Sentiment is stable - maintain current quality\")\n\n # Review velocity insight\n if len(trends) >= 2:\n recent_reviews = trends[-1]['total_reviews']\n previous_reviews = trends[-2]['total_reviews']\n\n if recent_reviews > previous_reviews * 1.5:\n insights.append(\"Review volume increasing - growing user base or recent controversy\")\n\n return insights\n\n\ndef analyze_reviews(\n app_name: str,\n reviews: List[Dict[str, Any]]\n) -> Dict[str, Any]:\n \"\"\"\n Convenience function to perform comprehensive review analysis.\n\n Args:\n app_name: App name\n reviews: List of review dictionaries\n\n Returns:\n Complete review analysis\n \"\"\"\n analyzer = ReviewAnalyzer(app_name)\n\n return {\n 'sentiment_analysis': analyzer.analyze_sentiment(reviews),\n 'common_themes': analyzer.extract_common_themes(reviews),\n 'issues_identified': analyzer.identify_issues(reviews),\n 'feature_requests': analyzer.find_feature_requests(reviews)\n }\n","content_type":"text/x-python; charset=utf-8","language":"python","size":25561,"content_sha256":"395f675845886fd88b28c94c445b7450e60522c1acf0e0cd26a7465cfef8560f"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"App Store Optimization (ASO)","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Keyword Research Workflow","type":"text"}]},{"type":"paragraph","content":[{"text":"Discover and evaluate keywords that drive app store visibility.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Workflow: Conduct Keyword Research","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Define target audience and core app functions:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Primary use case (what problem does the app solve)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Target user demographics","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Competitive category","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Generate seed keywords from:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"App features and benefits","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"User language (not developer terminology)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"App store autocomplete suggestions","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Expand keyword list using:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Modifiers (free, best, simple)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Actions (create, track, organize)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Audiences (for students, for teams, for business)","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Evaluate each keyword:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Search volume (estimated monthly searches)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Competition (number and quality of ranking apps)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Relevance (alignment with app function)","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Score and prioritize keywords:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Primary: Title and keyword field (iOS)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Secondary: Subtitle and short description","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Tertiary: Full description only","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Map keywords to metadata locations","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Document keyword strategy for tracking","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Validation:","type":"text","marks":[{"type":"strong"}]},{"text":" Keywords scored; placement mapped; no competitor brand names included; no plurals in iOS keyword field","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Keyword Evaluation Criteria","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Factor","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Weight","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"High Score Indicators","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Relevance","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"35%","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Describes core app function","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Volume","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"25%","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"10,000+ monthly searches","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Competition","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"25%","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Top 10 apps have \u003c4.5 avg rating","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Conversion","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"15%","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Transactional intent (\"best X app\")","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Keyword Placement Priority","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Location","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Search Weight","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"App Title","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Highest","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Subtitle (iOS)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"High","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Keyword Field (iOS)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"High","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Short Description (Android)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"High","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Full Description","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Medium","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"See: ","type":"text"},{"text":"references/keyword-research-guide.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/keyword-research-guide.md","title":null}}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Metadata Optimization Workflow","type":"text"}]},{"type":"paragraph","content":[{"text":"Optimize app store listing elements for search ranking and conversion.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Workflow: Optimize App Metadata","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Audit current metadata against platform limits:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Title character count and keyword presence","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Subtitle/short description usage","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Keyword field efficiency (iOS)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Description keyword density","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Optimize title following formula:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"[Brand Name] - [Primary Keyword] [Secondary Keyword]","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Write subtitle (iOS) or short description (Android):","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Focus on primary benefit","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Include secondary keyword","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Use action verbs","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Optimize keyword field (iOS only):","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Remove duplicates from title","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Remove plurals (Apple indexes both forms)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"No spaces after commas","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Prioritize by score","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Rewrite full description:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Hook paragraph with value proposition","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Feature bullets with keywords","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Social proof section","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Call to action","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Validate character counts for each field","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Calculate keyword density (target 2-3% primary)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Validation:","type":"text","marks":[{"type":"strong"}]},{"text":" All fields within character limits; primary keyword in title; no keyword stuffing (>5%); natural language preserved","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Platform Character Limits","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Field","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Apple App Store","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Google Play Store","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Title","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"30 characters","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"50 characters","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Subtitle","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"30 characters","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"N/A","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Short Description","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"N/A","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"80 characters","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Keywords","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"100 characters","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"N/A","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Promotional Text","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"170 characters","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"N/A","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Full Description","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"4,000 characters","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"4,000 characters","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"What's New","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"4,000 characters","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"500 characters","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Description Structure","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"PARAGRAPH 1: Hook (50-100 words)\n├── Address user pain point\n├── State main value proposition\n└── Include primary keyword\n\nPARAGRAPH 2-3: Features (100-150 words)\n├── Top 5 features with benefits\n├── Bullet points for scanability\n└── Secondary keywords naturally integrated\n\nPARAGRAPH 4: Social Proof (50-75 words)\n├── Download count or rating\n├── Press mentions or awards\n└── Summary of user testimonials\n\nPARAGRAPH 5: Call to Action (25-50 words)\n├── Clear next step\n└── Reassurance (free trial, no signup)","type":"text"}]},{"type":"paragraph","content":[{"text":"See: ","type":"text"},{"text":"references/platform-requirements.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/platform-requirements.md","title":null}}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Competitor Analysis Workflow","type":"text"}]},{"type":"paragraph","content":[{"text":"Analyze top competitors to identify keyword gaps and positioning opportunities.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Workflow: Analyze Competitor ASO Strategy","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Identify top 10 competitors:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Direct competitors (same core function)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Indirect competitors (overlapping audience)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Category leaders (top downloads)","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Extract competitor keywords from:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"App titles and subtitles","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"First 100 words of descriptions","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Visible metadata patterns","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Build competitor keyword matrix:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Map which keywords each competitor targets","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Calculate coverage percentage per keyword","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Identify keyword gaps:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Keywords with \u003c40% competitor coverage","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"High volume terms competitors miss","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Long-tail opportunities","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Analyze competitor visual assets:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Icon design patterns","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Screenshot messaging and style","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Video presence and quality","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Compare ratings and review patterns:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Average rating by competitor","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Common praise themes","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Common complaint themes","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Document positioning opportunities","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Validation:","type":"text","marks":[{"type":"strong"}]},{"text":" 10+ competitors analyzed; keyword matrix complete; gaps identified with volume estimates; visual audit documented","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Competitor Analysis Matrix","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Analysis Area","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Data Points","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Keywords","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Title keywords, description frequency","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Metadata","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Character utilization, keyword density","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Visuals","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Icon style, screenshot count/style","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Ratings","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Average rating, total count, velocity","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Reviews","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Top praise, top complaints","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Gap Analysis Template","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Opportunity Type","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Example","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Action","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Keyword gap","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"habit tracker\" (40% coverage)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Add to keyword field","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Feature gap","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Competitor lacks widget","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Highlight in screenshots","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Visual gap","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"No videos in top 5","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Create app preview","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Messaging gap","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"None mention \"free\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Test free positioning","type":"text"}]}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"App Launch Workflow","type":"text"}]},{"type":"paragraph","content":[{"text":"Execute a structured launch for maximum initial visibility.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Workflow: Launch App to Stores","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Complete pre-launch preparation (4 weeks before):","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Finalize keywords and metadata","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Prepare all visual assets","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Set up analytics (Firebase, Mixpanel)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Build press kit and media list","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Submit for review (2 weeks before):","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Complete all store requirements","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Verify compliance with guidelines","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Prepare launch communications","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Configure post-launch systems:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Set up review monitoring","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Prepare response templates","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Configure rating prompt timing","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Execute launch day:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Verify app is live in both stores","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Announce across all channels","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Begin review response cycle","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Monitor initial performance (days 1-7):","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Track download velocity hourly","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Monitor reviews and respond within 24 hours","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Document any issues for quick fixes","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Conduct 7-day retrospective:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Compare performance to projections","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Identify quick optimization wins","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Plan first metadata update","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Schedule first update (2 weeks post-launch)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Validation:","type":"text","marks":[{"type":"strong"}]},{"text":" App live in stores; analytics tracking; review responses within 24h; download velocity documented; first update scheduled","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Pre-Launch Checklist","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Category","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Items","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Metadata","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Title, subtitle, description, keywords","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Visual Assets","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Icon, screenshots (all sizes), video","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Compliance","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Age rating, privacy policy, content rights","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Technical","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"App binary, signing certificates","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Analytics","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"SDK integration, event tracking","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Marketing","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Press kit, social content, email ready","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Launch Timing Considerations","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Factor","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Recommendation","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Day of week","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Tuesday-Wednesday (avoid weekends)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Time of day","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Morning in target market timezone","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Seasonal","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Align with relevant category seasons","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Competition","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Avoid major competitor launch dates","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"See: ","type":"text"},{"text":"references/aso-best-practices.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/aso-best-practices.md","title":null}}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"A/B Testing Workflow","type":"text"}]},{"type":"paragraph","content":[{"text":"Test metadata and visual elements to improve conversion rates.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Workflow: Run A/B Test","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Select test element (prioritize by impact):","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Icon (highest impact)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Screenshot 1 (high impact)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Title (high impact)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Short description (medium impact)","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Form hypothesis:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"If we [change], then [metric] will [improve/increase] by [amount]\nbecause [rationale].","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Create variants:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Control: Current version","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Treatment: Single variable change","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Calculate required sample size:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Baseline conversion rate","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Minimum detectable effect (usually 5%)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Statistical significance (95%)","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Launch test:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Apple: Use Product Page Optimization","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Android: Use Store Listing Experiments","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Run test for minimum duration:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"At least 7 days","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Until statistical significance reached","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Analyze results:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Compare conversion rates","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Check statistical significance","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Document learnings","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Validation:","type":"text","marks":[{"type":"strong"}]},{"text":" Single variable tested; sample size sufficient; significance reached (95%); results documented; winner implemented","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"A/B Test Prioritization","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Element","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Conversion Impact","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Test Complexity","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"App Icon","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"10-25% lift possible","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Medium (design needed)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Screenshot 1","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"15-35% lift possible","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Medium","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Title","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"5-15% lift possible","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Low","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Short Description","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"5-10% lift possible","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Low","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Video","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"10-20% lift possible","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"High","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Sample Size Quick Reference","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Baseline CVR","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Impressions Needed (per variant)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"1%","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"31,000","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"2%","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"15,500","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"5%","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"6,200","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"10%","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"3,100","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Test Documentation Template","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"TEST ID: ASO-2025-001\nELEMENT: App Icon\nHYPOTHESIS: A bolder color icon will increase conversion by 10%\nSTART DATE: [Date]\nEND DATE: [Date]\n\nRESULTS:\n├── Control CVR: 4.2%\n├── Treatment CVR: 4.8%\n├── Lift: +14.3%\n├── Significance: 97%\n└── Decision: Implement treatment\n\nLEARNINGS:\n- Bold colors outperform muted tones in this category\n- Apply to screenshot backgrounds for next test","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Before/After Examples","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Title Optimization","type":"text"}]},{"type":"paragraph","content":[{"text":"Productivity App:","type":"text","marks":[{"type":"strong"}]}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Version","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Title","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Analysis","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Before","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"MyTasks\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"No keywords, brand only (8 chars)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"After","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"MyTasks - Todo List & Planner\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Primary + secondary keywords (29 chars)","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"Fitness App:","type":"text","marks":[{"type":"strong"}]}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Version","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Title","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Analysis","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Before","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"FitTrack Pro\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Generic modifier (12 chars)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"After","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"FitTrack: Workout Log & Gym\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Category keywords (27 chars)","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Subtitle Optimization (iOS)","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Version","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Subtitle","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Analysis","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Before","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"Get Things Done\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Vague, no keywords","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"After","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"Daily Task Manager & Planner\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Two keywords, benefit clear","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Keyword Field Optimization (iOS)","type":"text"}]},{"type":"paragraph","content":[{"text":"Before (Inefficient - 89 chars, 8 keywords):","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"task manager, todo list, productivity app, daily planner, reminder app","type":"text"}]},{"type":"paragraph","content":[{"text":"After (Optimized - 97 chars, 14 keywords):","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"task,todo,checklist,reminder,organize,daily,planner,schedule,deadline,goals,habit,widget,sync,team","type":"text"}]},{"type":"paragraph","content":[{"text":"Improvements:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Removed spaces after commas (+8 chars)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Removed duplicates (task manager → task)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Removed plurals (reminders → reminder)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Removed words in title","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Added more relevant keywords","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Description Opening","type":"text"}]},{"type":"paragraph","content":[{"text":"Before:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"MyTasks is a comprehensive task management solution designed\nto help busy professionals organize their daily activities\nand boost productivity.","type":"text"}]},{"type":"paragraph","content":[{"text":"After:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"Forget missed deadlines. MyTasks keeps every task, reminder,\nand project in one place—so you focus on doing, not remembering.\nTrusted by 500,000+ professionals.","type":"text"}]},{"type":"paragraph","content":[{"text":"Improvements:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Leads with user pain point","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Specific benefit (not generic \"boost productivity\")","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Social proof included","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Keywords natural, not stuffed","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Screenshot Caption Evolution","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Version","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Caption","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Issue","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Before","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"Task List Feature\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Feature-focused, passive","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Better","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"Create Task Lists\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Action verb, but still feature","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Best","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"Never Miss a Deadline\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Benefit-focused, emotional","type":"text"}]}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Tools and References","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Scripts","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Script","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Purpose","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Usage","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"keyword_analyzer.py","type":"text","marks":[{"type":"link","attrs":{"href":"scripts/keyword_analyzer.py","title":null}}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Analyze keywords for volume and competition","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"python keyword_analyzer.py --keywords \"todo,task,planner\"","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"metadata_optimizer.py","type":"text","marks":[{"type":"link","attrs":{"href":"scripts/metadata_optimizer.py","title":null}}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Validate metadata character limits and density","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"python metadata_optimizer.py --platform ios --title \"App Title\"","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"competitor_analyzer.py","type":"text","marks":[{"type":"link","attrs":{"href":"scripts/competitor_analyzer.py","title":null}}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Extract and compare competitor keywords","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"python competitor_analyzer.py --competitors \"App1,App2,App3\"","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"aso_scorer.py","type":"text","marks":[{"type":"link","attrs":{"href":"scripts/aso_scorer.py","title":null}}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Calculate overall ASO health score","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"python aso_scorer.py --app-id com.example.app","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"ab_test_planner.py","type":"text","marks":[{"type":"link","attrs":{"href":"scripts/ab_test_planner.py","title":null}}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Plan tests and calculate sample sizes","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"python ab_test_planner.py --cvr 0.05 --lift 0.10","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"review_analyzer.py","type":"text","marks":[{"type":"link","attrs":{"href":"scripts/review_analyzer.py","title":null}}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Analyze review sentiment and themes","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"python review_analyzer.py --app-id com.example.app","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"launch_checklist.py","type":"text","marks":[{"type":"link","attrs":{"href":"scripts/launch_checklist.py","title":null}}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Generate platform-specific launch checklists","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"python launch_checklist.py --platform ios","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"localization_helper.py","type":"text","marks":[{"type":"link","attrs":{"href":"scripts/localization_helper.py","title":null}}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Manage multi-language metadata","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"python localization_helper.py --locales \"en,es,de,ja\"","type":"text","marks":[{"type":"code_inline"}]}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"References","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Document","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Content","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"platform-requirements.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/platform-requirements.md","title":null}}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"iOS and Android metadata specs, visual asset requirements","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"aso-best-practices.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/aso-best-practices.md","title":null}}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Optimization strategies, rating management, launch tactics","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"keyword-research-guide.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/keyword-research-guide.md","title":null}}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Research methodology, evaluation framework, tracking","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Assets","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Template","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Purpose","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"aso-audit-template.md","type":"text","marks":[{"type":"link","attrs":{"href":"assets/aso-audit-template.md","title":null}}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Structured audit checklist for app store listings","type":"text"}]}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Platform Notes","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Platform / Constraint","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Behavior / Impact","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"iOS keyword changes","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Require app submission","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"iOS promotional text","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Editable without an app update","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Android metadata changes","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Index in 1-2 hours","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Android keyword field","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"None — use description instead","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Keyword volume data","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Estimates only; no official source","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Competitor data","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Public listings only","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"When not to use this skill:","type":"text","marks":[{"type":"strong"}]},{"text":" web apps (use web SEO), enterprise/internal apps, TestFlight-only betas, or paid advertising strategy.","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Related Skills","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Skill","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Integration Point","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"content-creator","type":"text","marks":[{"type":"link","attrs":{"href":"../content-creator/","title":null}}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"App description copywriting","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"marketing-demand-acquisition","type":"text","marks":[{"type":"link","attrs":{"href":"../marketing-demand-acquisition/","title":null}}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Launch promotion campaigns","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"marketing-strategy-pmm","type":"text","marks":[{"type":"link","attrs":{"href":"../marketing-strategy-pmm/","title":null}}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Go-to-market planning","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Proactive Triggers","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"No keyword optimization in title","type":"text","marks":[{"type":"strong"}]},{"text":" → App title is the #1 ranking factor. Include top keyword.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Screenshots don't show value","type":"text","marks":[{"type":"strong"}]},{"text":" → Screenshots should tell a story, not show UI.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"No ratings strategy","type":"text","marks":[{"type":"strong"}]},{"text":" → Below 4.0 stars kills conversion. Implement in-app rating prompts.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Description keyword-stuffed","type":"text","marks":[{"type":"strong"}]},{"text":" → Natural language with keywords beats keyword stuffing.","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Output Artifacts","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"When you ask for...","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"You get...","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"ASO audit\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Full app store listing audit with prioritized fixes","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"Keyword research\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Keyword list with search volume and difficulty scores","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"Optimize my listing\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Rewritten title, subtitle, description, keyword field","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Communication","type":"text"}]},{"type":"paragraph","content":[{"text":"All output passes quality verification:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Self-verify: source attribution, assumption audit, confidence scoring","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Output format: Bottom Line → What (with confidence) → Why → How to Act","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Results only. Every finding tagged: 🟢 verified, 🟡 medium, 🔴 assumed.","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}}]},"metadata":{"date":"2026-06-05","name":"app-store-optimization","author":"@skillopedia","source":{"stars":16818,"repo_name":"claude-skills","origin_url":"https://github.com/alirezarezvani/claude-skills/blob/HEAD/marketing-skill/skills/app-store-optimization/SKILL.md","repo_owner":"alirezarezvani","body_sha256":"2eb98b482e4bdcd605163d74e3759072a2a156eb13340f6bdabd9098d8f8a58a","cluster_key":"a3ba40724ef257077e0bde3e8b0156664f8fb940ced9dc78b37cb425dbba0fce","clean_bundle":{"format":"clean-skill-bundle-v1","source":"alirezarezvani/claude-skills/marketing-skill/skills/app-store-optimization/SKILL.md","attachments":[{"id":"b3ae0820-5f06-518a-a019-d2a1bb23f92a","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/b3ae0820-5f06-518a-a019-d2a1bb23f92a/attachment.md","path":"HOW_TO_USE.md","size":10252,"sha256":"88163da94aff5fd03196f635f7e1640e14cf7be8e76fa3086473cbc41e03f18e","contentType":"text/markdown; charset=utf-8"},{"id":"643c7a90-d4c7-5f3a-b3cb-2589f658e775","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/643c7a90-d4c7-5f3a-b3cb-2589f658e775/attachment.md","path":"README.md","size":14917,"sha256":"4c3289588110cbb07049b15e05b22a3e3c251e62305be94e3952195c36d701d2","contentType":"text/markdown; charset=utf-8"},{"id":"290508ef-3105-5654-815b-f46bda157335","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/290508ef-3105-5654-815b-f46bda157335/attachment.md","path":"assets/aso-audit-template.md","size":4871,"sha256":"3a96bbc323bf420b59219c0d0e223393850a923c94c4a52df0acf992739ee010","contentType":"text/markdown; charset=utf-8"},{"id":"569be2fe-6ee1-5928-b57d-8cd749f4baf4","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/569be2fe-6ee1-5928-b57d-8cd749f4baf4/attachment.json","path":"expected_output.json","size":5492,"sha256":"59db04fda533c3f2e0e0aa6387afd5bdd09b8278234af22ef4b40c85dcf92c47","contentType":"application/json; charset=utf-8"},{"id":"8303bda0-eb66-5644-a8dc-2d9a4f2923d9","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/8303bda0-eb66-5644-a8dc-2d9a4f2923d9/attachment.md","path":"references/aso-best-practices.md","size":12488,"sha256":"e86e9710a8dcdd5034c19113eb41a232104531c71f1339e7135dfe0c1aa33c82","contentType":"text/markdown; charset=utf-8"},{"id":"658263fc-a87a-56e2-b4e6-e21fce55d72a","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/658263fc-a87a-56e2-b4e6-e21fce55d72a/attachment.md","path":"references/keyword-research-guide.md","size":11906,"sha256":"631a6206414ab908f3e09c218a83a6deaec5dfec3b869336d8420da9b072f833","contentType":"text/markdown; charset=utf-8"},{"id":"782bd4d7-7ffa-5e62-9a8c-4d5fdbcea9d3","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/782bd4d7-7ffa-5e62-9a8c-4d5fdbcea9d3/attachment.md","path":"references/platform-requirements.md","size":9575,"sha256":"686604daedaf48e0f6bc70a9ad4b327069c54ee524c1104c56e45f6a1d45fe34","contentType":"text/markdown; charset=utf-8"},{"id":"62a79674-d943-5701-bb52-cdcbee65e2ff","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/62a79674-d943-5701-bb52-cdcbee65e2ff/attachment.json","path":"sample_input.json","size":723,"sha256":"e4abb74979b21e8707e0026b77d76bfa882416710a49d35b9985b7ca692de585","contentType":"application/json; charset=utf-8"},{"id":"ea3149ec-fbf2-5831-b9ac-28fb39441a89","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/ea3149ec-fbf2-5831-b9ac-28fb39441a89/attachment.py","path":"scripts/ab_test_planner.py","size":22857,"sha256":"bc65f41e0fe84170b02e83b4648d3d2dbb460e9588acb1e1bea4d7d9e63d1a95","contentType":"text/x-python; charset=utf-8"},{"id":"d47f23bd-4889-5c38-b7b1-3f0ead29a6b9","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/d47f23bd-4889-5c38-b7b1-3f0ead29a6b9/attachment.py","path":"scripts/aso_scorer.py","size":18966,"sha256":"df2854642b889a55877f2420563a22a753dc157723a3c7fe40d3dfcfc16b7892","contentType":"text/x-python; charset=utf-8"},{"id":"24fd807f-c7a9-59c0-b9ec-a27558f6ce57","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/24fd807f-c7a9-59c0-b9ec-a27558f6ce57/attachment.py","path":"scripts/competitor_analyzer.py","size":21340,"sha256":"df64cf5b9c863afabebca1461230039287c6075806895e21541f8471c10f47c8","contentType":"text/x-python; charset=utf-8"},{"id":"efc1e3fe-bf4d-5174-a329-c8f16a92f261","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/efc1e3fe-bf4d-5174-a329-c8f16a92f261/attachment.py","path":"scripts/keyword_analyzer.py","size":13108,"sha256":"7d66b1043a859eecfe919649c82f693ac841a18361cffffc5a8faf92e2c432f4","contentType":"text/x-python; charset=utf-8"},{"id":"aa8981e8-b488-5d04-83b1-5235b3b5927c","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/aa8981e8-b488-5d04-83b1-5235b3b5927c/attachment.py","path":"scripts/launch_checklist.py","size":28949,"sha256":"4d820f097856c612b7f41bd02319f5003384af237318ad0139e0f62c723587a1","contentType":"text/x-python; charset=utf-8"},{"id":"f3d3b238-ed20-5437-9663-3055a5a2cb86","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/f3d3b238-ed20-5437-9663-3055a5a2cb86/attachment.py","path":"scripts/localization_helper.py","size":22142,"sha256":"1c6c26fc2c8c87867d02777bcd90753ed461319573df7961ccaf38bb2c29726b","contentType":"text/x-python; charset=utf-8"},{"id":"a26ee2f5-138f-54b1-aa8f-45c9e93b3599","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/a26ee2f5-138f-54b1-aa8f-45c9e93b3599/attachment.py","path":"scripts/metadata_optimizer.py","size":20824,"sha256":"e689b3521cad59b510b89e5e6d9536519286e521079f805fe016d7546d68702f","contentType":"text/x-python; charset=utf-8"},{"id":"18e6e7fa-1282-59d1-90ce-6bff22465005","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/18e6e7fa-1282-59d1-90ce-6bff22465005/attachment.py","path":"scripts/review_analyzer.py","size":25561,"sha256":"395f675845886fd88b28c94c445b7450e60522c1acf0e0cd26a7465cfef8560f","contentType":"text/x-python; charset=utf-8"}],"bundle_sha256":"24d17630964262433396af457eb6663d80162441ccce7dafe05ee6e83d6d0848","attachment_count":16,"text_attachments":16,"attachment_storage":"skillopedia-attachments-v1","binary_attachments":0,"excluded_attachments":[]},"cluster_size":3,"skill_md_path":"marketing-skill/skills/app-store-optimization/SKILL.md","import_metadata":{"date":"2026-06-05","author":"@skillopedia","version":"v1","category":"testing-qa","category_label":"Testing"},"exact_dupes_collapsed_into_this":2},"version":"v1","category":"testing-qa","triggers":["ASO","app store optimization","app store ranking","app keywords","app metadata","play store optimization","app store listing","improve app rankings","app visibility","app store SEO","mobile app marketing","app conversion rate"],"import_tag":"clean-skills-v1","description":"App Store Optimization (ASO) toolkit for researching keywords, analyzing competitor rankings, generating metadata suggestions, and improving app visibility on Apple App Store and Google Play Store. Use when the user asks about ASO, app store rankings, app metadata, app titles and descriptions, app store listings, app visibility, or mobile app marketing on iOS or Android. Supports keyword research and scoring, competitor keyword analysis, metadata optimization, A/B test planning, launch checklists, and tracking ranking changes."}},"renderedAt":1782979554351}

App Store Optimization (ASO) --- Keyword Research Workflow Discover and evaluate keywords that drive app store visibility. Workflow: Conduct Keyword Research 1. Define target audience and core app functions: - Primary use case (what problem does the app solve) - Target user demographics - Competitive category 2. Generate seed keywords from: - App features and benefits - User language (not developer terminology) - App store autocomplete suggestions 3. Expand keyword list using: - Modifiers (free, best, simple) - Actions (create, track, organize) - Audiences (for students, for teams, for busine…