# Customer Feedback Analysis

> 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.

- Skill: `crawlora-org/customer-feedback-analysis` (Agent Skill, multi-file: 3 files)
- Install (CLI): `npx skillmds@latest add crawlora-org/customer-feedback-analysis`
- Raw SKILL.md: https://api.skillmd.com/api/skills/crawlora-org/customer-feedback-analysis/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: Crawlora-org (https://skillmd.com/u/crawlora-org)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/crawlora-org/customer-feedback-analysis

---


# 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](https://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](reference/endpoints.md)
for supported sources, discovery endpoints, IDs, and pagination.

## Collect a comparable sample

1. 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.
2. 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. |

3. 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.
4. 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.
5. 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.

```sh
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.

