Trustpilot Reviews Reputation & Competitor Monitor
Pricing
from $2.50 / 1,000 analyzed review or business summaries
Trustpilot Reviews Reputation & Competitor Monitor
⭐ Monitor public Trustpilot reviews, compare competitors, detect reputation changes, surface urgent issues, and export evidence-based response priorities.
Pricing
from $2.50 / 1,000 analyzed review or business summaries
Rating
0.0
(0)
Developer
Daniel S.
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
⭐ Trustpilot Reviews Reputation & Competitor Monitor
Monitor public Trustpilot reviews, compare competitors, detect reputation changes, and turn customer feedback into an actionable response queue.
This standalone Apify Actor reads public Trustpilot review pages with a cost-efficient hybrid fetcher: lightweight HTTP first, then a managed Playwright browser only when Trustpilot presents a JavaScript challenge. It does not use a paid API or another Apify Actor.
🚀 What you get
- ⭐ Business TrustScore, public review count, and rating distribution
- 💬 Structured review-level records without reviewer profile data
- 📈 Observed 30-day review velocity
- 📣 Public business response rate
- 🚨 Negative-review rate and urgent issue detection
- 🧠 Deterministic sentiment and topic classification
- 🏆 Competitor reputation leaderboard
- 🔄 Changes versus the previous run
- 🔎 Evidence links and response priorities
- 📊 Apify Dataset views for leaderboard, urgent issues, reviews, and all data
- 📄 Professional HTML and JSON reputation reports
- 🗄️ Historical state stored in a named key-value store
- 🌐 Retry, exponential backoff, and optional Apify/custom proxy support
- 🛡️ Automatic browser fallback for Trustpilot WAF challenges
Who should use it?
- Reputation management agencies
- Customer-experience and support leaders
- Competitive intelligence teams
- SaaS, e-commerce, travel, fintech, and marketplace operators
- Consultants preparing account reviews
- Automation teams sending reputation alerts to Slack, email, Make, Zapier, or n8n
Quick start
Use a business domain:
{"businesses": ["www.airbnb.com"],"maxReviewsPerBusiness": 100,"ratings": ["1", "2", "3", "4", "5"],"competitorComparison": false,"includeReviewText": true,"topicKeywords": ["refund", "cancellation", "customer support"],"historyKey": "airbnb-reputation-watch","proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}
Or compare several public Trustpilot profiles:
{"businesses": ["https://www.trustpilot.com/review/www.airbnb.com","www.booking.com","www.vrbo.com"],"maxReviewsPerBusiness": 100,"competitorComparison": true,"includeReviewText": true,"historyKey": "travel-platform-reputation"}
The first business is treated as the primary brand in the input, while all businesses are evaluated by the same deterministic method.
Input
| Field | Type | Default | Description |
|---|---|---|---|
businesses | string[] | required | 1–20 domains or full Trustpilot /review/ URLs |
maxReviewsPerBusiness | integer | 100 | Maximum matching review records per business, up to 1,000 |
dateFrom | YYYY-MM-DD | empty | Inclusive lower publication-date filter |
dateTo | YYYY-MM-DD | empty | Inclusive upper publication-date filter |
ratings | string[] | ["1","2","3","4","5"] | Star ratings to export; numeric API values are also normalized at runtime |
competitorComparison | boolean | true | Build a cross-business leaderboard |
includeReviewText | boolean | true | Include public review titles, bodies, and business response text |
topicKeywords | string[] | empty | Additional business-specific phrases to detect |
historyKey | string | trustpilot-reputation-monitor | Named KVS identifier reused across scheduled runs |
proxyConfiguration | object | Residential proxy | Apify Proxy or custom proxy settings; direct mode remains available |
requestTimeoutSecs | integer | 30 | Per-request timeout |
maxConcurrency | integer | 2 | Concurrent business profiles, maximum 5 |
Filtering behavior
Pages are requested newest first. Rating and date filters control the review rows exported to the Dataset. Business summary metrics use the recent reviews sampled while the Actor scans for matching results. The report clearly labels these values as sampled metrics.
When dateFrom is supplied, scanning stops after the crawler reaches reviews older than that date. A page safety limit prevents unexpectedly large runs.
Output design
The default Dataset contains two record types:
summary
One business-level row per successfully processed profile:
{"recordType": "summary","businessDomain": "example.com","businessName": "Example Co","businessRating": 3.8,"businessReviewCount": 1234,"reviewsCollected": 100,"reviewVelocity30d": 42,"responseRate": 68,"negativeReviewRate": 21,"reputationScore": 72,"competitorRank": 2,"urgentIssueCount": 4,"topTopics": [{"topic": "customer support","count": 18,"negativeCount": 11}],"changes": {"hasPreviousRun": true,"ratingDelta": -0.1,"reviewCountDelta": 42,"negativeRateDelta": 3.2,"newReviewCount": 42}}
review
One evidence-level row per filtered public review:
{"recordType": "review","businessDomain": "example.com","rating": 1,"reviewTitle": "Refund never arrived","reviewText": "Customer support ignored my request...","publishedAt": "2026-07-20T10:00:00.000Z","hasBusinessResponse": false,"sentiment": "negative","sentimentScore": -100,"topics": ["customer support", "refund"],"isUrgent": true,"urgencyReasons": ["Recent 1–2 star review has no public business response"],"reviewUrl": "https://www.trustpilot.com/reviews/..."}
Reviewer names, avatars, countries, profile URLs, and reviewer activity are deliberately not collected.
Dataset views
- 🏆 Competitor leaderboard: scores, ranks, changes, and priorities
- 🚨 Urgent issues: low-star evidence needing action
- 💬 Review intelligence: filtered, analyzed review rows
- All structured data: complete API-friendly output
The default key-value store also contains:
REPUTATION_REPORT.jsonREPUTATION_REPORT.html
Reputation score
reputationScore is deterministic and bounded from 0 to 100:
- 55%: public business rating, or sampled average when unavailable
- 20%: inverse sampled negative-review rate
- 15%: sampled public response rate
- 10%: urgent-issue penalty
It is a prioritization metric, not a statement of fact about a company and not a prediction of future performance.
Sentiment, topics, and urgency
No external AI API is required. Sentiment starts from the star rating and is adjusted by a small documented positive/negative vocabulary.
Built-in topics cover:
- customer support
- delivery and shipping
- refunds
- billing and payments
- cancellations
- product/service quality
- security and fraud
- account access
- bookings
- communication
- website and app
- staff
- pricing
Custom topicKeywords are matched case-insensitively and added to the same output.
A review can become urgent when it is a recent unanswered 1–2 star review, a very recent one-star review, or contains critical language such as fraud, safety, identity theft, or data breach. Every flag includes evidence and an explicit reason.
Historical monitoring
Use the same historyKey every time:
{"businesses": ["example.com", "competitor.com"],"historyKey": "weekly-category-monitor"}
The Actor opens a named key-value store and saves a compact REPUTATION_STATE_V1 snapshot. The next run calculates:
- rating change
- total review-count change
- negative-rate change in percentage points
- response-rate change in percentage points
- observed 30-day velocity change
- new review IDs in the current sample
- newly added urgent-issue count
For reliable comparisons, keep the same businesses, filters, review cap, and history key.
Scheduling and alerts
- Save the Actor input as an Apify Task.
- Schedule it daily or weekly.
- Keep
historyKeyunchanged. - Connect the Dataset or JSON report to Make, Zapier, n8n, a webhook, email, or a CRM.
- Trigger an alert when
isUrgentistrue,ratingDeltais negative, ornegativeRateDeltaexceeds your threshold.
Run locally
Requirements: Node.js 20 or newer.
npm installexport APIFY_LOCAL_STORAGE_DIR=./storagenpx --yes apify-cli run --purge --input-file examples/input-smoke.json
Alternatively, place the input in storage/key_value_stores/default/INPUT.json and run:
$npm start
Run offline tests:
$npm test
Run a real one-page smoke check:
$npm run smoke -- https://www.trustpilot.com/review/www.airbnb.com
Trustpilot commonly rejects datacenter IPs. To execute the same live smoke test through your Apify account:
APIFY_TOKEN=your_token \SMOKE_USE_APIFY_PROXY=true \SMOKE_PROXY_GROUPS=RESIDENTIAL \npm run smoke -- https://www.trustpilot.com/review/www.airbnb.com
You can instead set SMOKE_PROXY_URL to a full custom proxy URL.
API example
curl "https://api.apify.com/v2/acts/YOUR_USERNAME~trustpilot-reputation-intelligence/runs?token=$APIFY_TOKEN" \-X POST \-H "Content-Type: application/json" \-d '{"businesses": ["www.airbnb.com", "www.booking.com"],"maxReviewsPerBusiness": 100,"competitorComparison": true,"historyKey": "travel-weekly"}'
Pricing
The launch price uses predictable pay-per-event billing:
apify-actor-start: $0.00005 once per runapify-default-dataset-item: $0.0025 per exported summary or review row
That equals $2.50 per 1,000 exported Dataset records, plus the negligible run-start event. A business with 20 matching reviews normally produces 21 records and costs about $0.05255. Failed requests and reviews removed by filters do not create paid Dataset items.
See PRICING.md for examples, margin guardrails, and the exact Apify configuration.
Reliability and responsible use
- Only pages and review data intentionally exposed on public Trustpilot profiles are requested.
- The Actor first uses lightweight HTTP. If Trustpilot serves its normal JavaScript challenge instead of the public page, it retries that same public URL in its own managed Playwright browser.
- It does not log in, call private or paid APIs, depend on another Actor, solve CAPTCHAs, or attempt to circumvent access controls.
- Requests use conservative concurrency, retries, and exponential backoff.
- Apify Proxy is supported but optional. Direct and datacenter IPs may be rejected; a suitable proxy can improve reliability but cannot guarantee access.
- Public website markup can change. Parser fixtures cover the supported HTML contract, and the live smoke script detects major markup changes.
- Review velocity and rates are based on the sampled reviews available within the configured cap.
- Use the Actor in accordance with applicable laws, Trustpilot's terms, and your legitimate business purpose.
- This Actor is independent and is not affiliated with, endorsed by, or sponsored by Trustpilot.
Project structure
.actor/ Actor definition, input/output/dataset schemas, Dockerfilesrc/input.js Input validation and URL normalizationsrc/fetch.js Hybrid HTTP/Playwright fetcher, retry, backoff, proxy supportsrc/parser.js Cheerio parser for server-rendered review pagessrc/analysis.js Topics, sentiment, urgency, score, leaderboard, historical diffsrc/history.js Named KVS statesrc/output.js Dataset-friendly recordssrc/report.js JSON and HTML reportssrc/main.js Apify orchestrationtest/ Sanitized fixtures and offline testsscripts/smoke.mjs Live one-page parser smoke testexamples/ Example inputs and outputs
License and trademarks
Private commercial project. Trustpilot and associated marks belong to their respective owners and are used descriptively to identify the public source being monitored.