Customer-feedback analysis
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 numeric id or bundle app_id. Pages 1–10; sort=mostRecent or mostHelpful; specify country. |
| Google Play |
Search/details resolve package app_id. Reviews use num (max 1000), country, lang, and sort=newest, helpfulness, or rating. Read rows under data.data and follow data.next_pagination_token only within the sample bound. |
| Stored app reviews |
/datasets/apps-reviews/search uses store=ios or android, exact app_id, and page_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_id through search, then /capterra/product/reviews with page. |
| Adidas |
Resolve products[].model_number through search. Fetch review topics for that model before applying topic; reviews accept rating, locale, and page. |
| Reddit |
Search for relevant discussions, then retrieve the returned post ID and comments. Normal comment mode can be text; use include_metrics=true only 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/N with 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
transient 5xx once, and stop on 401/403. App Store 404 can 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.
1---2name: customer-feedback-analysis3description: Analyze public customer reviews and discussions through Crawlora to identify complaint themes, feature requests, praise, and competitive gaps. Use for voice-of-customer briefs and product-feedback comparisons with cited examples and explicit sample counts.4---56# Customer-feedback analysis78Turn a bounded sample of customer feedback into traceable themes and hypotheses.9Keep reviews and social discussion distinct: a Reddit commenter is not necessarily10a customer, and sentiment in a sample is not a population satisfaction measure.1112## Setup1314Set `CRAWLORA_API_KEY` to your key from [crawlora.net](https://crawlora.net).15Run the bundled `scripts/crawlora.sh` from this skill directory or by absolute16path. It sends `x-api-key` to `https://api.crawlora.net/api/v1` and prints JSON.17Keep the key in the environment. Read [reference/endpoints.md](reference/endpoints.md)18for supported sources, discovery endpoints, IDs, and pagination.1920## Collect a comparable sample21221. Define the product(s), question, market/language, time window, and sample23 bound from the brief. Resolve exact products before collecting feedback.24 Keep app versions, product models, and company-wide service reviews separate.252. Choose relevant sources, rather than querying all of them:2627 | Source | Identity and collection details |28 |---|---|29 | App Store | Search with `term`; reviews require numeric `id` or bundle `app_id`. Pages 1–10; `sort=mostRecent` or `mostHelpful`; specify `country`. |30 | Google Play | Search/details resolve package `app_id`. Reviews use `num` (max 1000), `country`, `lang`, and `sort=newest`, `helpfulness`, or `rating`. Read rows under `data.data` and follow `data.next_pagination_token` only within the sample bound. |31 | Stored app reviews | `/datasets/apps-reviews/search` uses `store=ios` or `android`, exact `app_id`, and `page_size` (max 100). This is indexed feedback, not a live refresh. |32 | 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. |33 | Capterra | Resolve numeric `product_id` through search, then `/capterra/product/reviews` with `page`. |34 | Adidas | Resolve `products[].model_number` through search. Fetch review topics for that model before applying `topic`; reviews accept `rating`, `locale`, and `page`. |35 | Reddit | Search for relevant discussions, then retrieve the returned post ID and comments. Normal comment mode can be text; use `include_metrics=true` only when structured comment identities/metrics are needed, with its higher documented credit cost. |36373. Save source IDs/URLs, dates, product/version, rating scale, text, and collection38 filters. Deduplicate by source review ID; use normalized text plus date/product39 only as a fallback, and avoid counting syndicated copies twice. Exclude brand40 replies from the customer-review denominator and report exclusions.414. Label each review with one or more specific themes and distinguish an explicit42 feature request from an inferred product opportunity. Separate praise and43 complaints. Keep mixed/unclear sentiment instead of forcing a binary label.445. Count unique eligible reviews mentioning each theme. Report `n/N` with the45 definition of N, by source/product. Multiple themes per review mean totals46 can exceed N. Do not combine incompatible star scales or compare differently47 filtered samples as though they were controlled measurements.4849```sh50scripts/crawlora.sh /googleplay/reviews \51 app_id=com.openai.chatgpt country=us lang=en sort=newest num=1052```5354## Deliverable and interpretation5556Return a theme table with theme, source/product, unique-review count/denominator,57short attributed examples and links, observed impact, and a proposed follow-up.58Include dates, filters, deduplication rules, gaps, and untested hypotheses.59Use brief excerpts rather than republishing review archives. Do not export60reviewer contact details; only retain author identifiers when needed for provenance.6162- A star-filtered, keyword-filtered, or helpfulness-ranked sample is biased63 toward its selection rule. It cannot establish overall complaint prevalence.64- Missing dates cannot prove a review belongs in the requested window. Mark65 undated records separately. Do not call comments verified purchases.66- No repeated pagination token/page progress means stop. For indexed app reviews,67 respect the 10,000-result window; there is a minimum-score filter, not a maximum.68- Stop when the bound or source end is reached. Back off on `429`, retry a69 transient `5xx` once, and stop on `401`/`403`. App Store `404` can mean the70 app is absent from that storefront; do not repeatedly retry it. Check the71 application envelope before treating an empty response as no feedback.