# Shopify App Store Reviews Monitor - New Reviews, Rating & Rank (`neverempty/shopify-app-store-reviews-monitor`) Actor

For Shopify app developers: reviews of any Shopify App Store app (rating, text, date, store name and country, time using the app, developer reply), app details (rating, review count, pricing plans) and category rank. Monitoring mode returns only new reviews and rating, count or rank changes.

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

## Pricing

from $3.50 / 1,000 review returneds

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/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 Monitor - New Reviews, Rating & Rank

Read the reviews, rating, review count, pricing plans and category rank of any app on the Shopify App Store (apps.shopify.com). Turn on **monitoring mode** and each scheduled run returns only what is new: reviews added since the last run, an app row only when its rating or review count moved, and category rows only for apps whose rank changed.

Built for Shopify app developers and agencies who check their own app and their competitors every day.

### What you get

**Review rows** (`type: "review"`), newest first:

| Field | Example |
| --- | --- |
| `handle`, `appName`, `appUrl` | `judgeme`, `Judge.me Product Reviews App` |
| `reviewId`, `reviewUrl` | `2384152`, `https://apps.shopify.com/reviews/2384152` |
| `rating` | `5` |
| `date`, `edited` | `2026-10-05`, `false` |
| `body` | the review text (`null` when the merchant left only stars) |
| `storeName`, `storeCountry` | `Nys Aroma Boutique`, `United States` |
| `usageDuration` | `6 days using the app` (`null` when the store does not show it) |
| `developerReply`, `developerReplyDate` | the developer's reply and its date, or `null` |

**App rows** (`type: "app"`), one per app: `name`, `developer`, `developerUrl`, `rating`, `reviewCount`, `ratingCounts` (exact count per star, 5 to 1), `pricingSummary`, `pricingPlans` (name and price of each plan), `categories`, `launchedDate`, `builtForShopify`.

**Category rank rows** (`type: "category-rank"`), one per app listed on a category page: `rank`, `page`, `handle`, `appName`, `rating`, `reviewCount`. Sponsored placements are returned with `isAd: true`, `rank: null` and their own `adPosition`, so paid slots never shift the organic rank.

Measured on 2026-10-05: on the app `judgeme` the count per star added up exactly to the review count shown by the store (47,987), reviews came 10 per page newest first, and the category "Product reviews" listed 20 organic apps plus 4 sponsored placements per page.

### Input

- **Apps**: app URLs (`https://apps.shopify.com/judgeme`) or handles (`judgeme`).
- **Categories**: category URLs (`https://apps.shopify.com/categories/marketing-and-conversion-social-trust-product-reviews`).
- **Maximum reviews per app** (default 50) and **Category pages to read** (default 2, about 20 apps per page).
- **Monitoring mode** and **Forget what was seen before**.

```json
{
  "apps": ["judgeme", "https://apps.shopify.com/loox"],
  "categories": ["https://apps.shopify.com/categories/marketing-and-conversion-social-trust-product-reviews"],
  "maxReviewsPerApp": 50,
  "monitoringMode": true
}
```

### Monitoring mode

1. The first run returns the current state (app row, newest reviews, category ranks) marked `change: "first-check"` and remembers it.
2. Every later run returns only:
   - reviews that were not seen before (`change: "new-review"`),
   - the app row when `rating` or `reviewCount` changed, with `changedFields`, `previousRating` and `previousReviewCount`,
   - category rows for apps whose organic rank changed (`previousRank`) or that entered the pages you read.
3. An app or category with nothing new returns no rows. The run status then says `no-new-since-last-run`.

Only rows that were actually delivered are remembered, so if a run stops at your spending limit the remaining new reviews arrive with the next run. Schedule it daily and send the dataset to Slack, email or a sheet with an Apify integration.

Limits to know: sponsored placements are not monitored (they rotate on every page load). An app that drops out of the category pages you read is not reported as a row. An edited review keeps its id and is not returned again. If two runs with the same input finish at the same moment, one may not see what the other remembered.

### When something cannot be returned

You are never charged for a row that explains a problem. These come back as free rows with `type: "note"`:

