automations.help

Reviews & UGC

Export product reviews to Google Sheets

Your reviews live inside Judge.me, Loox, Okendo, or Yotpo, where you can read them one at a time but can't easily pivot by product, filter to the angry ones, or hand marketing a list of quotable lines. This pipes every review — the ones you already have and every new one after — into a Google Sheet with a clean column per field, so you can sort, filter, pivot, and share them like any other data. Build it yourself with the steps below, or we build it, backfill your history, and hand you the keys so you own it with no monthly fee. Free teardown of your current review setup first.

Difficulty
Intermediate
Time to build
2-4 hrs
Updated
  • Google Sheets
  • n8n

The manual way today

Reviews sit inside whatever app collects them — Judge.me, Loox, Okendo, Yotpo, Stamped — and that dashboard is built to display reviews one at a time, not to analyze them in bulk. When someone wants 'every five-star for the serum', 'all the reviews that mention shipping', or 'a list of quotes for the new landing page', the only path is opening the app, eyeballing pages, and copy-pasting into a doc by hand — or pulling a one-time CSV export that's already stale the moment the next review lands.

The real cost is the questions nobody asks because the data is too annoying to get at. Which product draws the most three-star 'it's fine' reviews. Whether complaints spiked after you switched 3PLs. Which customers left a photo worth turning into an ad. Every answer is sitting in the review app, but because slicing it means an hour of manual copy-paste each time, the question just doesn't get asked — so the reviews shape nothing beyond the star average on the product page. It never shows up in a report, because building the report by hand was never worth it.

What running looks like

Every review — the ones already collected and every new one going forward — lands as a row in a Google Sheet: date, product, rating, title, body, reviewer name and email, verified-buyer flag, photo URL if there is one, the source app, and a link straight back to the review. Editing a review updates its existing row instead of adding a second one. From there it's an ordinary spreadsheet: filter views by rating, a pivot table by product, a tab of quotable lines for marketing, shared read-only with whoever needs it. The sheet stays current on its own; a person decides what to do with what it shows.

01The build

