---
license: cc-by-4.0
language:
  - en
tags:
  - product-reviews
  - consumer-products
  - meta-analysis
  - ratings
  - e-commerce
pretty_name: Verdict Cross-Publication Product Review Ratings
size_categories:
  - 1K<n<10K
---

# Verdict Cross-Publication Product Review Ratings

**6,010 product ratings collected from 2,016 distinct review publications, covering 1,809 consumer products across 351 categories — with each score traced to the review that published it, and flagged for whether the publisher printed the number or it was inferred from their prose.**

Most product-rating datasets are *retailer* data: star ratings left by customers on one storefront. This one is *editorial* data. It records what professional and independent reviewers concluded, across many outlets, for the same product — which makes it possible to ask questions a single-source dataset cannot:

- How often do independent reviewers actually agree about a product?
- Does price predict published quality? (Across this corpus: barely.)
- Which outlets score systematically high or low relative to their peers?
- How much of the review web still publishes a machine-readable score at all?

Generated 2026-08-17 from the live corpus behind [verdict-reviews.com](https://verdict-reviews.com).

## Files

### `ratings.csv` — 6,010 rows, one per cited review

| column | meaning |
|---|---|
| `product_slug` | joins to `products.csv` |
| `category_slug` | the guide this rating was collected for |
| `publisher` | the outlet or creator, as stored (see limitation 3) |
| `review_url` | the specific review the score came from |
| `value`, `max` | the score **in the publisher's own scale** — `8.3` / `10` stays `8.3` / `10` |
| `normalized_5pt` | that score rescaled to 5 points, which is what the aggregate averages |
| `source` | how the score was obtained (`jsonld`, `text`, `article-llm`, `youtube-llm`, …) |
| `publisher_stated` | **`true` = we read this number off the publisher's own page (structured data or printed body copy). `false` = a language model inferred it from their prose or video transcript. Empty = they reviewed the product and published no score.** |
| `outlet_publishes_scores` | `true` when we have successfully read **5 or more** printed scores from that host elsewhere in the corpus. Only meaningful on `publisher_stated=false` rows — see the warning below. |

**The natural key is `(product_slug, category_slug, review_url)`** — unique across all 6,010 rows. It is *not* `(product_slug, review_url)`: 30 rows share that pair, because a product cited in two guides appears once per guide (same score, different context — see limitation 2). Deduplicate on the triple, or on `review_url` alone if you want one row per published review. Separately, 296 review URLs are cited for more than one product; those are roundups covering several products, which is expected rather than a defect.

### `products.csv` — 1,809 rows, one per product

Category, product name, rank within its guide, the aggregate rating, how many reviews it rests on (`rating_count` = scored, `review_count` = all cited), publication dates, and the canonical page.

### `stats.json`

Corpus-level counts as generated, so a consumer can verify their load.

## The column that matters most: `publisher_stated`

**44.5% of these scores were read off the publisher's page. 44.6% were inferred by a language model reading the review's own words. 10.9% are reviews with no score at all.**

That split is the single most important thing to understand before using this data. Filter to `publisher_stated == true` for the **2,674 rows** a human editor demonstrably published — that is the conservative dataset.

### The caveat that stops you over-reading it

It is tempting to read "44.6% inferred" as *"most of the review web doesn't publish machine-readable scores."* **Don't — not from this column alone.** A `false` here means *we* did not read a number, and there are two very different reasons for that: the reviewer genuinely published none, or they published one and our extraction missed it. Scores injected client-side are the classic case: a server-side fetch sees nothing where a rendered read sees 9.1/10.

`outlet_publishes_scores` separates them as far as the data honestly can. **373 rows (6.2% of the corpus) are inferred scores sitting on hosts we have successfully read 5+ printed scores from** — concentrated on outlets like Consumer Reports, GearJunkie and Pro Tool Reviews. On those, the likeliest explanation is our read failure, not the reviewer declining to score.

So the honest floor is: **at least 50.7% of these reviews carried a published score** (44.5% read + 6.2% probably missed), and the true figure is higher still, since the ≥5 threshold only catches hosts we've read repeatedly. The safest reading of the remaining `false` rows is *"we could not obtain a published number here,"* which is a statement about this dataset's extraction, not a measurement of the review industry.

If your question needs publisher-published numbers, use `publisher_stated == true`. If you are studying score availability across the web, treat `publisher_stated == false AND outlet_publishes_scores == true` as unknown rather than as absence.

## How it was built

Automated research collects candidate reviews for a product, extracts a score where one is published (schema.org structured data first, printed body copy second), and where a reviewer published no number, a language model reads the full article or video transcript and returns a rating. Each product's aggregate is the arithmetic mean of the normalized scores, every source weighted equally.

**No product in this dataset was tested by us.** This is an aggregation of other people's published reviews, and the value on offer is the cross-outlet comparison, not original measurement. The full method, including the parts that are messier than a marketing page would admit, is at [verdict-reviews.com/methodology](https://verdict-reviews.com/methodology/).

## Limitations — please read before drawing conclusions

1. **43.4% of scores are model-inferred, not published.** Flagged per row. An inferred rating is an interpretation of a reviewer's words, not a measurement they endorsed. Treat it accordingly, and filter it out if your question needs publisher-stated numbers.

2. **Ratings are category-scoped.** A product is scored as a member of the guide it appears in, so the same item can carry different aggregates in two different guides — a fan reviewed among tower fans and among air purifiers is being asked two different questions. 12 products appear in two guides and 9 of those carry different numbers. This is deliberate, not an error, but it means `product_slug` is not a globally unique key for a rating.

3. **Publisher labels are inconsistent.** 2,016 distinct label strings represent fewer real outlets. Web publications are stored as a lowercase hostname slug (`tomsguide`), while YouTube reviewers are stored as channel names, so the two namespaces are mixed. A residual ~13 labels are truncated video titles from a since-fixed extraction bug. **Normalise or group before treating `publisher` as an entity.**

4. **Syndication is not detected.** Two outlets re-reporting one underlying test count here as two independent reviews. Wire pickups and sister-title re-runs are invisible to a per-domain rule, so some products' agreement is thinner than the row count suggests.

5. **Coverage is not a random sample.** Categories reflect what was researched, weighted toward consumer electronics, home and outdoor goods. Do not treat category composition as representative of the retail market.

6. **Some cited URLs have gone offline** since collection. The score recorded is the one that was published at the time.

7. **Evidence per product is uneven, and thin at the tail.** Distribution of cited reviews per product: 3 reviews is the mode (728 products), then 2 (368) and 4 (348). But **90 products rest on a single review, and 7 carry none at all** — these predate the current two-citation publishing gate and are pending re-research. A 4.6 from one reviewer and a 4.6 from six are not the same claim; `rating_count` and `review_count` in `products.csv` let you filter on it, and any analysis of agreement should.

8. **This is not a census, and "4 products" usually means "the floor", not "the market".** Products are those the research pipeline surfaced and published. Four is the publication floor, and repeated end-to-end runs on the same category have hit exactly four every time — so a 4-product category generally means research stopped once it qualified, not that only four products exist. **Do not read category size as market size**, and be wary of per-category aggregates on the smallest categories.

## Excluded on purpose

- **Reviewers' verbatim quotes.** They are other publications' copyrighted prose, and an internal audit found a meaningful share of stored quotes could not be located on the page they credited. Publishing text we know to be partly wrong, under real publications' names, would be the worst possible use of this data. Repair is ongoing; the quotes stay out.
- **Our own editorial prose, pros/cons and summaries** — not what makes this dataset useful, and site content remains reserved.
- **Affiliate links.**

## Licence and citation

Released under **[CC BY 4.0](https://creativecommons.org/licenses/by/4.0/)** — use it commercially, modify it, redistribute it; just credit the source. Attribution is the only thing asked in return.

```bibtex
@misc{verdict_review_ratings_2026,
  title  = {Verdict Cross-Publication Product Review Ratings},
  author = {Hunter, Michael},
  year   = {2026},
  url    = {https://verdict-reviews.com/data/},
  note   = {6,010 editorial product ratings from 2,016 review publications}
}
```

Plain-text credit is equally fine: *Data: Verdict Cross-Publication Product Review Ratings (verdict-reviews.com/data).*

Corrections are welcome — if a score here misrepresents your publication, [tell us](https://verdict-reviews.com/contact/) and it will be fixed or removed.
