Trustpilot Reviews to Complaint Themes avatar

Trustpilot Reviews to Complaint Themes

Pricing

from $20.00 / 1,000 company analyseds

Go to Apify Store
Trustpilot Reviews to Complaint Themes

Trustpilot Reviews to Complaint Themes

I read a company's Trustpilot reviews and group them into the complaint and praise themes that repeat, each with a count and verbatim quotes tied to the review they came from. Bring your own OpenAI key for the themes, and without one you still get every review.

Pricing

from $20.00 / 1,000 company analyseds

Rating

0.0

(0)

Developer

Jessy Mariau

Jessy Mariau

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 hours ago

Last modified

Share

Plenty of Actors will hand you a company's Trustpilot reviews as a spreadsheet. Then you are holding 500 rows and the question you started with: what are these people actually angry about, and how often? This one answers that question. It collects the reviews. Give it your own OpenAI key and it reads them too, then hands back the top complaint themes and the top praise themes. Each theme carries a count and up to three quotes copied word for word from the reviews, tied to review ids so you can check any of them yourself.

I built it for my own pre-sales work. Before I pitch a fix for someone's support queue I want to know what their customers say is broken, in their words, with a number next to it. Ten minutes with a themes row beats an afternoon in a spreadsheet.

What it does

  1. Opens the company's public Trustpilot review pages in a real browser, newest first, and reads the reviews out of the JSON each page ships rather than scraping the HTML. It drives a browser because it has to: Trustpilot puts an AWS WAF JavaScript challenge in front of every page, and a plain HTTP client never gets past it (see Limits).
  2. Pushes one dataset row per review with the star rating and the full title and text, both dates, the reviewer's country and verified flag, the company's public reply when there is one, and a link back to the review.
  3. With an OpenAI key, sends the reviews to the model you name (gpt-5-mini by default) under a strict JSON schema and asks for 5 to 8 complaint themes and 3 to 5 praise themes. Each theme gets a short label, a count estimate and up to 3 quotes. You also get a one-paragraph readout in plain English.
  4. Checks every quote the model returns against the review it claims to come from. A quote that is not a verbatim substring of that review's text or title is dropped, and the row records how many were dropped. The model is told never to invent a quote; this step is what proves it did not.
  5. Pushes one summary row per company with type: "themes", and writes the same summary to the OUTPUT record.

Run it with no domains and you get a demo dataset: 5 sample reviews and 1 sample themes row, nothing charged, so you can see the shape before pointing it at a real company.

What you need

  • One or more company domains, written exactly as they appear in the Trustpilot URL after /review/, one per line. monzo.com works, so does www.asos.com. Trustpilot keeps its own canonical name for each company and redirects to it, throwing your filters away as it goes, so the Actor resolves that name first and only then asks for filtered pages. You get the star and language filter you asked for, not a first page that is quietly unfiltered.
  • An OpenAI API key from platform.openai.com, only if you want the themes step. It is stored as a secret and used for nothing else. The model cost lands on your OpenAI account, not here. For scale: my 20-review test on gpt-5-mini used about 1,600 input tokens and 6,200 output tokens.
  • Nothing else. No proxy by default, no Trustpilot login. The browser runs inside the Actor, so there is nothing for you to install.

How to run it

{
"domains": "monzo.com\nstarlingbank.com",
"maxReviewsPerCompany": 200,
"starsFilter": ["1", "2"],
"language": "en",
"openaiApiKey": "sk-your-own-key",
"themeModel": "gpt-5-mini"
}

Pick 1 and 2 stars to feed the themes step complaints only; that is the setting I use most. Leave the star filter empty and the themes row shows the balance between praise and complaints across everything. maxReviewsPerCompany goes up to 500, collected 20 per page. language takes a Trustpilot language code, or all.

Leave out openaiApiKey and you still get every review row; the themes row then says the step was skipped and why.

Output

Review rows, type: "review":

FieldWhat it holds
companythe domain you gave
reviewIdTrustpilot's id for the review
rating1 to 5
title, textthe review as written
publishedDate, experiencedDateISO dates
languagelanguage code of the review
reviewerCountry, reviewerNameas shown on Trustpilot
verified, verificationLevelwhether Trustpilot marks it verified, and how (for example invited)
reply, replyDatethe company's public reply, or null
urllink to the review

Themes row, one per company, type: "themes":

FieldWhat it holds
company / trustpilotNamethe domain you gave and the name Trustpilot resolved it to
companyName / trustScore / totalReviewsOnTrustpilotwhat Trustpilot shows for the company
reviewsAnalysed / ratingBreakdown / filtershow many reviews went into the themes step, split by stars, and the filters used
blocked / notFound / fetchStatuseswhether Trustpilot blocked or had no page, plus the HTTP status of every page fetched
themesGenerated / model / tokenswhether the themes step ran, with which model, and what it used
complaintThemes / praiseThemesarrays of { label, countEstimate, quotes: [{ reviewId, quote, rating }] }
readoutthe one-paragraph plain-English summary
droppedQuoteshow many model quotes failed the verbatim check and were removed
noteanything you should know about this company's run, in a sentence

The OUTPUT record in the key-value store holds every themes row under companies, plus a one-line text summary you can pipe into Slack or email with an Apify integration.

Pricing

$0.02 per company analysed. That is the only charge. The reviews themselves cost nothing, however many you pull.

You are charged when a company's themes are actually produced. A company Trustpilot blocked, a run with no OpenAI key, a failed model call and the demo run all produce output and charge you nothing.

The OpenAI cost is separate and sits on your own key.

Limits

  • Trustpilot sits behind AWS WAF. The first version of this Actor used a plain HTTP fetch, and it collected nothing at all: a 403 "Verifying Connection" page from an Apify datacenter IP, the same through residential proxy, and the same from my own home line with a full set of browser headers. Not the IP, then, and not the headers. That interstitial is a JavaScript challenge. It runs a script and earns a token cookie before the real page will load. No HTTP client can do that. So the Actor drives a real Chromium and waits for the challenge to clear, which takes a second or two on the first page of each company and nothing after that, because the token is reused for the rest of the run. Residential proxy is not needed for this and is off by default.
  • If the challenge does not clear, the Actor says so rather than guessing. That company gets a themes row with blocked: true, the HTTP status of every page it touched in fetchStatuses, and a note explaining what happened. A company with no Trustpilot page gets notFound: true the same way. You still get a row, and the row still tells the truth.
  • Because it runs a browser, this Actor needs 4 GB of memory. That is set as the minimum on the Actor, so you should not have to think about it.
  • Themes are model output. Read them against the counts and the quotes. The quotes are verified word for word; the labels and the count estimates are the model's judgement, not a database query. A theme with a count of 1 and a single quote is one reviewer, not a trend.
  • One model call per company, with each review text cut at 1,200 characters. 500 reviews fit comfortably in one call on current models.
  • Public reviews only. Trustpilot's terms apply to what you do with the data.
  • Mixed languages lower the quality of the themes. Filter to one language unless you have a reason not to.

Getting past the bot wall took a rebuild, and I wrote up both that and what the themes will not tell you at https://fractionalhq.uk/use-cases/review-themes

Built by Fractional HQ

I run Fractional HQ, a one-man studio for design and automation. I do not write code by hand: I architect, review and hold the standard while AI agents do the typing. That method runs my own estate of seven brands, on a Postgres operations system with more than 100 scheduled jobs. I publish n8n templates. I am Zapier Silver certified.

Want the themes wired into a weekly report, or the complaints turned into a fix list for your support team? Get in touch: https://fractionalhq.uk/brief