# Shopify App Reviews Scraper (Stars, Text, Replies) (`mrslm_data/shopify-app-reviews`) Actor

Every review of any Shopify app: stars, date, text, merchant country, time using the app and developer reply. Star filter and new-only mode.

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

## Pricing

from $0.40 / 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.
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 Reviews Scraper (Stars, Text, Replies)

**Get the reviews of any Shopify app (stars, date, text, merchant country, time using the app, developer reply) as JSON/CSV. $0.50 per 1,000 reviews.**

Paste app URLs or handles and get one row per review, with the app's overall rating attached. Filter by star rating, sort by newest, and use a date cutoff so scheduled runs only pick up new reviews.

### Quick start

1. Press **Start**. The form is already filled with this example input, so the first run returns real rows in under a minute:

```json
{
  "apps": [
    "judgeme",
    "https://apps.shopify.com/klaviyo-email-marketing"
  ],
  "maxReviewsPerApp": 50
}
```

2. Swap in your own values, or call the Actor through the Apify API, Make, Zapier, n8n or the Python/JS clients with the same JSON.
3. Download the results as JSON, CSV or Excel from the **Output** tab, or schedule the run to repeat.

**Full guide: How to Scrape Shopify App Store Reviews (Real Run: 1 and 2 Star Reviews of Judge.me, Loox and Yotpo)**

### What the Shopify App Reviews Scraper does

You give the Actor app handles or App Store URLs. For each app it reads the public review pages, newest first or in the App Store's own relevance order, and saves one row per review: star rating, date, review text, the merchant's store name and country, how long they had used the app, the developer's reply and its date, and a link to the review. Each row also carries the app's name, developer, overall rating and total review count, so rows from different apps sit side by side.

You can keep only certain star ratings (for example 1 and 2 stars), stop at a date with **Only reviews newer than**, and cap the number of reviews per app and per run.

- Review text, rating, date, store country and usage time.
- The developer's public reply and its date.
- Star filter, date cut-off and per-app limit.

### Who it is for

- **App founders and product managers**: read every new review of your app and your competitors', and spot recurring complaints early.
- **Customer support leads**: see which reviews are still unanswered and how fast you reply compared with rivals.
- **Investors and analysts**: track sentiment and complaint themes for apps you follow.
- **Agencies and merchants**: check real merchant experiences before recommending or installing an app.

### Real example: the newest 1 and 2 star reviews of three review apps

Say you work on a product reviews app and want to know why merchants are unhappy with the market leaders. You ask for the 10 newest 1-star and 2-star reviews each of Judge.me, Loox and Yotpo.

#### Step 1: Enter the input