`app-not-found` (no such handle, HTTP 404), `category-not-found`, `invalid-input`, `duplicate-input`, `blocked` (the store answered with a rate limit or a verification page; the run stops and does not try to get around it), `unreadable` (the page did not look as expected, so nothing is claimed about it), `disallowed-by-robots`, `robots-unreadable`.

### What this Actor does not do

- No keyword search rank. The robots.txt of apps.shopify.com disallows automated requests to search URLs, and this Actor reads robots.txt on every run and requests only URLs it allows.
- No proxy rotation and no CAPTCHA solving.
- No personal data beyond what a public review shows: the store's business name and country.

### Pricing

Pay per result: one event per review row, one per app or category rank row, and a much smaller check event in monitoring mode for an app or category that had nothing new. Free explanation rows cost nothing.

### Related Actors

- [Shopify Products Price Monitor](https://apify.com/neverempty/shopify-products-price-monitor) - prices and stock of any Shopify store's products.
- [Shopify Store Inspector](https://apify.com/neverempty/shopify-store-inspector) - theme, apps and details of a Shopify store.
- [App Store Keyword Rank Tracker](https://apify.com/neverempty/app-store-keyword-rank-tracker) - keyword ranks on the Apple App Store.

### Thanks for using this Actor

We build these tools for people who run them every day, and we improve them from what users tell us.

- **Missing a field, or need another filter?** Tell us in the **Issues** tab. If the data is there, we add it.
- **Found a bug or a wrong value?** Post the run ID in the **Issues** tab. Wrong data is the thing we fix first.

If this Actor saved you time, a short review helps other people find it.

# Actor input Schema

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

Apps to read: the app URL such as https://apps.shopify.com/judgeme, or just the handle (the last part of that URL), such as judgeme. For each app you get one app row (rating, review count, count per star, pricing plans, developer, categories, launch date) and its newest reviews.

## `categories` (type: `array`):

Optional. Category pages to rank, such as https://apps.shopify.com/categories/marketing-and-conversion-social-trust-product-reviews. You get one row per app in the order the Shopify App Store lists them, with sponsored (ad) placements marked separately and not counted in the rank. Keyword search is not offered: the Shopify App Store disallows automated search requests in its robots.txt.

## `includeReviews` (type: `boolean`):

Turn off to get only the app row (rating, review count, pricing) for each app.

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

Newest reviews first, 10 per page read. In monitoring mode this is the most new reviews returned per app per run; the rest come with the next run.

## `maxCategoryPages` (type: `integer`):

Each category page lists about 20 apps plus up to 4 sponsored placements. 2 pages gives the top 40.

## `monitoringMode` (type: `boolean`):

The first run returns the current state and remembers it. Every later run with the same apps and categories returns only reviews added since then, an app row only when its rating or review count changed (with the previous values), and category rows only for apps whose rank changed. A target with nothing new returns no rows and costs one small check fee.

## `resetMonitoringState` (type: `boolean`):

Clears the remembered state for the apps and categories in this input before the run, so the run behaves like a first run for them.

## Actor input object example

```json
{
  "apps": [
    "judgeme"
  ],
  "includeReviews": true,
  "maxReviewsPerApp": 50,
  "maxCategoryPages": 2,
  "monitoringMode": false,
  "resetMonitoringState": false
}
```

# Actor output Schema

## `results` (type: `string`):

Review rows (rating, text, date, store name and country, time using the app, developer reply), app rows (rating, review count, count per star, pricing plans, developer, categories, launch date) and category rank rows (rank, sponsored flag) from the Shopify App Store. Apps or categories that do not exist, blocked or unreadable pages and invalid input come back as free rows that say why.

# 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"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("neverempty/shopify-app-store-reviews-monitor").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"] }

# Run the Actor and wait for it to finish
run = client.actor("neverempty/shopify-app-store-reviews-monitor").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"
  ]
}' |
apify call neverempty/shopify-app-store-reviews-monitor --silent --output-dataset

```

## MCP server setup

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

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/D6eY9SPCta6TNerra/builds/jECcl5ppXUKK5gouG/openapi.json
