Install
openclaw skills install @crawlora-org/customer-feedback-analysisAnalyze 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.
openclaw skills install @crawlora-org/customer-feedback-analysisTurn 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.
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.
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. |
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
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.
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.