Shopify App Reviews Scraper — Filter & Sort by Rating
Pricing
Pay per event
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
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 5★ 2660 4★ 75 3★ 28 2★ 33 1★ 200today 5★ 2666 4★ 75 3★ 28 2★ 33 1★ 205────────────────────────────────────────────────────new +6 +0 +0 +0 +5 → 11 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.
| field | meaning |
|---|---|
rating | 1–5 |
body | the review text, or null when the merchant left only a rating |
shop | the store that wrote it |
country | where that store is |
usingAppFor | how long they had the app installed — "6 months", "Over 1 year" |
postedOn | ISO date |
developerReplied | whether the developer answered |
developerReply, developerRepliedOn, developerReplyBy | the reply itself |
reviewUrl | direct link back to it |
app — one row per app per run.
| field | meaning |
|---|---|
star5 … star1 | exact count at each level |
exactAverage | computed from those counts — four decimals |
displayedRating | what the page shows, rounded |
ratingCount | total |
newRatings, newStar5 … newStar1 | what arrived since your last run, exactly |
newRatingsAverage | the average of just those |
newNegativeRatings | new 1★ and 2★ combined |
ratingDrop, ratingDropGap | flagged when new ratings run a full star below the standing average |
someRatingsRemoved | Shopify 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
ratingFilterto[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-marketing → klaviyo-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:
| event | when |
|---|---|
| Actor start | once per run |
| App summary | one app's breakdown recorded |
| Review | one 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 withonlyNewSinceLastRun— 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.txtexcludes.
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 installnpm test # 33 unit tests, no networknpm 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 Jobs Scraper with Applicant Counts — jobs plus how fast applicants are arriving
- LinkedIn Jobs Scraper — Filters That Actually Work — the experience/workplace filters LinkedIn silently ignores, applied for real
- LinkedIn Jobs Salary Data — Filter by Pay — salary parsed into numbers so you can filter by yearly pay
- Fast LinkedIn Jobs Scraper — bulk job listings, cheap and quick
- LinkedIn Company Jobs Scraper — every open role at a company you name
LinkedIn companies
- LinkedIn Company Scraper with Headcount Growth — the real headcount and how fast it's growing
- LinkedIn Company Posts + Engagement — a company's posts with exact reaction and comment counts
App stores
- App Store Rank & Rating Scraper — iOS keyword rank and rating changes over time
- Shopify App Reviews Scraper — Filter & Sort by Rating — exact per-star review counts, filter and sort
- Google Play Rating & Review Tracker — an Android app's rating tracked day by day
