Mobile App Review Intelligence
Analyze iOS and Android app reviews across a target app and competitors, then convert the raw review text into a prioritized product, QA, and positioning report.
Prerequisites
- Apify account and either an authenticated Apify CLI session or
APIFY_TOKEN.
- App Store numeric IDs or URLs when available.
- Google Play package names or URLs when available.
- Target countries, time window, max reviews per app, and whether to include competitors.
Workflow
- Collect scope. Ask for target app name, known iOS App Store URL or ID, known Android package or Play URL, competitor apps, countries, time window, max reviews per app, and report goal.
- Resolve missing app IDs. If the user only gives app names, run Google Search for
site:apps.apple.com and site:play.google.com/store/apps/details queries. Keep only results whose app title, developer, and category match the target.
- Scrape iOS reviews. Run
jdtpnjtp/apple-app-store-scraper for known iOS app IDs or URLs, one run per country group if needed.
- Scrape Android reviews. Run
neatrat/google-play-store-reviews-scraper for known Play package names or URLs.
- Crawl supporting pages. Run Google Search for release notes, help-center pages, pricing pages, public roadmaps, and competitor comparison pages, then crawl the best URLs with
apify/website-content-crawler.
- Normalize evidence. Merge reviews into a shared schema: platform, app, country, rating, date, version, title, body, developer response, URL or source run ID.
- Classify themes. Assign each review to at most two primary themes: bug, performance, UX confusion, missing feature, pricing, account/login, notification, onboarding, support, localization, billing, privacy, praise, or other.
- Prioritize. Score each theme by volume, rating severity, recency, cross-platform spread, competitor gap, and evidence quality.
- Deliver. Produce a compact executive summary, evidence tables, review excerpts, competitor gaps, and recommended roadmap actions.
Actor routing
| Need |
Actor ID |
Tier |
Best for |
| Discover app store URLs from names |
apify/google-search-scraper |
apify |
Finding App Store and Google Play result URLs when IDs are missing |
| Scrape iOS App Store reviews |
jdtpnjtp/apple-app-store-scraper |
community |
App Store reviews, app metadata, country-specific iOS feedback |
| Scrape Google Play reviews |
neatrat/google-play-store-reviews-scraper |
community |
Android reviews by package name or Play URL |
| Crawl release notes and help docs |
apify/website-content-crawler |
apify |
Competitor docs, release notes, pricing pages, public support pages |
Prefer verified, non-deprecated Actors. Before a large run, inspect each Actor schema because community Actor fields can change.
Calling Actors - Apify CLI
Use these as payload patterns. Replace IDs, countries, and limits with the user's scope.
# Discover missing iOS / Android app URLs
apify actors call "apify/google-search-scraper" \
-i '{"queries":"Slack app site:apps.apple.com\nSlack app site:play.google.com/store/apps/details","maxPagesPerQuery":1,"resultsPerPage":10,"countryCode":"us","languageCode":"en"}' \
--json \
--user-agent apify-awesome-skills/apify-mobile-app-review-intelligence \
2>/dev/null
# iOS App Store reviews
apify actors call "jdtpnjtp/apple-app-store-scraper" \
-i '{"mode":"lookup","appUrls":["https://apps.apple.com/us/app/slack/id618783545"],"country":"us","includeReviews":true,"maxReviews":500,"timePeriod":"30d","includeAppInfo":true}' \
--json \
--user-agent apify-awesome-skills/apify-mobile-app-review-intelligence \
2>/dev/null
# Android Google Play reviews
apify actors call "neatrat/google-play-store-reviews-scraper" \
-i '{"appIdOrUrl":"com.Slack","sortBy":"newest","maxReviews":500,"recentDays":30,"uniqueOnly":true}' \
--json \
--user-agent apify-awesome-skills/apify-mobile-app-review-intelligence \
2>/dev/null
# Crawl release notes, help docs, pricing pages, or competitor pages
apify actors call "apify/website-content-crawler" \
-i '{"startUrls":[{"url":"https://slack.com/release-notes"}],"maxCrawlPages":20,"outputMarkdown":true}' \
--json \
--user-agent apify-awesome-skills/apify-mobile-app-review-intelligence \
2>/dev/null
# Inspect schema and fetch dataset results
apify actors info "neatrat/google-play-store-reviews-scraper" --input --json \
--user-agent apify-awesome-skills/apify-mobile-app-review-intelligence 2>/dev/null
apify datasets get-items DATASET_ID --format json \
--user-agent apify-awesome-skills/apify-mobile-app-review-intelligence 2>/dev/null
The Apify MCP server at https://mcp.apify.com is an equivalent interface. Keep the same actor routing and output schema.
Inputs to collect
Ask for these before running paid Actors:
| Input |
Required |
Notes |
| Target app |
yes |
Name plus iOS URL/ID and Android package/URL if known |
| Competitors |
no |
Use 2-5 direct competitors for gap analysis |
| Countries |
yes |
Default to us; use all for iOS only after cost confirmation |
| Time window |
yes |
Default 30d; use 7d for release monitoring |
| Max reviews per app |
yes |
Default 500; confirm before more than 5,000 per app |
| Ratings to emphasize |
no |
Default all ratings; use 1-3 stars for bug triage |
| Goal |
yes |
roadmap, release-regression, competitor-gap, ASO-sentiment, or custom |
| Output format |
yes |
Markdown table, CSV-ready table, or JSON summary |
Data normalization
Create one normalized row per review:
| Field |
Source |
app |
User label or App Store / Play metadata |
platform |
ios or android |
country |
Actor input country |
rating |
iOS rating; Android rating |
date |
iOS date; Android date |
version |
iOS version; Android appVersion |
title |
iOS title; Android blank if unavailable |
body |
iOS text; Android body |
developerResponse |
iOS developerResponse.body; Android blank unless present |
reviewId |
iOS id; Android reviewId |
sourceRunId |
Apify run ID or dataset URL |
If a field is missing, write Not found. Do not infer version, country, or platform.
Theme and priority scoring
For each normalized review:
- Drop spam, one-word noise, duplicate bodies, and reviews with no actionable text.
- Label sentiment from
very_negative, negative, mixed, positive, very_positive.
- Assign up to two themes. Prefer concrete product themes over generic sentiment.
- Extract one evidence quote under 35 words.
- Detect whether the user describes a bug, desired feature, competitor comparison, workflow blocker, or praise.
Score each theme:
| Factor |
Points |
| Appears in at least 5 reviews |
+2 |
| Median rating is 1 or 2 stars |
+2 |
| Present on both iOS and Android |
+2 |
| Increased in the last 7 days |
+2 |
| Mentions a competitor advantage |
+2 |
| Mentioned on crawled release notes or help docs |
-1 if already solved, +1 if competitor ships it |
Priority:
P0: score 7+ and includes bug, login, billing, data loss, crash, or release regression.
P1: score 5-6 or clear competitor gap with repeated demand.
P2: score 3-4 and useful but not urgent.
Watch: low volume, unclear evidence, or praise-only themes.
Report format
Return these sections:
- Scope and coverage - apps, platforms, countries, time window, review counts, Apify run IDs or dataset links.
- Executive summary - 5 bullets max, each tied to evidence.
- Priority table -
Priority | Theme | Evidence count | Platforms | Rating impact | Competitor gap | Recommended action.
- Theme evidence - 2-4 short excerpts per P0/P1 theme with app, platform, rating, date, and version.
- Competitor gaps - features or promises competitors have that the target app reviews complain about.
- Release watch - new or spiking issues in the selected recent window.
- Caveats - missing platforms, missing countries, incomplete schemas, or low review volume.
Never claim statistical certainty from small samples. Label results from fewer than 50 reviews as directional.
Cost and safety guardrails
- Confirm before scraping more than 5 apps, more than 5 countries, or more than 5,000 reviews per app.
- Avoid iOS
country: "all" unless the user explicitly wants multi-market coverage; it multiplies work across many countries.
- Start with
maxReviews: 200 for a smoke test when the app ID is uncertain.
- For Google Play, use
recentDays instead of fetching all history when the user asks about a launch or release.
- For iOS, use
timePeriod such as 7d, 30d, or 90d for recent analysis.
- Check each Actor pricing tab before quoting exact costs.
Troubleshooting
- App not found - Re-run Google Search with developer name and store-specific query, then verify title and developer manually.
- Wrong app matched - Compare developer name, icon, category, and store URL before running review Actors.
- iOS proxy failure - The Apple Actor may require an Apify proxy group on some plans. Try one country first and report the run error if it fails.
- Google Play returns zero reviews - Check
appIdOrUrl, switch sortBy to newest, remove keyword filters, and lower recentDays constraints.
- Dataset too large - Fetch only needed fields with
apify datasets get-items DATASET_ID --format json and summarize in batches.
- Conflicting signals - Separate platform-specific issues instead of averaging them away.
1---2name: apify-mobile-app-review-intelligence3description: Turn App Store and Google Play reviews into product-roadmap intelligence by chaining Apify Actors for iOS reviews, Android reviews, SERP-based app discovery, and website or help-center crawling. Use when the user asks to analyze mobile app reviews, compare app competitors, find bugs or feature requests in reviews, prioritize a mobile roadmap, monitor release feedback, audit ASO sentiment, or explain why an app's ratings changed across iOS and Android.4---56# Mobile App Review Intelligence78Analyze iOS and Android app reviews across a target app and competitors, then convert the raw review text into a prioritized product, QA, and positioning report.910## Prerequisites1112- Apify account and either an authenticated Apify CLI session or `APIFY_TOKEN`.13- App Store numeric IDs or URLs when available.14- Google Play package names or URLs when available.15- Target countries, time window, max reviews per app, and whether to include competitors.1617## Workflow18191. **Collect scope.** Ask for target app name, known iOS App Store URL or ID, known Android package or Play URL, competitor apps, countries, time window, max reviews per app, and report goal.202. **Resolve missing app IDs.** If the user only gives app names, run Google Search for `site:apps.apple.com` and `site:play.google.com/store/apps/details` queries. Keep only results whose app title, developer, and category match the target.213. **Scrape iOS reviews.** Run `jdtpnjtp/apple-app-store-scraper` for known iOS app IDs or URLs, one run per country group if needed.224. **Scrape Android reviews.** Run `neatrat/google-play-store-reviews-scraper` for known Play package names or URLs.235. **Crawl supporting pages.** Run Google Search for release notes, help-center pages, pricing pages, public roadmaps, and competitor comparison pages, then crawl the best URLs with `apify/website-content-crawler`.246. **Normalize evidence.** Merge reviews into a shared schema: platform, app, country, rating, date, version, title, body, developer response, URL or source run ID.257. **Classify themes.** Assign each review to at most two primary themes: bug, performance, UX confusion, missing feature, pricing, account/login, notification, onboarding, support, localization, billing, privacy, praise, or other.268. **Prioritize.** Score each theme by volume, rating severity, recency, cross-platform spread, competitor gap, and evidence quality.279. **Deliver.** Produce a compact executive summary, evidence tables, review excerpts, competitor gaps, and recommended roadmap actions.2829## Actor routing3031| Need | Actor ID | Tier | Best for |32|------|----------|------|----------|33| Discover app store URLs from names | `apify/google-search-scraper` | apify | Finding App Store and Google Play result URLs when IDs are missing |34| Scrape iOS App Store reviews | `jdtpnjtp/apple-app-store-scraper` | community | App Store reviews, app metadata, country-specific iOS feedback |35| Scrape Google Play reviews | `neatrat/google-play-store-reviews-scraper` | community | Android reviews by package name or Play URL |36| Crawl release notes and help docs | `apify/website-content-crawler` | apify | Competitor docs, release notes, pricing pages, public support pages |3738Prefer verified, non-deprecated Actors. Before a large run, inspect each Actor schema because community Actor fields can change.3940## Calling Actors - Apify CLI4142Use these as payload patterns. Replace IDs, countries, and limits with the user's scope.4344```bash45# Discover missing iOS / Android app URLs46apify actors call "apify/google-search-scraper" \47 -i '{"queries":"Slack app site:apps.apple.com\nSlack app site:play.google.com/store/apps/details","maxPagesPerQuery":1,"resultsPerPage":10,"countryCode":"us","languageCode":"en"}' \48 --json \49 --user-agent apify-awesome-skills/apify-mobile-app-review-intelligence \50 2>/dev/null51```5253```bash54# iOS App Store reviews55apify actors call "jdtpnjtp/apple-app-store-scraper" \56 -i '{"mode":"lookup","appUrls":["https://apps.apple.com/us/app/slack/id618783545"],"country":"us","includeReviews":true,"maxReviews":500,"timePeriod":"30d","includeAppInfo":true}' \57 --json \58 --user-agent apify-awesome-skills/apify-mobile-app-review-intelligence \59 2>/dev/null60```6162```bash63# Android Google Play reviews64apify actors call "neatrat/google-play-store-reviews-scraper" \65 -i '{"appIdOrUrl":"com.Slack","sortBy":"newest","maxReviews":500,"recentDays":30,"uniqueOnly":true}' \66 --json \67 --user-agent apify-awesome-skills/apify-mobile-app-review-intelligence \68 2>/dev/null69```7071```bash72# Crawl release notes, help docs, pricing pages, or competitor pages73apify actors call "apify/website-content-crawler" \74 -i '{"startUrls":[{"url":"https://slack.com/release-notes"}],"maxCrawlPages":20,"outputMarkdown":true}' \75 --json \76 --user-agent apify-awesome-skills/apify-mobile-app-review-intelligence \77 2>/dev/null78```7980```bash81# Inspect schema and fetch dataset results82apify actors info "neatrat/google-play-store-reviews-scraper" --input --json \83 --user-agent apify-awesome-skills/apify-mobile-app-review-intelligence 2>/dev/null84apify datasets get-items DATASET_ID --format json \85 --user-agent apify-awesome-skills/apify-mobile-app-review-intelligence 2>/dev/null86```8788The Apify MCP server at <https://mcp.apify.com> is an equivalent interface. Keep the same actor routing and output schema.8990## Inputs to collect9192Ask for these before running paid Actors:9394| Input | Required | Notes |95|-------|----------|-------|96| Target app | yes | Name plus iOS URL/ID and Android package/URL if known |97| Competitors | no | Use 2-5 direct competitors for gap analysis |98| Countries | yes | Default to `us`; use `all` for iOS only after cost confirmation |99| Time window | yes | Default `30d`; use `7d` for release monitoring |100| Max reviews per app | yes | Default 500; confirm before more than 5,000 per app |101| Ratings to emphasize | no | Default all ratings; use 1-3 stars for bug triage |102| Goal | yes | `roadmap`, `release-regression`, `competitor-gap`, `ASO-sentiment`, or custom |103| Output format | yes | Markdown table, CSV-ready table, or JSON summary |104105## Data normalization106107Create one normalized row per review:108109| Field | Source |110|-------|--------|111| `app` | User label or App Store / Play metadata |112| `platform` | `ios` or `android` |113| `country` | Actor input country |114| `rating` | iOS `rating`; Android `rating` |115| `date` | iOS `date`; Android `date` |116| `version` | iOS `version`; Android `appVersion` |117| `title` | iOS `title`; Android blank if unavailable |118| `body` | iOS `text`; Android `body` |119| `developerResponse` | iOS `developerResponse.body`; Android blank unless present |120| `reviewId` | iOS `id`; Android `reviewId` |121| `sourceRunId` | Apify run ID or dataset URL |122123If a field is missing, write `Not found`. Do not infer version, country, or platform.124125## Theme and priority scoring126127For each normalized review:1281291. Drop spam, one-word noise, duplicate bodies, and reviews with no actionable text.1302. Label sentiment from `very_negative`, `negative`, `mixed`, `positive`, `very_positive`.1313. Assign up to two themes. Prefer concrete product themes over generic sentiment.1324. Extract one evidence quote under 35 words.1335. Detect whether the user describes a bug, desired feature, competitor comparison, workflow blocker, or praise.134135Score each theme:136137| Factor | Points |138|--------|--------|139| Appears in at least 5 reviews | +2 |140| Median rating is 1 or 2 stars | +2 |141| Present on both iOS and Android | +2 |142| Increased in the last 7 days | +2 |143| Mentions a competitor advantage | +2 |144| Mentioned on crawled release notes or help docs | -1 if already solved, +1 if competitor ships it |145146Priority:147148- `P0`: score 7+ and includes bug, login, billing, data loss, crash, or release regression.149- `P1`: score 5-6 or clear competitor gap with repeated demand.150- `P2`: score 3-4 and useful but not urgent.151- `Watch`: low volume, unclear evidence, or praise-only themes.152153## Report format154155Return these sections:1561571. **Scope and coverage** - apps, platforms, countries, time window, review counts, Apify run IDs or dataset links.1582. **Executive summary** - 5 bullets max, each tied to evidence.1593. **Priority table** - `Priority | Theme | Evidence count | Platforms | Rating impact | Competitor gap | Recommended action`.1604. **Theme evidence** - 2-4 short excerpts per P0/P1 theme with app, platform, rating, date, and version.1615. **Competitor gaps** - features or promises competitors have that the target app reviews complain about.1626. **Release watch** - new or spiking issues in the selected recent window.1637. **Caveats** - missing platforms, missing countries, incomplete schemas, or low review volume.164165Never claim statistical certainty from small samples. Label results from fewer than 50 reviews as directional.166167## Cost and safety guardrails168169- Confirm before scraping more than 5 apps, more than 5 countries, or more than 5,000 reviews per app.170- Avoid iOS `country: "all"` unless the user explicitly wants multi-market coverage; it multiplies work across many countries.171- Start with `maxReviews: 200` for a smoke test when the app ID is uncertain.172- For Google Play, use `recentDays` instead of fetching all history when the user asks about a launch or release.173- For iOS, use `timePeriod` such as `7d`, `30d`, or `90d` for recent analysis.174- Check each Actor pricing tab before quoting exact costs.175176## Troubleshooting177178- **App not found** - Re-run Google Search with developer name and store-specific query, then verify title and developer manually.179- **Wrong app matched** - Compare developer name, icon, category, and store URL before running review Actors.180- **iOS proxy failure** - The Apple Actor may require an Apify proxy group on some plans. Try one country first and report the run error if it fails.181- **Google Play returns zero reviews** - Check `appIdOrUrl`, switch `sortBy` to `newest`, remove keyword filters, and lower `recentDays` constraints.182- **Dataset too large** - Fetch only needed fields with `apify datasets get-items DATASET_ID --format json` and summarize in batches.183- **Conflicting signals** - Separate platform-specific issues instead of averaging them away.