Review Intelligence
Pricing
Pay per usage
Review Intelligence
Turn normalized customer reviews into one deterministic, evidence-backed product intelligence report.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
Agent Workflow Lab
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Turn heterogeneous customer reviews into one auditable product-intelligence report. The Actor normalizes common review fields, summarizes ratings and negative-review share, measures ten business topics, ranks evidence-backed issues, and attaches short verbatim quotes.
No external API key or LLM is required. Review content is not sent to a model or third-party API; cloud runs use only Apify's input and output storage APIs. The analysis logic is deterministic keyword/rating analysis with a limited fixed lexical fallback for unrated reviews. The report timestamp (generatedAt) varies by run. This is not an LLM semantic-analysis product.
Use cases
- Rank recurring product and service issues before roadmap planning.
- Compare rating outcomes with topic mention volume.
- Surface review evidence for support, product, and operations teams.
- Normalize exports from several review platforms into one stable report shape.
- Integrate a one-report-per-run analysis step into an API or automation workflow.
Quick start
An omitted reviews field, including input {}, runs a clearly labeled embedded sample so the default path is useful and QA-safe:
{}
To analyze your data, select an existing Apify Dataset in the Source Dataset resource picker. API clients can pass its Dataset ID:
{"datasetId": "DATASET_ID","productName": "Acme Cloud","maxReviews": 1000}
The Actor opens that Dataset from the caller's accessible storage, reads at most maxReviews items, and never writes to, deletes, or otherwise mutates the source. Dataset reports use inputMode: "dataset", and diagnostics.sourceItemCount records the number of source items fetched. A missing or inaccessible Dataset still produces exactly one structured zero-review report with a warning instead of failing the run.
Or pass reviews inline:
{"productName": "Acme Cloud","negativeRatingThreshold": 3,"maxReviews": 1000,"reviews": [{ "id": "r-1", "text": "Fast, but billing was confusing.", "rating": 3, "date": "2026-06-01" },{ "reviewId": "r-2", "reviewText": "Support solved the setup problem.", "stars": 4, "publishedAt": "2026-06-03" },{ "title": "Export failure", "body": "The app crashes during large exports.", "score": 1 }],"topics": [{ "label": "Exports", "keywords": ["export", "exports"] }]}
To request an intentional zero-review report, pass:
{ "reviews": [] }
An explicit empty array never activates Dataset or sample data. Input precedence is based on property presence: if reviews exists, it is used (even []) and datasetId is ignored; otherwise a nonblank datasetId is used; otherwise the embedded sample is used.
Native upstream pipelines
Documented Dataset handoffs are covered by contract fixtures and regression tests for:
compass/google-maps-reviews-scraperjunglee/amazon-reviews-scraperthewolves/appstore-reviews-scraper
Select the upstream review Dataset in Source Dataset; no manual reshaping is required for the documented output forms. Google Maps uses stars rather than its external-site rating field and never treats place title as review text. Junglee Amazon combines reviewTitle + reviewDescription, maps ratingScore, and accepts optional username. App Store maps score and userName. The compatibility fixtures are reconstructed from public upstream schemas and samples; paid upstream Actors were not run.
Output
Every run writes exactly one review_intelligence_report item to the default Dataset and writes the same report to the default key-value store record named OUTPUT. One report therefore equals one Dataset item with stable automation and output semantics.
Abbreviated output shape:
{"type": "review_intelligence_report","inputMode": "inline","productName": "Acme Cloud","summary": {"reviewCount": 3,"ratedReviewCount": 3,"averageRating": 2.67,"ratingDistribution": { "1": 1, "2": 0, "3": 1, "4": 1, "5": 0 },"negativeReviewCount": 2,"negativeReviewShare": 0.6667,"dateRange": { "from": "2026-06-01", "to": "2026-06-03" }},"topics": [],"topIssues": [],"methodology": {},"warnings": [],"diagnostics": {}}
Each topic includes mentions, negativeMentions, negativeRate, impactScore, trend, and up to three verbatim negative-review quotes. topIssues ranks topics by:
impact score = negative mentions × (negative mentions / all topic mentions)
Supported review fields
| Canonical value | Accepted fields / behavior |
|---|---|
| Text | Generic: text, reviewText, content, review, then title + optional body; Junglee Amazon: reviewTitle + reviewDescription; source profiles apply safer documented mappings |
| Rating | Generic: rating, then stars, then score; Google Maps: stars; Junglee Amazon: ratingScore; numeric integers or single-digit decimal strings from 1–5 only |
| Date | Google Maps: valid publishedAtDate first; otherwise valid date, publishedAt, publishedAtDate, or updatedAt. ISO dates must be a valid date alone or a valid timestamp; their source-local calendar date is preserved. |
| Author | Generic: author, reviewerName, or authorName; Google Maps: name; Junglee Amazon: optional username; App Store: userName |
| ID | id, then reviewId; otherwise a deterministic content hash |
| Source | Explicit source; otherwise the detected profile label (Google Maps, Amazon, or Apple App Store) |
Records without usable text are skipped and counted. Invalid rating/date aliases do not block a later valid alias. Diagnostics expose normalized and detected source-profile counts, mapping counts, skipped records, duplicate-ID repairs, and truncation.
Built-in topics
The default taxonomy covers product quality, usability, performance, reliability, price/value, customer support, delivery/shipping, documentation/setup, missing features, and billing/cancellation. Add up to 20 custom topics with up to 20 literal keywords each.
Limits and evidence policy
- At most 5,000 records can be inspected;
maxReviewsdefaults to 1,000 and is clamped to a minimum of 1. - Review text is capped at 5,000 characters.
- Evidence quotes are copied verbatim from supplied text and capped at 240 characters.
- No causal conclusions or generated recommendations are claimed.
- Keyword matching can miss synonyms, negation, sarcasm, and context.
- A valid rating at or below the selected threshold is negative. Only unrated reviews use the documented fixed negative-term fallback.
- Trend compares topic negative rates in chronological earlier and later halves and requires at least two dated topic mentions.
Privacy and storage
The Actor performs local, in-run computation and makes no external model or third-party API calls. When datasetId is used, Apify storage access reads the caller-accessible source Dataset without modifying it. User review data is written only as part of the single report in the run's default Dataset and OUTPUT record. The Actor does not write user data to named/shared stores or any external service. Apify account retention settings still govern the source and default storages.
API integration
Run synchronously and return the Dataset item:
curl -X POST \"https://api.apify.com/v2/acts/agentworkflowlab~review-intelligence/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-H 'Content-Type: application/json' \-d '{"productName":"Acme Cloud","reviews":[{"text":"Very slow exports","rating":2}]}'
Using the Apify JavaScript client:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('agentworkflowlab/review-intelligence').call({productName: 'Acme Cloud',reviews: [{ text: 'Very slow exports', rating: 2 }],});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items[0]);