Tutorial
Use guest reviews without inventing a score
Import a review export, read the stored, duplicate and rejected counts, and get a per-source average you can defend instead of one misleading overall number.
About 8 minutes. Last reviewed against the product on .
By the end of this you will have one review export imported and a per-source average you can defend, and you will know why this page refuses to give you a single overall score.
1. Prepare the export
Open Review intelligence. The importer takes a CSV, and only a CSV. Before you upload it, take out the direct identifiers you do not need for analysis: reviewer names, email addresses, handles. The confirmation checkbox asks you to state that you have done this, and it is the only place that is checked.
Column headings are matched by meaning, not position. Matching ignores case, spaces and punctuation, so Review Date, review_date and reviewdate all reach the same field.
| Field | Headings accepted | Needed |
|---|---|---|
| Source | source, platform, review source | Yes |
| Date | date, review date, created at | Yes |
| Rating | rating, stars, score | Yes |
| Review text | review, review text, comment, text | No |
| Location | location, restaurant, branch | No |
Measured from the review row parser at src/lib/reviews/parser.ts.
2. Import it and read the three counts
The importer replies with one line: how many reviews were stored, how many were duplicates, and how many were rejected. All three matter.
A row is rejected when it has no source, when its date cannot be read, or when its rating is missing or falls outside the accepted range. Rejected rows are not stored and are not counted anywhere, so a large rejection count means your averages describe a fraction of the file.
- Upload limit
- 10 MB
- CSV only; larger files are refused
- Rating accepted
- 0 to 5
- anything outside this rejects the row
- Reviews loaded per view
- 1,000
- the most recent matching the filters
- Individual reviews listed
- 100
- the summaries above them cover all 1,000
Measured from app/api/reviews/import/route.ts and app/app/reviews/page.tsx.
3. Read one source at a time
Each source gets its own card: a count, an average, the observed range, how many locations appeared, and the period the reviews span. Sources are never merged. Google, Tripadvisor and an internal survey stay separate even when all three use five points, because a four on one is not a four on another. Different prompts, different audiences, different moments.
The observed range is the smallest and largest rating imported for that source. It is not a confidence interval and it says nothing about how spread out the middle is.
4. Filter, then check what the filter did
Source, location and a date range narrow the view, and the averages recalculate over what remains. The clear link tells you how many filters are active, which is worth glancing at before you believe a number that has moved.
5. Leave with one thing to change
Pick the source with the most reviews, read the twenty most recent, and find the one complaint that appears more than twice. That is a service or menu problem with evidence behind it. The average rating is a thermometer; the repeated sentence is the diagnosis.
What is measured and what is assumed
Measured: the ratings, dates, sources, locations and text in the file you uploaded, and the arithmetic performed on them after your filters.
Assumed: that your export is complete and unfiltered. If the platform exported only reviews above a threshold, or only a recent slice, nothing here can detect that and the average inherits the bias silently.
Out of scope entirely: whether these reviews represent your guests. People who write reviews are a self-selected group, weighted towards strong feeling in either direction, and no amount of arithmetic on them produces a measure of everyone who ate with you. Someone with viewer access cannot import an export.