# How to Move Reviews From WooCommerce to Shopify (2026)

Source: https://bealinawaz.com/blog/move-reviews-woocommerce-to-shopify/
By Ali Nawaz, freelance WordPress and Shopify developer in Lahore, Pakistan (https://bealinawaz.com/about-me/).

Published: 2026-11-13

Move reviews from WooCommerce to Shopify without losing stars, dates or replies: a full export, product mapping, the CSV for your review app, and the rules.

To move reviews from WooCommerce to Shopify, export every review with its rating, date and reply, install a Shopify review app, and import a CSV that matches each review to the right Shopify product. Shopify has no built-in reviews any more, so the app you choose decides the file format, the badges and how the stars reach Google.

None of the free migration tools does this part for you. [Shopify's own WooCommerce migration guide](https://help.shopify.com/en/manual/migrating-to-shopify/migrating-from-woocommerce) says product reviews aren't included in the WooCommerce product export, and its Store Migration app moves products and customers only. So reviews are a separate job, and it's the one where a store quietly loses years of social proof if it's done in a hurry.

This guide covers the export that most guides skip (pending reviews, replies, old reviews with an empty type), the product mapping, the exact CSV columns for the main apps, and the US and UK rules that apply when you republish reviews. Facts were checked on 13 November 2026 against WooCommerce 11.3, the review apps' help centres and the official rule texts.

## What you are actually moving

In WooCommerce, a product review is a WordPress comment on the product. That shapes everything that follows.

| Part of a review | Where WooCommerce keeps it |
| --- | --- |
| Review text, name, email, date | `wp_comments`, with `comment_type = 'review'` |
| Star rating (1 to 5) | `wp_commentmeta`, key `rating` |
| "Verified owner" flag | `wp_commentmeta`, key `verified` (0 or 1) |
| Approved, pending, spam, trash | `wp_comments.comment_approved` |
| Your reply | A separate child comment, with `comment_parent` set to the review's ID, usually of type `comment` |
| Photos | Not in core WooCommerce. Only photo-review plugins add them |

Three things in that table cause most lost reviews:

- **Old reviews may have no type.** WooCommerce 3.5 converted untyped product comments to `review`, but WooCommerce's own counting code still accepts an empty type and `comment`. A store that started long ago, or imported reviews by hand, can have reviews that tools filtering on `review` never see.
- **Ratings can be missing.** Ratings can be switched off or made optional in WooCommerce settings, so some reviews have text and no stars.
- **Replies are separate comments.** Export only the reviews and your replies stay behind.

Reviews also belong to the parent product. WooCommerce doesn't take reviews per variation from the shop front, which helps later when you map products.

## Step 1: Export every WooCommerce review

Pick one of these routes. Whichever you use, count the result against the number of reviews in **Products > Reviews** in your WordPress admin.

##### Option A: the REST API

WooCommerce's `GET /wp-json/wc/v3/products/reviews` [endpoint returns reviews as JSON](https://developer.woocommerce.com/docs/apis/rest-api/v3/product-reviews/) with `id`, `date_created`, `date_created_gmt`, `product_id`, `product_name`, `status`, `reviewer`, `reviewer_email`, `review`, `rating` and `verified`. Create a read key under **WooCommerce > Settings > Advanced > REST API** and call it over HTTPS.

```bash
curl -u ck_your_key:cs_your_secret \
  "https://your-store.com/wp-json/wc/v3/products/reviews?status=all&context=edit&per_page=100&page=1"
```

Three defaults catch people out:

1. **`status` defaults to `approved`.** Pending reviews are skipped unless you pass `status=all`.
2. **`per_page` stops at 100.** Read the `X-WP-TotalPages` header and loop through every page.
3. **The text gets HTML added.** In the default `view` context the review body is run through `wpautop()`, so it comes back wrapped in `<p>` tags. `context=edit` returns the raw text.

The endpoint also only returns comments of type `review`. Your replies and any untyped legacy reviews aren't in the response, and there's no parent field to link them. If you replied to reviews, or the store is old, use the SQL route as well.

##### Option B: a SQL query (gets replies and legacy reviews)

Run this on a copy of the database, not the live one. Change `wp_` if your table prefix is different.

```sql
SELECT c.comment_ID, c.comment_post_ID AS product_id, p.post_name AS product_slug,
       c.comment_author, c.comment_author_email, c.comment_date, c.comment_date_gmt,
       c.comment_content, c.comment_approved, c.comment_parent, c.comment_type,
       MAX(CASE WHEN m.meta_key = 'rating'   THEN m.meta_value END) AS rating,
       MAX(CASE WHEN m.meta_key = 'verified' THEN m.meta_value END) AS verified
FROM wp_comments c
JOIN wp_posts p ON p.ID = c.comment_post_ID AND p.post_type = 'product'
LEFT JOIN wp_commentmeta m ON m.comment_id = c.comment_ID
WHERE c.comment_type IN ('review', 'comment', '')
GROUP BY c.comment_ID
ORDER BY c.comment_post_ID, c.comment_parent, c.comment_date_gmt;
```

Rows with `comment_parent` above 0 are replies. Join each one to its parent so the parent row gets a `reply` text and a `reply_date`. Keep `comment_approved = 1` rows for publishing, and decide on pending ones before import rather than dropping them by accident.

##### Option C: WP-CLI or a plugin

`wp wc product_review list <product_id> --format=csv` wraps the same REST controller, so it has the same limits on status and type. Export plugins such as WP All Export with its WooCommerce add-on can also produce a CSV. If your photo reviews come from a plugin such as Customer Reviews for WooCommerce, use that plugin's own export, because core WooCommerce has no image field to read.

One plugin to avoid: the free "Product Reviews Import Export for WooCommerce" plugin that still turns up in search results [was closed on WordPress.org in May 2024](https://wordpress.org/plugins/product-reviews-import-export-for-woocommerce/) at its author's request.

##### If your WooCommerce store used Judge.me

[Judge.me ended its WooCommerce app on 31 October 2025](https://judge.me/help/en/articles/11868548-judge-me-sunsetting-on-woocommerce-square-squarespace-bigcommerce-duda-and-prestashop). The self-serve export went with it, so Judge.me's help centre says to email its support team from the store's admin address and ask for the export. That file is already in Judge.me's format, which makes the Shopify side simple.

## Step 2: Choose a Shopify review app

Shopify's own Product Reviews app stopped working on 6 May 2024, so reviews on Shopify need an app. Shopify pointed merchants to Judge.me, Loox, Okendo, Stamped and Yotpo at the time. Here's how the four with public import docs handle a custom file:

| App | Product matching | Required columns | Photos | Verified badge | Date format |
| --- | --- | --- | --- | --- | --- |
| Judge.me | Product ID, handle, URL, SKU, or a manual mapping column | `body`, `rating`, plus a product column | Up to 5 image URLs | Imported reviews are never marked verified | `dd/mm/yyyy` by default (changeable) |
| Loox | Handle, then product ID | `product_handle`, `rating`, `author`, `body`, `created_at` | Up to 5 | `verified_purchase` column | `YYYY-MM-DD` |
| Okendo | Product ID (recommended), handle or SKU | `name`, `body`, `handle`, `productId`, `rating`, `sku`, `dateCreated` | Images and videos | `isVerifiedBuyer` column | `yyyy-MM-dd HH:mm:ss` |
| Stamped | `product_id` or `product_handle` | `product_id`, `productUrl`, `productImageUrl`, `productTitle`, `rating`, `author`, `body`, `created_at` | 3 photos, 1 video | Not covered in its import doc | `YYYY-MM-DD HH:MM:SS` |

Judge.me includes the importer and Google rich snippets on its free plan, which is why it's the usual pick for a migrated store. Yotpo's import help pages weren't reachable when I checked, so if you choose it, download the template from **Settings > Import Reviews** in the app and follow its columns.

## Step 3: Map WooCommerce products to Shopify products

Import your products into Shopify before the reviews. WooCommerce post IDs never match Shopify product IDs, so every review needs a lookup from the old product to the new one.

Build a two-column map: WooCommerce product ID (or slug) to Shopify product ID (or handle). Product IDs are the safest key. Handles break when a slug changed during the move, and Judge.me's own error guide lists "couldn't find the product with this product_handle" as a common failure. Reviews Judge.me can't match become store reviews instead of product reviews, which hides them from the product page.

Two cases need a decision rather than a lookup:

- **Products you merged.** If three WooCommerce products became one Shopify product with variants, think before you pile all their reviews onto it. The UK regulator's fake reviews guidance treats moving reviews of a different product onto a listing as misleading unless the customer experience is materially the same. Sizes or colours of one item usually are. Different models usually aren't.
- **Products you dropped.** Reviews for products you no longer sell can stay out, as long as the rule is about the product and not about the stars.

If you're also rebuilding URLs, map the old product URLs at the same time with the [migration redirect generator](https://bealinawaz.com/tools/migration-redirect-generator/), so reviews, products and redirects all come from one product list.

## Step 4: Build the CSV for your app

Here's the mapping for Judge.me's import template. Its files use `title, body, rating, review_date, reviewer_name, reviewer_email, reply, reply_date, picture_urls, curated, product_id, product_handle`.

| Judge.me column | Fill it from |
| --- | --- |
| `product_id` | Your map: the Shopify product ID for the review's WooCommerce product |
| `body` | `comment_content` (raw text, no HTML) |
| `rating` | The `rating` meta, a whole number from 1 to 5 |
| `review_date` | `comment_date_gmt`, written in the format the importer is set to |
| `reviewer_name` | `comment_author`, as it was shown on your store |
| `reviewer_email` | `comment_author_email` (used for matching, not shown) |
| `reply`, `reply_date` | The joined child comment, if you replied |
| `title` | Leave blank. WooCommerce reviews have no title |
| `picture_urls` | Public image URLs from a photo-review plugin, comma separated |
| `curated` | `ok` for approved reviews; `not-yet` for any you still need to check |

Watch the dates. A blank date becomes the import day, and a mix of formats turns 3 April into 4 March. Convert everything to one format in a spreadsheet before you upload. For photos, the URLs must be public while the import runs, so don't switch off the old site first. Okendo suggests uploading images to Shopify Files and using those URLs, which is safer for any app.

Judge.me publishes imported reviews even when manual moderation is on, so the `curated` column is how you keep a row unpublished. It also doesn't email the customers in your file.

## Step 5: Import 10 reviews first, then the rest

Take ten rows that cover the awkward cases: a review with a reply, a review with photos, a variant product, an old review with an early date. Import them, then open each product page on the storefront and check the stars, the date, the name and the reply.

When those are right, import the full file once. Re-importing a file creates duplicates in most apps. Okendo doesn't support re-importing existing reviews at all, Stamped asks for no duplicate rows, and Judge.me blocks duplicates that clash with Shopify's review metaobjects. Keep the app's import log until you've checked the counts.

## Step 6: Check stars, counts and Google rich results

Review apps publish each product's average and count to [Shopify's standard metafields](https://shopify.dev/docs/apps/build/metafields/list-of-standard-definitions), `reviews.rating` and `reviews.rating_count`, and must keep them in sync. Themes and other apps read those. Compare them with WooCommerce for your top products: the count and average should match, apart from any group you left out on purpose.

Then test a product URL in Google's Rich Results Test. Judge.me adds review structured data on its free plan once a product has a published review and its review widget is on the page. Make sure only one source outputs review markup: if your theme or an SEO app adds its own, turn one off. [Google's review snippet guidelines](https://developers.google.com/search/docs/appearance/structured-data/review-snippet) also say the reviews you mark up must be visible on that page, and that you shouldn't aggregate reviews or ratings from other websites, so keep marketplace or Amazon reviews out of the import.

For star ratings in Google Shopping, [Merchant Center has its own rules](https://support.google.com/merchants/answer/6098512?hl=en): at least 50 reviews in the feed, reviews you collected and own, low-star reviews included. Ask your review app whether it sends migrated reviews in its feed before you count on it.

## Keep it honest: the US and UK rules

Moving reviews is a moment where it's tempting to tidy them. Both main markets now have specific rules against that.

- **United States.** [The FTC's rule on consumer reviews and testimonials](https://www.govinfo.gov/content/pkg/FR-2024-08-22/html/2024-18519.htm) (16 CFR Part 465) has applied since 21 October 2024. It bans fake reviews, and its review suppression section says you can't present the reviews you show as all or most of them while you hold some back for being negative. Leaving reviews out is fine only by criteria applied to every review regardless of sentiment, such as personal data, abuse or content unrelated to the product.
- **United Kingdom.** The fake reviews provisions of the Digital Markets, Competition and Consumers Act 2024 have applied since 6 April 2025. The CMA's guidance says traders must not edit, withhold or remove negative reviews to limit their impact, and warns against cherry-picking positive ones and against moving reviews between different products.

In practice: import the one-star reviews with the five-star ones, don't edit review text, don't invent a rating for reviews that had none, and only mark a review verified if WooCommerce's `verified` flag was 1. If you leave a group out, write down the neutral rule you used.

## Common mistakes when you move reviews from WooCommerce to Shopify

- Exporting through the REST API with the default `status`, so pending reviews never leave WooCommerce.
- Losing every reply because the export only read comments of type `review`.
- Importing before the products exist on Shopify, so reviews fail or land as store reviews.
- Matching on handles that changed during the migration.
- Filling missing ratings with a 5 to get past the importer. Leave those reviews out by a neutral rule instead.
- Adding filler text to star-only reviews so they pass a "body required" check. Judge.me and Loox need text, so star-only reviews may simply not move.
- Ticking "verified" for every imported review.
- Mixing date formats, or leaving dates blank so every review looks a day old.
- Taking the old site offline before photo URLs were imported.
- Running the import twice.
- Two plugins outputting review markup on the same product page.

## Frequently asked questions

##### Can you transfer reviews from WooCommerce to Shopify?

Yes. Export the reviews from WooCommerce, install a Shopify review app such as Judge.me, Loox, Okendo or Stamped, and import a CSV in that app's format. Shopify's own migration app doesn't move reviews.

##### How do I export WooCommerce product reviews to CSV?

Use the REST API endpoint `/wp-json/wc/v3/products/reviews` with `status=all` and `context=edit`, a SQL query on a database copy, or an export plugin. SQL is the only route that also returns replies and untyped legacy reviews.

##### Does Shopify have built-in product reviews?

No. Shopify's Product Reviews app stopped working on 6 May 2024. Product pages need a review app, or reviews collected through the Shop app.

##### Will imported reviews show as verified?

It depends on the app. Judge.me never marks imported reviews as verified. Loox and Okendo accept a verified column, which you should only fill from WooCommerce's own verified-owner flag.

##### Do imported reviews keep their original dates?

Yes, if you fill the date column in the format the app expects. A blank date becomes the import date in Judge.me.

##### Will customers be emailed when I import their reviews?

Judge.me says it doesn't email the customers in an imported file. Check your app's import help before uploading.

##### Will migrated reviews show stars in Google?

They can. Stars come from review structured data on the product page, which apps like Judge.me add once reviews are published. Google decides whether to show them, and the reviews must be your own customers' reviews, visible on the page.

## When to get help

For a store with a few hundred reviews on a few dozen products, this is an afternoon's work with a spreadsheet. It gets slower with replies, photo reviews, merged products, thousands of reviews or changed handles, and mistakes are hard to undo once duplicates or wrong product matches are live.

My [WooCommerce to Shopify migration service](https://bealinawaz.com/services/woocommerce-to-shopify-migration/) can take the reviews on as part of the move, along with products, customers, orders and redirects, for a fixed quote after a free audit. For the rest of the move, read the [WooCommerce to Shopify migration guide](https://bealinawaz.com/blog/how-to-migrate-woocommerce-to-shopify/), the post on [WooCommerce to Shopify redirects](https://bealinawaz.com/blog/woocommerce-to-shopify-redirects/), and how to [keep your SEO through the move](https://bealinawaz.com/blog/woocommerce-to-shopify-seo/).
