Turn a bounded sample of customer feedback into traceable themes and hypotheses. Keep reviews and social discussion distinct: a Reddit commenter is not necessarily a customer, and sentiment in a sample is not a population satisfaction measure.
Setup
Set CRAWLORA_API_KEY to your key from crawlora.net.
Run the bundled scripts/crawlora.sh from this skill directory or by absolute
path. It sends x-api-key to https://api.crawlora.net/api/v1 and prints JSON.
Keep the key in the environment. Read reference/endpoints.md
for supported sources, discovery endpoints, IDs, and pagination.
Collect a comparable sample
-
Define the product(s), question, market/language, time window, and sample bound from the brief. Resolve exact products before collecting feedback. Keep app versions, product models, and company-wide service reviews separate.
-
Choose relevant sources, rather than querying all of them:
Source Identity and collection details App Store Search with term; reviews require numericidor bundleapp_id. Pages 1–10;sort=mostRecentormostHelpful; specifycountry.Google Play Search/details resolve package app_id. Reviews usenum(max 1000),country,lang, andsort=newest,helpfulness, orrating. Read rows underdata.dataand followdata.next_pagination_tokenonly within the sample bound.Stored app reviews /datasets/apps-reviews/searchusesstore=iosorandroid, exactapp_id, andpage_size(max 100). This is indexed feedback, not a live refresh.Trustpilot Search for the business slug, usually its domain; collect /trustpilot/business/{slug}/reviews. Preserve star/language filters. Date filters are currently rejected upstream: filter returned dates locally and disclose collection coverage.Capterra Resolve numeric product_idthrough search, then/capterra/product/reviewswithpage.Adidas Resolve products[].model_numberthrough search. Fetch review topics for that model before applyingtopic; reviews acceptrating,locale, andpage.Reddit Search for relevant discussions, then retrieve the returned post ID and comments. Normal comment mode can be text; use include_metrics=trueonly when structured comment identities/metrics are needed, with its higher documented credit cost. -
Save source IDs/URLs, dates, product/version, rating scale, text, and collection filters. Deduplicate by source review ID; use normalized text plus date/product only as a fallback, and avoid counting syndicated copies twice. Exclude brand replies from the customer-review denominator and report exclusions.
-
Label each review with one or more specific themes and distinguish an explicit feature request from an inferred product opportunity. Separate praise and complaints. Keep mixed/unclear sentiment instead of forcing a binary label.
-
Count unique eligible reviews mentioning each theme. Report
n/Nwith the definition of N, by source/product. Multiple themes per review mean totals can exceed N. Do not combine incompatible star scales or compare differently filtered samples as though they were controlled measurements.
scripts/crawlora.sh /googleplay/reviews \
app_id=com.openai.chatgpt country=us lang=en sort=newest num=10
Deliverable and interpretation
Return a theme table with theme, source/product, unique-review count/denominator, short attributed examples and links, observed impact, and a proposed follow-up. Include dates, filters, deduplication rules, gaps, and untested hypotheses. Use brief excerpts rather than republishing review archives. Do not export reviewer contact details; only retain author identifiers when needed for provenance.
- A star-filtered, keyword-filtered, or helpfulness-ranked sample is biased toward its selection rule. It cannot establish overall complaint prevalence.
- Missing dates cannot prove a review belongs in the requested window. Mark undated records separately. Do not call comments verified purchases.
- No repeated pagination token/page progress means stop. For indexed app reviews, respect the 10,000-result window; there is a minimum-score filter, not a maximum.
- Stop when the bound or source end is reached. Back off on
429, retry a transient5xxonce, and stop on401/403. App Store404can mean the app is absent from that storefront; do not repeatedly retry it. Check the application envelope before treating an empty response as no feedback.