13 columns in an Etsy review CSV: which one decides if your Shopify import works
Two posts ago I wrote about the routes for getting Etsy reviews into a file. This one is about what happens after you have the file — specifically, which column quietly decides whether your import succeeds or silently attaches reviews to the wrong products.
First, the thing worth repeating: Etsy does offer a free official download. In Shop Manager it's Settings → Options → Download Data → Take your data with you → Download Your Reviews. Start there. Etsy doesn't publish the column list for that file, so open it in a spreadsheet and check what you actually got before you design anything around it.
The 13 columns a structured export should give you
Here is the schema I use when I need a portable, documented file rather than an in-app sync:
| Column | What it's for | What usually goes wrong |
|---|---|---|
transaction_id | Stable per-review identifier; deduplication on re-import | Missing entirely, so re-running an import duplicates everything |
review_date | Chronology and review-age rules | Locale formats like 03/04/2026 get parsed as two different dates |
rating | 1–5 numeric value | Stored as text with a trailing "stars", breaks filters and averages |
reviewer_name | Display name shown with the review | Treated as a customer email or unique key — it is neither |
body | The review text | Line breaks and quotes break naive CSV splitting |
photo_count | How many buyer photos are attached | Ignored, so photo-only filters can't be applied later |
picture_urls | Full-resolution buyer photo URLs | Etsy preview-size URLs get copied instead; photos degrade after the original listing disappears |
verified_buyer | Whether the review is tied to a purchase | Assumed to be true for everything |
product_id | Etsy listing identifier | Used as a Shopify key — the two systems have unrelated ID spaces |
product_handle | The stable join key you map to a Shopify product | This is the one that matters (see below) |
product_title | Human-readable label | Used as the join key; titles get renamed, abbreviated and translated |
product_url | The original Etsy listing URL | Dropped, which removes your only fallback when titles drift |
seller_reply | Your public response to a review | Almost always forgotten, and it is not recoverable from the storefront later |
If you only verify four things in any file you get — from Etsy, from a sync, or from a tool — make them body + review_date, seller_reply, full-resolution picture_urls, and the product_url / product_handle pair.
Why product_handle is the column that decides everything
Etsy attaches reviews to a listing, not to a design or a variant. That distinction is invisible while you sell on Etsy and painful the moment you restructure a catalog.
Say one Etsy listing offers 20 designs and has 300 reviews. On Shopify you want 20 separate products. There is no clean automatic way to decide which of those 300 reviews belongs to which of the 20 new products — the data simply was never recorded at that granularity. Any tool claiming to "split" them is guessing.
What you can do is preserve the mapping you still have: capture every review together with its original product_url / product_handle before you change anything, then decide your own catalog structure. Assign the same handle/SKU on both sides from day one. Retrofitting 200 listings later is miserable, and it determines whether you can ever match an Etsy order or review to a Shopify product in a spreadsheet.
Titles are the trap. Teams join on product_title because it's readable, then a rename or a seasonal edit breaks the join. A handle is boring and stable; use it.
A 5-row test import before you do 500
Whatever route you take, run this first:
- Pick 5 rows that include: one review with a photo, one rating-only review, one with a seller reply, one with a comma or line break in the body, and one from an older listing.
- Import into a test product in your review app, not your live catalog.
- Check the date renders in the right timezone, the photo loads at full resolution, the body isn't truncated at the comma, and the review is attached to the product you intended.
- Re-run the same 5 rows. If you now have 10 reviews, you have no stable
transaction_idand need deduplication. - Only then scale up. Keep the original file untouched as your archive.
The legal bit, briefly
Only import reviews that were genuinely written for your own products by your own customers. In the US, the FTC's Rule on Consumer Reviews and Testimonials (16 CFR Part 465, effective October 2024) prohibits misrepresenting that a review was written for a product or seller it wasn't written for. Public reviews from other shops are useful for market research — they must never be presented as your own customers' feedback. If you're using Judge.me, note that its Etsy-synced reviews are excluded from its Google Shopping product-ratings feed.
Where my tool fits
For the cases the official download and a native sync don't cover, I built a small independent Chrome extension that produces a structured CSV with the documented 13-column schema above, entirely on your device (free tier: 40 reviews): https://yi1260.github.io/etsy-review-studio/?utm_source=devto&utm_campaign=csvcolumns
Full disclosure: I'm the developer. It is not affiliated with Etsy, Shopify, Judge.me or Loox, and for a plain copy of your own shop's data the official Etsy download may be all you need.