Review Intelligence avatar

Review Intelligence

Pricing

Pay per usage

Go to Apify Store
Review Intelligence

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

Agent Workflow Lab

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

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:

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 valueAccepted fields / behavior
TextGeneric: text, reviewText, content, review, then title + optional body; Junglee Amazon: reviewTitle + reviewDescription; source profiles apply safer documented mappings
RatingGeneric: rating, then stars, then score; Google Maps: stars; Junglee Amazon: ratingScore; numeric integers or single-digit decimal strings from 1–5 only
DateGoogle 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.
AuthorGeneric: author, reviewerName, or authorName; Google Maps: name; Junglee Amazon: optional username; App Store: userName
IDid, then reviewId; otherwise a deterministic content hash
SourceExplicit 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; maxReviews defaults 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]);