# App Review Product Intelligence (`lokki/app-review-product-intelligence`) Actor

Turn Apple App Store and Google Play reviews into deterministic, evidence-linked product improvement priorities without AI.

- **URL**: https://apify.com/lokki/app-review-product-intelligence.md
- **Developed by:** [Ian Dikhtiar](https://apify.com/lokki) (community)
- **Categories:** Agents, Automation, Developer tools
- **Stats:** 3 total users, 2 monthly users, 81.3% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.40 / 1,000 app analyzeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## App Review Product Intelligence

Turn low-rating Apple App Store and Google Play reviews into a product-improvement brief whose every finding points back to real review IDs.

This standalone Apify Actor is built for founders, product managers, UX researchers, and competitive-intelligence teams. It collects auditable raw reviews, groups recurring evidence with a fixed taxonomy, ranks issues with a published formula, extracts explicit feature requests, and compares primary-product evidence with competitor evidence.

**No runtime AI. No LLM calls. No embeddings. No external AI APIs.** The method is deterministic TypeScript: the same review rows produce the same themes, scores, priorities, matched terms, and recommended investigate/validate actions.

### Outputs

- Default dataset: unified raw Apple and Google reviews for auditing/export.
- `REPORT`: complete JSON findings, feature requests, comparison signals, method, thresholds, and limitations.
- `REPORT.md`: concise human-readable report with evidence links.
- `SUMMARY`: success/partial/failure status and per-app diagnostics.
- `PROGRESS-{platform}-{appId}`: latest bounded scrape progress.

Each raw review includes platform, primary/competitor role, app metadata, discovery provenance, review ID/URL/title/text/rating/date/version, helpful count, developer reply where available, locale, and scrape time. Apple fields that its public feed does not expose are `null`; Google review titles are `null`.

### Input

In Apify Console, paste one store link or app ID per line—no JSON objects:

- **Your app links** are marked `primary`.
- **Competitor app links** are marked `competitor`.
- **Discover competitors by search** searches both stores and marks matches `competitor`.

Apple URLs and numeric IDs are auto-detected. Google Play URLs and package IDs are auto-detected.

API input uses the same simple string lists:

```json
{
  "primaryApps": [
    "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580"
  ],
  "competitorApps": [
    "https://play.google.com/store/apps/details?id=com.google.android.apps.youtube.music"
  ],
  "searchTerms": [
    "music streaming"
  ],
  "minRating": 1,
  "maxRating": 2,
  "maxReviewsPerApp": 100,
  "country": "us",
  "language": "en"
}
```

Search discovery uses Apple's public iTunes Search API and Google Play search. Direct apps keep their list role; discovered apps are competitors.

Defaults focus on actionable negative evidence: ratings 1–2, 500 matching reviews per app, 3 apps per search, and 10 total apps. Hard caps are 25 total apps, 10 apps per search, and 2,000 matching reviews per app. Apple is additionally capped to the 10 pages exposed by its public RSS endpoint. Requests time out after 15 seconds, temporary failures receive bounded retries, and 404 responses are not retried.

See [examples/input.json](examples/input.json).

### Deterministic method

The Actor normalizes review title and text, then matches transparent phrases/regular expressions for:

- crashes/performance
- login/account
- subscriptions/payments
- ads
- update regressions
- usability/navigation
- sync/data loss
- notifications
- support
- privacy
- battery
- connectivity
- localization/accessibility
- missing features

It separately extracts explicit requests beginning with phrases such as `please add`, `wish`, `needs`, `should have`, `would be better if`, and `missing`.

For each app/theme:

```text
score = round(
  share of negative reviews × 60
  + min(occurrences / 5, 1) × 25
  + min(helpful votes / 20, 1) × 15
)
```

Priority thresholds are critical 80–100, high 60–79, medium 35–59, and low 0–34. Confidence is high at 5+ matching reviews, medium at 2–4, and low at 1. Recommendations come from a fixed map and are deliberately framed as investigations or validations. The Actor does not claim root cause, sentiment understanding, or an invented fix.

### Store limitations

- Apple customer-review RSS is public but bounded to at most 10 pages. Availability varies by storefront. It does not expose helpful counts or developer replies.
- Google and Apple control what their public endpoints expose and may omit, repeat, or reorder reviews.
- Locale selection changes the visible sample. Results are not all worldwide reviews.
- Lexical matching can miss paraphrases or match ambiguous language. Read the evidence quotes and raw rows.
- Competitor signals compare only the collected low-rating sample; they are not market-wide prevalence claims.

Partial success is preserved: one failed app does not discard successful apps. If no target resolves, every app fails, or zero useful review rows are produced, the Actor writes a diagnostic `SUMMARY` and fails rather than silently returning an empty success.

# Actor input Schema

## `primaryApps` (type: `array`):

Apps treated as your primary products. Paste one link or ID per line.

## `competitorApps` (type: `array`):

Benchmark apps from either store. Paste one link or ID per line.

## `searchTerms` (type: `array`):

Searches both Apple and Google and treats discovered apps as competitors. Enter one phrase per line.

## `maxAppsPerDiscovery` (type: `integer`):

Maximum apps retained from each search phrase across the selected stores.

## `maxTotalApps` (type: `integer`):

Hard cap across your apps, competitors, and discovered apps.

## `minRating` (type: `integer`):

Lowest rating included in the raw reviews and report.

## `maxRating` (type: `integer`):

Highest rating included. Keep 2 for the worst-review workflow; use 3 for broader criticism.

## `maxReviewsPerApp` (type: `integer`):

Maximum matching reviews saved and analyzed for each app.

## `country` (type: `string`):

Two- or three-letter storefront code such as us, gb, ca, or au.

## `language` (type: `string`):

Google Play review language, such as en, es, de, or fr.

## Actor input object example

```json
{
  "primaryApps": [
    "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580"
  ],
  "competitorApps": [
    "https://play.google.com/store/apps/details?id=com.google.android.apps.youtube.music"
  ],
  "searchTerms": [
    "budget planner"
  ],
  "maxAppsPerDiscovery": 3,
  "maxTotalApps": 10,
  "minRating": 1,
  "maxRating": 2,
  "maxReviewsPerApp": 500,
  "country": "us",
  "language": "en"
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `report` (type: `string`):

No description

## `reportMarkdown` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "primaryApps": [
        "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580"
    ],
    "competitorApps": [
        "https://play.google.com/store/apps/details?id=com.google.android.apps.youtube.music"
    ],
    "searchTerms": [
        "budget planner"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("lokki/app-review-product-intelligence").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "primaryApps": ["https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580"],
    "competitorApps": ["https://play.google.com/store/apps/details?id=com.google.android.apps.youtube.music"],
    "searchTerms": ["budget planner"],
}

# Run the Actor and wait for it to finish
run = client.actor("lokki/app-review-product-intelligence").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "primaryApps": [
    "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580"
  ],
  "competitorApps": [
    "https://play.google.com/store/apps/details?id=com.google.android.apps.youtube.music"
  ],
  "searchTerms": [
    "budget planner"
  ]
}' |
apify call lokki/app-review-product-intelligence --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=lokki/app-review-product-intelligence",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/TT5pyWnFOU7YTaxCv/builds/ZRDR9A6AdvjLUNZ9e/openapi.json
