Review import columns

The columns a review file uses when its Format is set to Cascade. Exports use the same columns, so an exported file can be edited and imported back in. For the everyday steps see Importing reviews.

A minimal file needs three columns:

customer,product,rating
alice@example.com,running-shoes,5
bob@example.com,coffee-mug,2

Columns

ColumnRequiredDescription
customerYesEmail address of the reviewer. A customer Cascade has never seen is created from it.
productYes*Slug of the product being reviewed. It must already exist. On Shopify this is the product handle.
ratingYesWhole number from 1 to 5. A decimal is rounded to the nearest star.
titleNoThe review's headline.
bodyNoThe review's text.
externalIdNoThe review's ID in the app you are migrating from. See Running it twice.
productExternalIdNoThe product's Shopify ID. See Finding the product.
productUrlNoThe product's page URL on your storefront. See Finding the product.
siteNoSlug of the site the review belongs to. Leave it out and the product's own site is used.
productVariantNoSlug of the variant being reviewed, if the reviewer named one.
publishedNotrue or false. Defaults to true. See Moderation.
hiddenNotrue or false, the opposite of published, for apps that export the flag that way round.
moderationStatusNoThe moderation word your old app used, such as published, pending or spam. See Moderation.
verifiedBuyerNotrue or false. Defaults to false. Shows the Verified buyer badge.
orderReferenceNoThe order the review came from. Any row with one counts as a verified buyer.
responseNoYour store's reply to the review, published with your organization's name above it.
responderNameNoThe name shown above the reply. Defaults to your organization's name.
responseCreatedAtNoWhen the reply was written. Without it the reply is dated from the import.
createdAtNoWhen the review was written, for example 2023-04-11T09:15:00Z. Without it the review is dated from the import.
imageUrlsNoURLs of the review's photos and videos. See Photos and videos.
metadataNoA JSON object of your own string key/value pairs.
question:<label>NoOne column per review question. See Review questions.

* A row needs one of product, productExternalId or productUrl.

Finding the product

Cascade looks for the product in this order:

  1. product, matched against the product's slug (the Shopify handle).
  2. productExternalId, matched against the Shopify product ID recorded by your connected store. The numeric form (7788) and the gid:// form both work. Only resolves when a Shopify store is connected.
  3. productUrl, whose last path segment is read as a slug, so https://example.com/products/running-shoes finds running-shoes.

A row that matches nothing is skipped and the job says which identifiers it tried.

Moderation

Imported reviews are published unless the file says otherwise, and count as decided, so they stay out of the moderation queue. The one exception is a review your old app had not decided on yet: it arrives unpublished and waits in the queue for you.

moderationStatus accepts the words apps print: published, approved, live, visible, ok and public publish the review; unpublished, hidden, rejected, draft and private keep it off the storefront; pending, unapproved and held put it in the moderation queue; unknown and an empty cell publish it. A spam row is not imported at all and is listed on the job.

Where a file has more than one of these columns, published wins, then hidden, then moderationStatus.

Verified buyers

verifiedBuyer accepts true, false, and the words apps print on the badge: buyer, verified and verified purchase mean true; unverified and guest mean false. A row with an orderReference counts as verified; an explicit verifiedBuyer value wins over it. The reference is kept in the review's metadata.

Photos and videos

imageUrls takes publicly reachable URLs separated by commas, spaces or semicolons, or a JSON array of URLs (or of objects with a url field). Cascade downloads and stores its own copy of each. JPEG, PNG, GIF and WebP images and MP4, QuickTime and WebM video are accepted. An attachment that can't be fetched is reported against its row and the review is still imported. A URL already attached to the review is not fetched twice.

Review questions

Each live review question gets a column named question: followed by its label, such as question:How is the fit?. A scale takes the step number counting from 1; a list of options takes the option labels separated by |, such as Yes|No. An empty cell means the review didn't answer. A value the question doesn't offer skips the row and reports why. Required questions can be left unanswered on an import.

Running it twice

externalId makes an import safe to repeat: importing the same file again updates those reviews in place instead of adding a second copy. Without it, every import adds new reviews. Exports fill externalId in for you, using the review's own Cascade ID where there is no external one.

A review holds one reply, so re-importing rewrites the reply rather than adding a second.

When a row doesn't match

Rows that can't be placed are skipped and listed with their row number on the import job under Settings → Import jobs:

An import job whose one problem names the row and the product slug it could not find

Row 3: No customer with the email "ghost@example.com".
Row 4: No product with the slug "discontinued-widget".

Fix those rows and import the file again, with externalId set so the rows that worked aren't duplicated.