How to build it

  1. Decide the columns before you touch a tool

    Needs a human

    One row equals one review — settle the columns on paper first so the rest of the build is just typing in a decision you already made. A solid default: review ID, created date, product (name and handle), rating, title, body, reviewer first name, email, verified-buyer flag, photo URL, source app, and a deep link to the review. Pick the review's unique ID as your key column — it's what makes edits update a row instead of duplicating it later. Decide one more thing now: if your app uses a 0–100 scale instead of 1–5 (some do), whether you store the raw value or normalize it to stars. Write the list down; that list is your header row.

  2. Build the sheet and connect it to n8n

    Runs itself

    Create a Google Sheet with two tabs: a 'Reviews (raw)' tab whose first row is exactly the columns from step one, and a second tab you'll use for views and pivots so nothing you do for analysis ever touches the raw data. In n8n, add a Google Sheets credential — OAuth2 for your own account, or a Google service account if you'd rather not tie it to a person; with a service account, share the sheet with that account's email so it can write. Run one test write from an n8n Google Sheets node to confirm a row lands in the right tab before you wire any reviews in.

  3. Backfill the reviews you already have, once

    Runs itself

    A sheet that only starts collecting from today is half-useful — the history is where the patterns live. Do a one-time load first. The quick path: export a CSV from your review app and import it into the raw tab, mapping its columns to yours. The cleaner path: build a throwaway n8n workflow with a Schedule or Manual Trigger feeding an HTTP Request node that pages through the app's reviews API from the beginning, runs each page through the same normalize step you build next, and appends. Either way you start complete, and from here on the sheet only has to keep up with new reviews.

  4. Get new reviews flowing into n8n

    Runs itself

    Pick one of two intakes. If your review app emits a webhook on new reviews (Judge.me, Okendo, and Yotpo do; Loox via its API), add an n8n Webhook node and paste its production URL into the app's webhook settings — instant and the cleanest path. If there's no webhook, use an n8n Schedule Trigger (every 10–15 minutes) feeding an HTTP Request node that calls the reviews API and pulls everything since the last run. Submit one test review and confirm the payload arrives carrying the review ID, the rating, the product, the body, the reviewer, and any photo URL. If the ID or rating isn't in the payload, fix the intake before going further — every step after this keys off them.

  5. Normalize each review into your columns

    Runs itself

    Review apps name their fields differently, so add an n8n Set (Edit Fields) node that maps the raw payload onto your exact column list and outputs the same shape every time. Format the date to a single style (ISO 'YYYY-MM-DD' sorts correctly in Sheets; a raw timestamp string often won't). Flatten photos to the first URL, or join multiple URLs with a comma into one cell. Build the deep link to the review from the app's pattern plus the review ID. Apply the rating-scale decision from step one. Centering this mapping in one node is what lets the same workflow handle Judge.me today and Okendo later — you swap the intake, not the rest.

  6. Append or update — keyed on the review ID, so edits never duplicate

    Runs itself

    Use the Google Sheets node's 'Append or Update Row' operation with the matching column set to your review ID. New reviews append a fresh row; a review the customer later edits, or one you reply to, finds its existing row by ID and updates it in place — no second row for the same review. For the polling intake, also track the highest review ID (or latest created-at) you've processed in n8n's static workflow data so a re-read of the same window doesn't re-process everything. Add a condition to skip your own staff and test emails so QA submissions never hit the sheet. One review, one row.

  7. Handle the edge cases that corrupt a sheet quietly

    Runs itself

    A few realities will mangle the data if you ignore them. Reviews with line breaks, quotes, or emoji in the body need the value written as a single cell, not split across columns — write through the Sheets node's structured input rather than building a CSV string by hand. A deleted or spam-flagged review should update its row's status (or move it to an 'archived' tab), not vanish silently, so your counts stay honest. Very long bodies are fine in a cell but truncate display; that's a view concern, not a storage one — keep the full text in raw. Re-run your test with a review that has a photo, an emoji, and a long paragraph, and confirm it lands clean.

  8. Turn the sheet into something people actually use

    Needs a human

    The raw tab is the database; the value is what you build on top. On the second tab, set up filter views (rating ≤ 2 for follow-up, rating = 5 with a photo for marketing), a pivot table of average rating and count by product, and a short 'quotes to use' list pulled from the strongest bodies. Protect the raw tab so an analysis formula can't overwrite source data, and share the sheet read-only with the people who need numbers. Spend five minutes a week confirming new reviews are still landing and the views still answer the questions you care about. Before any review, quote, or photo goes into an ad or onto the site, a person confirms the customer agreed to it being reused — the sheet surfaces the candidates; it doesn't grant permission.

02The stack

What it’s built on

n8n
The glue that does the work: a Webhook or Schedule node takes reviews in from your review app, a Set node maps every app's fields onto your one column schema, and a Google Sheets 'Append or Update' node writes each review to its row keyed on the review ID. Centering the logic here keeps the build portable — switch review apps and you only swap the intake node.n8n is open-source and self-hostable for free, which covers this build end to end; their cloud tier just saves you running the server. Either way this is low-volume, so it sits comfortably inside the smallest plan.
Google Sheets
The destination and the analysis surface in one. A raw tab holds one review per row; filter views, pivot tables, and a quotes tab on top turn it into something the team can slice by product or rating and share read-only — no separate BI tool needed for this.Free with any Google account. A sheet comfortably handles tens of thousands of review rows (the hard ceiling is 10 million cells); if you genuinely blow past that, that's the honest signal to move the raw store to Airtable or a database and keep Sheets as the view.

03Questions

Before you build

Can't I just export a CSV from my review app instead?

You can, and for a one-off look that's fine. The difference is freshness: a CSV is a snapshot that's stale the moment the next review lands, so you re-export and re-clean it every time you want current data. This build keeps the sheet live — new reviews append themselves, edits update their row — so the spreadsheet is always current without anyone re-running an export. Do the CSV once for the backfill, then let the automation keep it up to date.

Will editing a review create a duplicate row?

No, as long as you use 'Append or Update Row' keyed on the review ID. New reviews append; a review the customer edits or that you reply to is found by its ID and updated in place. Without that key you'd get a second row every time an app re-emits an event, which is the usual way these sheets turn into a mess — keying on the ID is what keeps it one review, one row.

Can I pull in the reviews I already have, not just new ones?

Yes — that's the backfill step, and it's worth doing first because the history is where the patterns are. Either import a CSV export from your app into the raw tab once, or run a one-time n8n workflow that pages through the app's reviews API from the beginning and appends each one through the same normalize step. After that the live intake only has to keep up with new reviews.

Won't Google Sheets choke once I have thousands of reviews?

Not for a long time. A sheet handles tens of thousands of rows fine; the real ceiling is 10 million cells total, so with a dozen columns you're good into the hundreds of thousands of reviews. If you genuinely outgrow that, it's a signal to move the raw store to Airtable or a small database and keep Sheets as the read-only view — but most DTC brands never reach that point.

Do I need n8n, or can my review app push to Sheets on its own?

A few apps offer a basic Sheets export or a Zapier hook, but they rarely give you your own column schema, a clean dedupe on edits, a backfill of history, and rating normalization in one place. n8n is what gives you that control and makes it portable — move from Loox to Okendo later and you swap the intake node while the schema, the dedupe, and the sheet stay exactly as they are. Zapier can run the same shape if you already live there; n8n is the more flexible and cheaper default.

Reviews & UGC

Post new 5-star reviews to Slack

Your worst reviews get found fast — a customer emails, a ticket opens, someone scrolls the dashboard. Your best ones just sit in Judge.me or Loox where nobody looks. This watches every review as it's submitted, catches the five-star ones, and posts them to a Slack channel with the product, the words, the customer, and the photo if there is one — so the team sees the wins as they happen, and the quotable ones get caught before they're buried. Build it yourself with the steps below, or we build it, wire the routing, and hand you the keys so you own it with no monthly fee. Free teardown of your current review setup first.

  • Slack
  • n8n

Intermediate1-3 hrs

Reviews & UGC

Flag negative reviews for follow-up

A one-star review is a customer telling you something's wrong in the most public place they have. This watches every review as it's submitted, catches the low ones, and drops them in a Slack channel with the rating, the product, what they wrote, and who they are — so someone reaches out while it still matters instead of finding it a week later in the app's dashboard. Build it yourself with the steps below, or we build it, wire the routing, and hand you the keys so you own it with no monthly fee. Free teardown of your current review setup first.

  • Slack
  • Klaviyo

Intermediate1-3 hrs

Reviews & UGC

Collect photo and video UGC in Airtable

Your best content is already being made — customers shoot it and drop it in photo reviews, email replies, and DMs, where it dies. This pulls every photo and video into one Airtable library the moment it lands: the file attached, who sent it, which product, which source, and — the part most teams skip — whether you actually have the right to run it in an ad. Build it yourself with the steps below, or we build it on the accounts you already pay for and hand you the keys, so you own the whole thing with no monthly fee. Free teardown of where your UGC is currently leaking first.

  • Airtable
  • Klaviyo
  • n8n

Intermediate4-6 hrs