# Shopify Review Rating & Count Delta Monitor (`produkdigitalali/shopify-review-rating-delta`) Actor

Monitor product-bound Judge.me rating summaries on Shopify, compare supplied baselines and export rating/count deltas without reviewer identities.

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

## Pricing

$4.00 / 1,000 rating summary saveds

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 Review Rating & Count Delta Monitor

Product-bound public Judge.me widget rating/count snapshots with optional caller-supplied baseline comparison. No reviewer names, text, photos or contact details are exported.

### Quick start

Supply 1-10 canonical public Shopify product URLs. The prefilled example processes one product. No Shopify login, API key, browser, proxy or AI service is needed.

Example input:

```
{"productUrls":["https://norlanglass.com/products/norlan-whisky-glass"]}
```

Optional baselines: a JSON object keyed by the exact product URL. Each value contains productId (numeric string), averageRating (number 0-5), reviewCount (nonnegative integer), observedAt (past ISO timestamp). The same URL and product ID must match. Each run is stateless; copy prior report metrics into your next input using your own scheduler. Unsupported products are listed in OUTPUT without charge.

### Results

One dataset row per successfully processed product; nested arrays stay structured in JSON. Use Apify dataset exports for JSON/CSV/Excel. Common fields: stableKey, productId as string, productUrl, sourceUrl, productTitle, checkedAt. Specific fields: averageRating, reviewCount, baselineAverage, baselineCount, ratingDelta, countDelta, widgetUpdatedAt, provider, association. OUTPUT reports per-product source errors, stored report count, charged count and budget truncation.

### Pricing

Pay per event **USD0.004 per saved product report (USD4 per 1,000 reports)**. This is per product report, not per asset, finding, review or variant. Failed/unsupported sources and diagnostics are free. A valid report with zero findings, zero reviews or zero media can be chargeable because the requested check succeeded. Platform usage charges may also apply. Every report is stored before its event is charged. Storage and billing are separate services; interruption between them is not an atomic transaction. A billing/storage failure stops processing rather than silently continuing.

### Scope and limitations

Only server-rendered Judge.me widgets whose data-id exactly matches the public Shopify product ID. No multi-provider or JavaScript rendering claim. Missing widgets are UNSUPPORTED and free. A widget may aggregate grouped products; metrics describe the widget, not verified SKU-specific reviews or purchases. Counts may fall after moderation. A rating delta is not sentiment analysis or evidence of fraud. Baseline is caller-supplied, not authenticated historical truth; no persistent named state or automatic baseline updates.

Each run reads at most 10 selected products, 20 primary HTTP requests (one product JSON and one HTML per product), at most 3 same-origin redirects per request,4MiB per response and 120 seconds of source work. No unbounded pagination or retries. Headless/password-protected stores may be unsupported; public source formats may change. All unsupported/failing inputs fail the run when no supported report can be produced; partial success is explicit in OUTPUT. Default QA input is small and intended to finish under5 minutes. Product IDs and handle/source URL are verified; unsafe numeric IDs are rejected rather than rounded.

### Security and privacy

Read-only public HTTPS with DNS/IP validation and pinning, TLS hostname verification, same-origin redirects, hard caps and no arbitrary scripts, cookies, login or private network access. Product metadata may contain merchant-provided content; no customer/reviewer personal information is intentionally exported. No Admin API or cart writes. Not affiliated with Shopify or Judge.me. Respect content rights and target terms.

### Development

Run npm ci, npm test and apify validate-schema. See TEST_PLAN.md and BUILD_PUBLISH_CHECKLIST.md for acceptance. Pricing is configured only for this new Actor; no changes to existing public Actor prices.

# Changelog

This Actor's version history is a separate document: https://apify.com/produkdigitalali/shopify-review-rating-delta/changelog.md

# Actor input Schema

## `productUrls` (type: `array`):

1-10 canonical HTTPS /products/handle URLs. No credentials, query strings or private destinations.

## `baselines` (type: `object`):

Caller-supplied URL keyed snapshots with productId, averageRating0-5, reviewCount and observedAt. Not verified historical data.

## Actor input object example

```json
{
  "productUrls": [
    "https://norlanglass.com/products/norlan-whisky-glass"
  ]
}
```

# Actor output Schema

## `reports` (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 = {
    "productUrls": [
        "https://norlanglass.com/products/norlan-whisky-glass"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("produkdigitalali/shopify-review-rating-delta").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 = { "productUrls": ["https://norlanglass.com/products/norlan-whisky-glass"] }

# Run the Actor and wait for it to finish
run = client.actor("produkdigitalali/shopify-review-rating-delta").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 '{
  "productUrls": [
    "https://norlanglass.com/products/norlan-whisky-glass"
  ]
}' |
apify call produkdigitalali/shopify-review-rating-delta --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,produkdigitalali/shopify-review-rating-delta"
        }
    }
}
```

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/CFs7YxY0lYfkmeSm7/builds/lSYpaJRVQjWmDSlIl/openapi.json
