Track competitor Trustpilot reviews weekly in Google Sheets with n8n
Reading competitors’ Trustpilot pages by hand each week is slow, and copying reviews into a sheet loses the history of their TrustScore.
arcadium/trustpilot-reviews remembers which reviews it already delivered under a state key, so a weekly run returns only the new ones and charges only for those. One free company row per competitor carries the TrustScore and review count for a weekly snapshot.
Cost of this example on the Apify Free plan: 300 × $0.00052 = $0.156 ($0.081 on the Apify Gold plan and higher), plus $0.005 per GB of memory when the run starts.
What you need
- An Apify account and API token.
- n8n (cloud or self-hosted) with Apify’s official node
@apify/n8n-nodes-apify, and a Google Sheets credential in n8n. - The website domains of the competitors you track, for example
bestbuy.com.
Step 1: Run it in the Apify Store (no code)
- Open arcadium/trustpilot-reviews on the Apify Store and sign in (a free Apify account works).
- Enter the competitor domains (or their Trustpilot review page links) in Companies.
- Set Max reviews per company to 100.
- Turn on Only new reviews and set State key to a stable name such as
competitors. Keep it the same on every run. - Optional: set a maximum cost per run in the run options as a hard cap.
- Click Start. Rows appear in the Output tab; export them as JSON, CSV or Excel.
The same input as JSON (paste it in the JSON tab of the input form):
{
"companies": [
"bestbuy.com",
"walmart.com",
"target.com"
],
"maxReviewsPerCompany": 100,
"onlyNewReviews": true,
"stateKey": "competitors",
"includeCompanyInfo": true
}
Step 2: Call it over the Apify API
One HTTP call runs the actor and returns its rows. It suits runs up to about five minutes; for longer runs start the run asynchronously and read the dataset when it finishes.
curl -X POST "https://api.apify.com/v2/acts/arcadium~trustpilot-reviews/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"companies":["bestbuy.com","walmart.com","target.com"],"maxReviewsPerCompany":100,"onlyNewReviews":true,"stateKey":"competitors","includeCompanyInfo":true}'
Step 3: Run it from Python
With apify-client 3.x, call() returns a Run object: read the dataset id as run.default_dataset_id (older examples use run["defaultDatasetId"], which no longer works).
# pip install "apify-client>=3"
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("arcadium/trustpilot-reviews").call(run_input={
"companies": ["bestbuy.com", "walmart.com", "target.com"],
"maxReviewsPerCompany": 100,
"onlyNewReviews": True,
"stateKey": "competitors",
})
rows = list(client.dataset(run.default_dataset_id).iterate_items()) # apify-client 3.x Run object
for c in (r for r in rows if r.get("rowType") == "company"):
print(c["name"], "TrustScore", c.get("trustScore"), "reviews", c.get("reviewCount"))
new = [r for r in rows if r.get("rowType") == "review"]
print(len(new), "new reviews")
for r in new[:5]:
print(r["productName"], r["date"], r["ratingOverall"], (r.get("title") or "")[:80])
Step 4: Run it from JavaScript
// npm install apify-client
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('arcadium/trustpilot-reviews').call({
"companies": [
"bestbuy.com",
"walmart.com",
"target.com"
],
"maxReviewsPerCompany": 100,
"onlyNewReviews": true,
"stateKey": "competitors",
"includeCompanyInfo": true
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
Step 5: Ask an AI assistant (MCP)
Apify’s hosted MCP server turns the actor into one tool. Add it to Claude, Cursor, VS Code or any MCP client:
{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com/?tools=arcadium/trustpilot-reviews",
"headers": {
"Authorization": "Bearer <APIFY_TOKEN>"
}
}
}
}Then ask, for example:
Use arcadium/trustpilot-reviews to get the 50 newest Trustpilot reviews of bestbuy.com and walmart.com, then compare the most common complaints in 1- and 2-star reviews.
More clients and the local setup on the MCP page.
Set it up in n8n
The workflow: a Schedule trigger (Monday 06:00), the Apify node with the operation Run actor and get dataset and the input above, then two Code nodes that split review rows from company rows, and two Google Sheets nodes that append them to a Reviews tab and a TrustScores tab. Set a maximum total charge for the run (maxTotalChargeUsd, for example $1) as a hard cost cap. Run it once by hand, check both tabs, then activate it.
Ready-made workflow: Weekly Trustpilot reviews of competitors to Google Sheets (import the file in n8n, Workflows, Import from File).
Without n8n: Google Sheets only
Schedule the input above as an Apify task (Console, Saved tasks, Schedule weekly), then load its last successful run into a sheet with Apps Script and a weekly time-driven trigger.
// Extensions > Apps Script. Project Settings > Script properties > APIFY_TOKEN.
function importNewReviews() {
const token = PropertiesService.getScriptProperties().getProperty('APIFY_TOKEN');
const url = 'https://api.apify.com/v2/acts/arcadium~trustpilot-reviews/runs/last/dataset/items?status=SUCCEEDED&clean=true';
const rows = JSON.parse(UrlFetchApp.fetch(url, { headers: { Authorization: 'Bearer ' + token } }).getContentText());
const reviews = rows.filter((r) => r.rowType === 'review');
const keys = ['productName', 'date', 'ratingOverall', 'title', 'text', 'vendorResponse', 'language', 'reviewUrl'];
if (reviews.length) SpreadsheetApp.getActiveSheet().getRange(SpreadsheetApp.getActiveSheet().getLastRow() + 1, 1, reviews.length, keys.length)
.setValues(reviews.map((r) => keys.map((k) => r[k] ?? '')));
}Ready-made workflow: Weekly Trustpilot reviews of competitors to Google Sheets (import the file in n8n, Workflows, Import from File).
Output fields
Every row has a rowType; filter on it first. Failed inputs come back as free rows with a code and message. The fields this tutorial uses, from the actor’s dataset schema:
| Field | What it holds |
|---|---|
rowType | Kind of row. Filter on this first. Values: 'company': one row per company with TrustScore, stars, review count and categories (free with reviews; charged as the 'company' event in company mode: categories, or includeReviews false). 'review': one review (charged). 'coverage': stated total vs delivered and why reading stopped, per company or per category and country (free). 'error': an input could not be read; see code and message (free). 'watch-summary': watch mode counts (free). |
productName | Company name as shown on Trustpilot. |
reviewId | Stable review id in the form '<Platform>___<native id>'. Use it to deduplicate between runs. |
reviewUrl | Link to the single review, null when the site has none. |
date | Date the review was published, ISO yyyy-mm-dd. Date of experience: extras.experiencedDate. |
ratingOverall | Star rating of the review, 1 to 5. |
title | Review headline, null when the site has none. |
text | Review text in the language it was written in. Null when the review has no text. |
vendorResponse | The company's public reply, null when there is none. The reviewer's name is removed from it. Reply date: extras.vendorResponseDate. |
language | Language of the review text as a two-letter code, null if unknown. |
country | Company rows: ISO two-letter country of the company (from the profile, or mapped from the category listing). Review rows: always null. |
trustScore | Company rows: TrustScore, 1.0 to 5.0. |
reviewCount | Company rows: total number of reviews Trustpilot states. |
All fields: Trustpilot Reviews Scraper guide.
Cost per run
Pay per event: you pay for the rows delivered, at the actor’s live Apify price on 2026-11-02. Error, coverage and summary rows are free.
| What | Rows | Price per row (Free plan) | Subtotal |
|---|---|---|---|
| Review: first run: 3 companies x 100 reviews; later runs only new reviews | 300 | $0.00052 | $0.156 |
Cost of this example on the Apify Free plan: 300 × $0.00052 = $0.156 ($0.081 on the Apify Gold plan and higher), plus $0.005 per GB of memory when the run starts. Higher Apify plans pay less per row. The Store page always has the current price.
Limitations
- The state key is what makes the weekly run return only new reviews. A new key starts over and delivers (and charges) everything again.
- The first run is the expensive one; later runs cost only the reviews published since the previous run.
- Trustpilot shows an anonymous visitor 10 pages per filter combination; reading further would need a login, which this actor never does. With
splitFiltersthe actor reaches more reviews through other combinations, not all of them for very large profiles: the coverage row then saysstopReason: "cap". - With several languages or
splitFilters, rows are not in one date order; sort ondateif you need it. - Category listings stop at 10,000 companies per category and country (Trustpilot's own limit, coverage
stopReason: "cap"); list sub-categories to reach more. Trustpilot's TrustScore filter is not applied. - Public data only. No login, no personal data, no contact details.
Links
- Trustpilot Reviews Scraper: fields, price table and sample output
- How to use Trustpilot Reviews Scraper: every input field, n8n, LangChain
- arcadium/trustpilot-reviews on the Apify Store
- All tutorials