Trustpilot to Google Sheets, reviews tagged by OpenAI
Review data is supposed to help you make decisions. Instead, it often turns into a weekly ritual of copy-pasting Trustpilot links, losing context, and arguing about “how bad” a complaint really is.
This Trustpilot Sheets automation hits marketing leads and customer ops first, because they’re the ones asked to “pull insights” on demand. A founder feels it too, usually at the worst possible time. The outcome is simple: new reviews flow into a Google Sheet with consistent fields and OpenAI sentiment tags, so you can sort, filter, and report in minutes.
You’ll see how the workflow pulls reviews, extracts the details that matter, labels sentiment, and prevents duplicate rows from creeping in.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Trustpilot to Google Sheets, reviews tagged by OpenAI
flowchart LR
subgraph sg0["When clicking ‘Test workflow’ Flow"]
direction LR
n0@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Out", pos: "b", h: 48 }
n1@{ icon: "mdi:robot", form: "rounded", label: "Information Extractor", pos: "b", h: 48 }
n2@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If", pos: "b", h: 48 }
n3@{ icon: "mdi:play-circle", form: "rounded", label: "When clicking ‘Test workflow’", pos: "b", h: 48 }
n4@{ icon: "mdi:cog", form: "rounded", label: "Limit1", pos: "b", h: 48 }
n5@{ icon: "mdi:swap-vertical", form: "rounded", label: "Set Parameters", pos: "b", h: 48 }
n6["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Get reviews"]
n7["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/html.dark.svg' width='40' height='40' /></div><br/>Extract"]
n8@{ icon: "mdi:database", form: "rounded", label: "Get rows", pos: "b", h: 48 }
n9@{ icon: "mdi:database", form: "rounded", label: "Get Google Sheets", pos: "b", h: 48 }
n10["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Get Single review"]
n11["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/html.dark.svg' width='40' height='40' /></div><br/>Extract review"]
n12@{ icon: "mdi:database", form: "rounded", label: "Update sheet", pos: "b", h: 48 }
n13@{ icon: "mdi:robot", form: "rounded", label: "Sentiment Analysis", pos: "b", h: 48 }
n14@{ icon: "mdi:brain", form: "rounded", label: "DeepSeek Chat Model", pos: "b", h: 48 }
n15@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model", pos: "b", h: 48 }
n2 --> n10
n4 --> n9
n7 --> n0
n8 --> n2
n0 --> n4
n6 --> n7
n11 --> n1
n5 --> n6
n9 --> n8
n10 --> n11
n15 -.-> n13
n13 --> n12
n14 -.-> n1
n1 --> n13
n3 --> n5
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n3 trigger
class n1,n13 ai
class n14,n15 aiModel
class n2 decision
class n8,n9,n12 database
class n6,n10 api
classDef customIcon fill:none,stroke:none
class n6,n7,n10,n11 customIcon
The Problem: Tracking Trustpilot Reviews Without Losing Your Mind
Trustpilot is great when you’re reading a few reviews. It gets messy when you’re trying to track patterns over time. Somebody has to open pages, click into individual reviews, copy text, capture star ratings, and then paste everything into a spreadsheet that never quite stays consistent. Then you still have the hardest part: deciding what the review “means” and whether it’s an actual product issue, a delivery complaint, or just one-off frustration. Do that for a few pages of reviews and you’re already behind again next week.
It adds up fast. And the friction compounds when you try to share insights across a team.
- Pulling reviews manually usually costs about 1–2 hours per refresh, and it’s never “done” because new ones keep coming.
- Spreadsheets fill with inconsistent rows, which means filtering by rating or theme turns into cleanup work.
- Sentiment is judged differently by different people, so reporting can feel subjective instead of reliable.
- Duplicates sneak in when multiple people update the sheet, especially if you’re tracking across pages or weeks.
The Solution: Trustpilot Reviews to Google Sheets With OpenAI Sentiment
This workflow turns Trustpilot reviews into structured, searchable data inside Google Sheets. It starts by fetching the Trustpilot review pages for a specific company ID, then grabs individual review links from the HTML. For each review, it loads the full review page, parses the content, and uses an AI extractor to pull consistent fields like author, rating, date, title, review text, reviewer country, and the reviewer’s total review count. Once the review is structured, OpenAI tags it as Positive, Neutral, or Negative. Finally, n8n syncs the record into your Google Sheet by checking what’s already there and updating or appending so you don’t keep re-importing the same review.
It begins when you run the workflow and set your company_id and max_page. Then the workflow scrapes, extracts, and validates each review before sentiment scoring. Your sheet ends up as a clean dataset you can filter by date, rating, country, and sentiment without extra formatting work.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you check 5 Trustpilot pages each Monday and log about 20 new reviews. Manually, you might spend about 5 minutes per review to open it, copy details, paste into Sheets, and sanity-check formatting, which is roughly 2 hours. With this workflow, you set company_id once, pick max_page (like 5), run it, and wait for processing. Your “work” becomes about 10 minutes of reviewing the sheet and filtering by Negative or by rating.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets for storing and sharing review records
- OpenAI to label sentiment consistently
- DeepSeek API key (get it from your DeepSeek dashboard)
Skill level: Intermediate. You’ll connect credentials, set company_id/max_page, and map Sheet columns once.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
You trigger a run with your Trustpilot settings. The workflow starts from a manual trigger, then assigns settings like company_id and max_page so the scrape is scoped to what you actually want.
Trustpilot pages are fetched and links are collected. n8n requests the Trustpilot review listing pages, parses the HTML to grab each review URL, and splits them into individual items so each review can be processed cleanly.
Each review is parsed and turned into structured fields. The workflow loads a single review page, parses the HTML again, and uses an AI extractor (via a DeepSeek chat engine) to return consistent fields like rating, author, date, title, text, and country.
Sentiment is scored and the sheet is synced. OpenAI classifies each review as Positive, Neutral, or Negative, then the Google Sheets nodes check existing rows and update the matching review or append a new row.
You can easily modify the sentiment labels to match your reporting style, or change the page limit based on how frequently you want updates. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Manual Trigger
This workflow starts on demand and then sets the target company and pagination settings before scraping review pages.
- Add and open Manual Execution Start to verify it is the trigger for the workflow.
- Open Assign Settings and set company_id to
COMPANYand max_page to2. - Confirm the flow from Manual Execution Start → Assign Settings → Fetch Review Pages matches the execution order.
- In Fetch Review Pages, set URL to
=https://it.trustpilot.com/review/{{ $json.company_id }}and confirm pagination usespage={{ $pageCount + 1 }}with maxRequests ={{ $json.max_page }}. - Set the query parameter sort to
recencyin Fetch Review Pages.
Step 2: Connect Google Sheets
These nodes check existing rows and sync IDs before writing enriched review data.
- Open Retrieve Sheet Rows and select the target documentId (e.g.,
[YOUR_ID]) and sheetName (e.g.,Foglio1). - In Retrieve Sheet Rows, set the filter lookupValue to
{{ $('Separate Items').item.json.recensioni.replace('/reviews/','') }}and lookupColumn toId. - Open Sync Review Row and keep operation set to
appendOrUpdatewith matchingColumns =Id. - Open Update Review Sheet and confirm operation is
appendOrUpdateand the mapping uses the expressions provided for Id, URL, Data, Nome, Testo, Titolo, Località, Sentiment, Valutazione, and N. Recensioni. - Credential Required: Connect your googleSheetsOAuth2Api credentials in Retrieve Sheet Rows, Sync Review Row, and Update Review Sheet.
Step 3: Set Up Review Collection and Validation
These nodes extract review links, limit processing, and validate whether a review already exists before fetching the full review page.
- In HTML Link Grabber, keep operation set to
extractHtmlContentand confirm cssSelector isarticle section awith attribute set tohrefreturning an array torecensioni. - In Separate Items, set fieldToSplitOut to
recensioni. - In Restrict Items, set maxItems to
3to limit how many reviews are processed per run. - In Validation Gate, keep the condition comparing leftValue
{{ $json.Valutazione }}to rightValue{{ $('Separate Items').item.json.recensioni.replace('/reviews/','') }}with operation =empty. - Confirm the execution order Fetch Review Pages → HTML Link Grabber → Separate Items → Restrict Items → Sync Review Row → Retrieve Sheet Rows → Validation Gate → Fetch Single Review.
Step 4: Set Up Parsing and Sentiment Analysis
The workflow parses each review’s HTML and uses LLM tools to extract structured data and sentiment.
- In Fetch Single Review, set URL to
=https://it.trustpilot.com{{ $('Separate Items').item.json.recensioni }}. - In Parse Review HTML, keep operation set to
extractHtmlContentand extractarticleinto the keyrecensione. - In Review Data Parser, set text to
=You need to extract the review from the following HTML: {{ $json.recensione }}and keep the attribute definitions forautore,valutazione,data,titolo,testo,n_recensioni, andnazione. - In Sentiment Scoring, set inputText to
{{ $json.output.testo }}and keep categoriesPositive, Neutral, Negative. - Credential Required: Connect your openAiApi credentials in DeepSeek Chat Engine and OpenAI Chat Engine.
- Note that DeepSeek Chat Engine is connected as the language model for Review Data Parser and OpenAI Chat Engine is connected as the language model for Sentiment Scoring; add credentials to these parent nodes, not the sub-nodes.
article returns the full review HTML.Step 5: Configure Output Updates
The final step appends or updates the review row with extracted data and sentiment.
- In Update Review Sheet, confirm Id is set to
{{ $('Separate Items').item.json.recensioni.replace('/reviews/','') }}. - Set URL to
=https://it.trustpilot.com{{ $('Separate Items').item.json.recensioni }}. - Map fields to parser output: Data =
{{ $('Review Data Parser').item.json.output.data }}, Nome ={{ $json.output.autore }}, Testo ={{ $('Review Data Parser').item.json.output.testo }}, Titolo ={{ $('Review Data Parser').item.json.output.titolo }}. - Map remaining fields: Località =
{{ $('Review Data Parser').item.json.output.nazione }}, Valutazione ={{ $('Review Data Parser').item.json.output.valutazione }}, N. Recensioni ={{ $('Review Data Parser').item.json.output.n_recensioni }}, Sentiment ={{ $json.sentimentAnalysis.category }}.
Step 6: Test and Activate Your Workflow
Run a manual test to confirm review ingestion, parsing, sentiment scoring, and sheet updates.
- Click Execute Workflow on Manual Execution Start to run a test.
- Verify that Fetch Review Pages and HTML Link Grabber return review URLs, and Separate Items splits them correctly.
- Confirm Review Data Parser outputs structured fields and Sentiment Scoring returns a category.
- Check your Google Sheet to ensure Update Review Sheet appended or updated rows with the mapped columns.
- When successful, toggle the workflow to Active for production use.
Common Gotchas
- Google Sheets credentials can expire or need specific permissions. If things break, check the Google connection in n8n’s Credentials page and confirm the sheet is shared with the right Google account first.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
Frequently Asked Questions
About 30 minutes if your API keys and Google Sheet are ready.
No. You’ll mostly paste credentials and map columns once in n8n.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in OpenAI API costs (usually just a few dollars a month at small volumes) and your DeepSeek usage.
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, and it’s one of the best reasons to use n8n. You can change the sentiment categories inside the Sentiment Scoring node to match your reporting language (for example, adding “Mixed” or splitting “Negative” into “Delivery” vs “Product”). If you want extra columns, adjust what the Review Data Parser extracts, then map those fields into the Update Review Sheet node. You can also raise or lower max_page in the Assign Settings node to control how much history you pull each run.
Most of the time it’s expired OAuth or the sheet is owned by a different Google account than the one you connected in n8n. Reconnect Google Sheets credentials, then open the sheet and confirm you have edit access. Also check that the documentId and sheet/tab name match what the node expects, because a renamed tab can cause silent failures.
Practically speaking, hundreds per run is fine for most setups, and the real limit is your n8n plan/server plus Trustpilot page volume. If you self-host, executions aren’t capped by n8n, but your VPS resources still matter. On n8n Cloud, your monthly execution allowance determines how often you can run it at scale, so high-frequency monitoring might push you to a higher tier.
Often, yes. Zapier and Make are great for clean APIs, but this workflow depends on scraping pages, parsing HTML, running multi-step enrichment, and then deciding whether to update or append rows, which is the kind of logic n8n handles comfortably. The self-host option is also a big deal if you want volume without paying per task. If you only need a simple “new review alert,” a lighter tool may be enough. Talk to an automation expert if you want help choosing.
Once this is running, reviews stop being a messy inbox item and become a dataset you can actually use. Honestly, that’s the difference between guessing what customers think and knowing.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.