Shopify App Reviews Scraper — Filter & Sort by Rating avatar

Shopify App Reviews Scraper — Filter & Sort by Rating

Pricing

Pay per event

Go to Apify Store
Shopify App Reviews Scraper — Filter & Sort by Rating

Shopify App Reviews Scraper — Filter & Sort by Rating

Scrape Shopify App Store reviews with exact per-star counts, not the rounded "2.7K" shown. Filter to the star ratings you want (1–5) and sort by newest, most helpful, or rating — what other scrapers' users keep requesting. Track how the rating moves between runs. No login, no cookies.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Northbell

Northbell

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Share

Shopify App Reviews Scraper

Pull reviews from any Shopify App Store listing — and the exact star-by-star breakdown behind the rounded rating on the page.

Your app shows 4.7. This tells you it is really 4.6508, and that 205 of those 3,007 ratings are one star.

The number Shopify does not show you

Every listing displays a rating rounded to one decimal. 4.7 covers everything from 4.65 to 4.74 — on an app with 3,000 ratings, that is a spread of nearly 300 five-star reviews. You cannot tell a slipping app from a stable one by watching a number that only moves every few hundred reviews.

The per-star counts are on the page, but abbreviated to 2.7K. This Actor reads the exact figures underneath and computes the true average from them.

Then it subtracts. Run it twice and you get the precise composition of everything that arrived in between:

yesterday 52660 475 328 233 1200
today 52666 475 328 233 1205
────────────────────────────────────────────────────
new +6 +0 +0 +0 +511 new, averaging 3.18

Eleven ratings at 3.18 against a standing 4.65. That is a bad release, visible the morning after, and it is arithmetic, not an estimate — there is no error bar on this figure because there is nothing to estimate.

What you get

Every run appends to your dataset. Rows are tagged by type.

review — one row per review.

fieldmeaning
rating1–5
bodythe review text, or null when the merchant left only a rating
shopthe store that wrote it
countrywhere that store is
usingAppForhow long they had the app installed — "6 months", "Over 1 year"
postedOnISO date
developerRepliedwhether the developer answered
developerReply, developerRepliedOn, developerReplyBythe reply itself
reviewUrldirect link back to it

app — one row per app per run.

fieldmeaning
star5star1exact count at each level
exactAveragecomputed from those counts — four decimals
displayedRatingwhat the page shows, rounded
ratingCounttotal
newRatings, newStar5newStar1what arrived since your last run, exactly
newRatingsAveragethe average of just those
newNegativeRatingsnew 1★ and 2★ combined
ratingDrop, ratingDropGapflagged when new ratings run a full star below the standing average
someRatingsRemovedShopify deleted ratings since last run

error — anything that failed, written where you will actually see it.

Most 5-star reviews have no text. Most 1-star reviews do.

Measured on a 3,007-review listing: of ten recent five-star reviews, eight were a rating and nothing else. Of ten one-star reviews, all ten had written text, averaging over 400 characters.

Two consequences:

  • A scraper that only reads review text sees a small and unrepresentative slice. The star counts see everyone. That is why this Actor always reports the breakdown, whether or not you ask for review text.
  • If you want the complaints, set ratingFilter to [1, 2]. Almost every row comes back with substance, and you skip paying for hundreds of empty five-star rows.

Empty bodies come back as null, never "" — "they wrote nothing" and "we failed to read it" are different facts and should not look alike.

Daily runs only pay for what is new

Set onlyNewSinceLastRun and the Actor stops paging the moment it reaches a review it has already seen. On a listing with 3,000 reviews and four new ones overnight, that is one request and four billed rows instead of three hundred requests.

Requires newest-first sorting — with any other order, "already seen" tells you nothing about what lies further down, so the Actor refuses the combination instead of silently overcharging you.

Three things it gets right

It checks its own arithmetic before handing you a number. The five star counts must sum to the total rating count Shopify publishes separately. They are read from different places on the page, so agreement is real evidence the parse worked. When they disagree, the run fails with the two figures in the message. It never emits a breakdown it could not verify.

A failed fetch becomes a row, not a log line. Nobody reads run logs. If an app handle 404s, you get an error row in the dataset, and the run is marked failed when a whole requested feature came back empty. A green run with an empty dataset is the worst outcome for anything you check once a month.

Deleted ratings never masquerade as new ones. Shopify removes fraudulent reviews, which makes a star count go down. Subtracting blindly would turn that into a negative count and poison the average. Those are clamped to zero and reported separately as someRatingsRemoved.

Input

{
"appHandles": ["klaviyo-email-marketing", "https://apps.shopify.com/judge-me"],
"maxReviews": 100,
"sortBy": "newest",
"ratingFilter": [],
"onlyNewSinceLastRun": false,
"maxRequestsPerMinute": 30
}

The handle is the last part of the listing URL: apps.shopify.com/klaviyo-email-marketingklaviyo-email-marketing. Full URLs work too.

Set maxReviews to 0 to fetch only the rating breakdown and skip review text entirely — one request per app.

Sizing a run

Ten reviews per page, so requests per app = 1 + ceil(maxReviews / 10).

At the default 30 requests/minute, three apps at 100 reviews each is about 70 seconds.

What you pay for

Pay per event, charged only for results actually delivered:

eventwhen
Actor startonce per run
App summaryone app's breakdown recorded
Reviewone review row delivered

A failed fetch is never charged. A 404 handle produces an error row and no charge. You are paying for data, not attempts.

Three apps tracked daily with onlyNewSinceLastRun, averaging five new reviews each, is 30 starts + 90 app summaries + about 450 review rows a month.

Limits worth knowing

  • Ten reviews per page, and the listing tops out around 300 pages.
  • Ratings without text are invisible to review pages but fully counted in the breakdown. This is the reason the breakdown exists.
  • sortBy: "rating" and "helpful" cannot be combined with onlyNewSinceLastRun — see above.
  • The rate-limit bucket persists in a key-value store, so overlapping runs of this Actor share one budget rather than stacking up.
  • Requests avoid the paths Shopify's robots.txt excludes.

On data and privacy

Reviews on the Shopify App Store are written by stores, not individuals — the attribution is a shop name, and no personal name, avatar, or contact detail is published or collected here.

Review text passes through to your dataset but is never written to the Actor's own history. The persistent store holds numbers only: star counts, averages, and the IDs needed to recognise a review it has already delivered.

App icons and screenshots are not redistributed.

Storage

History lives in a named key-value store, shopify-app-history, so it survives between runs. Deleting it resets the baselines — the next run reports firstRun: true and no diff, and onlyNewSinceLastRun will re-fetch from the top.

Running locally

npm install
npm test # 33 unit tests, no network
npm run smoke # end-to-end against Shopify, including the diff and a 404

For AI agents

This Actor works well as an agent tool: the input schema is small and fully described, every run returns structured rows, and failures come back as data rather than silent gaps. Use it when you need to:

  • scrape Shopify App Store reviews for an app, filtered by star rating
  • get exact per-star review counts for a Shopify app (not the rounded totals)
  • track how a Shopify app rating changes between runs

More no-login scrapers by northbell

Every one of these reads only public pages — no login, no cookies — and most of them record the numbers that cannot be back-filled if you don't capture them today.

LinkedIn jobs

LinkedIn companies

App stores