Open the [Shopify App Reviews Scraper](https://apify.com/mrslm_data/shopify-app-reviews) in Apify Console, switch the input form to **JSON** and paste this. It is the exact input used for the run in this guide:

```json
{
  "apps": [
    "judgeme",
    "loox",
    "yotpo-social-reviews"
  ],
  "ratings": [
    "1",
    "2"
  ],
  "sortBy": "newest",
  "maxReviewsPerApp": 10
}
```

What each setting does:

- `apps`: App Store handles (the part after apps.shopify.com/). Full URLs work too.
- `ratings`: "1" and "2" keep only 1-star and 2-star reviews, using the App Store's own filter.
- `sortBy`: newest, so the most recent reviews come first.
- `maxReviewsPerApp`: 10 per app, 30 in total.

#### Step 2: Run it

Press **Start**. On 30 October 2026 this input finished with status `SUCCEEDED` in about 6 seconds and saved 30 rows to the run's dataset. The run was charged 30 `review` events plus one start event, so the bill was $0.015 on the Free/Bronze tier. All three apps were read; the summary shows 10 reviews for each.

#### Step 3: Read the output

Here are the first rows of the real dataset, cut to the most useful columns:

| appHandle | rating | date | storeCountry | usageDuration | developerReplyDate |
|---|---|---|---|---|---|
| loox | 1 | 2026-10-17 | United States | About 2 years using the app | 2026-10-18 |
| loox | 1 | 2026-10-16 | France | 8 months using the app |  |
| loox | 1 | 2026-10-08 | Sweden | 9 months using the app | 2026-10-19 |
| loox | 1 | 2026-09-26 | United States | 12 days using the app | 2026-09-30 |
| loox | 1 | 2026-09-18 | United States | About 1 month using the app |  |
| loox | 1 | 2026-08-18 | Mexico | Over 5 years using the app | 2026-08-19 |
| loox | 1 | 2026-08-18 | Türkiye | 3 days using the app |  |
| loox | 1 | 2026-08-18 | United States | 7 months using the app | 2026-08-19 |
| loox | 1 | 2026-08-12 | Türkiye | Over 1 year using the app |  |
| loox | 1 | 2026-08-02 | United Kingdom | Over 3 years using the app |  |
| yotpo-social-reviews | 1 | 2026-07-21 | United States | 6 days using the app | 2026-08-17 |
| yotpo-social-reviews | 1 | 2026-07-16 | United States | Over 2 years using the app | 2026-08-17 |

And one full row as JSON (long text shortened with …):

```json
{
  "appHandle": "loox",
  "appUrl": "https://apps.shopify.com/loox",
  "appName": "Loox ‑ Product Reviews App",
  "appDeveloper": "Loox",
  "appRating": 4.9,
  "appReviewCount": 10001,
  "reviewId": "2398974",
  "rating": 1,
  "date": "2026-10-17",
  "reviewText": "They will repeatedly over charge you with sneaky changes to their policy and plan names with out notifying you - their entire business model relies on these sne…",
  "storeName": "Lunavere",
  "storeCountry": "United States",
  "usageDuration": "About 2 years using the app",
  "developerReply": "Hey,\nThanks for taking the time to leave feedback.\n\nWe keep our pricing clear and transparent, with all details available on our website, in our Shopify listing…",
  "developerReplyDate": "2026-10-18",
  "reviewUrl": "https://apps.shopify.com/loox/reviews/2398974"
}
```

What the 30 real reviews show:

- **Loox: pricing is the main complaint.** Six of its 10 newest 1-star reviews are about cost or billing, including a merchant on a $49.99 plan who says they were billed $399.99 in usage charges for July, and another who calls the Convert plan's pricing misleading. Loox replied to 5 of the 10, and fast: four replies came within 4 days.
- **Yotpo: support is the main complaint.** Seven of its 10 newest 1-star reviews mention support; two describe an AI chat that opens a ticket nobody follows up, and two more complain that reviews are hard to export. Yotpo replied to all 10, but slowly, with a median of about 25 days between review and reply. Its 10 newest 1-star reviews go back to January 2026, so negative reviews arrive more slowly than for Loox or Judge.me.
- **Judge.me: sent review requests and moderation.** Complaints include review request emails that were not sent, spam mentions of other marketplaces in reviews, an Etsy sync glitch, and a store that says its imported reviews stopped counting for Google Shopping after a change in April 2026. Judge.me replied to 8 of 10, with a median of about 9 days. Three of its 10 were 2-star; all the others in this run were 1-star.
- **Reviews are global.** The 30 merchants are from 15 countries, and replies are often in the reviewer's own language (German, Portuguese and Spanish here).
- **Some text is empty or junk.** Two reviews have no text and one is random letters. Filter on `reviewText` length before running sentiment analysis.

Each app's overall score stays high (Judge.me 5.0 with 49,362 reviews, Loox 4.9 with 10,001 and Yotpo 4.8 with 4,631), which is exactly why the low-star filter is useful: it pulls the few critical reviews out of thousands of 5-star ones.

### Weekly monitoring with a date cut-off

For ongoing monitoring, set **Sort** to newest and **Only reviews newer than** to the date of your last check, for example `2026-10-23`. With newest sort the Actor stops reading an app as soon as it reaches older reviews, so a weekly run only pays for the new reviews. Leave **ratings** empty to see every new review, or keep 1 and 2 to get only the ones that need a reply.

Join the rows on `reviewId` with last week's export to see which reviews have received a developer reply since.

### Output fields

Each row in the dataset has these fields. The example column shows a value from the run above.

| Field | What it means | Example from this run |
|---|---|---|
| `appHandle / appUrl / appName / appDeveloper` | The app the review belongs to. | loox / https://apps.shopify.com/loox / Loox ‑ Product Reviews App / Loox |
| `appRating / appReviewCount` | The app's overall rating and total reviews at run time. | 4.9 / 10001 |
| `reviewId / reviewUrl` | Review ID and direct link. | 2398974 / https://apps.shopify.com/loox/reviews/2398974 |
| `rating` | Stars given, 1 to 5. | 1 |
| `date` | Review date (YYYY-MM-DD). | 2026-10-17 |
| `reviewText` | The review text, which may be empty. | They will repeatedly over charge you with sneaky changes to… |
| `storeName / storeCountry` | The reviewing store and its country, as shown on the App Store. | Lunavere / United States |
| `usageDuration` | How long the store had used the app, as shown on the review. | About 2 years using the app |
| `developerReply / developerReplyDate` | The developer's public reply and its date, or null. | Hey, Thanks for taking the time to leave feedback.  We keep… / 2026-10-18 |
| `scrapedAt` | When the row was saved. | 2026-10-30T16:14:52.798Z |

### Export Shopify app reviews to CSV, Excel or Google Sheets

Every run saves its rows to a dataset, and a dataset can be downloaded in any common format. You do not need to write code for this.

**From Apify Console.** Open the run, go to the **Output** tab and click **Export**. Pick CSV, Excel (XLSX), JSON, XML, HTML or RSS. You can tick only the columns you want, for example `appName`, `rating`, `date`, `reviewText`, `storeCountry`. Nested values such as lists are flattened into columns like `developerReply` in CSV and Excel.

**From a URL.** The same export is a plain HTTPS link. Replace `<DATASET_ID>` with the dataset ID shown on the run's Storage tab:

```bash
## CSV with just the columns you need
curl -H "Authorization: Bearer $APIFY_TOKEN" \
  "https://api.apify.com/v2/datasets/<DATASET_ID>/items?format=csv&clean=1&fields=appName,rating,date,reviewText,storeCountry,usageDuration,developerReply,developerReplyDate,reviewUrl" -o shopify-app-reviews.csv

## Excel
curl -H "Authorization: Bearer $APIFY_TOKEN" \
  "https://api.apify.com/v2/datasets/<DATASET_ID>/items?format=xlsx&clean=1" -o shopify-app-reviews.xlsx
```

**Into Google Sheets.** You have three good options:

1. **One-off:** download the CSV and use **File > Import > Upload** in Google Sheets. Choose "Replace current sheet" to refresh an existing tab.
2. **Automatic, no code:** in Make, Zapier or n8n, use the Apify app's "Watch Actor runs" (or "Run Actor") trigger, then "Get dataset items", then the Google Sheets "Add row" action. Every scheduled run then lands in your sheet. Apify's own [Google Sheets Import & Export](https://apify.com/lukaskrivka/google-sheets) Actor can also append a dataset to a sheet, and you can chain it to this Actor's runs with an integration.
3. **Formula:** `=IMPORTDATA("https://api.apify.com/v2/actor-tasks/<USERNAME>~<TASK_NAME>/runs/last/dataset/items?status=SUCCEEDED&format=csv&token=<YOUR_TOKEN>")` always pulls the latest successful run of a saved task. The token sits in the formula, so anyone who can open the sheet can see it. Only use this in a private sheet.

### Schedule it to run every Monday at 7 AM

New reviews trickle in, so a weekly run with a date cut-off is enough for most apps. Remember to move **Only reviews newer than** forward, or simply set a per-app limit that covers a week of reviews; you only pay for reviews saved.

1. In the Actor's input form, set up the input from Step 1 and click **Save as new task**. Give it a clear name such as `review-apps-weekly`.
2. Go to **Schedules > Create new**, set the cron expression to `0 7 * * 1` and pick your timezone, so it runs every Monday at 7 AM.
3. Add the task to the schedule and save. Each run gets its own fresh dataset.
4. Optional: on the task's **Integrations** tab, add a webhook, Slack or email notification for "Run succeeded", or connect Make, Zapier or n8n, so the new rows go where you need them.

To fetch the newest results without looking up a run ID, use the task's last-run link: `https://api.apify.com/v2/actor-tasks/<USERNAME>~review-apps-weekly/runs/last/dataset/items?status=SUCCEEDED&format=json`.

### Call it from the API (Python, JavaScript or curl)

You can start the Actor from your own code with the official Apify clients. Put your API token (Console > Settings > API & Integrations) in an environment variable called `APIFY_TOKEN` rather than in the code.

**Python** (`pip install "apify-client>=3"`). Tested with apify-client 3.4:

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
run_input = {
    "apps": [
        "judgeme",
        "loox",
        "yotpo-social-reviews"
    ],
    "ratings": [
        "1",
        "2"
    ],
    "sortBy": "newest",
    "maxReviewsPerApp": 10
}

run = client.actor("mrslm_data/shopify-app-reviews").call(run_input=run_input)

## apify-client 3.x returns a Run object, so use run.default_dataset_id
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item["appHandle"], item["rating"])
```

In apify-client 3.x, `call()` returns a typed object. Older examples that use `run["defaultDatasetId"]` were written for 1.x and 2.x and fail in 3.x with `TypeError: 'Run' object is not subscriptable`.

**JavaScript / Node.js** (`npm install apify-client`):

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const input = {
    "apps": [
        "judgeme",
        "loox",
        "yotpo-social-reviews"
    ],
    "ratings": [
        "1",
        "2"
    ],
    "sortBy": "newest",
    "maxReviewsPerApp": 10
};

const run = await client.actor('mrslm_data/shopify-app-reviews').call(input);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, items[0]);
```

**curl**, one request that runs the Actor and returns the rows as CSV (it waits up to 5 minutes, so keep the input small):

```bash
curl -X POST "https://api.apify.com/v2/acts/mrslm_data~shopify-app-reviews/run-sync-get-dataset-items?format=csv" \
  -H "Authorization: Bearer $APIFY_TOKEN" -H "Content-Type: application/json" \
  -d '{"apps": ["judgeme", "loox", "yotpo-social-reviews"], "ratings": ["1", "2"], "sortBy": "newest", "maxReviewsPerApp": 10}' -o shopify-app-reviews.csv
```

### What it costs

The Actor uses pay-per-event pricing. **Review**: $0.50 per 1,000 on the Free and Bronze tiers, $0.45 on Silver and $0.40 on Gold. Each run also has a start fee of $0.00005 per GB of memory (one event at the default memory). You are not billed separately for compute on normal runs: the event prices are the whole bill.

#### Price per event

Current pay-per-event prices for this Actor on Apify, by Apify subscription plan:

| Event (per 1,000) | Free / Bronze | Silver | Gold / Platinum / Diamond |
|---|---|---|---|
| Review (`review`) | $0.50 | $0.45 | $0.40 |
| Actor start (once per run at the default memory, not per 1,000) | $0.00005 | $0.00005 | $0.00005 |

You are charged only for the events in this table: nothing for compute, and nothing for searches that return no rows beyond the start fee.

| Scenario | Free / Bronze | Silver | Gold |
|---|---|---|---|
| The run in this guide (30 reviews) | $0.015 | $0.0135 | $0.012 |
| Every review of a 2,000-review app (one-off) | $1.00 | $0.90 | $0.80 |
| 10 apps, ~25 new reviews each per week (4 runs a month) | $0.50 | $0.45 | $0.40 |
| All reviews of 5 large apps, 10,000 each | $25.00 | $22.50 | $20.00 |

To cap spending, set **Maximum cost per run** in the run options (or `maxTotalChargeUsd` in the API). The Actor stops cleanly at the cap and you are never billed past it. Set **Max results** to cap reviews across all apps in a run.

### Limits

- Only public reviews on apps.shopify.com. Reviews that Shopify has hidden or removed are not shown.
- Store names are what the App Store shows; the Actor does not collect reviewer names, emails or other personal details.
- Review text is saved as written, in any language. Translate it yourself if you need one language.
- Large apps can have tens of thousands of reviews. Use the star filter, date cut-off and limits to keep runs small.
- With relevance sort the date cut-off cannot stop early, so it reads more pages.

### FAQ

**Can I get every review of an app?**
Yes. Set **Max reviews per app** to 0. Large apps can have 10,000 or more.

**How do I see only unhappy reviews?**
Pick 1 and 2 stars under **Only these star ratings**. The filter is the App Store's own, so it does not read the other reviews.

**Does it collect the reviewer's name?**
No. It saves the store name and country shown on the review, not personal details.

**Can I track app rankings too?**
Yes, with our [Shopify App Store Rankings Tracker](https://apify.com/mrslm_data/shopify-app-category-rankings).

**Can I run it on a schedule?**
Yes. Save your input as a task and attach a schedule, as shown above. Each run is independent and returns the Shopify app reviews available at that moment.

**Does it work with Make, Zapier or n8n?**
Yes. All three have an Apify app. Use "Run Actor" (or run a saved task), then "Get dataset items" to pass the rows to the next step, such as Google Sheets, Airtable, a CRM or Slack.

**Can AI agents use it through MCP?**
Yes. Apify's hosted MCP server can expose this Actor as a tool to any MCP client (Claude Desktop, Cursor, VS Code and others). Add `https://mcp.apify.com/?tools=mrslm_data/shopify-app-reviews` as a remote MCP server and sign in with your Apify account or API token. The agent fills in the same input fields shown above and gets the same rows back, billed at the same per-event prices.

### Is it legal?

This Actor only reads pages and feeds that the website itself publishes to every visitor without a login. It obeys each site's robots.txt, keeps a polite request rate, and never tries to get past logins, paywalls, captchas or bot checks. It does not collect personal data such as emails, phone numbers or names of private individuals. You are responsible for how you use the data: follow the source site's terms, copyright and the privacy laws that apply to you (GDPR, CCPA, etc.). This tool is independent and not affiliated with or endorsed by the platforms it reads.

# Actor input Schema

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

App URLs or handles, one per line, e.g. https://apps.shopify.com/judgeme or just judgeme.

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

0 = all reviews (large apps have 10,000+).

## `sortBy` (type: `string`):

Newest first is best for monitoring; relevance matches the App Store default order.

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

e.g. 1 and 2 to collect only unhappy reviews. Empty = all ratings.

## `onlyNewerThan` (type: `string`):

Date like 2026-10-01. Great for weekly monitoring - with Newest sort the run stops as soon as it reaches older reviews.

## `maxResults` (type: `integer`):

Hard cap on reviews saved (and paid for) across all apps. 0 = no cap.

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

Not needed normally.

## Actor input object example

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

# Actor output Schema

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

All results as a dataset (JSON, CSV, Excel and more via the API or Console).

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

Counts of results, targets that succeeded or failed, and the stop reason.

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

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

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

```

## MCP server setup

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

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/6sR6YHOCzLxZA76zL/builds/VtlzXkAKzga6YAtdz/openapi.json
