# Shopify App Store Review Intelligence (`taroyamada/shopify-app-store-review-intelligence`) Actor

Extracts and normalizes Shopify App Store app metadata, ratings, pricing hints, review samples, and keyword-based theme/feature-request rollups.

- **URL**: https://apify.com/taroyamada/shopify-app-store-review-intelligence.md
- **Developed by:** [太郎 山田](https://apify.com/taroyamada) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## Shopify App Store Review Intelligence API | Merchant Reviews, Pricing & Themes

Monitor one Shopify App Store listing with a structured row of ratings, pricing hints, AI summary text, and recurring merchant feedback themes. This actor is for app teams, partnerships, support, and growth operators who need a low-maintenance way to spot praise patterns, complaint clusters, and pricing or onboarding friction from public Shopify App Store pages without custom scraping.

### Store Quickstart

- Start with `store-input.example.json` for the smallest useful dataset run.
- Check `sample-output.example.json` for a recent single-listing sample captured from the repo's live parser output.
- Check `live-proof.example.json` for the latest live canary + contract proof on the public actor surface.
- Then move through `store-input.templates.json` in this order:
  - `Quickstart Baseline (Single App Listing)` — smallest useful dataset run for one listing
  - `Recurring Baseline (Multi-App Merchant Feedback Watch)` — same schema tuned for repeat monitoring
  - `Webhook Routed Alerts (Merchant Review Handoff)` — route the same payload after the dataset baseline and destination schema are stable

### What first success looks like

A good first run gives you:

1. `apps[]` — one merchant-review row with rating, pricing hints, AI summary text, and the recurring themes buyers care about first.
2. `reviewSamples[]` plus `rollups` — enough raw evidence and grouped complaints to validate whether onboarding, support, billing, or feature friction is real.
3. `warnings` and `endpointStatuses` — explicit source honesty when review pages are thin or a listing surface degrades.

### What it does

For each app URL or slug you provide, the actor:

1. **Fetches the public listing page** at `apps.shopify.com/{slug}`.
2. **Extracts structured metadata** from JSON-LD and HTML (name, developer, description, icon, category).
3. **Parses the rating summary** — overall score, total review count, per-star distribution, and star counts.
4. **Extracts pricing plan details** — plan names, pricing hints, free-trial indicators, and feature-list snippets.
5. **Collects the AI-generated review summary** that Shopify surfaces on listing pages.
6. **Samples individual reviews** from listing and paginated review pages (stars, date, store name, location, usage duration, body text, developer replies).
7. **Builds keyword-based rollups** — top themes (support, ease of use, bugs, billing, onboarding, etc.) and feature-request excerpts.

If certain surfaces are unavailable (for example no reviews or changed HTML structure), the actor returns explicit `warnings` instead of failing silently.

### Use Cases

| Who | Why |
|-----|-----|
| Shopify app teams | Track merchant praise, complaints, and onboarding friction without manual review reading |
| Partnerships / GTM teams | Compare category rivals on pricing posture, review volume, and recurring merchant themes |
| Support / success teams | Pull fresh review evidence into churn-risk, escalation, or FAQ workflows |
| Product teams | Spot feature gaps, support pain points, and billing friction from public merchant feedback |

### Input

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `appUrls` | string[] | *required* | Shopify App Store URLs or bare slugs |
| `reviewLimit` | integer | 100 | Max reviews to collect per app (1–500) |
| `timeoutMs` | integer | 20000 | HTTP timeout per request in ms |
| `delivery` | string | `"dataset"` | `"dataset"` or `"webhook"` |
| `webhookUrl` | string | — | Webhook URL when delivery=webhook |
| `dryRun` | boolean | false | Skip dataset/webhook writes |

#### Input Example

```json
{
  "appUrls": [
    "https://apps.shopify.com/omnisend",
    "klaviyo-email-marketing"
  ],
  "reviewLimit": 50,
  "delivery": "dataset",
  "dryRun": false
}
````

### Output

```jsonc
{
  "meta": {
    "generatedAt": "2026-04-10T17:06:42.111Z",
    "implementationStatus": "live",
    "totalSources": 1,
    "totals": { "apps": 1, "ok": 1, "errors": 0, "warningCount": 0, "totalReviewsSampled": 10 },
    "notes": ["..."]
  },
  "apps": [
    {
      "slug": "omnisend",
      "url": "https://apps.shopify.com/omnisend",
      "status": "ok",
      "app": { "name": "...", "developer": "...", "description": "...", "icon": "...", "category": "..." },
      "rating": { "overall": 4.8, "totalReviews": 2939, "distribution": { "5": 90, "...": "..." }, "starCounts": { "5": 2632, "...": "..." } },
      "pricing": { "hasFreeOption": true, "hasFreeTrial": false, "pricingHint": "Free to install", "plans": ["..."] },
      "reviewSummary": "Merchants praise this app for ...",
      "reviewSamples": [{ "id": "2090002", "stars": 5, "date": "February 21, 2026", "storeName": "...", "body": "..." }],
      "rollups": { "themes": [{ "theme": "customer support", "count": 5 }], "featureRequests": ["..."] },
      "warnings": [],
      "endpointStatuses": { "listing": "ok", "reviews": "ok" },
      "error": null
    }
  ]
}
```

### Proof buyers can inspect

| Buyer question | Proof asset | What it proves |
|----------------|-------------|----------------|
| "Will one listing already show a usable merchant-feedback story?" | `store-input.example.json` + `sample-output.example.json` | The quickstart returns rating, pricing hints, Shopify's AI summary text, sampled reviews, and grouped merchant themes from one listing. |
| "Is the public actor still working live on Apify?" | `live-proof.example.json` | The latest canary + contract proof passed on the public actor surface. |
| "How do I scale from one listing to a watchlist or routing workflow?" | `store-input.templates.json` | The quickstart, recurring, and webhook templates keep the same review schema while widening the monitoring lane. |

### Related Actors

Use this actor first when merchant-review intelligence is the starting signal. Add the next actor when you need to widen the commercial story:

- [Shopify Store Intelligence API](https://apify.com/taroyamada/shopify-store-intelligence) — Add when you also need the merchant's public storefront, catalog, or launch-page changes to explain review swings.
- [App Review Intelligence API | App Store + Google Play Summary](https://apify.com/taroyamada/app-review-cross-platform-intelligence) — Add when the same company also operates iOS / Android apps and you want merchant feedback plus consumer app sentiment in one portfolio.
- [Website Content Extractor](https://apify.com/taroyamada/website-content-extractor) — Add when pricing, onboarding, or help-center pages need clean copy for battlecards, churn analysis, or support QA.
- [Domain Security Audit API](https://apify.com/taroyamada/domain-trust-monitor) — Add when merchant complaints point to login, checkout, or trust issues on owned web properties.

### Pricing & Cost Control

Apify Store pricing is usage-based, so total cost mainly follows how many app listings you analyze and how many review pages you sample. Check the Store pricing card for the current per-event rates.

- Start with `Quickstart Baseline` on 1–2 listings in dataset mode while you validate the schema.
- Keep `reviewLimit` modest for `Recurring Baseline`; increase it only when deeper theme clustering changes decisions.
- Move to `Webhook Routed Alerts` once the merchant-feedback schema already fits your routing workflow.
- Use `dryRun: true` before recurring runs or larger watchlists.

### Local run

```bash
npm start          ## Uses input.json
npm test           ## Run unit tests
```

### Docker

```bash
docker build -t shopify-app-reviews .
docker run --rm shopify-app-reviews
```

### ⭐ Was this helpful?

If this actor saved you time, please [**leave a ★ rating**](https://apify.com/taroyamada/shopify-app-store-review-intelligence/reviews) on Apify Store. It takes 10 seconds, helps other developers discover it, and keeps updates free.

Bug report or feature request? Open an issue on the [Issues tab](https://apify.com/taroyamada/shopify-app-store-review-intelligence/issues) of this actor.

# Actor input Schema

## `appUrls` (type: `array`):

One or more Shopify App Store URLs (e.g. https://apps.shopify.com/omnisend) or app slugs (e.g. omnisend).

## `reviewLimit` (type: `integer`):

Maximum reviews per app to collect.

## `timeoutMs` (type: `integer`):

HTTP request timeout per page in milliseconds.

## `delivery` (type: `string`):

Where to send results: dataset or webhook.

## `webhookUrl` (type: `string`):

Webhook URL to POST results to when delivery=webhook.

## `dryRun` (type: `boolean`):

Run without saving results to dataset or webhook.

## Actor input object example

```json
{
  "appUrls": [
    "https://apps.shopify.com/omnisend"
  ],
  "reviewLimit": 100,
  "timeoutMs": 20000,
  "delivery": "dataset",
  "dryRun": false
}
```

# 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 = {
    "appUrls": [
        "https://apps.shopify.com/omnisend"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("taroyamada/shopify-app-store-review-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 = { "appUrls": ["https://apps.shopify.com/omnisend"] }

# Run the Actor and wait for it to finish
run = client.actor("taroyamada/shopify-app-store-review-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 '{
  "appUrls": [
    "https://apps.shopify.com/omnisend"
  ]
}' |
apify call taroyamada/shopify-app-store-review-intelligence --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Shopify App Store Review Intelligence",
        "description": "Extracts and normalizes Shopify App Store app metadata, ratings, pricing hints, review samples, and keyword-based theme/feature-request rollups.",
        "version": "0.1",
        "x-build-id": "kKouwK9rreFytfxCf"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/taroyamada~shopify-app-store-review-intelligence/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-taroyamada-shopify-app-store-review-intelligence",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/taroyamada~shopify-app-store-review-intelligence/runs": {
            "post": {
                "operationId": "runs-sync-taroyamada-shopify-app-store-review-intelligence",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/taroyamada~shopify-app-store-review-intelligence/run-sync": {
            "post": {
                "operationId": "run-sync-taroyamada-shopify-app-store-review-intelligence",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "appUrls"
                ],
                "properties": {
                    "appUrls": {
                        "title": "App URLs",
                        "type": "array",
                        "description": "One or more Shopify App Store URLs (e.g. https://apps.shopify.com/omnisend) or app slugs (e.g. omnisend).",
                        "items": {
                            "type": "string"
                        }
                    },
                    "reviewLimit": {
                        "title": "Review Limit",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Maximum reviews per app to collect.",
                        "default": 100
                    },
                    "timeoutMs": {
                        "title": "Timeout (ms)",
                        "minimum": 5000,
                        "maximum": 60000,
                        "type": "integer",
                        "description": "HTTP request timeout per page in milliseconds.",
                        "default": 20000
                    },
                    "delivery": {
                        "title": "Delivery",
                        "enum": [
                            "dataset",
                            "webhook"
                        ],
                        "type": "string",
                        "description": "Where to send results: dataset or webhook.",
                        "default": "dataset"
                    },
                    "webhookUrl": {
                        "title": "Webhook URL",
                        "type": "string",
                        "description": "Webhook URL to POST results to when delivery=webhook."
                    },
                    "dryRun": {
                        "title": "Dry Run",
                        "type": "boolean",
                        "description": "Run without saving results to dataset or webhook.",
                        "default": false
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
