Takes rows of public Shopify App Store review text and produces one prioritized brief a product or support owner can act on: what kind of problem each review describes, how badly it can hurt, what to do first, and where the original wording came from.
It is built for independent Shopify app teams and the agencies that run their support - the case where low-star reviews arrive scattered across several listings plus a few watched competitors, and the failure mode is treating them all as equally urgent.
The rubric below is not invented here. It reproduces a publicly published rule set verbatim, so a manual pass and this skill sort the same row the same way. See Provenance for the source.
These are not style preferences. Breaking one makes the output worse than nothing.
source: not captured - never a guessed one.Ask for one review per line. The full form keeps the source link, which the brief needs:
rating | app name | review date | public reviews URL | review text
A shorter three-field form is also accepted - treat field 1 as the rating when it is a bare 1-5
(optionally followed by star or stars), otherwise as the app name:
rating | app name | review text
Rules for this step:
# are comments. Blank lines are skipped.source: not captured through to the brief. Do not drop
the row and do not fabricate a link.Lower-case the review text and normalize curly apostrophes (’ to ') before matching, so a
pasted "won’t load" still matches won't load. Also match every keyword below with the
apostrophe dropped entirely: merchants routinely type these contractions without one, and the
apostrophe-free spelling must classify exactly the same as the contracted form.
Five buckets. Each row gets exactly one primary bucket - the first dimension below, in this order, with any matching keyword. Further matches are recorded as secondary, never as a second brief item.
The purchase path, app activation, or merchant data may be at stake right now. Left alone it costs the merchant money and the team installs.
Suggested action. Try to reproduce on a test store today. If confirmed, treat it as an incident: fix or mitigate first, then reply to the reviewer with what changed.
Signal keywords. won't load, won't open, won't close, can't close, cannot close, blank screen, broken, crash, stopped working, not working, doesn't work, does not work, checkout, losing sales, lost sales, error
The product works, but the same struggle keeps showing up across reviews or against an open support theme. Repetition is the signal, not volume of adjectives.
Suggested action. Log it against the matching support theme. If the same complaint repeats across rows, schedule a UX fix ahead of new feature work.
Signal keywords. confusing, unclear, hard to, difficult, complicated, clunky, slow, couldn't figure, could not figure, annoying, had to contact support, setup took, too many steps
What the merchant expected to pay and what happened diverged. Usually a copy problem in the listing, the plan limits, or the upgrade prompts - not a code problem.
Suggested action. Compare what the reviewer expected with the listing's pricing section and in-app upgrade prompts; clarify the copy where they diverge.
Signal keywords. pricing, price, charged, charge, billing, billed, expensive, free plan, trial, refund, hidden fee, hidden cost, paywall
The merchant wants something the app does not do, or could not find. Valuable as a log entry, rarely urgent on its own.
Suggested action. Add it to the feature-request log with a link to the review. If the capability already exists, reply to the reviewer with where to find it.
Signal keywords. wish, would be great, would love, please add, feature request, missing, if only, would like, no option to, needs an option, hope you add, add support for
No keyword matched. Vague frustration, sarcasm, mixed praise, or a story that needs context.
Suggested action. No keyword matched. Read the full review yourself and file it manually - the heuristic makes no guess here.
Priority. The rubric labels this bucket P2 and sorts it last. Treat that label as
provisional placement in the queue, not as a severity judgment - nothing has been judged yet.
The first pass is where this skill stops being able to help on its own. Before any item is presented as more than a keyword match, a person on the team has to:
Ask for these outcomes rather than assuming them. Until you have them, every item stays labeled first pass - not human-checked, including in the summary line. An unverified P0 is a candidate, not an incident.
Known limits to state plainly when they apply: keyword matching is English-only, misses sarcasm and context, can misfile a review that mentions "checkout" in passing, and sees only the rows supplied.
One document per portfolio, sections in rubric order, every item carrying an owner, a next action, and a source link. An item without an owner is a note, not a brief entry.
# Low-star review brief - {portfolio or team name} - week of {YYYY-MM-DD}
Scope: {apps monitored} - {competitors watched} - {N} rows supplied, {date range}.
Covers only the rows supplied - no claim of exhaustive coverage.
Reviews are customer reports, not verified defects. Items marked "first pass" are
unverified keyword matches; "human-checked" means a person read the review and checked it.
## P0 - Incident risk
- **{App} - {signal in a few words}** ({rating} stars, {review date}, [source]({public reviews URL}))
- Reviewer reports: {one sentence, in their words where possible}
- Status: first pass - not human-checked / human-checked
- Reproduced: {yes / no / attempted - notes}
- Next action: {action} - owner {name}, due {date}
## P1 - Repeated friction
- **{App} - {theme}** ({rating} stars, {date}, [source]({public reviews URL}); also seen: {where})
- Status: first pass - not human-checked / human-checked
- Next action: {UX or docs change} - owner {name}, due {date}
## P2 - Pricing confusion
- **{App} - {signal}** ({rating} stars, {date}, [source]({public reviews URL}))
- Expected vs. actual: {one line}
- Status: first pass - not human-checked / human-checked
- Next action: {copy or prompt change} - owner {name}, due {date}
## P3 - Feature requests
- **{App} - {request}** ({rating} stars, {date}, [source]({public reviews URL})) - {log it, or already exists so reply with where to find it}
## Needs human read
- **{App}** ({rating} stars, {date}, [source]({public reviews URL})) - {no keyword matched; what a human should look for}
## Competitor watch
- **{Competitor} - {signal}**: {what it implies for our roadmap, copy, or positioning}
## Decisions this week
- {one decision or experiment, with the rows that motivated it}
Open the summary line with the counts, e.g. "Triaged 8 rows supplied: 3 incident risk, 2 repeated friction, 1 pricing confusion, 1 feature request, 1 needs human read - first pass, not human-checked."
Refuse to deliver until every line is true:
source: not captured.These eight fictional rows exercise every bucket. Two of them are deliberately 4-star and 5-star, to reach the feature-request and needs-human-read buckets.
1 | Example Popup App | The editor shows a blank screen and the popup won't load. We are losing sales every day.
2 | Example Popup App | The overlay can't close on mobile and it blocks the checkout button.
1 | Example Currency App | Conversion is broken at checkout and we were still billed for the month.
3 | Example Currency App | Setup took hours and the settings screen is confusing. Support was slow to reply.
3 | Example Reviews App | The widget looks fine but the template editor is confusing and hard to use on a tablet.
2 | Example Currency App | We kept getting charged after uninstalling, and the pricing page never mentioned this.
4 | Example Reviews App | Great app, but I wish it could export reviews to CSV. Please add filtering by country.
5 | Example Reviews App | Does what it promises and support replied the same day.
First pass over those rows:
row 1 -> P0 incident risk
row 2 -> P0 incident risk
row 3 -> P0 incident risk (secondary: pricing confusion)
row 4 -> P1 repeated friction
row 5 -> P1 repeated friction
row 6 -> P2 pricing confusion
row 7 -> P3 feature request
row 8 -> needs human read
Rows 4 and 5 both matched confusing, so they are flagged as a repeated theme - two rows, which
is a cluster to watch, not yet the three that trigger escalation. Row 3 is a single P0 item with
pricing recorded as secondary, never two items. Row 8 matched nothing and stays unjudged. None of
these rows carried a source URL, so each item would read source: not captured until the team
supplies the listing links.
.../reviews?ratings%5B%5D=1), and pin the item
with the review date plus the reviewer's first few words so a human can find it again.| into the review text, so a
row carrying a date and a URL still classifies but displays them inside the quoted review.checkout is the noisiest keyword in the set. It fires on "we love the checkout upsell".
A P0 whose only evidence is the word checkout is a needs-human-read row wearing a P0 badge -
say so instead of promoting it.missing and error cross buckets. "missing a dark mode" is P3; "settings page errors out"
is P0. Primary-bucket order resolves the collision mechanically; the human pass fixes the ones
where it guessed wrong.The dimensions, priorities, keyword lists, suggested actions, tie-break rules, and brief template reproduced above come from a publicly published manual triage guide: https://alfredtech2026.github.io/shopify-app-review-brief/guides/shopify-app-review-triage.html
That guide is maintained independently and is not affiliated with, endorsed by, or sponsored by Shopify Inc. or any app developer. Shopify is a trademark of Shopify Inc.