# Shopify App Store Reviews Scraper (`piotrv1001/shopify-app-store-reviews-scraper`) Actor

Scrape Shopify App Store reviews for any app: star rating, review text, date, store name and country, time using the app, developer reply and reply date. Full history with no page cap, 1-5 star filter, since-date incremental runs, renamed and delisted apps handled.

- **URL**: https://apify.com/piotrv1001/shopify-app-store-reviews-scraper.md
- **Developed by:** [FalconScrape](https://apify.com/piotrv1001) (community)
- **Categories:** E-commerce, Developer tools, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 reviews

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### 🛍️ Shopify App Store Reviews Scraper

**Shopify App Store Reviews Scraper** extracts merchant reviews of any app on the **[Shopify App Store](https://apps.shopify.com/)** (apps.shopify.com), with no login and no API key. Give it app handles or URLs and get clean JSON with the **star rating, review text, date, store name, store country, how long the merchant has used the app, and the developer's reply with its date**. You can also add one **app summary row** with the overall rating, review count, 1-5 star distribution, developer and the "What merchants think" summary.

Run it on the **[Apify platform](https://apify.com/)** to get scheduling, an API, webhooks and exports to Google Sheets, Excel or CSV.

### ✨ Features

- ⭐ **Every review, no page cap.** Walk an app's full review history: 3,355 of 3,355 Klaviyo reviews in about a minute, and the full Judge.me archive (48,000+ reviews back to 2016) when you need it.
- 🎯 **Star filter.** Collect only 1- and 2-star reviews for complaint analysis, or any mix of 1-5 stars.
- 🗓️ **Incremental runs.** Set **Reviews since** and the Actor stops paging as soon as it reaches older reviews: schedule it daily or weekly and get only new reviews.
- 💬 **Developer replies.** Each review comes with the developer's reply text and reply date, so you can measure response rates and response times.
- 🧾 **Rating-only reviews flagged.** Many merchants leave stars without text. Those rows have `text: null` and `hasText: false` instead of a blank string.
- 🔁 **Renamed and delisted apps handled.** Old handles are followed to the app's new handle (e.g. `shopify-email` → `shopify-messaging`) and both are recorded. Delisted apps and unknown handles are reported in the run status, never billed.
- 🧹 **No duplicates.** Each review is saved once, by its stable review ID, even when new reviews arrive while the Actor pages.

### 💡 Use cases

- **Competitor research.** Read what merchants love and hate about competing apps before you build or position your own.
- **Review monitoring.** Track new reviews of your own app (or competitors') on a schedule and route 1-2 star reviews to support.
- **Support benchmarking.** Compare developer reply rates and reply times across apps in your category.
- **Market and product research.** Find feature gaps from negative reviews, see which countries a merchant base comes from, and how long merchants stay with an app.
- **Sentiment and AI analysis.** Feed review text into LLMs or BI tools for topic and sentiment analysis.

### 🛠️ How to use

1. **Add apps.** Enter app handles (`judgeme`), app URLs (`https://apps.shopify.com/judgeme`) or reviews URLs copied from your browser.
2. **Set Max reviews per app.** The default is 50. Use 0 for all reviews.
3. **(Optional)** Pick a sort order, star ratings, a **Reviews since** date, or turn on the app summary row.
4. **Run** and download the results as JSON, CSV, Excel or via the API.

### 📥 Input

| Field                | Type    | Description                                                                                                                      |
| -------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------- |
| `apps`               | array   | App handles, app URLs or reviews URLs. Sort, star filter and page in a reviews URL are kept. Default: `judgeme`.                 |
| `maxReviewsPerApp`   | integer | Reviews to save per app. Default `50`, `0` = all.                                                                                |
| `sort`               | string  | `newest` (default) or `relevance` (most relevant, the App Store default).                                                        |
| `ratings`            | array   | Only these star ratings, e.g. `["1", "2"]`. Empty = all.                                                                         |
| `sinceDate`          | string  | Only reviews posted on or after this date (`YYYY-MM-DD`). Paging stops at the first older review. Uses newest-first order.       |
| `includeAppSummary`  | boolean | Add one row per app with overall rating, review count, star distribution, developer and the merchants' summary. Default `false`. |
| `maxItems`           | integer | Optional cap on reviews across all apps. Empty = no total cap.                                                                   |
| `proxyConfiguration` | object  | Proxy settings. The default Apify Proxy works well.                                                                              |

Example:

```json
{
    "apps": ["judgeme", "https://apps.shopify.com/klaviyo-email-marketing", "loox"],
    "maxReviewsPerApp": 500,
    "ratings": ["1", "2"],
    "includeAppSummary": true
}
```

Daily new-review feed:

```json
{
    "apps": ["judgeme", "loox"],
    "maxReviewsPerApp": 0,
    "sinceDate": "2026-10-01"
}
```

### 📤 Output

One row per review:

```json
{
    "type": "review",
    "reviewId": "2368666",
    "appHandle": "judgeme",
    "requestedAppHandle": "judgeme",
    "appName": "Judge.me Product Reviews App",
    "developer": "Judge.me",
    "rating": 1,
    "text": "if I could put 0 stars, I would do it, I dont know how this app has 5 stars...",
    "hasText": true,
    "date": "2026-09-21",
    "edited": false,
    "storeName": "Wildaro",
    "storeCountry": "United States",
    "timeUsingApp": "8 months",
    "developerReply": "We're very sorry that using Judge.me became such a frustrating and time-consuming experience for you...",
    "developerReplyDate": "2026-10-02",
    "reviewUrl": "https://apps.shopify.com/reviews/2368666",
    "appUrl": "https://apps.shopify.com/judgeme"
}
```

| Field                                   | Description                                                                                      |
| --------------------------------------- | ------------------------------------------------------------------------------------------------ |
| `reviewId`                              | Stable App Store review ID                                                                       |
| `appHandle`                             | The app's current handle (after following a rename)                                              |
| `requestedAppHandle`                    | The handle you entered (differs from `appHandle` when the app was renamed)                       |
| `rating`                                | 1-5 stars                                                                                        |
| `text` / `hasText`                      | Review text (paragraphs kept), `null` for rating-only reviews                                    |
| `date` / `edited`                       | Review date (`YYYY-MM-DD`); `edited` is `true` when the merchant edited the review (date = edit) |
| `storeName` / `storeCountry`            | The reviewing merchant's store and country                                                       |
| `timeUsingApp`                          | How long the merchant had used the app when reviewing, e.g. `8 months`                           |
| `developerReply` / `developerReplyDate` | The developer's public reply and its date                                                        |

With **Add an app summary row**, each app also gets one row:

```json
{
    "type": "app",
    "appHandle": "moosedesk",
    "requestedAppHandle": "moosedesk",
    "appName": "Moose AI Chatbot & Live Chat",
    "developer": "Vegahub Technology Inc.",
    "rating": 5,
    "reviewCount": 483,
    "ratingDistribution": { "1": 0, "2": 0, "3": 1, "4": 8, "5": 474 },
    "merchantsSummary": "Merchants describe this as a game-changing AI chatbot and helpdesk that cuts support workload...",
    "builtForShopify": true,
    "iconUrl": "https://cdn.shopify.com/app-store/listing_images/d2676c33fa9d7ec9e2284b03d6a4d0bb/icon/CMiP-dXQ9v8CEAE=.png",
    "appUrl": "https://apps.shopify.com/moosedesk"
}
```

### 💰 How much does it cost to scrape Shopify App Store reviews?

The Actor uses pay-per-event pricing, so you pay only for what you get:

| Event       | Price                         | When it's charged                                    |
| ----------- | ----------------------------- | ---------------------------------------------------- |
| Actor start | **$0.00005**                  | Once per run                                         |
| Review      | **$0.0005** ($0.50 per 1,000) | For every saved review                               |
| App summary | **$0.002**                    | For every app summary row (only when you turn it on) |

For example, 1,000 reviews cost about **$0.50**, and the full Klaviyo history (3,355 reviews) about **$1.68**. Set a maximum cost per run in Apify, and the Actor stops when it reaches that cost.

### ⚙️ Tips

- **Complaints only:** set Star ratings to 1 and 2 to collect every negative review of an app in one run.
- **Scheduled monitoring:** use **Reviews since** with the date of your last run and `maxReviewsPerApp: 0`. Only new reviews are fetched and billed.
- **Paste filtered URLs:** set a star filter and sort on apps.shopify.com, copy the reviews URL and paste it. Filters, sort and page are kept.
- **Delisted apps:** apps removed from the App Store show "not currently available" and have no public reviews. The run status lists them; they cost nothing.

### ❓ FAQ

**Does it need a Shopify account?** No. It reads the public review pages.

**Is there a limit on how many reviews I can get?** No. The Actor pages through an app's whole review history; the count matches the number shown on the App Store.

**Why do some reviews have no text?** Merchants can leave a star rating without writing anything. Those rows have `text: null` and `hasText: false`.

**What happens with a renamed app?** The Actor follows the App Store redirect to the new handle and saves reviews under the new `appHandle`, keeping your original handle in `requestedAppHandle`.

**Can I get the app's pricing plans or listing details?** This Actor focuses on reviews; the optional summary row adds the rating, star distribution, developer and merchants' summary.

### 🛟 Support

Found a bug or need a field that's missing? Open an issue on the Actor's **Issues** tab and we'll take a look.

# Actor input Schema

## `apps` (type: `array`):

Shopify apps to get reviews for: the app handle (e.g. judgeme), the app URL (https://apps.shopify.com/judgeme) or a reviews URL copied from your browser (https://apps.shopify.com/judgeme/reviews?ratings%5B%5D=1\&sort_by=newest). Sort, star filter and page in a reviews URL are kept. Renamed apps are followed to their new handle.

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

How many reviews to save for each app. 0 = all reviews (Judge.me alone has over 48,000).

## `sort` (type: `string`):

Order of the reviews, as on the App Store.

## `ratings` (type: `array`):

Only reviews with these star ratings, e.g. 1 and 2 stars for complaints. Empty = all ratings.

## `sinceDate` (type: `string`):

Only reviews posted on or after this date (YYYY-MM-DD). The scraper stops paging once it reaches older reviews - ideal for scheduled runs that collect only new reviews. Uses newest-first order.

## `includeAppSummary` (type: `boolean`):

Also save one row per app with its overall rating, review count, rating distribution (1-5 stars), developer and the 'What merchants think' summary. Billed as a separate event.

## `maxItems` (type: `integer`):

Optional cap on reviews across all apps. Empty or 0 = no total cap.

## `proxyConfiguration` (type: `object`):

Proxy servers used to load the App Store pages. The default Apify Proxy works well.

## Actor input object example

```json
{
  "apps": [
    "judgeme",
    "https://apps.shopify.com/klaviyo-email-marketing"
  ],
  "maxReviewsPerApp": 50,
  "sort": "newest",
  "includeAppSummary": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (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 = {
    "apps": [
        "judgeme",
        "https://apps.shopify.com/klaviyo-email-marketing"
    ],
    "maxReviewsPerApp": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("piotrv1001/shopify-app-store-reviews-scraper").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 = {
    "apps": [
        "judgeme",
        "https://apps.shopify.com/klaviyo-email-marketing",
    ],
    "maxReviewsPerApp": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("piotrv1001/shopify-app-store-reviews-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "apps": [
    "judgeme",
    "https://apps.shopify.com/klaviyo-email-marketing"
  ],
  "maxReviewsPerApp": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call piotrv1001/shopify-app-store-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,piotrv1001/shopify-app-store-reviews-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

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